>-🍨本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/2Wc0B5c2SdivAR3WS_g1bA)中的学习记录博客
>-🍦 参考文章:[TS实战|第P4周:猴痘病识别](https://www.heywhale.com/mw/project/6347b0065565973b87564268)
>-**🍖 原作者:[K同学啊|接辅导、项目定制](https://mtyjkh.blog.csdn.net/)
加载数据集
image_dataset_from_directory()
是TensorFlow中的一个函数,用于从磁盘上按目录组织的图像文件中创建一个tf.data.Dataset
对象。它可以帮助我们快速地将图像数据加载到内存中,并进行预处理和数据增强等操作。
这个函数接受三个参数:
directory
: 图像文件所在的根目录。labels
: 可选参数,默认为None。如果不为None,则会将每个子目录名称作为标签,并返回一个带有标签的(image, label)
对的tf.data.Dataset
对象;否则,仅返回(image, )
对的tf.data.Dataset
对象。image_size
: 可选参数,默认为(256, 256)。指定输出图像的大小。可以是一个整数,表示输出图像的大小为正方形;也可以是一个元组,表示输出图像的大小为长方形。batch_size
: 可选参数,默认为32。指定输出的batch大小。shuffle
: 可选参数,默认为True。是否进行随机打乱数据。seed
: 可选参数,默认为None。如果指定了seed,则每次生成的数据集都是相同的。validation_split
: 可选参数,默认为None。如果指定了validation_split,则会从训练数据中划分出一部分作为验证数据,并返回两个tf.data.Dataset
对象:一个用于训练,一个用于验证。subset
: 可选参数,默认为"training"。如果指定了subset为"validation",则返回用于验证的tf.data.Dataset
对象;如果指定为"training",则返回用于训练的tf.data.Dataset
对象。
这个函数返回一个tf.data.Dataset
对象,它包含一些预处理过的图像数据。可以通过调用prefetch()
等方法来提高数据集读取的效率。
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="training",
seed=123,
image_size=(img_height, img_width),
batch_size=batch_size
)
构建网络
卷积核计算
卷积核是卷积神经网络中一个重要的概念,它用于对输入图像进行特征提取。在卷积操作中,卷积核是一个固定大小的矩阵,通过滑动窗口的方式对输入图像进行扫描,从而生成输出特征图。
具体地说,卷积操作可以定义为将卷积核与输入图像的每个像素点进行乘积运算,并将所有乘积的结果相加得到输出特征图上对应像素点的值。这个过程可以表示为:
其中, 表示输出特征图上位置 $(i,j)$ 的像素点的值,$x_{i+m-1, j+n-1}$ 表示输入图像上位置 $(i+m-1, j+n-1)$ 的像素点的值,$h_{m,n}$ 表示卷积核上位置 $(m,n)$ 的权重值,$M$ 和 $N$ 分别表示卷积核的高度和宽度。
在实际计算中,我们通常使用矩阵乘法的方式来加速卷积操作。具体地,我们可以将卷积核展开成一维的向量,然后将输入图像的每个与卷积核大小相同的子矩阵也展开成一维的向量,最后通过矩阵乘法运算得到输出特征图。
Dropout
Dropout是一种在神经网络训练中广泛使用的正则化技术,它可以有效减少过拟合现象。Dropout层会随机地将一部分神经元的输出置为0,从而在每次训练中随机丢弃一部分神经元,使得网络不能够过度依赖某些特定的神经元来做出预测,从而提高网络的泛化能力。
具体地说,Dropout层的具体实现方式是在训练时以一定的概率�p将神经元的输出值设为0,这样可以模拟神经元失活的情况。因此,在每个训练批次中,都会随机选择一部分神经元进行失活,这样可以让网络中的不同神经元以更均衡的方式参与到训练过程中。同时,在测试时,Dropout层不需要执行任何操作,因为我们希望网络能够利用所有的神经元来作出最好的预测结果。
Dropout层的一个重要参数是dropout rate,它表示失活的概率。通常情况下,dropout rate的值设置在0.2到0.5之间比较合适。当dropout rate设置得太小时,可能无法达到很好的正则化效果;当dropout rate设置得太大时,可能会导致网络欠拟合。
总之,Dropout层是一种简单而有效的正则化技术,在神经网络训练中应用广泛。它可以帮助我们减少过拟合现象,提高网络的泛化能力。
num_classes = 2
model = models.Sequential([
layers.experimental.preprocessing.Rescaling(1./255, input_shape=(img_height, img_width, 3)),
layers.Conv2D(16, (3, 3), activation='relu', input_shape=(img_height, img_width, 3)), # 卷积层1,卷积核3*3
layers.AveragePooling2D((2, 2)), # 池化层1,2*2采样
layers.Conv2D(32, (3, 3), activation='relu'), # 卷积层2,卷积核3*3
layers.AveragePooling2D((2, 2)), # 池化层2,2*2采样
layers.Dropout(0.3),
layers.Conv2D(64, (3, 3), activation='relu'), # 卷积层3,卷积核3*3
layers.Dropout(0.3),
layers.Flatten(), # Flatten层,连接卷积层与全连接层
layers.Dense(128, activation='relu'), # 全连接层,特征进一步提取
layers.Dense(num_classes) # 输出层,输出预期结果
])
model.summary() # 打印网络结构
训练结果