在小型数据集上从头开始训练一个卷积神经网络(数据增强后)_猫狗分类数据集

一、数据处理

在上一篇博客(https://blog.csdn.net/qq_43607118/article/details/129580242)实现了小数据集上训练一个神经网络,但是可以看出模型是过拟合的。所以这节我们引入数据增强功能,尝试解决问题。

#利用ImageDataGenerator来实现数据增强
from keras import layers
from keras import models
from keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest')

1、显示几个随机增强后的经过数据增强后和原图进行比较

from keras.utils import image_utils
from PIL import Image
import matplotlib.pyplot as plt
fnames = [os.path.join(train_cats_dir,fname) for fname in os.listdir(train_cats_dir)]
img_path = fnames[3]
img = image_utils.load_img(img_path,target_size=(150,150))
x = image_utils.img_to_array(img)
x = x.reshape((1,)+x.shape)
i = 0
for batch in datagen.flow(x,batch_size=1):
    i+=1
    if i %4 ==0:
        break
plt.subplot(221)
plt.imshow(img)
img1 = Image.open("F:/图像视觉/pdf/学习记录/python深度学习_费朗索瓦/cats_and_dogs_small/train/cats/cat.100.jpg")
plt.subplot(222)
plt.imshow(img1)

对比结果

#定义一个包含dropout的新卷积神经网络
model = models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(150,150,3)))
model.add(layers.MaxPool2D((2,2)))
model.add(layers.Conv2D(64,(3,3),activation="relu",input_shape=(150,150,3)))
model.add(layers.MaxPool2D((2,2)))
model.add(layers.Conv2D(128,(3,3),activation="relu",input_shape=(150,150,3)))
model.add(layers.MaxPool2D((2,2)))
model.add(layers.Conv2D(128,(3,3),activation="relu",input_shape=(150,150,3)))
model.add(layers.MaxPool2D((2,2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512,activation='relu'))
model.add(layers.Dense(1,activation='sigmoid'))
model.compile(loss='binary_crossentropy',
             optimizer=optimizers.RMSprop(learning_rate=1e-4),
             metrics=['acc'])
#利用数据增强生成器训练神经网络
train_datagen = ImageDataGenerator(rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)   #不能增强验证数据
train_generator = train_datagen.flow_from_directory(train_dir,target_size=(150,150),batch_size=32,class_mode='binary')
validation_generator = test_datagen.flow_from_directory(validation_dir,target_size=(150,150),batch_size=32,class_mode='binary')
history=model.fit_generator(train_generator,steps_per_epoch=100,epochs=100,validation_data=validation_generator,validation_steps=50)

保存模型

model.save('cats_and_dogs_small_2.h5')

绘制验证曲线
acc
loss

猜你喜欢

转载自blog.csdn.net/qq_43607118/article/details/129586496