ImageDataGenerator 和数据增广
ImageDataGenerator图片生成器,是keras中处理原始图片非常好用的API,简单来说就是,图片到数据的一个预处理和转换。我觉得这个东西的用法应该结合数据增广来讲。
Python的生成器机制
其实应该是一个迭代器,懒加载。
数据增广
数据增广是视觉领域用于小数据集情况下对抗过拟合的好用的方法。超乎我想象的好用。
这是2000张图片的识别结果。这也是我之前遇到过非常严重的过拟合的问题,无从下手。使用数据增广之后,从70左右的准确率升到80.
在此之前,我对数据增广的理解是有问题的。我原来想象中的数据增广就是通过图形变换,得到更多数据,事实上输入并不需要变多,而且我想得太过简单。
这里数据增广的真正做法是,“不让网络看见图片两次”。实现是在图片每次输入网络的时候都对它进行随机复数次变换。
关键点如下:
1. 让网络无法看见同一张图片不是虚话,它的真正做法是,图片每次输入的时候做随机变换
2. 这种方法的核心在于,不会引入新的信息,但提高了信息的利用率。
3. 缺点:数据自相关性
注意:数据增广只是用在训练集上,和dropout一样。想一下,val set的作用就是predict一下,拿到准确率,没有多次输入.
使用ImageDataGenerator 进行数据增广
# 生成器构造器,设置一些数据增广的参数
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')