如何在 Tensorflow 中使用其他示例转换扩展 tf.data.Dataset

How to expand tf.data.Dataset with additional example transformations in Tensorflow

我想通过向其中添加随机噪声,将我用来在 tensorflow 中动态训练神经网络的现有数据集的大小加倍。所以当我完成后,我将拥有所有现有示例以及所有添加了噪音的示例。我还想在转换它们时交错这些,所以它们按以下顺序出现:示例 1 没有噪音,示例 1 有噪音,示例 2 没有噪音,示例 2 有噪音,等等。我正在努力完成这个使用数据集 api。我试过像这样使用 unbatch 来完成此操作:

def generate_permutations(features, labels):
    return [
        [features, labels],
        [add_noise(features), labels]
    ]

dataset.map(generate_permutations).apply(tf.contrib.data.unbatch())

但我收到一条错误消息 Shapes must be equal rank, but are 2 and 1。我猜 tensorflow 正试图从我要返回的那批中制作一个张量,但是 featureslabels 是不同的形状,所以这是行不通的。我可能可以通过制作两个数据集并将它们连接在一起来做到这一点,但我担心这会导致训练非常偏斜,我在一半的时间里训练得很好,突然间所有数据在第二个时间点都进行了这种新的转换一半。在输入 tensorflow 之前,如何在不将这些转换写入磁盘的情况下即时完成此操作?

Dataset.flat_map() 转换是您需要的工具:它使您能够将单个输入元素映射到多个元素,然后将结果展平。您的代码如下所示:

def generate_permutations(features, labels):
    regular_ds = tf.data.Dataset.from_tensors((features, labels))
    noisy_ds = tf.data.Dataset.from_tensors((add_noise(features), labels))
    return regular_ds.concatenate(noisy_ds)

dataset = dataset.flat_map(generate_permutations)