【问题标题】:How to expand tf.data.Dataset with additional example transformations in Tensorflow如何使用 Tensorflow 中的其他示例转换扩展 tf.data.Dataset
【发布时间】:2017-11-16 18:46:49
【问题描述】:

我想通过向其添加随机噪声来将用于在 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 之前,如何在不将这些转换写入磁盘的情况下即时完成此操作?

【问题讨论】:

    标签: python tensorflow tensorflow-datasets


    【解决方案1】:

    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)
    

    【讨论】:

    • 这将如何将非噪声样本与噪声样本交错?看起来它只是将整个嘈杂的 ds 连接到非嘈杂的 ds 的末尾。在我缺少的 flat_map 引擎盖下是否有一些交错魔法?
    • 它将交替使用非噪声样本和噪声样本。 flat_map() 中的嵌套可能有点令人惊讶,因为 featureslabels 表示单个输入样本:您可以将其解读为“对于 dataset 的每个元素,构建一个包含一个非通过连接两个单元素数据集,然后将嵌套数据集展平,将噪声和一个噪声样本连接起来。”
    • 啊,灯泡!我真的不明白 flat_map 在做什么,非常感谢!完全有效!
    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    相关资源
    最近更新 更多