Python 深度学习–学习笔记(七)

  • Post author:
  • Post category:python




运用数据增强来提高猫狗分类准确度

猫狗分类的基本代码已在

Python 深度学习–学习笔记(六)


上节中,训练过程输出(部分) 如下:

1

可以看出,验证集的准确度最后停在 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() 

2

  • 定义图片生成器:
#图片生成器
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')

最后输出:

在第三十轮的时候:

3

准确度达到0.7665。比起没有用数据增强,有了些许提高。

训练到最后的时候:

4

准确度达到0.7925。



版权声明:本文为yuan_1520原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。