卷积操作的实现

本文参考 Why GEMM is at the heart of deep learning

BLAS的全称是基础线性代数子程序库(Basic Linear Algebra Subprograms),提供了一些低层次的通用线性代数运算的实现函数,如向量的相加,数乘,点积和矩阵相乘等。BLAS的实现根绝硬件平台的不同而不同,常常利用了特定处理器的硬件特点进行加速计算(例如处理器上的向量寄存器和SIMD指令集),提供了C和Fortran语言支持。
不同的厂商根据自己硬件的特点,在BLAS的统一框架下,开发了自己的加速库,Intel的MKL,ATLAS和OpenBLAS。其中后面的三个均可以在Caffe中配置使用。
在BLAS中,实现了矩阵与矩阵相乘的函数gemm(GEMM: General Matrix to Matrix Multiplication)和矩阵和向量相乘的函数gemv,这两个数学运算的高效实现,关系到整个DL 框架的运算速度。

可以看到,在前向计算过程中,无论是CPU还是GPU,大量时间都花在了卷积层和全连接层上。

全连接层

对于全连接层的操作为输出神经元需要和输入相乘并求和得出输出,其过程如下图所示:

k为输入数据的维度,n为全连接层神经元的个数,可以看出每个神经元都要和输入相乘求和得到一个输出,n个神经元并得到n个输出。

卷积层

在卷积核对多通道的特征图或者输入图像进行处理时其效果如图所示:
—>

实现过程

第一步是将输入图像或特征图从3D数组转换成的二维数组。应用卷积操作的位置都是图像中的一个小三维立方体,因此我们将这些立方体中的值拉直作为矩阵的一行。这就是所谓的im2col,如图所示:

为了实现矩阵乘积的操作,还需要不卷积核拉直到矩阵中,这时需要把卷积核拉伸为一列,具体的GEMM过程为:

如果卷积核的大小3x3,输入的特征图的通道数为16,则k=3x3x16,卷积操作输出的特征图的个数为卷积核的个数即kernel matrix的列数。

猜你喜欢

转载自blog.csdn.net/kuguadaoren/article/details/80040677