【问题标题】:Augmentation of a tf.data.Datasettf.data.Dataset 的扩充
【发布时间】:2020-03-18 17:03:48
【问题描述】:

按照this 指南,我偶然发现了这个:为了增加 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)

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

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

或者在每个 epoch 之后以某种我无法理解的方式应用增强?

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

【问题讨论】:

    标签: python tensorflow machine-learning keras


    【解决方案1】:

    在每个 epoch 之后以某种我无法理解的方式应用增强?

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

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

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

    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%)。

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

    【讨论】:

    • 图像数据生成器能否应用于 tf.data.Dataset?
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2019-07-03
    • 1970-01-01
    • 2021-10-05
    相关资源
    最近更新 更多