本文涉及到的是中国大学慕课《人工智能实践:Tensorflow笔记》第四讲的内容,对神经网络八股进行拓展。这里介绍的是通过tensorflow实现mnist手写数字的数据增强,即图像增强的简单应用。
在tensorflow中,常用的图像增强方法有以下几种: 缩放系数:rescale=所有数据将乘以提供的值 随机旋转:rotation_range=随机旋转角度数范围 宽度偏移:width_shift_range=随机宽度偏移量 高度偏移:height_shift_range=随机高度偏移量 水平翻转:horizontal_flip=是否水平随机翻转 随机缩放:zoom_range=随机缩放的范围 [1-n,1+n]
代码示例:
image_gen_train = ImageDataGenerator( rescale=1./255, #原像素值 0~255 归至 0~1 rotation_range=45, #随机 45 度旋转 width_shift_range=.15, #随机宽度偏移 [-0.15,0.15) height_shift_range=.15, #随机高度偏移 [-0.15,0.15) horizontal_flip=True, #随机水平翻转 zoom_range=0.5 #随机缩放到 [1-50%,1+50%] )从神经网络搭建的六步法来看,与DL with python(6)——Keras实现手写数字识别(全连接网络)中直接导入mnist数据的代码相比,数据增强的代码在第一步、第二步和第五步有所改动。
需要注意的是,因为mnist数据集的数据质量较好,因此对其进行数据增强的效果并不明显,需要在实际应用中体会数据增强的作用。今后有机会将其运用到实际数据中,我再进行介绍。
# 第一步,导入相关模块 import tensorflow as tf from tensorflow.keras.preprocessing.image import ImageDataGenerator # 第二步,导入数据集 mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 x_train = x_train.reshape(x_train.shape[0], 28, 28, 1) # 给数据增加一个维度,从(60000, 28, 28)reshape为(60000, 28, 28, 1) image_gen_train = ImageDataGenerator( rescale=1. / 1., # 如为图像,分母为255时,可归至0~1 rotation_range=45, # 随机45度旋转 width_shift_range=.15, # 宽度偏移 height_shift_range=.15, # 高度偏移 horizontal_flip=False, # 水平翻转 zoom_range=0.5 # 将图像随机缩放阈量50% ) image_gen_train.fit(x_train) # 第三步,搭建网络结构 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(), # 输入特征拉直为1-D数组 tf.keras.layers.Dense(128, activation='relu'), # 网络层1 tf.keras.layers.Dense(10, activation='softmax') # 网络层2,输出概率分布 ]) # 第四步,配置训练方法 model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['sparse_categorical_accuracy']) # 第五步,执行训练,依次为训练集样本,训练集标签,小批量大小32,训练轮次5,测试集,训练集循环1轮次进行一次测试 model.fit(image_gen_train.flow(x_train, y_train, batch_size=32), epochs=5, validation_data=(x_test, y_test), validation_freq=1) # 第六步,打印网络结构和参数统计 model.summary()