运用数据增强来提高猫狗分类准确度
猫狗分类的基本代码已在
Python 深度学习–学习笔记(六)
上节中,训练过程输出(部分) 如下:
可以看出,验证集的准确度最后停在 0.7120,这很大的原因是训练集的数目不够多。为使模型的泛化能力提升,最关键的就是要
增加训练的数据量
.
在图片数据不够多的前提下,可以让模型对图片进行
更深刻的学习
.例如,将图片左右旋转适当的角度,平移,镜像翻转,缩放等等,然后将改变的图片再传入模型进行学习。
今天,就围绕这个思路,在
Python 深度学习–学习笔记(六)
的基础上进行调整。
- 把需要用到的文件夹提取出来:
base_dir = 'C:\\Users\\Administrator\\Desktop\\Keras_learn\\cats_and_dogs_small'
train_dir = os.path.join(base_dir,'train') #在base_dir 的子目录下
validation_dir = os.path.join(base_dir, 'validation')
test_dir = os.path.join(base_dir,'test')
train_cats_dir = os.path.join(train_dir,'cats')
train_dogs_dir = os.path.join(train_dir,'dogs')
validation_cats_dir = os.path.join(validation_dir,'cats')
validation_dogs_dir = os.path.join(validation_dir,'dogs')
test_cats_dir = os.path.join(test_dir,'cats')
test_dogs_dir = os.path.join(test_dir,'dogs')
- 构造模型和学习模式:
from keras import models
from keras import layers
from keras import optimizers
model = models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation='relu',input_shape=(150,150,3)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64,(3,3), activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128,(3,3), activation='relu'))
model.add(layers.MaxPooling2D((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(lr=1e-4),
metrics=['acc'])
规定输入的单张图片大小为 150 * 150 的彩色图片。
这里多加了一层 Dropout层 抑制过拟合。
辨认图片是猫或狗是二分类,这与 辨认imdb评论正负面 类似。(
Python 深度学习–学习笔记(二)
)
- 设置数据生成器:
from keras.preprocessing.image import ImageDataGenerator
train_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'
#由于平移旋转多出的新像素的填充方式
)
val_datagen = ImageDataGenerator(rescale=1./255)
#验证集不能增强数据
我们传入一个图片看看:
import matplotlib.pyplot as plt
from keras.preprocessing import image
import numpy as np
fnames = [os.path.join(train_cats_dir,fname) for fname in os.listdir(train_cats_dir)]
#将每个训练猫的图片的地址提取出来
a = np.random.choice(len(fnames),1)
img_path = fnames[int(a)]
img = image.load_img(img_path,target_size=(150,150))
#随机导入一张猫图片
x = image.img_to_array(img)
x = x.reshape((1,) + x.shape)
i = 0
for batch in train_datagen.flow(x):
plt.figure(i)
imgplot = plt.imshow(image.array_to_img(batch[0]))
i += 1
if i % 3 == 0:
break
plt.show()
- 定义图片生成器:
#图片生成器
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(150,150),
batch_size=32,
class_mode='binary'
)
validation_generator = val_datagen.flow_from_directory(
validation_dir,
target_size=(150,150),
batch_size=32,
class_mode='binary'
)
生成器的解释在:
Python 深度学习–学习笔记(六).
- 训练模型:
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')
最后输出:
在第三十轮的时候:
准确度达到0.7665。比起没有用数据增强,有了些许提高。
训练到最后的时候:
准确度达到0.7925。
版权声明:本文为yuan_1520原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。