CNN中的卷积
很多文章都介绍过卷积的操作:用一个小的卷积核在图像上滑动,每次滑动计算出一个值,比如用3*3的卷积核卷积一个5*5的矩阵(不考虑扩展边缘),过程如下:
卷积操作在二维平面上很好理解,但是在CNN中,被卷积的矩阵是有深度的:
这个深度可以类比三通道的RGB图像想象。所以被卷积的矩阵的维度是depth*height*width
,那么针对这样的矩阵,卷积操作是如何进行的呢?一次卷积涉及到的参数量又是多少呢?
斯坦福的教程里说:
Every filter is small spatially (along width and height), but extends through the full depth of the input volume.
大致意思就是,每次卷积的操作是在“一小块儿面积,但是全部深度”上进行的。假如这一层输入的维度是32*32*3,卷积核的维度是5*5*3(这里,5*5两个维度可以随意设计,但是3是固定的,因为输入数据的第三维度的值是3),那么得到的输入应该是28*28*1的。问题来了,怎么把立体的卷积成平面了呢?
上边的操作只使用了一个卷积核,如果使用多个卷积核呢,比如12个?那得到的输入就是立体的了28*28*12。没错,CNN中就是这么操作的,但是请注意两个名词局部连接
和权值共享
,关于这两个词有很多解释,这里不再赘述。
然后来计算一下参数量
还是上边的例子:32*32*3的输入,5*5*3的卷积核,需要的参数个数是5*5*3=75.
该层使用12个卷积核的话,总参数个数(没有算偏置项)5*5*3*12=900.
可以看一下caffe中conv的源码:
template <typename Dtype>
void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*