Keras2 ImageDataGenerator 还是 TensorFlow tf.data?

Keras2 ImageDataGenerator or TensorFlow tf.data?

随着 Keras2 即将在 TensorFlow 和 TensorFlow 2.0 中实施,您是否应该将 Keras ImageDataGenerator 与例如来自 TensorFlow 的 flow_from_directorytf.data 一起使用,它们也可以与 fit_genearator Keras 现在?

这两种方法是否会通过服务于不同的目的而占有一席之地,或者 tf.data 是否会成为新的发展方式并且 Keras 生成器在未来会被弃用?

谢谢,我想走这条路,让我在这个快速发展的领域保持更长时间的最新状态。

自发布以来,TensorFlow Dataset API 是为在 TensorFlow 后端构建的任何模型构建输入管道的默认推荐方式,包括 Keras 和低级 TensorFlow。 在以后的 TF 1.xx 版本中可以直接在 tf.keras.Model.fit 方法中使用

model.fit(dataset, epochs)

它对快速原型制作都有好处,

dataset = tf.data.Dataset.from_tensor_slices((train, test))
dataset = dataset.shuffle().repeat().batch()

并用于构建复杂的高性能 ETL 管道 4. 升级你的数据输入管道,更多关于这里 https://www.tensorflow.org/guide/performance/datasets

根据官方文档,在 TF 2.0 中,它也将成为向模型输入数据的默认方式。 https://www.tensorflow.org/alpha/guide/migration_guide

默认情况下,即将发布的 TensorFlow 版本将被急切执行,数据集对象将变得可迭代并且更易于使用。

对我来说,我更喜欢用 yield:

构建一个生成器
def generator(batch_size=4,path):
imgs=glob(path+'*.jpg')
while True:
    batch=[]
    for i in range(batch_size):
        idx=np.random.randint(0,len(imgs))
        img=cv.resize(cv.imread(imgs[idx]),(256,256))/255
        batch.append(img)
    batch=np.array(batch)
    yield batch

然后创建生成器,输入到model.fit_generator,就可以了。

你可以像这样随机选择数据,也可以使用一些循环的方法。

虽然代码比较粗糙,但是很容易修改,可以生成复杂的batch。

请注意,这是一种使用 Keras2 而不是 TensorFlow 2.0 为 TF 1.X 生成的方法。

除了自定义的 Python 生成器外,您还可以将来自 Keras 的 ImageDataGenerator 包装在 tf.data.

以下片段摘自 TensorFlow 2.0 文档。

img_gen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255, rotation_range=20)
ds = tf.data.Dataset.from_generator(
    img_gen.flow_from_directory, args=[flowers], 
    output_types=(tf.float32, tf.float32), 
    output_shapes = ([32,256,256,3],[32,5])
)

因此,仍然可以使用典型的 Keras ImageDataGenerator,你只需要像上面那样将其包装成 tf.data.Dataset