一维卷积、二维卷积

1x1的卷积能做什么呢?
所谓信道压缩,Network in Network是怎么做到的?
对于如下的二维矩阵,做卷积,相当于直接乘以2,貌似看上去没什么意义。
在这里插入图片描述
但是,对于下面这种32通道的数据,如果我用1个1x1x32的卷积核与其做卷积运算,得到的就是1个6x6的矩阵。
一维卷积、二维卷积_第1张图片
在这个过程中,发生了如下的事情:
(1)遍历36个单元格(6x6)
(2)计算左图中32个信道中截面与卷积核中32个元素的乘积
(3)此时得到的结果,仍然是6x6x32的矩阵
(4)每个6x6的矩阵都叠加起来,得到一个6x6的矩阵
(5)接下来用Relu函数作用于这个6x6的矩阵
(6)得到6x6的输出
同理,如果我用N个1x1x32的卷积核与其做卷积运算,得到的就是N个6x6的矩阵。
所以,1x1的卷积,可以从根本上理解为:有一个全连接的神经网络,作用在了不同的32个位置上。
这种做法,通常称为1x1卷积或Network in Network。它的主要作用,就是降低信道数量。如下图
一维卷积、二维卷积_第2张图片
28x28x192的数据,被32个1x1x192的卷积核作用后,就变为28x28x32的数据。这也就是所谓信道压缩,信道降维。当然如果你愿意,也可以增加信道维度。

tf.nn.conv2d是怎样实现卷积的?
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
除去name参数用以指定该操作的name,与方法有关的一共五个参数:

input: 指需要做卷积的输入图像,它要求是一个Tensor,具有[batch, in_height, in_width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],注意这是一个4维的Tensor,要求类型为float32和float64其中之一

filter: 相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,有一个地方需要注意,第三维in_channels,就是参数input的第四维

strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4

padding: string类型的量,只能是”SAME”,”VALID”其中之一,这个值决定了不同的卷积方式

use_cudnn_on_gpu: bool类型,是否使用cudnn加速,默认为true

结果返回一个Tensor,这个输出,就是我们常说的feature map

卷积层和池化层的计算公式相同:
若没有边缘填充,padding=VALID,计算公式如下:O=ceil((W-K+1)/S)
若有边缘填充,padding=SAME,计算公式如下:O=ceil(W/S)
O是输出尺寸,W是输入尺寸的长或宽,K是过滤器尺寸,P是边缘填充,S是步长,ceil()表示向上取整函数

你可能感兴趣的:(一维卷积、二维卷积)