随着Keras2即将在TensorFlow和TensorFlow 2.0中实现,您应该将Keras ImageDataGenerator
与TensorFlow的flow_from_directory
或tf.data
配合使用,也可以与{{1 }}现在的Keras?
这两种方法会因为用途不同而占有一席之地,还是fit_genearator
将成为新的发展方式,而Keras生成器将来会被弃用?
谢谢,我想走这条路,让我在这个快速发展的领域中保持更长的时间。
答案 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
,它将起作用。
您可以像这样随机选择数据或使用一些循环方法。
尽管代码很粗糙,但很容易更改,因此可以生成复杂的批处理。