五种卷积神经网络解决猫狗分类问题(二):V2 简单线性网络上添加数据增强和dropout层

本文介绍了如何使用Keras构建卷积神经网络解决猫狗分类问题,通过添加数据增强和Dropout层防止过拟合。V2.0版本在V1的基础上增加了数据增强,如旋转、平移、缩放等,同时添加了Dropout层,训练和验证精度分别达到83%。实验结果显示,数据增强有效提升了验证集精度,Dropout层有助于防止过拟合。
摘要由CSDN通过智能技术生成
版本描述epochs训练精度验证精度
V1.0简单线性卷积神经网络10099%75%
V2.0添加了数据增强和dropout层10083%83%
V3.0使用预训练-特征提取-分步式10099%90%
V4.0使用预训练-特征提取-合并式10090%90%
V5.0使用预训练-微调模型10099%94%

五种卷积神经网络解决猫狗分类问题(零):总概要
五种卷积神经网络解决猫狗分类问题(一):V1 简单线性网络
五种卷积神经网络解决猫狗分类问题(二):V2 简单线性网络上添加数据增强和dropout层
五种卷积神经网络解决猫狗分类问题(三):V3 预训练-特征提取-分步式
五种卷积神经网络解决猫狗分类问题(四):V4 预训练-特征提取-合并式
五种卷积神经网络解决猫狗分类问题(五):V5 预训练-微调模型

1. 介绍

使用keras搭建简单线性网络,添加数据增强和一层dropout层,在猫狗数据集上训练,最终得到83%的训练精度和83%验证集精度,然后训练集精度相比V1的99%下降了,但是验证集精度相比于V1的75%上升了。

2. 数据增强

在V1中我们使用了keras的ImageDataGenerator来实现批量数据输入,实际上ImageDataGenerator中可以设置这些批量数据的旋转、平移、缩放等,也就是数据增强。所以我们实现数据增强,就是需要在ImageDataGenerator中设置不同的增强参数,比如:

# 针对训练图片的图像增强设置
train_datagen=ImageDataGenerator(rotation_range=40,        #随机旋转的角度范围(0~180°)     range代表范围
                                width_shift_range=0.2,    # width_shift/height_shift:在图像水平或垂直方向上平移的范围(按总宽总高比例)
                                height_shift_range=0.2,   
                                shear_range=0.2,          # 随机错切变换的角度
                                zoom_range=0.2,           # 图像随机缩放的范围
                                horizontal_flip=True,     # 随机将一半图像水平翻转
                                fill_mode='nearest'        # 填充像素的方法
                                )  # 将所有图像乘以1/255缩放,归一化

3. 添加dropout层

这是V1版本(即简单线性神经卷积网络)的loss图:
在这里插入图片描述
从图中我们可以看到验证集(validation)的loss有一个很短的下降,然后开始上升(loss上升当然是我们不希望的),这说明网络可能过拟合了。简单来说就是网络太聪明,而我们的数据集太简单了。为了防止这种过拟合我们可以试图让网络变笨一点,通过dropout层来实现,让网络和数据集门当户对:
如果网络太聪明,数据集太简单,就可能会出现过拟合
如果网络太愚笨,数据集太复杂,就可能会出现欠拟合

我们将保持V1的卷积神经网络结构不变,在最后两层的dense层之前加入一层dropout层:

#--------------------------------------------------------------
# 添加dropout层
model.add(layers.Dropout(0.5))
#--------------------------------------------------------------

4. 代码

4.1 数据集与格式

参考五种卷积神经网络解决猫狗分类问题(一):V1 简单线性网络的4.1节(数据集V1~V5都一样)

4.2 网络结构
from keras import layers
from keras import models

model=models.Sequential()

# block 1
model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(150,150,3)))
model.add(layers.MaxPool2D((2,2)))

# block 2
model.add(layers.Conv2D(64,(3,3),activation="relu"))
model.add(layers.MaxPool2D((2,2)))

# block 3
model.add(layers.Conv2D(128,(3,3),activation="relu"))
model.add(layers.MaxPool2D((2,2)))

# block 4
model.add(layers.Conv2D(128,(3,3),activation="relu"))
model.add(layers.MaxPool2D((2,2)))

# output
model.add(layers.Flatten())  #展开为向量
#--------------------------------------------------------------
# 添加dropout层
model.add(layers.Dropout(0.5))
#--------------------------------------------------------------
model.add(layers.Dense(512,activation="relu"))
model.add(layers.Dense(1,activation="sigmoid"))     
4.3 配置模型(优化器)
from keras import optimizers

model.compile(loss='binary_crossentropy',
              optimizer=optimizers.RMSprop(lr=1e-4),
              metrics=['accuracy'])
4.4 数据预处理
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing import image
import matplotlib.pyplot as plt

train_datagen=ImageDataGenerator(rescale=1./255,
                                 rotation_range=40,        #随机旋转的角度范围(0~180°)     range代表范围
                                width_shift_range=0.2,    # width_shift/height_shift:在图像水平或垂直方向上平移的范围(按总宽总高比例)
                                height_shift_range=0.2,   
                                shear_range=0.2,          # 随机错切变换的角度
                                zoom_range=0.2,           # 图像随机缩放的范围
                                horizontal_flip=True,     # 随机将一半图像水平翻转
                                )  # 将所有图像乘以1/255缩放,归一化

validation_datagen=ImageDataGenerator(rescale=1./255)

# 参数分别指目标目录、调整为多少尺寸、batch_size、标签类型(因为使用了binary_crossentropy损失,所以需要用二进制标签)
train_generator=train_datagen.flow_from_directory(train_dir,
                                                 target_size=(150,150),
                                                  batch_size=20,
                                                  class_mode="binary"
                                                 )
validation_generator=validation_datagen.flow_from_directory(validation_dir,
                                                 target_size=(150,150), 
                                                  batch_size=20,
                                                  class_mode="binary"
                                                 )
4.5 开始训练
history=model.fit_generator(train_generator,
                           steps_per_epoch=100,
                           epochs=100,
                           validation_data=validation_generator,
                
                           validation_steps=50)
4.6 保存模型
model.save("cats_and_dogs_small_2.h5")
4.7 可视化
import matplotlib.pyplot as plt
acc=history.history['accuracy']
print("训练最佳精度:",max(acc))
val_acc=history.history['val_accuracy']
print("验证最佳精度:",max(val_acc))

loss=history.history['loss']
val_loss=history.history['val_loss']

epochs=range(1,len(acc)+1)

plt.plot(epochs,acc,'bo',label='Training acc')
plt.plot(epochs,val_acc,'b',label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()  #创建图例

plt.figure()

plt.plot(epochs,loss,'bo',label='Training loss')
plt.plot(epochs,val_loss,'b',label='Validation loss')
plt.title('Training and validation loss')
plt.legend()  #创建图例

plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一个对称矩阵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值