keras深度可分离卷积SeparableConv2D与DepthwiseConv2D

keras中的深度可分离卷积有 SeparableConv2D与DepthwiseConv2D两种方式实现。

可分离卷积分为两步:1、深度方向的空间卷积

                                    2、将通道进行混合的逐点卷积

传统卷积

深度可分离卷积

深度方向卷积

 

逐点卷积

 DepthwiseConv2D仅仅实现前半部分的深度方向空间卷积

keras.layers.DepthwiseConv2D( kernel_size,
                              strides=(1, 1),
                              padding='valid',
                              depth_multiplier=1,
                              data_format=None, 
                              activation=None, 
                              use_bias=True, 
                              depthwise_initializer='glorot_uniform', 
                              bias_initializer='zeros',
                              depthwise_regularizer=None, 
                              bias_regularizer=None,
                              activity_regularizer=None, 
                              depthwise_constraint=None,
                              bias_constraint=None
                            )

参数: 

  • kernel_size: 一个整数,或者 2 个整数表示的元组或列表, 指明 2D 卷积窗口的高度和宽度。 可以是一个整数,为所有空间维度指定相同的值。
  • strides: 一个整数,或者 2 个整数表示的元组或列表, 指明卷积沿高度和宽度方向的步长。 可以是一个整数,为所有空间维度指定相同的值。 指定任何 stride 值 != 1 与指定 dilation_rate值 != 1 两者不兼容。
  • padding"valid" 或 "same" (大小写敏感)。
  • depth_multiplier: 每个输入通道的深度方向卷积输出通道的数量。 深度方向卷积输出通道的总数将等于 filterss_in * depth_multiplier
  • data_format: 字符串, channels_last (默认) 或 channels_first 之一,表示输入中维度的顺序。channels_last 对应输入尺寸为 (batch, height, width, channels), channels_first 对应输入尺寸为 (batch, channels, height, width)。 它默认为从 Keras 配置文件 ~/.keras/keras.json 中 找到的 image_data_format 值。 如果你从未设置它,将使用「channels_last」。
  • activation: 要使用的激活函数 (详见 activations)。 如果你不指定,则不使用激活函数 (即线性激活: a(x) = x)。
  • use_bias: 布尔值,该层是否使用偏置向量。
  • depthwise_initializer: 运用到深度方向的核矩阵的初始化器 详见 initializers)。
  • bias_initializer: 偏置向量的初始化器 (详见 initializers)。
  • depthwise_regularizer: 运用到深度方向的核矩阵的正则化函数 (详见 regularizer)。
  • bias_regularizer: 运用到偏置向量的正则化函数 (详见 regularizer)。
  • activity_regularizer: 运用到层输出(它的激活值)的正则化函数 (详见 regularizer)。
  • depthwise_constraint: 运用到深度方向的核矩阵的约束函数 (详见 constraints)。
  • bias_constraint: 运用到偏置向量的约束函数 (详见 constraints)。

例子 

 用 DepthwiseConv2D实现keras mobilenetv1的一层

#Conv2-3
    keras.layers.DepthwiseConv2D(kernel_size = (3,3), strides=(1, 1), padding='same', use_bias=False),#深度方向的卷积
    keras.layers.BatchNormalization(),
    keras.layers.Activation('relu'),
    keras.layers.Conv2D(64, (1,1), strides=(1, 1), padding='same', use_bias=False),#逐点卷积
    keras.layers.BatchNormalization(),
    keras.layers.Activation('relu'),

SeparableConv2D实现整个深度分离卷积过程,即深度方向的空间卷积 + 输出通道混合在一起的逐点卷积

keras.layers.SeparableConv2D( filters,
                              kernel_size, 
                              strides=(1, 1),
                              padding='valid',
                              data_format=None,
                              dilation_rate=(1, 1), 
                              depth_multiplier=1,
                              activation=None, 
                              use_bias=True, 
                              depthwise_initializer='glorot_uniform', 
                              pointwise_initializer='glorot_uniform',
                              bias_initializer='zeros', 
                              depthwise_regularizer=None, 
                              pointwise_regularizer=None, 
                              bias_regularizer=None,
                              activity_regularizer=None,
                              depthwise_constraint=None,
                              pointwise_constraint=None, 
                              bias_constraint=None
                            )

参数

  • filters: 整数,输出空间的维度 (即卷积中滤波器的输出数量)。
  • kernel_size: 一个整数,或者 2 个整数表示的元组或列表, 指明 2D 卷积窗口的高度和宽度。 可以是一个整数,为所有空间维度指定相同的值。
  • strides: 一个整数,或者 2 个整数表示的元组或列表, 指明卷积沿高度和宽度方向的步长。 可以是一个整数,为所有空间维度指定相同的值。 指定任何 stride 值 != 1 与指定 dilation_rate值 != 1 两者不兼容。
  • padding"valid" 或 "same" (大小写敏感)。
  • data_format: 字符串, channels_last (默认) 或 channels_first 之一,表示输入中维度的顺序。channels_last 对应输入尺寸为 (batch, height, width, channels), channels_first 对应输入尺寸为 (batch, channels, height, width)。 它默认为从 Keras 配置文件 ~/.keras/keras.json 中 找到的 image_data_format 值。 如果你从未设置它,将使用「channels_last」。
  • dilation_rate: 一个整数,或者 2 个整数表示的元组或列表, 为使用扩张(空洞)卷积指明扩张率。 目前,指定任何 dilation_rate 值 != 1 与指定任何 stride 值 != 1 两者不兼容。
  • depth_multiplier: 每个输入通道的深度方向卷积输出通道的数量。 深度方向卷积输出通道的总数将等于 filterss_in * depth_multiplier
  • activation: 要使用的激活函数 (详见 activations)。 如果你不指定,则不使用激活函数 (即线性激活: a(x) = x)。
  • use_bias: 布尔值,该层是否使用偏置向量。
  • depthwise_initializer: 运用到深度方向的核矩阵的初始化器 详见 initializers)。
  • pointwise_initializer: 运用到逐点核矩阵的初始化器 (详见 initializers)。
  • bias_initializer: 偏置向量的初始化器 (详见 initializers)。
  • depthwise_regularizer: 运用到深度方向的核矩阵的正则化函数 (详见 regularizer)。
  • pointwise_regularizer: 运用到逐点核矩阵的正则化函数 (详见 regularizer)。
  • bias_regularizer: 运用到偏置向量的正则化函数 (详见 regularizer)。
  • activity_regularizer: 运用到层输出(它的激活值)的正则化函数 (详见 regularizer)。
  • depthwise_constraint: 运用到深度方向的核矩阵的约束函数 (详见 constraints)。
  • pointwise_constraint: 运用到逐点核矩阵的约束函数 (详见 constraints)。
  • bias_constraint: 运用到偏置向量的约束函数 (详见 constraints)。

例子 

def test_model(input_size=(224, 224, 10)):
    _input = Input(shape=input_size, name='input')
    _output = SeparableConv2D(32, kernel_size=(3, 3), activation='relu', padding='same')(_input)
    model = keras.models.Model(_input, _output)
    model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input (InputLayer)           (None, 224, 224, 10)      0         
_________________________________________________________________
separable_conv2d_1 (Separabl (None, 224, 224, 32)      442       
=================================================================
Total params: 442
Trainable params: 442
Non-trainable params: 0
_________________________________________________________________

 


版权声明:本文为wuruivv原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。