深度学习入门之第五章:经典卷积神经网络( 五 )


数据生成器通过Tensorflow中的ImageDataGenerator函数调用 。 具体使用方法如下 。
(1)定义两个不同的数据生成器 , 其中validation_generator为生成的验证数据集 , train_generator为生成的训练数据集 。
(2)以validation_generator为例 , 在ImageDataGenerator中 , 参数resale=1.0/255用于将图像的像素取值转换为0~1 。
(3)函数flow_from_directory表示数据生成器要从本地目录data/ChineseStyle/test中读取数据 。 由于该目录下有两个不同的子目录 , 一个叫作lishu , 另一个叫作xingkai , 所以程序会知道这是一个二类别问题 。
(4)统一原始图像的像素规格 , 因为Tensorflow要求输入的像素必须一致 , 定义IMSIZE=227 , 因此不管输入图像是什么规格 , 输出一定是227×227像素的 。
(5)batch_size=200代表每次读200张图像 。
(6)因变量为categorical , 说明是一个分类问题 。
到此 , 完成了验证数据集生成器的定义 , 同样的操作也应用在train_generator上 。 这就是数据生成器的基本情况 , 具体如代码示例5-5所示 。
代码示例5-5:数据生成器
1from Keras.preprocessing.image import ImageDataGenerator 2 3IMSIZE=227 4 5validation_generator = ImageDataGenerator(rescale=1./255).flow_from_directory( 6'./data_alex/ChineseStyle/test/', 7target_size=(IMSIZE, IMSIZE), 8batch_size=200, 9class_mode='categorical')1011train_generator = ImageDataGenerator(rescale=1./255).flow_from_directory(12'./data_alex/ChineseStyle/train',13target_size=(IMSIZE, IMSIZE),14batch_size=200,15class_mode='categorical')数据读入后 , 利用pyplot函数将原始图像的中文字体展示在画板上 , 首先通过plt.figure()将画布初始化 , 利用plt.subplots()将画板设定为2行5列的形式 , 其中高为6个单位 , 宽为15个单位 , 将每一个位置用ax记录下来 , 把validation_generator数据生成器输入给一个特定的命令next() , 它会不停地向外输出数据 , 每执行一次next() , 就输出一张图像 , 这里输出10张图像 。 具体如代码示例5-6 。
代码示例5-6:输出图像
1from matplotlib import pyplot as plt23plt.figure()4fig,ax = plt.subplots(2,5)5fig.set_figheight(7)6fig.set_figwidth(15)7ax=ax.flatten()8X,Y=next(validation_generator)9for i in range(10): ax[i].imshow(X[i,:,:,:])输出:
深度学习入门之第五章:经典卷积神经网络文章插图
03
AlexNet代码实现
有了LeNet-5的代码基础 , 相信大家看懂AlexNet的代码不是难事 , AlexNet的代码如代码示例5-7 , 代码细节不再赘述 。
代码示例5-7:AlexNet代码实现
1from Keras.layers import Activation,Conv2D, BatchNormalization, Dense 2from Keras.layers import Dropout, Flatten, Input, MaxPooling2D, ZeroPadding2D 3from Keras import Model 4 5IMSIZE = 227 6input_layer = Input([IMSIZE,IMSIZE,3]) 7x = input_layer 8x = Conv2D(96,[11,11],strides = [4,4], activation = 'relu')(x)9x = MaxPooling2D([3,3], strides = [2,2])(x)10x = Conv2D(256,[5,5],padding = "same", activation = 'relu')(x)11x = MaxPooling2D([3,3], strides = [2,2])(x)12x = Conv2D(384,[3,3],padding = "same", activation = 'relu')(x) 13x = Conv2D(384,[3,3],padding = "same", activation = 'relu')(x) 14x = Conv2D(256,[3,3],padding = "same", activation = 'relu')(x) 15x = MaxPooling2D([3,3], strides = [2,2])(x)16x = Flatten()(x)17x = Dense(4096,activation = 'relu')(x)18x = Dropout(0.5)(x)19x = Dense(4096,activation = 'relu')(x)20x = Dropout(0.5)(x)21x = Dense(2,activation = 'softmax')(x) 22output_layer=x23model=Model(input_layer,output_layer)24model.summary()


推荐阅读