当数据很多时,考虑到效率和内存的问题,这时应该使用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