如何直接使用 map 函数在第一个 epoch 生成的转换,而不是每个 epoch 都执行 map 函数?

How to directly use the transformation generated by map function in first epoch instead of executing map function every epoch?

我想使用映射函数对数据集应用一些转换。但是,我发现 map 函数在每个 epoch 都被执行了。 有没有可能map函数只在第一个epoch执行,后面的epoch直接使用第一个epoch生成的transformation?

如果您使用 Tensorflow 设置种子并使用 tf.image 应用转换,则随机转换将在各个时期之间保持一致。

import tensorflow as tf
from skimage import data
tf.random.set_seed(42)
import matplotlib.pyplot as plt

def transform(image):
    image = tf.image.random_hue(image, 0.5, 1.)
    image = tf.image.random_flip_left_right(image)
    image = tf.image.random_flip_up_down(image)
    return image

X = tf.stack([data.chelsea() for i in range(4)])
ds = tf.data.Dataset.from_tensor_slices(X).map(transform)

inputs = [[], []]

for epoch in range(2):
    for sample in ds:
        inputs[epoch].append(sample)

inputs_paired = [i for s in inputs for i in s]

fig = plt.figure(figsize=(16, 8))
plt.subplots_adjust(wspace=.1, hspace=.1)
for i in range(8):
    ax = plt.subplot(2, 4, i + 1)
    ax.set_xticks([])
    ax.set_yticks([])
    ax.imshow(inputs_paired[i])
plt.show()

顶部是第一个纪元,底部是第二个纪元。