caffe im2col 详解

原文链接:https://blog.csdn.net/Mrhiuser/article/details/52672824

本文讲解的是caffe中卷积过程,众所周知caffe中卷积采用的是im2col和sgemm的方式。网上已经有很多的im2col的讲解。原本不打算写这篇文章(在此不得不吐槽下,网上有不少的讲解caffe im2col的过程的文章多是错的。一些文章和caffe的具体实现对不上,真不知道他们到底有没有看caffe代码的具体实现,正是因为那些文章,浪费了不少时间。)

 本文举例讲解caffe中im2col 和 sgemm的具体过程。在此之前先说明下:caffe中的数据是行优先(row-major)存储的。

一:im2col

  一个图像 input_num=1;

  图像通道 input_channel=1;

  图像高 input_h=4;

  图像宽 input_w=4;

  kernel高 kernel_h=3;

  kernel宽 kernel_w=3;

  stride=1;pad=0;

  卷积后,输出图像的计算公式:

  output_h=(input_h-kernel_h)/stride+1;

  output_w=(input_w-kernel_w)/stride+1;

  如下图,(注:图像中数据不代表图像的颜色数值)

原图(图a)按照从左到右、从上到下的过程,将(a)中大小为3*3(因为kernel大小为3*3)的矩阵拉成右图(图b)中的一列。具体过程如下图所示:


二:多通道的im2col

  假设有三个通道(R、G、B)图像通道 input_channel=3;

  图像在内存中的存储是:首先是连续存储第一通道的数据,然后再存储第二通道的数据,最后存储第三通道的数据。如下图:


多通道的im2col的过程,是首先im2col第一通道,然后在im2col第二通道,最后im2col第三通道。各通道im2col的数据在内存中也是连续存储的。如下图:


三、kernel

图像的每个通道对应一个kernel通道,如下图(注:为计算简单,将kernel的值设置为1,同样此值不代表颜色数值。)


kernel的通道数据在内存中也是连续存储的。所以上面的kernel图像也可以表示为下图:


三:矩阵乘 sgemm

在caffe中图像与kernel的矩阵乘,是kernel*img。即:在矩阵乘法中

M=1 ,

N=output_h * output_w

K=input_channels * kernel_h * kernel_w

如下图所示:


图像数据是连续存储,因此输出图像也可以如下图所示【output_h * output_w】=【2*2】:


四:多通道图像输出

在caffe中图像与kernel的矩阵乘中:

M=output_channels ,

N=output_h * output_w

K=input_channels * kernel_h * kernel_w

如下图:


同样,多个输出通道图像的数据是连续存储,因此输出图像也可以如下图所示【output_channels*output_h * output_w】=【3*2*2】,

(完)

————————————————

版权声明:本文为CSDN博主「Tiger-Gao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

你可能感兴趣的:(caffe im2col 详解)