Keras2 ImageDataGenerator或TensorFlow tf.data?

时间:2019-04-11 08:29:24

标签: python tensorflow keras keras-2

随着Keras2即将在TensorFlow和TensorFlow 2.0中实现,您应该将Keras ImageDataGenerator与TensorFlow的flow_from_directorytf.data配合使用,也可以与{{1 }}现在的Keras?

这两种方法会因为用途不同而占有一席之地,还是fit_genearator将成为新的发展方式,而Keras生成器将来会被弃用?

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

3 个答案:

答案 0 :(得分:3)

自发布以来,默认建议使用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版本将被急切地执行,数据集对象将变得可迭代并且更加易于使用。

答案 1 :(得分:2)

在自定义的Python生成器旁边,您可以将Keras的image_data_generator包装在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中即可。

答案 2 :(得分:0)

对我来说,我更喜欢使用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,它将起作用。

您可以像这样随机选择数据或使用一些循环方法。

尽管代码很粗糙,但很容易更改,因此可以生成复杂的批处理。