繁体   English   中英

tf.data.Dataset 的增强

[英]Augmentation of a tf.data.Dataset

遵循指南,我偶然发现了这一点:为了增加 tf.data 数据集,我们手动使用 map 函数在原始数据集的每个图像中映射图像转换:

def convert(image, label):
  image = tf.image.convert_image_dtype(image, tf.float32) # Cast and normalize the image to [0,1]
  return image, label

def augment(image,label):
  image,label = convert(image, label)
  image = tf.image.convert_image_dtype(image, tf.float32) # Cast and normalize the image to [0,1]
  image = tf.image.resize_with_crop_or_pad(image, 34, 34) # Add 6 pixels of padding
  image = tf.image.random_crop(image, size=[28, 28, 1]) # Random crop back to 28x28
  image = tf.image.random_brightness(image, max_delta=0.5) # Random brightness

  return image,label

BATCH_SIZE = 64
# Only use a subset of the data so it's easier to overfit, for this tutorial
NUM_EXAMPLES = 2048

augmented_train_batches = (
    train_dataset
    # Only train on a subset, so you can quickly see the effect.
    .take(NUM_EXAMPLES)
    .cache()
    .shuffle(num_train_examples//4)
    # The augmentation is added here.
    .map(augment, num_parallel_calls=AUTOTUNE)
    .batch(BATCH_SIZE)
    .prefetch(AUTOTUNE)
) 

从我可以理解的事情是这样的:它采用原始的train_dataset并创建一个新的augmented_train_batches数据集,该数据集具有相同数量的由地图转换更改的图像。之后这样做是将这个数据集输入到.fit如下所示:

model_with_aug.fit(augmented_train_batches, epochs=50, validation_data=validation_batches)

所以我似乎无法理解的是:不是应该在每个时期之后更改数据,以便(根据文档)我们的模型不会多次看到相同的图像,而且使我们的过度拟合机会降低?

在本教程中, augmented_train_batches不只是一个稍微改变的数据集,它一遍又一遍地馈送到我们的模型中?

还是在每个时代之后以我无法理解的方式以某种方式应用了增强?

PSI 假设增强(如果正确完成)必须在每个 epoch 之后以相同的方式更改预转换的数据,而不是继续将转换应用于相同的更改数据集。

是否以我无法理解的方式在每个时代之后以某种方式应用了增强?

不,在本教程中,增强仅进行一次,而不是在每个时期进行。 当我们想使用 Data Augmentation 来训练每个 epoch 生成增强数据的网络时,使用 TF Keras Image Data Generator 来生成它会更容易。 这将创建一个迭代器,您可以直接向模型提供增强数据。 您可以在此链接中阅读更多相关信息。

本教程仅向您介绍数据增强的基本概念和好处。

请注意教程中的这一部分:

BATCH_SIZE = 64
# Only use a subset of the data so it's easier to overfit, for this tutorial
NUM_EXAMPLES = 2048

本教程仅打算使用数据子集,这就是为什么它更容易过度拟合,因此这可能是您担心过度拟合几率更高的原因。

增强是为了获得更多的数据,我们只需要对我们现有的数据集做一些小的改动。 小的更改,例如翻转或平移或旋转,您可以在其中使用tf.image并使用地图方法.map()将其应用于数据集中的每个项目。 我们的神经网络无论如何都会认为这些是不同的图像。

在教程中,将非增强数据与训练增强数据分开训练只是为了比较和显示差异有多大。

在这个例子中,增强模型在验证集上收敛到约 95% 的准确率。 这比没有数据增强的训练模型略高 (+1%)。

我们可以清楚地看到,两者之间没有太大的区别。 但通常使用增强的目的是为您的数据集提供更多更改的数据,因此如果您将其与原始数据集组合并增加时代数,结果可能会提供更大的差异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM