Tensorflow——深度可分离卷积

316 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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万多来自全连接层

可见,深度可分离卷积在参数量的降低上是非常巨大的