Python tf.data.Dataset的扩充

Python tf.data.Dataset的扩充,python,tensorflow,machine-learning,keras,Python,Tensorflow,Machine Learning,Keras,在这里,我偶然发现了以下指南:为了增强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 =

在这里,我偶然发现了以下指南:为了增强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\u数据集
,并创建一个新的
augmented\u train\u批次
数据集,该数据集具有相同数量的图像,这些图像通过映射转换进行更改。之后,它将此数据集输入
。fit
如下:

model_with_aug.fit(augmented_train_batches, epochs=50, validation_data=validation_batches)
因此,我似乎无法理解的是:数据不是应该在每一个纪元之后进行更改,以便(根据文档)我们的模型不会多次看到相同的图像,而且会降低过度拟合的几率

在本教程中,
augmented\u train\u batches
是否只是一个经过轻微修改的数据集,反复输入到我们的模型中

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

另外,我认为扩充(如果做得正确)必须在每个历元之后以相同的方式更改预转换的数据,而不是继续将转换应用于相同的已更改数据集

是不是在每个时代之后都会以我无法理解的方式应用增强功能?

不,在本教程中,增强只执行一次,而不是在每个历元上执行。 当我们想要使用数据增强来训练每个历元生成增强数据的网络时,使用TF Keras图像数据生成器来生成它更容易。这将创建一个迭代器,您可以直接向模型提供扩展数据。你可以在这篇文章中了解更多

本教程只是向您介绍了数据扩充的基本概念和好处

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

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方法
.map()
将其应用到数据集中的每个项目中,可以进行翻转、平移或旋转等微小更改。我们的神经网络会认为这些是不同的图像

在本教程中,分别训练非增强数据和训练增强数据只是为了比较并显示差异有多小

在本例中,增强模型在验证集上收敛到约95%的精度。这比未经数据扩充训练的模型略高(+1%)。


我们可以清楚地看到,两者之间没有很大的区别。但通常情况下,增强用于向数据集中提供更多修改后的数据,因此如果将其与原始数据集合并并增加历元的数量,结果可能会产生更大的差异。

图像数据生成器是否可以应用于tf.data.dataset?