darknet 源码阅读笔记(二)

从 https://github.com/BBuf/Darknet 看到一个写的比较好的博客:https://mp.weixin.qq.com/s/RruZSl49vv5B0eRif-p9HQ

先学习着。有额外内容再补充。

im2col解析

从上面的代码可以知道,卷积层的前向传播核心点是im2col操作还有sgemm矩阵计算方法对使用im2col进行重排后的数据进行计算。现在来解析一下im2col算法,sgemm算法就是im2col运行后直接调用即可,就不细讲了。

这里考虑到结合图片更容易理解im2col的思想,我利用CSDN Tiger-Gao博主的图描述一下。首先,我们把一个单通道的长宽均为4的图片通过im2col重新排布后会变成什么样呢?看下图:


在这里插入图片描述

来具体看一下变化过程:

这是单通道的变化过程,那么多通道的呢?首先来看原图:

在这里插入图片描述

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

在这里插入图片描述

这是原图经过im2col的变化,那么kernel呢?看原图:

在这里插入图片描述

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

那么我们是如何得到前向传播的结果呢?在DarkNet中和Caffe的实现方式一样,都是Kernel*Img,即是在矩阵乘法中:

M=1 ,
N=output_h * output_w
K=input_channels * kernel_h * kernel_w

结果如下:

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

在这里插入图片描述

对于多通道图像过程类似:

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

在这里插入图片描述

im2col算法的实现在src/im2col.c中,即im2col_cpu函数。

猜你喜欢

转载自blog.csdn.net/juluwangriyue/article/details/109185644
今日推荐