深度可分离卷积
深度可分离卷积是普通卷积操作的变种,可以替代不同卷积,从而构成卷积神经网络。
对于一个普通卷积,首先进行3*3的卷积操作,在进行批归一化,在经过relu,形成一个完整的卷积层。
对于深度可分离卷积,首先进行33的深度可分离卷积,在进行批归一化,然后relu,在经过11的卷积层,在进行批归一化,relu。
视野域指的是输出单元是和多少个输入单元相关联,对于一个33的矩阵来说,输出的每个单元,都可以看到输入矩阵中33的一个区域,对于一个两层的33卷积,输出可以看到两层之前的输入矩阵中55的一个方格,这样的区域对应的就是一个视野域。
减小输入,提升效率
对比普通卷积,输入的四个通道都是和输出的四个通道有关系的,而深度可分离卷积,只和输入的某一个通道有关系,从而减小计算量。
Dk代表卷积核大小,Df代表输入图像大小。M是输入通道的数目,N是输出通道的数目(卷积核数目也是输出通道的数目)
计算量很小,使得卷积神经网络可以在手机上运行
代码实现
model = keras.models.Sequential()
model.add(keras.layers.Conv2D(filters=32, kernel_size=3,
padding='same',
activation='selu',
input_shape=(28, 28, 1)))
#深度可分离卷积
model.add(keras.layers.SeparableConv2D(filters=32, kernel_size=3,
padding='same',
activation='selu'))
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.SeparableConv2D(filters=64, kernel_size=3,
padding='same',
activation='selu'))
model.add(keras.layers.SeparableConv2D(filters=64, kernel_size=3,
padding='same',
activation='selu'))
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.SeparableConv2D(filters=128, kernel_size=3,
padding='same',
activation='selu'))
model.add(keras.layers.SeparableConv2D(filters=128, kernel_size=3,
padding='same',
activation='selu'))
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(128, activation='selu'))
model.add(keras.layers.Dense(10, activation="softmax"))
model.compile(loss="sparse_categorical_crossentropy",
optimizer = "sgd",
metrics = ["accuracy"])
参数减小了
训练
学习曲线
可以发现迭代第二次后loss开始下降了,accuracy往上升,说明只要经过长时间的训练,模型可以达到一个好的效果。
测试
以精度损失为代价,换取计算量的减小和参数量的减小。