1,卷积作用:减少参数(卷积核参数共享),卷积过程中不断对上一个输出进行抽象,由局部特征归纳为全局特征(不同卷积层可视化可以观察到这点)
2,卷积核
早期卷积核由人工总结,如图像处理中有:
深度神经网络中,卷积核则由网络训练过程中学习获得。
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)过程中信息丢失问题,实现像素级的语义分割。
如图,卷积核大小不变,但是中间可以留空,这样可以增大卷积核的视野,而无需扩大卷积核大小(增加参数/计算量)。
- 反卷积(转置卷积):反卷积核与元素卷积核的输入输出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)
以上参数就不具体说明了,在此只是作个汇总,方便查看。