深度可分离卷积

如果我告诉你,有一个层可以替代Conv2D,并且可以让模型更加轻量(即更少的可训练权重参数)、速度更快(即更少的浮点数运算),还可以让任务性能提高几个百分点,那么如何呢?

深度可分离卷积(depthwise separable convolution)(SeparableConv2D)就可以做到这一点。这个层对输入的每个通道分别执行空间卷积,然后通过逐点卷积(1*1卷积)将输出通道混合。

深度可分离卷积_第1张图片

这相当于将空间特征学习和通道特征学习分开,如果你假设输入中的空间位置高度相关,但不同通道之间相对独立,那么这么做是有意义的。它需要的参数要少很多,计算量也更小,因此可以得到更小更快的模型。因为它是一种执行卷积更高效的方法,所以往往可以使用更少的数据学到更好的表示,从而得到性能更好的模型。

如果只用有限的数据从头开始训练小型模型,这些优点就会变得更加重要。例如,下面这个示例就是在小型数据集上构建一个轻量的深度可分离卷积网络,用于图像分类任务(softmax多分类)

from keras.models import Sequential, Model 
from keras import layers

height = 64
width = 64
channels = 3
num_classes = 10

model = Sequential()
model.add(layers.SeparableConv2D(32, 3, 
                                activation = 'relu',
                                input_shape = (height, width, channels,)))
model.add(layers.SeparableConv2D(64, 3, activation = 'relu'))
model.add(layers.MaxPooling2D(2))

model.add(layers.SeparableConv2D(64, 3, activation = 'relu'))
model.add(layers.SeparableConv2D(128, 3, activation = 'relu'))
model.add(layers.MaxPooling2D(2))

model.add(layers.SeparableConv2D(64, 3, activation = 'relu'))
model.add(layers.SeparableConv2D(128, 3, activation = 'relu'))
model.add(layers.GlobalAveragePooling2D())

model.add(layers.Dense(32, activation = 'relu'))
model.add(layers.Dense(num_classes, activation = 'softmax'))

model.compile(optimizer = 'rmsprop', loss = 'categorical_crossentropy')

对于规模更大的模型,深度可分离卷积是Xception架构的基础,Xception是一个高性能的卷积神经网络,内置于Keras中。在论文Xception : deep learning with depthwise separable convolutions中,可以进一步了解深度可分离卷积和Xception的理论基础。

你可能感兴趣的:(Keras)