当前位置:   article > 正文

TensorFlow学习笔记(13)数据增强_tensorflow数据增强

tensorflow数据增强

        本篇笔记主要记录了TensorFlow中对图片数据进行增强的两种方法。

        1、使用keras预处理层

        tf.keras.layers.Ressize 改变图片大小

        tf.keras.layers.Rescaling    归一化

  1. #对图片大小进行统一,并归一化
  2. IMG_SIZE = 180
  3. resize_and_rescale = tf.keras.Sequential([
  4. layers.Resizing(IMG_SIZE, IMG_SIZE),
  5. layers.Rescaling(1./255)
  6. ])

        tf.keras.layers.RandomFlip    随机翻转

        tf.keras.layers.RandomRotation    随机旋转

  1. #对图片进行随机翻转和旋转
  2. data_augmentation = tf.keras.Sequential([
  3. layers.RandomFlip("horizontal_and_vertical"),
  4. layers.RandomRotation(0.2),
  5. ])

   tf.keras.layers.RandomContrast    随机调整图片的对比度

   tf.keras.layers.RandomCrop    随机裁剪图片

   tf.keras.layers.RandomZoom    随机缩放图片

        在进行数据增强的操作后,如何使用这些图像成了重中之重。目前有两种处理方式:

        ①使预处理层成为模型的一部分

  1. model = tf.keras.Sequential([
  2. resize_and_rescale,
  3. data_augmentation,
  4. layers.Conv2D(16, 3, padding='same', activation='relu'),
  5. layers.MaxPooling2D(),
  6. ])

        当使用model.save导出模型时,预处理层会和其他网络层一同保存。如果再次在其他数据集上使用此模型,会根据已经设定好的预处理层再次标准化图像。测试时,数据增强预处理层是停用的,只有在调用model.fit的时候,才会对输入图像进行增强。model.evaluate和model.predict并不会对图像进行处理。

        ②将预处理层应用于数据集

  1. aug_ds = train_ds.map(
  2. lambda x, y: (resize_and_rescale(x, training=True), y))
  3. #匿名函数对x和y进行处理,使用map函数将处理后的x和y一一对应

        通过这种方式对数据集进行批次增强,数据增强在CPU上异步进行,此时可以使用dataset.prefetch预读取将GPU上的模型训练和数据预处理重叠。而且在调用model.save时,预处理层并不会随模型一并导出。在保存模型或者重现时,需要将其加到模型上。

演示:

  1. batch_size = 32
  2. AUTOTUNE = tf.data.AUTOTUNE
  3. def prepare(ds, shuffle=False, augment=False):
  4. ds = ds.map(lambda x, y: (resize_and_rescale(x), y),
  5. num_parallel_calls=AUTOTUNE)
  6. #数据增强
  7. if shuffle:
  8. ds = ds.shuffle(1000)
  9. ds = ds.batch(batch_size)
  10. #每32个分为一个batch
  11. #仅仅在训练层使用数据增强
  12. if augment:
  13. ds = ds.map(lambda x, y: (data_augmentation(x, training=True), y),
  14. num_parallel_calls=AUTOTUNE)
  15. return ds.prefetch(buffer_size=AUTOTUNE)
  16. train_ds = prepare(train_ds, shuffle=True, augment=True)
  17. val_ds = prepare(val_ds)
  18. test_ds = prepare(test_ds)
  19. model = tf.keras.Sequential([
  20. layers.Conv2D(16, 3, padding='same', activation='relu'),
  21. layers.MaxPooling2D(),
  22. layers.Conv2D(32, 3, padding='same', activation='relu'),
  23. layers.MaxPooling2D(),
  24. layers.Conv2D(64, 3, padding='same', activation='relu'),
  25. layers.MaxPooling2D(),
  26. layers.Flatten(),
  27. layers.Dense(128, activation='relu'),
  28. layers.Dense(num_classes)
  29. ])
  30. model.compile(optimizer='adam',
  31. loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
  32. metrics=['accuracy'])
  33. epochs=5
  34. history = model.fit(
  35. train_ds,
  36. validation_data=val_ds,
  37. epochs=epochs
  38. )
  39. loss, acc = model.evaluate(test_ds)
  40. print("Accuracy", acc)

2、使用tf.image

使用tf.data和tf.image编写数据增强层,常见的调整方式有:

tf.image.flip_left_right    左右翻转

tf.image.rgb_to_grayscale    变为灰度图

tf.image.adjust_brightness    调整亮度

tf.image.central_crop    裁剪图像中心区域

tf.image.adjust_saturation    调整饱和度

除此之外,还有一些随机变换帮助泛化和拓展数据的方式。

tf.image.stateless_random_brightness

tf.image.stateless_random_contrast

tf.image.stateless_random_crop

tf.image.stateless_random_flip_left_right

tf.image.stateless_random_flip_up_down

tf.image.stateless_random_hue

tf.image.stateless_random_jpeg_quality

tf.image.stateless_random_saturation

经过这些api处理的输出图像,仅仅取决于输入。在随机调整的过程中,每一步都要求输入一个随机的seed值,只要是同一个seed,无论调用多少次输出的都是相同的结果。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/255213
推荐阅读
相关标签
  

闽ICP备14008679号