如何在 Tensorflow 中使用附加示例转换来扩展 tf.data.Dataset

Rob*_*opp 0 python tensorflow tensorflow-datasets

我想通过向现有数据集添加随机噪声来将我用来动态训练张量流中的神经网络的现有数据集的大小加倍。因此,当我完成后,我将拥有所有现有示例以及添加了噪音的所有示例。我还想在转换它们时将它们交错,因此它们按以下顺序出现:示例 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())
Run Code Online (Sandbox Code Playgroud)

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

mrr*_*rry 6

转换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)
Run Code Online (Sandbox Code Playgroud)