如何在 Tensorflow Data API 中正确使用 dataset.map
How to use dataset.map in Tensorflow Data API correctly
我正在学习如何使用 Tensorflow 数据 API,并且很难理解映射的工作原理。对于上下文,我想加载图像数据集并将它们发送到神经网络。
下面的 MWE 在想法中做到了这一点(大小为 10 的假数据集,read_image
函数映射到数据集)。
import tensorflow as tf
import numpy as np
def read_image(filename, label):
return np.random.rand(8, 8, 1), label # simulate data load (generate random data)
# generate fake dataset of filenames (of size 10)
filenames = tf.constant(np.asarray(["file" + str(i) for i in range(10)]))
labels = tf.constant(np.asarray([2*i for i in range(10)]))
dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
dataset = dataset.map(read_image)
dataset = dataset.repeat().batch(2)
iterator = tf.data.Iterator.from_structure(dataset.output_types, dataset.output_shapes)
X, y = iterator.get_next()
train_init_op = iterator.make_initializer(dataset)
with tf.Session() as session:
tf.global_variables_initializer().run()
session.run(train_init_op)
for _ in range(10):
print(session.run([X]))
当 运行 这段代码(应该什么也不做,只是打印 read_image
生成的值)时,它总是以相同的数据结束: read_image
被调用只有一次。这是为什么 ?我使用了 dataset.map
,难道不应该在我的数据集的每个元素(这里是 10 个)上调用它吗?
在此先感谢您的帮助或建议。
我对它的理解是错误的,我实际上想出了如何让它发挥作用。这个映射函数是 "integrated" 到 Tensorflow 图,因此确实只调用了一次。里面需要用到TF操作
如果read_image
被替换为:
def read_image(filename, label):
return tf.random_normal([4]), tf.random_normal([1])
它按预期工作(每次调用 session.run
时都会生成随机值)。
我正在学习如何使用 Tensorflow 数据 API,并且很难理解映射的工作原理。对于上下文,我想加载图像数据集并将它们发送到神经网络。
下面的 MWE 在想法中做到了这一点(大小为 10 的假数据集,read_image
函数映射到数据集)。
import tensorflow as tf
import numpy as np
def read_image(filename, label):
return np.random.rand(8, 8, 1), label # simulate data load (generate random data)
# generate fake dataset of filenames (of size 10)
filenames = tf.constant(np.asarray(["file" + str(i) for i in range(10)]))
labels = tf.constant(np.asarray([2*i for i in range(10)]))
dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
dataset = dataset.map(read_image)
dataset = dataset.repeat().batch(2)
iterator = tf.data.Iterator.from_structure(dataset.output_types, dataset.output_shapes)
X, y = iterator.get_next()
train_init_op = iterator.make_initializer(dataset)
with tf.Session() as session:
tf.global_variables_initializer().run()
session.run(train_init_op)
for _ in range(10):
print(session.run([X]))
当 运行 这段代码(应该什么也不做,只是打印 read_image
生成的值)时,它总是以相同的数据结束: read_image
被调用只有一次。这是为什么 ?我使用了 dataset.map
,难道不应该在我的数据集的每个元素(这里是 10 个)上调用它吗?
在此先感谢您的帮助或建议。
我对它的理解是错误的,我实际上想出了如何让它发挥作用。这个映射函数是 "integrated" 到 Tensorflow 图,因此确实只调用了一次。里面需要用到TF操作
如果read_image
被替换为:
def read_image(filename, label):
return tf.random_normal([4]), tf.random_normal([1])
它按预期工作(每次调用 session.run
时都会生成随机值)。