刚接触Keras,写博客记录下自己遇到的问题>>>
在实际训练自己的网络模型时,基本都会遇到数据不够的难题.
Keras.preprocessing.imgae.ImageDataGenerator图片生成器,可以批量生成数据,防止模型过拟合并提高泛化能力.
使用方法如下:
#coding:utf-8
from keras.preprocessing.image import ImageDataGenerator,load_img,img_to_array
#定义图片生成器
data_gen = ImageDataGenerator(rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=True,
vertical_flip=True,
fill_mode='nearest',
data_format='channels_last')
img=load_img('/home/zyx/Dataset/flower_photos/daisy/144603918_b9de002f60_m.jpg')
x = img_to_array(img,data_format="channels_last") #图片转化成array类型,因flow()接收numpy数组为参数
x=x.reshape((1,) + x.shape) #要求为4维
#使用for循环迭代,生成图片
i = 0
for batch in data_gen.flow(x,batch_size=1,
save_to_dir='/home/zyx/Dataset/flower_photos/dataGen',
save_prefix='flower',
save_format='jpeg'):
print batch.shape
i += 1
if i>20:
break
#使用next()迭代,生成图片
next(data_gen.flow(x,batch_size=2,
save_to_dir='/home/zyx/Dataset/flower_photos/dataGen',
save_prefix='next_gen',
save_format='jpeg'))
data_gen.flow()返回是数据类型是NumpyArrayIterator类型,需要使用for或next,才可得到其中数据.
我们已经知道,可以直接作用于for
循环的数据类型有以下几种:
一类是集合数据类型,如list
、tuple
、dict
、set
、str
等;
一类是generator
,包括生成器和带yield
的generator function。
而生成器不但可以作用于for
循环,还可以被next()
函数不断调用并返回下一个值,直到最后抛出StopIteration
错误表示无法继续返回下一个值了。
可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
可以使用isinstance()
判断一个对象是否是Iterator
对象:
但是,这样生成的数据,相似度很高,在原始样本少的情况下,模型依旧很容易过拟合.
------------------------------如有错误,欢迎指出!---------------------------------