如何正确映射 python 函数,然后在 Tensorflow 中批处理数据集



我希望创建一个管道来向神经网络提供非标准文件(例如扩展名为 *.xxx(。 目前,我已经将我的代码结构如下:

1( 我定义了一个查找训练文件的路径列表

2(我定义了包含这些路径的tf.data.Dataset对象的实例

3(我将一个python函数映射到数据集,该函数采用每个路径并返回关联的numpy数组(从PC上的文件夹加载(;这个数组是一个维度为 [256, 256, 192] 的矩阵。

4(我定义了一个可初始化的迭代器,然后在网络训练期间使用它。

我的疑问在于我提供给网络的批次的大小。我希望将大小为 64 的批次提供给网络。我该怎么办? 例如,如果我使用函数 train_data.batch(b_size( b_size = 1,结果是迭代时,迭代器给出一个形状的元素 [256, 256, 192];如果我想只用这个数组的 64 个切片来喂养神经网络怎么办?

这是我的代码摘录:

with tf.name_scope('data'):
train_filenames = tf.constant(list_of_files_train)
train_data = tf.data.Dataset.from_tensor_slices(train_filenames)
train_data = train_data.map(lambda filename: tf.py_func(
self._parse_xxx_data, [filename], [tf.float32]))
train_data.shuffle(buffer_size=len(list_of_files_train))
train_data.batch(b_size)
iterator = tf.data.Iterator.from_structure(train_data.output_types, train_data.output_shapes)
input_data = iterator.get_next()
train_init = iterator.make_initializer(train_data)
[...]
with tf.Session() as sess:
sess.run(train_init)
_ = sess.run([self.train_op])

提前致谢

----------

我在下面的评论中发布了我的问题的解决方案。我仍然很高兴收到有关可能改进的任何评论或建议。谢谢;)

已经很长时间了,但我会发布一个可能的解决方案,以在 TensorFlow 中使用自定义形状批处理数据集,以防有人可能需要它。

该模块tf.data提供了解包每个数据集元素内容的方法unbatch()。可以先取消批处理,然后以所需的方式再次批处理数据集对象。通常,一个好主意也可能是在再次批处理之前对未批处理的数据集进行洗牌(以便我们在每批中都有来自随机元素的随机切片(:

with tf.name_scope('data'):
train_filenames = tf.constant(list_of_files_train)
train_data = tf.data.Dataset.from_tensor_slices(train_filenames)
train_data = train_data.map(lambda filename: tf.py_func(
self._parse_xxx_data, [filename], [tf.float32]))
# un-batch first, then batch the data
train_data = train_data.apply(tf.data.experimental.unbatch())
train_data.shuffle(buffer_size=BSIZE)
train_data.batch(b_size)
# [...]

如果我清楚地理解你的问题,你可以尝试在self._parse_xxx_data函数中将数组切成你想要的形状。

最新更新