我希望将现有数据集的大小加倍,以便通过向其中添加随机噪声来动态训练张量流中的神经网络。因此,当我完成时,我将拥有所有现有示例以及添加了噪声的所有示例。我也喜欢在变换它们时交织它们,所以它们按顺序出现:示例1没有噪声,示例1有噪声,示例2没有噪声,示例2有噪声等等。我' m使用Dataset 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
。我猜测张量流是试图从该批次中产生一个张量我返回,但是features
和labels
是不同的形状,因此不起作用。我可以通过制作两个数据集并将它们合并在一起来做到这一点,但是我担心会导致非常偏斜的训练,我训练了一半的时间,突然所有的数据都有了这个新的转换。下半场。如何在不将这些转换写入磁盘之前动态完成此操作,然后再加入tensorflow?
答案 0 :(得分:3)
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)