首页 > 其他分享 >[caffe解读] caffe从数学公式到代码实现5-caffe中的卷积

[caffe解读] caffe从数学公式到代码实现5-caffe中的卷积

时间:2022-10-12 15:37:50浏览次数:53  
标签:数学公式 layer conv 卷积 im2col caffe cpu gemm


今天要讲的就是跟卷积相关的一些layer了

im2col_layer.cpp

base_conv_layer.cpp

conv_layer.cpp

deconv_layer.cpp

inner_product_layer.cpp

01

im2col_layer.cpp

这是caffe里面的重要操作,caffe为什么这么耗显存,跟这个有很大关系。im2col的目的,就是把要滑动卷积的图像,先一次性存起来,然后再进行矩阵乘操作。简单来说,它的输入是一个C*H*W的blob,经过im2col操作会变成K' x (H x W) 的矩阵,其中K' =C*kernel_r*kernel_r,kernel_r就是卷积核的大小,这里只看正方形的卷积核。

如果不用这样的操作,贾扬清有一个吐槽,对于输入大小为W*H,维度为D的blob,卷积核为M*K*K,那么如果利用for循环,会是这样的一个操作,6层for循环,计算效率是极其低下的。

for w in 1..W

具体im2col是什么原理呢?先贴出贾扬清的回答,https://www.zhihu.com/question/28385679

[caffe解读] caffe从数学公式到代码实现5-caffe中的卷积_反向传播

上面说了,要把C*H*W的blob,变成K' x (H x W)或者 (H x W) xK' 的矩阵,把filters也复制成一个大矩阵,这样两者直接相乘就得到结果,下面看一个简单小例子。

借用网友一张图,虽然和caffe细节上不同,但是还是有助于理解

4*4的原始数据,进行stride=1的3*3操作,其中im2col的操作就是:

[caffe解读] caffe从数学公式到代码实现5-caffe中的卷积_卷积_02

也就是说4*4的矩阵,经过了im2col后,变成了9*4的矩阵,卷积核可以做同样扩展,卷积操作就变成了两个矩阵相乘。

下面看im2col的代码;

template <typename Dtype>

相关注释已经放在了上面,col2im的操作非常类似,可以自行看源码,这一段要自己写出来怕是需要调试一些时间。

有了上面的核心代码后,Forward只需要调用im2col,输入为bottom_data,输出为top_data,Backward只需要调用col2im,输入为top_diff,输出为bottom_diff即可,代码就不贴出了。

02

conv_layer.cpp,base_conv_layer.cpp

数学定义不用说,我们直接看代码,这次要两个一起看。由于conv_layer.cpp依赖于base_conv_layer.cpp,我们先来看看base_conv_layer.hpp中包含了什么东西,非常多。

base_conv_layer.hpp变量:

/// @brief The spatial dimensions of a filter kernel.

非常之多,因为卷积发展到现在,已经有很多的参数需要控制。无法一一解释了,stride_,pad_,dilation是和卷积步长有关参数,kernel_shape_是卷积核大小,conv_input_shape_是输入大小,output_shape是输出大小,其他都是以后遇到了再说,现在我们先绕过。更具体的解答,有一篇博客可以参考

下面直接看conv_layer.cpp。既然是卷积,输出的大小就取决于很多参数,所以先要计算输出的大小。

void ConvolutionLayer<Dtype>::compute_output_shape() {

然后,在forward函数中,

template <typename Dtype>

我们知道卷积层的输入,是一个blob,输出是一个blob,从上面代码知道卷积核的权重存在了this->blobs_[0]->cpu_data()中, this->blobs_[1]->cpu_data()则是bias,当然不一定有值。外层循环大小为bottom.size(),可见其实可以有多个输入。

看看里面最核心的函数,this>forward_cpu_gemm。

输入input,输出col_buff,关于这个函数的解析,https://tangxman.github.io/2015/12/07/caffe-conv/解释地挺详细,我大概总结一下。

首先,按照调用顺序,对于3*3等正常的卷积,forward_cpu_gemm会调用conv_im2col_cpu函数(在base_conv_layer.hpp中),它的作用看名字就知道,将图像先转换为一个大矩阵,将卷积核也按列复制成大矩阵;

然后利用caffe_cpu_gemm计算矩阵相乘得到卷积后的结果。

template <typename Dtype>

反向传播:

template <typename Dtype>

略去bias,从上面源码可以看出,有this->weight_cpu_gemm和this->backward_cpu_gemm两项。

this->backward_cpu_gemm是计算bottom_data的反向传播的,也就是feature map的反向传播。

template <typename Dtype>

}

weight_cpu_gemm是计算权重的反向传播的;

template <typename Dtype>

其中诸多细节,看不懂就再去看源码,一次看不懂就看多次。

03

 deconv_layer.cpp

[caffe解读] caffe从数学公式到代码实现5-caffe中的卷积_卷积_03

卷积,就是将下图转换为上图,一个输出像素,和9个输入像素有关。反卷积则反之,计算反卷积的时候,就是把上图输入的像素乘以卷积核,然后放在下图对应的输出各个位置,移动输入像素,最后把所有相同位置的输出相加。

template <typename Dtype>

forward直接调用了backward_cpu_gemm函数,反向的时候就直接调用forward函数,这里肯定是需要反复去理解的,一次不懂就多次。

template <typename Dtype>

04

inner_product_layerfilter.hpp

既然卷积层已经读过了,现在该读一读全连接层了。

全连接层和卷积层的区别是什么?就是没有局部连接,每一个输出都跟所有输入有关,如果输入feature map是H*W,那么去卷积它的核也是这么大,得到的输出是一个1*1的值。

它在setup函数里面要做一些事情,其中最重要的就是设定weights的尺寸,下面就是关键代码。num_output是一个输出标量数,比如imagenet1000类,最终输出一个1000维的向量。

K是一个样本的大小,当axis=1,实际上就是把每一个输入样本压缩成一个数,C*H*W经过全连接变成1个数。

const int num_output = this->layer_param_.inner_product_param().num_output();

所以,weight的大小就是N*K_。

有了这个之后,forward就跟conv_layer是一样的了。

好了,这一节虽然没有复杂的公式,但是很多东西够大家喝一壶了,得仔细推敲才能好好理解的。caffe_cpu_gemm是整节计算的核心,感兴趣的去看吧!


标签:数学公式,layer,conv,卷积,im2col,caffe,cpu,gemm
From: https://blog.51cto.com/u_14122493/5750916

相关文章

  • 【caffe解读】 caffe从数学公式到代码实现4-认识caffe自带的7大loss
    文章首发于微信公众号《与有三学AI》​本节说caffe中常见loss的推导,具体包含下面的cpp。multinomial_logistic_loss_layer.cppsoftmax_loss_layer.cppeuclidean_loss_laye......
  • 【caffe解读】 caffe从数学公式到代码实现2-基础函数类
    文章首发于微信公众号《与有三学AI》​接着上一篇,本篇就开始读layers下面的cpp,先看一下layers下面都有哪些cpp。absval_layer.cppaccuracy_layer.cppargmax_layer.cppbas......
  • 【caffe解读】 caffe从数学公式到代码实现1-导论
    ​真的很多年没有认真写csdn博客了,我回来了今天开一个新板块,目标是死磕现有的几大机器学习框架的代码,给想入门的小白们一些帮助。作为一个在图像行业战斗了几年的程序员,深知......
  • 【从caffe到Tensorflow 1】io 操作
    最近项目要频繁用到tensorflow,所以不得不认真研究下tensorflow而不是跟之前一样遇到了就搞一下了。首先我觉得所有这些框架里面caffe是最清晰的,所以就算是学习tensorflow,我......
  • ShuffleNetV1:极致轻量化卷积神经网络(分组卷积+通道重排)
    参考论文:ShuffleNet:AnExtremelyEfficientConvolutionalNeuralNetworkforMobileDevices作者:XiangyuZhang,XinyuZhou,MengxiaoLin,JianSun  1、论文摘要 ......
  • markdown数学公式
    title:markdown数学公式excerpt:反正latex也要学这些~tags:[markdown,latex,数学公式]categories:[life,software]index_img:https://picture-store-reposit......
  • 简述卷积操作
     卷积操作将一个人为规定大小(3*3)的卷积核,先以左上角的输入数据重合,按对应元素做乘法运算,再将该卷积核范围内的所有乘积求和。步长(stride卷积核每次移动的步数)stride=......
  • 卷积神经网络
    卷积神经网络:CNN应用领域:CV领域、检测任务、分类与检索、超分辨率重构、医学任务、无人驾驶、人脸识别卷积网络与传统网络区别:维度:三维二维输......
  • 基础干货:高效卷积,降内存提速度保精度(附论文下载)
    公众号ID|ComputerVisionGzq学习群|扫码在主页获取加入方式论文地址:​​https://arxiv.org/pdf/1901.01928v1.pdf​​计算机视觉研究院专栏作者:Edison_G深度学习模型在目标检......
  • 稀疏&集成的卷积神经网络学习
    计算机视觉研究院专栏作者:Edison_G今天主要和大家说的是分类检测过程中,一些稀疏和集成学习的相关知识,首先和大家说下图像目标定位与检测的方法分类。公众号ID|ComputerVision......