Keras2 ImageDataGenerator 还是 TensorFlow tf.data?
Keras2 ImageDataGenerator or TensorFlow tf.data?
随着 Keras2 即将在 TensorFlow 和 TensorFlow 2.0 中实施,您是否应该将 Keras ImageDataGenerator
与例如来自 TensorFlow 的 flow_from_directory
或 tf.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
。
随着 Keras2 即将在 TensorFlow 和 TensorFlow 2.0 中实施,您是否应该将 Keras ImageDataGenerator
与例如来自 TensorFlow 的 flow_from_directory
或 tf.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
。