当前位置:   article > 正文

Tensorflow2.x框架-神经网络八股扩展-数据增强_image_gen_train.fit

image_gen_train.fit

 

数据增强,扩展数据集

博主微信公众号(左)、Python+智能大数据+AI学习交流群(右):欢迎关注和加群,大家一起学习交流,共同进步!

目录

摘要

一、Tensorflow2.x 数据增强函数

二、Sequential() 实现数据增强

三、Class() 实现数据增强

四、数据增强可视化:显示原始图像和增强后的图像


摘要

    数据增强(增大数据量),可以帮助扩展数据集。

    对图像的增强,就是对图像的简单形变,用来应对因拍照角度不同引起的图片变形。

一、Tensorflow2.x 数据增强函数

image_gen_train = tf.keras.preprocessing.image.ImageDataGenerator(增强方法)

image_gen_train.fit(x_train)

常用增强方法:

    缩放系数:rescale=所有数据将乘以提供的值

    随机旋转:rotation_range=随机旋转角度数范围

    宽度偏移:width_shift_range=随机宽度偏移量

    高度偏移:hight_shift_range=随机高度偏移量

    水平翻转:horizontal_flip=是否水平随机翻转

    随机缩放:zoom_range=随机缩放的范围 [1-n, 1+n]

例:

(1)因为在数据增强 image_gen_train.fit(x_train) 时 fit() 函数输入的是 4 维数据,所以要对 x_train 进行 reshape:把 60000 张 28 行 28 列数据,变为,60000 张 28 行 28 列单通道数据(这个单通道是灰度值)。

  (60000, 28, 28)    ==>    (60000, 28, 28, 1)

  1. # 给数据增加一个维度,从 (60000, 28, 28) reshape 为 (600000, 28, 28, 1)
  2. x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)

(2)数据增强

  1. image_gen_train = ImageDataGenerator(
  2. rescale=1. / 255, # 原像素值 0~255 归至 0 ~ 1
  3. rotation_range=45, # 随机 45 度旋转
  4. width_shift_range=0.15, # 随机宽度偏移 [-0.15, 0.15]
  5. height_shift_range=0.15, # 随机高度偏移 [-0.15, 0.15]
  6. horizontal_flip=False, # 随机水平翻转
  7. zoom_range=0.5 # 随机缩放到 [1-50%, 1+50%]
  8. )
  9. image_gen_train.fit(x_train)

(3)model.fit() 同步更新为 .flow 形式

    model.fit(x_train, y_train, batch_size=32, ...) 变为 model.fit(image_train_train.flow(x_train, y_train, batch_size=32), ...)

  1. model.fit(
  2. image_gen_train.flow(
  3. x_train, # 训练集输入特征
  4. y_train, # 训练集标签
  5. batch_size=32, # 每次喂入网络32组数据
  6. ),
  7. epochs=5, # 数据集迭代5次
  8. validation_data=(x_test, y_test), # 测试集输入特征,测试集标签
  9. validation_freq=1) # 每迭代1次训练集执行一次测试集的评测

二、Sequential() 实现数据增强

  1. """
  2. 数据增强,扩展数据集
  3. """
  4. # 模块导入
  5. import tensorflow as tf
  6. from tensorflow.keras.preprocessing.image import ImageDataGenerator
  7. # 导入数据集,分别为输入特征和标签
  8. mnist = tf.keras.datasets.mnist
  9. # (x_train, y_train):(训练集输入特征,训练集标签)
  10. # (x_test, y_test):(测试集输入特征,测试集标签)
  11. (x_train, y_train), (x_test, y_test) = mnist.load_data()
  12. # 对输入网络的输入特征进行归一化,使原本0到255之间的灰度值,变为0到1之间的数值
  13. # (把输入特征的数值变小更适合神经网络吸收)
  14. x_train, x_test = x_train / 255.0, x_test / 255.0
  15. # 给数据增加一个维度,从 (60000, 28, 28) reshape 为 (600000, 28, 28, 1)
  16. x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
  17. # 数据增强
  18. image_gen_train = ImageDataGenerator(
  19. rescale=1. / 1., # 如为图像,分母为255时,可归至 0 ~ 1
  20. rotation_range=45, # 随机45度旋转
  21. width_shift_range=0.15, # 宽度偏移
  22. height_shift_range=0.15, # 高度偏移
  23. horizontal_flip=False, # 水平翻转
  24. zoom_range=0.5 # 将图像随机缩放阙量50%
  25. )
  26. image_gen_train.fit(x_train)
  27. # 搭建网络结构
  28. model = tf.keras.models.Sequential([
  29. tf.keras.layers.Flatten(), # 将输入特征拉直为一维数组,也就是拉直为28*28=784个数值
  30. tf.keras.layers.Dense(128, activation="relu"), # 第一层网络128个神经元,使用relu激活函数
  31. tf.keras.layers.Dense(10, activation="softmax") # 第二层网络10个神经元,使用softmax激活函数,使输出符合概率分布
  32. ])
  33. # 配置训练方法
  34. model.compile(optimizer="adam", # 优化器
  35. loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), # 损失函数,输出是概率分布,from_logits=False
  36. metrics=["sparse_categorical_accuracy"]) # 数据集中的标签是数值,神经网络输出y是概率分布
  37. # 执行训练过程
  38. model.fit(
  39. image_gen_train.flow(
  40. x_train, # 训练集输入特征
  41. y_train, # 训练集标签
  42. batch_size=32, # 每次喂入网络32组数据
  43. ),
  44. epochs=5, # 数据集迭代5次
  45. validation_data=(x_test, y_test), # 测试集输入特征,测试集标签
  46. validation_freq=1) # 每迭代1次训练集执行一次测试集的评测
  47. # 打印出网络结构和参数统计
  48. model.summary()

三、Class() 实现数据增强

  1. """
  2. 数据增强,扩展数据集
  3. """
  4. # 模块导入
  5. import tensorflow as tf
  6. from tensorflow.keras import Model
  7. from tensorflow.keras.layers import Dense, Flatten
  8. from tensorflow.keras.preprocessing.image import ImageDataGenerator
  9. # 导入数据集,分别为输入特征和标签
  10. mnist = tf.keras.datasets.mnist
  11. # (x_train, y_train):(训练集输入特征,训练集标签)
  12. # (x_test, y_test):(测试集输入特征,测试集标签)
  13. (x_train, y_train), (x_test, y_test) = mnist.load_data()
  14. # 对输入网络的输入特征进行归一化,使原本0到255之间的灰度值,变为0到1之间的数值
  15. # (把输入特征的数值变小更适合神经网络吸收)
  16. x_train, x_test = x_train / 255.0, x_test / 255.0
  17. # 给数据增加一个维度,从 (60000, 28, 28) reshape 为 (600000, 28, 28, 1)
  18. x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
  19. # 数据增强
  20. image_gen_train = ImageDataGenerator(
  21. rescale=1. / 1., # 如为图像,分母为255时,可归至 0 ~ 1
  22. rotation_range=45, # 随机45度旋转
  23. width_shift_range=0.15, # 宽度偏移
  24. height_shift_range=0.15, # 高度偏移
  25. horizontal_flip=False, # 水平翻转
  26. zoom_range=0.5 # 将图像随机缩放阙量50%
  27. )
  28. image_gen_train.fit(x_train)
  29. # 搭建网络结构
  30. class MnistModel(Model):
  31. def __init__(self):
  32. super(MnistModel, self).__init__()
  33. self.flatten = Flatten() # 将输入特征拉直为一维数组,也就是拉直为28*28=784个数值
  34. self.d1 = Dense(128, activation="relu") # 第一层网络128个神经元,使用relu激活函数
  35. self.d2 = Dense(10, activation="softmax") # 第二层网络10个神经元,使用softmax激活函数,使输出符合概率分布
  36. def call(self, x):
  37. x = self.flatten(x)
  38. x = self.d1(x)
  39. y = self.d2(x)
  40. return y
  41. model = MnistModel()
  42. # 配置训练方法
  43. model.compile(optimizer="adam", # 优化器
  44. loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), # 损失函数,输出是概率分布,from_logits=False
  45. metrics=["sparse_categorical_accuracy"]) # 数据集中的标签是数值,神经网络输出y是概率分布
  46. # 执行训练过程
  47. model.fit(
  48. image_gen_train.flow(
  49. x_train, # 训练集输入特征
  50. y_train, # 训练集标签
  51. batch_size=32, # 每次喂入网络32组数据
  52. ),
  53. epochs=5, # 数据集迭代5次
  54. validation_data=(x_test, y_test), # 测试集输入特征,测试集标签
  55. validation_freq=1) # 每迭代1次训练集执行一次测试集的评测
  56. # 打印出网络结构和参数统计
  57. model.summary()

四、数据增强可视化:显示原始图像和增强后的图像

  1. """
  2. 数据增强可视化:显示原始图像和增强后的图像
  3. """
  4. # 模块导入
  5. import numpy as np
  6. import tensorflow as tf
  7. from matplotlib import pyplot as plt
  8. from tensorflow.keras.preprocessing.image import ImageDataGenerator
  9. # 导入数据集,分别为输入特征和标签
  10. mnist = tf.keras.datasets.mnist
  11. # (x_train, y_train):(训练集输入特征,训练集标签)
  12. # (x_test, y_test):(测试集输入特征,测试集标签)
  13. (x_train, y_train), (x_test, y_test) = mnist.load_data()
  14. # 给数据增加一个维度,从 (60000, 28, 28) reshape 为 (600000, 28, 28, 1)
  15. x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
  16. # 数据增强
  17. image_gen_train = ImageDataGenerator(
  18. rescale=1. / 255, # 原像素值 255 归至 0 ~ 1
  19. rotation_range=45, # 随机45度旋转
  20. width_shift_range=0.15, # 宽度偏移
  21. height_shift_range=0.15, # 高度偏移
  22. horizontal_flip=False, # 水平翻转
  23. zoom_range=0.5 # 将图像随机缩放阙量50%
  24. )
  25. image_gen_train.fit(x_train)
  26. print(f"x_train: {x_train.shape}")
  27. x_train_subset1 = np.squeeze(x_train[:12])
  28. print(f"x_train_subset1: {x_train_subset1.shape}")
  29. print(f"x_train: {x_train.shape}")
  30. x_train_subset2 = x_train[:12] # 一次显示12张图片
  31. print(f"x_train_subset2: {x_train_subset2.shape}")
  32. fig = plt.figure(figsize=(20, 2))
  33. plt.set_cmap("gray")
  34. # 显示原始图片
  35. for i in range(0, len(x_train_subset1)):
  36. ax = fig.add_subplot(1, 12, i + 1)
  37. ax.imshow(x_train_subset1[i])
  38. fig.suptitle('Subset of Original Training Images', fontsize=20)
  39. plt.show()
  40. # 显示增强后的图片
  41. fig = plt.figure(figsize=(20, 2))
  42. for x_batch in image_gen_train.flow(x_train_subset2, batch_size=12, shuffle=False):
  43. for i in range(0, 12):
  44. ax = fig.add_subplot(1, 12, i + 1)
  45. ax.imshow(np.squeeze(x_batch[i]))
  46. fig.suptitle('Augmented Images', fontsize=20)
  47. plt.show()
  48. break

原始图像:

增强后的图像:

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

闽ICP备14008679号