训练的模型应用于口罩识别系统
今天要分析的一段代码:卷积神经网络模型
def build_model(inputshape,shape_count):
img_in = Input(shape=inputshape, name='img_in')
X = img_in
X = Convolution2D(8, 3, padding='same', activation='relu', name='conv1')(X)
X = MaxPooling2D(pool_size=2, strides=2, padding='same', name='maxpool1')(X)
X = Convolution2D(16, 3, padding='same', activation='relu', name='conv2')(X)
X = MaxPooling2D(pool_size=2, strides=2, padding='same', name='maxpool2')(X)
X_SHORT = X
X = Convolution2D(16, 3, padding='same', activation='relu', name='conv3')(X)
X = layers.add([X, X_SHORT])
X = Convolution2D(32, 3, padding='same', activation='relu', name='conv4')(X)
X = MaxPooling2D(pool_size=2, strides=2, padding='same', name='maxpool3')(X)
X = Convolution2D(64, 3, padding='same', activation='relu', name='conv5')(X)
X = MaxPooling2D(pool_size=2, strides=2, padding='same', name='maxpool4')(X)
X = Flatten(name='flattened')(X)
X = Dense(128, activation='relu', name='dense1')(X)
#Dense:定义网络层的基本方法
X = Dense(128, activation='relu', name='dense2')(X)
X = Dropout(0.25)(X)
classify = Dense(shape_count, activation='softmax', name='dense3')(X)
model = Model(inputs=[img_in], outputs=[classify])
return model
1.定义函数
def build_model(inputshape,shape_count)
inputshape为输入图片的维度和尺寸。
(例如64x64x3)
shape_count为输出的神经元个数或者输出的维度。
(例如在口罩识别系统中就两个输出:戴口罩与没带口罩,因此shape_count为2)
2.输入图片
img_in = Input(shape=inputshape, name='img_in')
X = img_in
在keras.layers.Input()方法中
shape为输入层的尺寸
name为输入层的名字
3.第一层卷积与池化
X = Convolution2D(8, 3, padding='same', activation='relu', name='conv1')(X)
X = MaxPooling2D(pool_size=2, strides=2, padding='same', name='maxpool1')(X)
在这一层的卷积层中,
第一个参数为卷积核的个数,
第二个参数为卷积核的尺寸(3x3),
第三个参数padding=‘same’为补零策略,即使输入的尺寸和输出的尺寸相同
第四个参数activation=‘relu’为激活函数
第五个参数为层的名字
在这一层的池化层中,
第一个参数为池化窗口的尺寸(2x2)
第二个参数为步长
第三四个参数同上
4.第二层卷积与池化
X = Convolution2D(16, 3, padding='same', activation='relu', name='conv2')(X)
X = MaxPooling2D(pool_size=2, strides=2, padding='same', name='maxpool2')(X)
X_SHORT = X
第二层的卷积核变成了16个
5.第三层卷积
X = Convolution2D(16, 3, padding='same', activation='relu', name='conv3')(X)
X = layers.add([X, X_SHORT])
将上一层的输出与这一层的输出相加
(我也不知道作用是啥…)
6.第四层卷积与池化
X = Convolution2D(32, 3, padding='same', activation='relu', name='conv4')(X)
X = MaxPooling2D(pool_size=2, strides=2, padding='same', name='maxpool3')(X)
卷积核的数量变成了32个
7.第五层卷积与池化
X = Convolution2D(64, 3, padding='same', activation='relu', name='conv5')(X)
X = MaxPooling2D(pool_size=2, strides=2, padding='same', name='maxpool4')(X)
卷积核的数量变成了64个
8.数据铺平
X = Flatten(name='flattened')(X)
输出展开为一维数据
9.第一层全连接
X = Dense(128, activation='relu', name='dense1')(X)
第一个参数为神经元个数
10.第二层全连接
X = Dense(128, activation='relu', name='dense2')(X)
同上
11.防止过拟合
X = Dropout(0.25)(X)
0.25为神经元被丢弃的概率
(这个好像挺深奥的,之后再深耕dropout吧)
12.归一化
classify = Dense(shape_count, activation='softmax', name='dense3')(X)
这一层的激活函数为softmax,最后将上一层的128个神经元转换为2个神经元(相对应的为戴口罩和没带口罩)
13.输出模型
model = Model(inputs=[img_in], outputs=[classify])
通过Model通用模型,设置输入为放入的图片,输出为classify。
最后返回model即为构建好的卷积神经网络。
总结:
对于卷积神经网络的python代码有了更深刻的理解,虽然有些地方还有困惑,但是大体的框架算是掌握了。此外,对于卷积神经网络的结构再一次加深了印象,但是某些细节还是需要继续琢磨。
继续学习ing…