【问题标题】:How do I correctly apply data augmentation to a TFRecord Dataset?如何正确地将数据扩充应用到 TFRecord 数据集?
【发布时间】:2020-07-29 07:35:24
【问题描述】:

我正在尝试在 TFRecord 数据集被解析后对其应用数据扩充。但是,当我在映射增强函数之前和之后检查数据集的大小时,大小是相同的。我知道解析函数正在工作并且数据集是正确的,因为我已经使用它们来训练模型。所以我只包含了映射函数并在之后计算示例的代码。

这是我正在使用的代码:

num_ex = 0

def flip_example(image, label):
    flipped_image = flip(image)
    return flipped_image, label


dataset = tf.data.TFRecordDataset('train.TFRecord').map(parse_function)
for x in dataset:
    num_ex += 1

num_ex = 0
dataset = dataset.map(flip_example)

#Size of dataset
for x in dataset:
    num_ex += 1

在这两种情况下,num_ex = 324,而不是非增强的预期 324 和增强的 648。我还成功地测试了翻转功能,所以问题似乎在于该功能如何与数据集交互。我如何正确实现这种增强?

【问题讨论】:

    标签: python tensorflow tensorflow-datasets data-augmentation


    【解决方案1】:

    当您使用tf.data API 应用数据增强时,它即时完成,这意味着每个示例都按照您的方法中实现的方式进行转换。以这种方式扩充数据并不意味着管道中的示例数量会发生变化。

    如果您想使用每个示例 n 次,只需添加 dataset = dataset.repeat(count=n)。您可能需要更新您的代码以使用tf.image.random_flip_left_right,否则每次翻转都以相同的方式完成。

    【讨论】:

    • 感谢您的回复。这更有意义。那么,如果我想要原始数据和增强数据都用于训练,最好的方法是使用 tf.data API 随机翻转一定比例的图像并对结果进行批处理?此外,我用于翻转的功能特定于我正在使用的图像类型,并且已经进行了随机化。但我很欣赏这个建议。
    • 没错。如果您使用dataset.repeat(count=n) 向网络显示n 时期的数据,并且您的翻转概率为0.5,您可以预期每个方向出现n/2 次。
    【解决方案2】:

    在您的示例中,您第二次检查 num_ex 时,数据集仅包含翻转的图像,因此为 324。 此外,如果您有一个大于 324 的大型数据集,您可能需要研究在线数据增强。在这种情况下,在训练期间,每个 epoch 都会对数据集进行不同的扩充,并且您仅在扩充数据上进行训练,而不是在原始数据集上进行培训。这有助于训练好的模型更好地泛化。 (https://www.tensorflow.org/tutorials/images/data_augmentation)

    【讨论】:

    • 感谢您的回复。我看过那个教程,但不清楚原始图像是否也包含在训练中,以及它如何增强数据而不是仅仅转换原始图像并使用那些(所以相同数量的训练示例)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    相关资源
    最近更新 更多