当数据很多时,考虑到效率和内存的问题,这时应该使用fit_generator(generator,...)来训练。
generator参数:要么是python的生成器,要么是keras.utils.Sequence的一个实例,其返回一个tuple,一般是一个inputs,targets的二元tuple。
1.使用keras自带函数:flow_from_directory
这里首先要创建一个ImageDataGenerator,这是一个对每个batch做预处理(缩放,归一化等待)的函数。然后调用flow_from_directory。一个显著的缺点是这个函数局限性太严重。其数据必须有且仅有一个中间目录,每个中间目录下必须放置同类图片。这个中间目录名字代表该目录类别。当然类别映射one-hot、shuffle等待这个函数都做好了。
2.使用python的generator
具体就是构建如下函数:
def generatorfunc(pathList)
np.random.shuffle(pathList)
x=shape(batch,...)
y=shape(batch,...)
while True:
for i,path in enumerate(pathList):
xone,yone = readpath(path)
x(i,...)=xone
y(i,...)=yone
if i>=batch:
yeild((input,output))
当然,这样做需要自己管控batch,shuffle等等,还是比较麻烦。
3.使用Sequence(不是指序列模型)
这里有一个问题,对于batch往往不能整除,那么应该如何处理呢?
每个epoch后shuffle,不能整除部分直接舍弃,相当于每个数据大概率用到了,官方的flow_from_directory就是这么干的。
def __len__(self):
return (self.n + self.batch_size - 1) // self.batch_size # round up