如何在 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 时都会生成随机值)。