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


02
数据预处理
数据加载之后需要进行一定的预处理工作 , 因为此时的X0和YO还不满足TensorFlow的数据规范 , 主要有以下3个问题 。
(1)X0是一个60000×28×28的立体矩阵 , 其中第一个维度6万代表样本量 , 剩下的两个维度代表像素矩阵的维度 , 因为这里为了满足TensorFlow的数据格式 , 还差一个维度 , 那就是通道数 , 所以要把X0从三维变成四维 , 即60000×28×28×1 。
(2)X0是个整数 , 最大值可以到255 , 但是TensorFlow要求输入的数值必须为0~1 , 所以要将X0和X1的数值除以255变成0~1的数 。
(3)Y0是一个数组 , 表示这个数字为0~9的哪一个 , 这也不符合TensorFlow的数据格式 , 需要把它转换成one-hot的编码形式 , 即变成一个长度为10的向量 。 例如 , 如果这个数字是5 , 那么在5对应的那个位置上写1 , 其余位置都是0 。
以上就是需要改变的3个方面 , 具体如代码示例5-2所示 。
代码示例5-2:数据预处理
1from Keras.utils import np_utils2N0=X0.shape[0];N1=X1.shape[0]3print([N0,N1])4X0 = X0.reshape(N0,28,28,1)/2555X1 = X1.reshape(N1,28,28,1)/2556YY0 = np_utils.to_categorical(Y0)7YY1 = np_utils.to_categorical(Y1)8print(YY1)输出:
1[60000, 10000]2[[0 0 0 ... 1 0 0]3[0 0 1 ... 0 0 0]4[0 1 0 ... 0 0 0]5...6[0 0 0 ... 0 0 0]7[0 0 0 ... 0 0 0]8[0 0 0 ... 0 0 0]]03
LeNet-5代码实现
完成了数据处理工作 , 接下来就可以用代码实现LeNet-5模型的网络结构 。 LeNet-5可以说是卷积神经网络最基础的模型 , 它的代码也相对易懂 , 如代码示例5-3所示 。 以下是对部分代码的解释 。
(1)前两行代表从Keras的layers中加载大量的模块用于构建CNN模型 , 这些模块包括Conv2D、Dense、Flatten、Input、MaxPooling2D和Model 。
【深度学习入门之第五章:经典卷积神经网络】(2)输入层 。 定义inpute_layer是一个28×28×1的像素矩阵 。
(3)卷积层 。 用函数Conv2D实现卷积操作 , 其中参数表示 , 用6个大小为5×5的卷积核进行padding=same的卷积操作 , 激活函数activation为ReLU 。
(4)池化层 。 使用函数Maxpooling2D , 采取的池化窗口大小为2×2 , 步长为[2,2] 。
(5)重复卷积和池化的操作 , 不同的是 , 更改了相应的参数 , 如卷积核数 , 卷积的形式等 。
(6)全连接层 。 Flatten函数将矩阵拉直成一维向量 , Dense函数构造全连接层 , 其中第一个参数表示神经元数 , 第二个参数表示激活函数的选择 。
(7)最后通过model.summary给出LeNet-5的模型概要和参数情况 。
代码示例5-3:LeNet-5代码实现
1from Keras.layers import Conv2D,Dense,Flatten,Input,MaxPooling2D2from Keras import Model 3 4input_layer = Input([28,28,1]) 5x = input_layer 6x = Conv2D(6,[5,5],padding = "same", activation = 'relu')(x)7x = MaxPooling2D(pool_size = [2,2], strides = [2,2])(x)8x = Conv2D(16,[5,5],padding = "valid", activation = 'relu')(x)9x = MaxPooling2D(pool_size = [2,2], strides = [2,2])(x)10x = Flatten()(x)11x = Dense(120,activation = 'relu')(x)12x = Dense(84,activation = 'relu')(x)13x = Dense(10,activation = 'softmax')(x)14output_layer=x15model=Model(input_layer,output_layer)16model.summary()以LeNet-5为例 , model.summary给出了一张非常详细的模型概要表 , 以这张表为例 , 介绍如何计算各层消耗的参数个数 。 从第二行第一个卷积层开始 。
(1)第一个卷积层 。 由于采取了6个5×5的卷积核进行same卷积 , 卷积核的大小是5×5 , 权重参数就是25 , 再加上一个偏置参数 , 所以一个卷积核的参数个数就是25+1=26 , 6个卷积核就是26×6=156 。


推荐阅读