赞
踩
数据增强,扩展数据集
博主微信公众号(左)、Python+智能大数据+AI学习交流群(右):欢迎关注和加群,大家一起学习交流,共同进步!
目录
数据增强(增大数据量),可以帮助扩展数据集。
对图像的增强,就是对图像的简单形变,用来应对因拍照角度不同引起的图片变形。
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)
- # 给数据增加一个维度,从 (60000, 28, 28) reshape 为 (600000, 28, 28, 1)
- x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
(2)数据增强
- image_gen_train = ImageDataGenerator(
- rescale=1. / 255, # 原像素值 0~255 归至 0 ~ 1
- rotation_range=45, # 随机 45 度旋转
- width_shift_range=0.15, # 随机宽度偏移 [-0.15, 0.15]
- height_shift_range=0.15, # 随机高度偏移 [-0.15, 0.15]
- horizontal_flip=False, # 随机水平翻转
- zoom_range=0.5 # 随机缩放到 [1-50%, 1+50%]
- )
-
- 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), ...)
- model.fit(
- image_gen_train.flow(
- x_train, # 训练集输入特征
- y_train, # 训练集标签
- batch_size=32, # 每次喂入网络32组数据
- ),
- epochs=5, # 数据集迭代5次
- validation_data=(x_test, y_test), # 测试集输入特征,测试集标签
- validation_freq=1) # 每迭代1次训练集执行一次测试集的评测
- """
- 数据增强,扩展数据集
- """
- # 模块导入
- import tensorflow as tf
- from tensorflow.keras.preprocessing.image import ImageDataGenerator
-
- # 导入数据集,分别为输入特征和标签
- mnist = tf.keras.datasets.mnist
- # (x_train, y_train):(训练集输入特征,训练集标签)
- # (x_test, y_test):(测试集输入特征,测试集标签)
- (x_train, y_train), (x_test, y_test) = mnist.load_data()
- # 对输入网络的输入特征进行归一化,使原本0到255之间的灰度值,变为0到1之间的数值
- # (把输入特征的数值变小更适合神经网络吸收)
- x_train, x_test = x_train / 255.0, x_test / 255.0
-
- # 给数据增加一个维度,从 (60000, 28, 28) reshape 为 (600000, 28, 28, 1)
- x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
-
- # 数据增强
- image_gen_train = ImageDataGenerator(
- rescale=1. / 1., # 如为图像,分母为255时,可归至 0 ~ 1
- rotation_range=45, # 随机45度旋转
- width_shift_range=0.15, # 宽度偏移
- height_shift_range=0.15, # 高度偏移
- horizontal_flip=False, # 水平翻转
- zoom_range=0.5 # 将图像随机缩放阙量50%
- )
- image_gen_train.fit(x_train)
-
- # 搭建网络结构
- model = tf.keras.models.Sequential([
- tf.keras.layers.Flatten(), # 将输入特征拉直为一维数组,也就是拉直为28*28=784个数值
- tf.keras.layers.Dense(128, activation="relu"), # 第一层网络128个神经元,使用relu激活函数
- tf.keras.layers.Dense(10, activation="softmax") # 第二层网络10个神经元,使用softmax激活函数,使输出符合概率分布
- ])
-
- # 配置训练方法
- model.compile(optimizer="adam", # 优化器
- loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), # 损失函数,输出是概率分布,from_logits=False
- metrics=["sparse_categorical_accuracy"]) # 数据集中的标签是数值,神经网络输出y是概率分布
-
- # 执行训练过程
- model.fit(
- image_gen_train.flow(
- x_train, # 训练集输入特征
- y_train, # 训练集标签
- batch_size=32, # 每次喂入网络32组数据
- ),
- epochs=5, # 数据集迭代5次
- validation_data=(x_test, y_test), # 测试集输入特征,测试集标签
- validation_freq=1) # 每迭代1次训练集执行一次测试集的评测
-
- # 打印出网络结构和参数统计
- model.summary()
- """
- 数据增强,扩展数据集
- """
- # 模块导入
- import tensorflow as tf
- from tensorflow.keras import Model
- from tensorflow.keras.layers import Dense, Flatten
- from tensorflow.keras.preprocessing.image import ImageDataGenerator
-
- # 导入数据集,分别为输入特征和标签
- mnist = tf.keras.datasets.mnist
- # (x_train, y_train):(训练集输入特征,训练集标签)
- # (x_test, y_test):(测试集输入特征,测试集标签)
- (x_train, y_train), (x_test, y_test) = mnist.load_data()
- # 对输入网络的输入特征进行归一化,使原本0到255之间的灰度值,变为0到1之间的数值
- # (把输入特征的数值变小更适合神经网络吸收)
- x_train, x_test = x_train / 255.0, x_test / 255.0
-
- # 给数据增加一个维度,从 (60000, 28, 28) reshape 为 (600000, 28, 28, 1)
- x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
-
- # 数据增强
- image_gen_train = ImageDataGenerator(
- rescale=1. / 1., # 如为图像,分母为255时,可归至 0 ~ 1
- rotation_range=45, # 随机45度旋转
- width_shift_range=0.15, # 宽度偏移
- height_shift_range=0.15, # 高度偏移
- horizontal_flip=False, # 水平翻转
- zoom_range=0.5 # 将图像随机缩放阙量50%
- )
- image_gen_train.fit(x_train)
-
- # 搭建网络结构
- class MnistModel(Model):
- def __init__(self):
- super(MnistModel, self).__init__()
- self.flatten = Flatten() # 将输入特征拉直为一维数组,也就是拉直为28*28=784个数值
- self.d1 = Dense(128, activation="relu") # 第一层网络128个神经元,使用relu激活函数
- self.d2 = Dense(10, activation="softmax") # 第二层网络10个神经元,使用softmax激活函数,使输出符合概率分布
-
- def call(self, x):
- x = self.flatten(x)
- x = self.d1(x)
- y = self.d2(x)
- return y
-
-
- model = MnistModel()
-
- # 配置训练方法
- model.compile(optimizer="adam", # 优化器
- loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), # 损失函数,输出是概率分布,from_logits=False
- metrics=["sparse_categorical_accuracy"]) # 数据集中的标签是数值,神经网络输出y是概率分布
-
- # 执行训练过程
- model.fit(
- image_gen_train.flow(
- x_train, # 训练集输入特征
- y_train, # 训练集标签
- batch_size=32, # 每次喂入网络32组数据
- ),
- epochs=5, # 数据集迭代5次
- validation_data=(x_test, y_test), # 测试集输入特征,测试集标签
- validation_freq=1) # 每迭代1次训练集执行一次测试集的评测
-
- # 打印出网络结构和参数统计
- model.summary()
- """
- 数据增强可视化:显示原始图像和增强后的图像
- """
-
- # 模块导入
- import numpy as np
- import tensorflow as tf
- from matplotlib import pyplot as plt
- from tensorflow.keras.preprocessing.image import ImageDataGenerator
-
- # 导入数据集,分别为输入特征和标签
- mnist = tf.keras.datasets.mnist
- # (x_train, y_train):(训练集输入特征,训练集标签)
- # (x_test, y_test):(测试集输入特征,测试集标签)
- (x_train, y_train), (x_test, y_test) = mnist.load_data()
-
- # 给数据增加一个维度,从 (60000, 28, 28) reshape 为 (600000, 28, 28, 1)
- x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
-
- # 数据增强
- image_gen_train = ImageDataGenerator(
- rescale=1. / 255, # 原像素值 255 归至 0 ~ 1
- rotation_range=45, # 随机45度旋转
- width_shift_range=0.15, # 宽度偏移
- height_shift_range=0.15, # 高度偏移
- horizontal_flip=False, # 水平翻转
- zoom_range=0.5 # 将图像随机缩放阙量50%
- )
- image_gen_train.fit(x_train)
-
- print(f"x_train: {x_train.shape}")
- x_train_subset1 = np.squeeze(x_train[:12])
- print(f"x_train_subset1: {x_train_subset1.shape}")
-
- print(f"x_train: {x_train.shape}")
- x_train_subset2 = x_train[:12] # 一次显示12张图片
- print(f"x_train_subset2: {x_train_subset2.shape}")
-
- fig = plt.figure(figsize=(20, 2))
- plt.set_cmap("gray")
-
- # 显示原始图片
- for i in range(0, len(x_train_subset1)):
- ax = fig.add_subplot(1, 12, i + 1)
- ax.imshow(x_train_subset1[i])
- fig.suptitle('Subset of Original Training Images', fontsize=20)
- plt.show()
-
- # 显示增强后的图片
- fig = plt.figure(figsize=(20, 2))
- for x_batch in image_gen_train.flow(x_train_subset2, batch_size=12, shuffle=False):
- for i in range(0, 12):
- ax = fig.add_subplot(1, 12, i + 1)
- ax.imshow(np.squeeze(x_batch[i]))
- fig.suptitle('Augmented Images', fontsize=20)
- plt.show()
- break
原始图像:
增强后的图像:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。