1,卷积作用:减少参数(卷积核参数共享),卷积过程中不断对上一个输出进行抽象,由局部特征归纳为全局特征(不同卷积层可视化可以观察到这点)

2,卷积核

早期卷积核由人工总结,如图像处理中有:

cnn是卷积核越多越好吗_卷积核

cnn是卷积核越多越好吗_ide_02

深度神经网络中,卷积核则由网络训练过程中学习获得。

3, 神经网络中的卷积类型

  • Group convolution:分组卷积。对通道channel进行分组后分别卷积。减少参数。

比如输入和输出通道都为64,卷积核大小为3*3,则原始参数量为64*3*3*64=36864,通道分组为8组,每组输入输出都为32,参数量为8*8*3*3*8=4608。为原来的1/8。

  • Depthwise convolution卷积核深度为1,只对相应通道的空间部分卷积
  • Pointwise convolution:卷积核大小为1*1,只对通道部分卷积
  • Depthwise Separable convolution:上面2者结合即为此。先对每个通道的空间部分卷积,再对各个通道卷积,分离了空间与channel。减少参数。

比如,输入通道为16,输出通道为32,使用卷积核大小3*3,如果直接卷积,则我们需要32个卷积核,每个参数为3*3*16,总参数为32*3*3*16=4608。分开操作时,第一步,我们每个卷积核只一个输入通道进行卷积,即对空间部分卷积,需要16个卷积核,每个3*3*1,共144个参数;第二步,对通道部分卷积,此时不需要对空间卷积了,所以卷积核大小为1*1(即保留原始空间信息),对16个通道卷积,即一个卷积核参数为1*1*16,输出32则用32个卷积核,共16*32=512个参数。总参数656个。参数量为原来的1/7。对于空间和通道较独立的数据,使用此方法不仅效率高,而且效果好。

  • Dilated convolution:空洞卷积。解决下采样(pooling)过程中信息丢失问题,实现像素级的语义分割。

cnn是卷积核越多越好吗_cnn是卷积核越多越好吗_03

 

 如图,卷积核大小不变,但是中间可以留空,这样可以增大卷积核的视野,而无需扩大卷积核大小(增加参数/计算量)。

  • 反卷积(转置卷积):反卷积核与元素卷积核的输入输出shape是交换形式,实现还原原始shape的操作。

4,tensorflow实现

常规卷积

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, Name=None)

可以用高级API,这里步长对于样本和通道维度默认设为1了,所以只有2个参数。对于dilation也是如此。同时还有trainable等特性。

tf.layers.Conv2D(
    filters,
    kernel_size,
    strides=(1, 1),
    padding='valid',
    data_format='channels_last',
    dilation_rate=(1, 1),
    activation=None,
    use_bias=True,
    kernel_initializer=None,
    bias_initializer=<tensorflow.python.ops.init_ops.Zeros object at 0x000001ECFFC4D188>,
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None,
    trainable=True,
    name=None,
    **kwargs,
)

Depthwise convolution

tf.nn.depthwise_conv2d(input, filter, strides, padding, rate=None, name=None, data_format=None)

Separable convolution

tf.nn.separable_conv2d(input, depthwise_filter, pointwise_filter, strides, padding, rate=None, name=None, data_format=None)

反卷积

tf.nn.conv2d_transpose(value, filter, output_shape, strides, padding="SAME", data_format="NHWC", name=None)

以上参数就不具体说明了,在此只是作个汇总,方便查看。