一、数据处理
在上一篇博客(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')
绘制验证曲线