携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
-
深度可分离卷积
- 深度可分离卷积是普通卷积操作的一个变种,它可以替代普通卷积,从而构成卷积神经网络
-
模型结构
-
-
-
视野域
- 什么是视野域?
- 输出单元是和多少个输出单元相关的,对于一个3x3的卷积来说,输出单元的每个单元都是可以看到输入单元的3x3的区域的;对于两层的3x3的卷积来说,每一个输出都能看到之前的一个5x5的区域,这样的区域就是视野域
- 不用的视野域提取的图像特征尺度不同
- 视野域是可以叠加的
- 提升效率
-
普通卷积计算量:
-
- DK是卷积核的大小,DF输入图像的大小,M输入通道的数目,N输出通道的数目
-
深度可分离卷积计算量
- 深度可分离
-
- 1*1卷积
-
- 深度可分离
-
优化比例
-
深度可分离卷积实战
模型构建:
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"])
模型展示:
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 28, 28, 32) 320
_________________________________________________________________
separable_conv2d (SeparableC (None, 28, 28, 32) 1344
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 14, 14, 32) 0
_________________________________________________________________
separable_conv2d_1 (Separabl (None, 14, 14, 64) 2400
_________________________________________________________________
separable_conv2d_2 (Separabl (None, 14, 14, 64) 4736
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 7, 7, 64) 0
_________________________________________________________________
separable_conv2d_3 (Separabl (None, 7, 7, 128) 8896
_________________________________________________________________
separable_conv2d_4 (Separabl (None, 7, 7, 128) 17664
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 3, 3, 128) 0
_________________________________________________________________
flatten (Flatten) (None, 1152) 0
_________________________________________________________________
dense (Dense) (None, 128) 147584
_________________________________________________________________
dense_1 (Dense) (None, 10) 1290
=================================================================
Total params: 184,234
Trainable params: 184,234
Non-trainable params: 0
相比于之前定义的卷积神经网络,参数是43万多
使用深度可分离卷积替代之后,发现参数是18万多,其中14万多来自全连接层
可见,深度可分离卷积在参数量的降低上是非常巨大的