CNN中的多通道卷积(RGB等)

卷积过程是对一个通道的图像进行卷积,比如10个卷积核,得到10个feature map, 那么输入图像为RGB三个通道呢,输出就为 30个feature map吗, 答案肯定不是的, 输出的个数依然是卷积核的个数10,只是输出时对RGB三个通道加和。

1、 一通道多个卷积核卷积过程:

一个卷积核得到的特征提取是不充分的,我们可以添加多个卷积核,比如32个卷积核,可以学习32种特征。在有多个卷积核时,如下图所示:输出就为32个feature map。

卷积神经网络


2.多通道的多个卷积核

下图展示了在四个通道上的卷积操作,有两个卷积核,生成两个通道。其中需要注意的是,四个通道上每个通道对应一个卷积核。

先将w2忽略,只看w1,那么在w1的某位置(i,j)处的值,是由四个通道上(i,j)处的卷积结果相加然后再取激活函数值得到的。  所以最后得到两个feature map, 即输出层的卷积核核个数为 feature map 的个数。

卷积神经网络

卷积神经网络

所以,在上图由4个通道卷积得到2个通道的过程中,参数的数目为4×2×2×2个,其中4表示4个通道,第一个2表示生成2个通道,最后的2×2表示卷积核大小。

3.实例

下图是一个3d的RGB效果,每个kernel(filter)可以扫描出一张feature map,多个filter可以叠加出很厚的feature maps,前一层filter做卷积可以形成后一层的一个像素点


如下图,可以代表i行j列k深度的一个输出像素值,k’代表第k个filter,w代表filter中的值,x代表输入,b是偏值。

4.计算实例

假设有两个卷积核为:,因此M=2,kernel_h=2,kernel_w=2,K= kernel_h * kernel_w=4。

输入图像矩阵为:,因此image_h=3,image_w=3,令边界扩展为0即pad_h=0,pad_w=0,滑动步长为1,即stride_h=1,stride_w=1,故N=[(3+2*0-2)/1+1]*[ (3+2*0-2)/1+1]=2*2=4。

A矩阵(M*K)为(一行为一个卷积核),B矩阵(K*N)为(B矩阵的每一列为一个卷积核要卷积的大小)

计算C矩阵:

C=A*B=*=

C中的分别为两个输出特征图像即feature map。验证了 有几个卷积核就有几个feature map。


说明:

在Caffe源码中,src/caffe/util/math_functions.cu(如果使用CPU则是src/util/math_functions.cpp)中的caffe_gpu_gemm()函数,其中有两个矩阵A(M*K)与矩阵 B(K*N),大家可以通过输出M、K、N的值即相应的矩阵内容来验证上述的原理,代码中的C矩阵与上述的C矩阵不一样,代码中的C矩阵存储的是偏置bias,×是A与B相乘后得到M*N大小的矩阵,然后再跟这个存储偏置的矩阵C相加完成卷积过程。如果是跑Mnist训练网络的话,可以看到第一个卷积层卷积过程中,M=20,K=25,N=24*24=576。

  (caffe中涉及卷积具体过程的文件主要有:src/caffe/layers/conv_layer.cu、src/caffe/layers/base_conv_layer.cpp、src/caffe/util/math_functions.cu、src/caffe/util/im2col.cu)


参考:

1.多通道(比如RGB三通道)卷积过程

https://blog.csdn.net/u014114990/article/details/51125776

2.【机器学习】彻底搞懂CNN

https://www.cnblogs.com/rucwxb/p/7975504.html




猜你喜欢

转载自blog.csdn.net/qinghuaci666/article/details/80834167