深度学习(二)卷积计算

写在前面:所有关于深度学习的基础知识均为鄙人的笔记分享,很多内容摘自大神们的博客或论文,因时间太长记不清了分别来自哪里。若有侵权,请联系鄙人邮箱[email protected]

目前,卷积的计算大多采用间接计算的方式,主要有以下三种实现方式:

  • im2col + GEMM。 caffe等很多框架中都使用了这种计算方式,原因是将问题转化为矩阵乘法后可以方便的使用很多矩阵运算库(如MKL、openblas、Eigen等)。
  • FFT变换。 时域卷积等于频域相乘,因此可将问题转化为简单的乘法问题。
  • Winograd。 这种不太熟悉,据说在GPU上效率更高。 NNPACK就是FFT和Winograd方法的结合。

上面三种方法执行效率都还不错,但对内存占用比较高,因为需要存储中间结果或者临时辅助变量。

 

im2col + GEMM 原理

darknet中应用了与caffe一样的函数

 

下面传有两个动图形象说明

å·ç§¯ç¥ç»ç½ç»

注意!!!!:

1 多通道多卷积操作计算过程

如图5,输入图像layer m-1有4个通道,同时有2个卷积核w1和w2。对于卷积核w1,先在输入图像4个通道分别作卷积,再将4个通道结果加起来得到w1的卷积输出;卷积核w2类似。所以对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量!

缩进对多通道图像做1x1卷积,其实就是将输入图像于每个通道乘以卷积系数后加在一起,即相当于把原图像中本来各个独立的通道“联通”在了一起。

 

2 卷积核计算过程

1、首先,假设输入图片大小是 224*224*3(224是图像宽或高,3是三个通道,也就是RGB三种)

2、然后,假设conv1层的是 7*7*96 (7*7是卷积核的size k,96是卷积核的个数n),stride = 2;

3、所以conv1得到的结果是110*110*96([(w-k+pad)/stride+1] * [(h-k+pad)/stride+1] * n) (这个110来自于 (224-7+pad)/2+1 = 110 ,这个pad是我们常说的填充,也就是在图片的周围补充像素,这样做的目的是为了能够整除,除以2是因为2是图中的stride);

4、再做一次池化pooling,得到pool1, 池化的核的大小是3*3,所以池化后图片的维度是55*55*96 ( (110-3+pad)/2 +1 =55 );

 

 

猜你喜欢

转载自blog.csdn.net/u013247002/article/details/84855817