RTFSC | Caffe 源码阅读 (其一)

建议安装scitools套装的understand对源码进行阅读。可以对整个工程的代码进行解析后以整个工程都可以快速地jump to definition。以及可以对整体代码进行更近一步的解析。反正无比好用,墙裂推荐。

Overview

Overview

我们今天主要讲一下layers的源码

layers

layers overview

我们发现每一种layer都分成.cpp和.cu两种。其实很好理解,.cpp的是cpu版本的,.cu是cuda版本的。

conv_layer.cpp

我们先来看看INSTANTIATE_CLASS(ConvolutionLayer);这个宏操作干了什么

INSTANTIATE_CLASS

简要介绍一下这个宏操作涉及的##(concatenate)和template specialization.

宏操作##

简单来说就是把signal的字符链接起来
举个例子

#define cat(a, b) a##b

辣么

printf("%d\n", cat(a,1));

就等价于

printf("%d\n", a1);

template instantiation

我们使用template的时候实际上是implicitly实例化了template的一个class,然而我们也有explicit version.

类似于

template class SampleClass<int>;

注意区别于template specialization.(模板类/函数特化是定义在规定了特定typename的template的定义)

好吧其实这些都没什么卵用。我们其实更在乎Forward和Backward。

总所周知,CNN主要有一个end to end的过程,遵循bp网络的定义,有forward也有backward。我们来简单看看这个forward和backward的过程应该怎么写

CPU version

forward
cpu forward

计算forward的被分成了两个部分。实际上就是

o = w*i + b

第一部分的w*i对应的就是

this->forward_cpu_gemm(bottom_data + n * this->bottom_dim_, 
          weight, top_data + n * this->top_dim_);

第二部分(bias)对应的就是

if (this->bias_term_) { 
    const Dtype* bias = this->blobs_[1]->cpu_data(); 
    this->forward_cpu_bias(top_data + n * this->top_dim_, bias);
}

出于好奇我们再进一步看看这两个函数是怎么做的

cpu_gemm cpu_bias

首先介绍一下什么是im2col
http://www.zhihu.com/question/28385679

相当于把运算分解成两部,首先第一步把矩阵变成一个一个的col,然后再相乘。特别的当矩阵是1x1的时候或者需要skip im2col的时候(后面一个什么鬼我还不太清楚,总之一般情况下先理解第一个)不需要im2col(废话)。

为什么要这么做呢?
相当于卷积被分解成了

o = col2im(w*im2col(i)) + b)

为什么要这么做呢?
好求导啊!
可以参考
http://zhangliliang.com/2015/02/11/about-caffe-code-convolutional-layer/
(啥时候才能赶上人家的水平。。。。

至于细节部分,我想讲讲我在阅读中有困难的地方,那就是维数的问题。在conv_layer.cpp部分中,其实只是用到了batch_size那一个维度以及之前和多少个前面的层连接。没有涉及到后面三维ChannelxWeightxHeight。

而在后面的部分,使用了im2col把WxH两个维度压成一个维度V, 于是就有了CxV的一个矩阵。convolution网络层的参数大小是C_bottom(上一层channel数)xC_top(输出channel数),正好对应一个矩阵乘法。

接下来forward部分的代码属于很好理解但是文字不好表述的部分(各种offset以及矩阵乘法函数的各种参数等等)。所以就不赘述了。

backward
backward

结构和forward类似。由于backward的原因应该考虑top的size。

backward_cpu_gemm backward_cpu_bias

有了上面所说的,其实这一步也是通过im2col把卷积变成全连接层的形式,类似于普通o=ai+b进行求导。

GPU version

外层的套路和CPU version几乎是一样的

conv_layer.cu
gpu_gemm gpu_bias
gpu_gemm gpu_bias

Titan X 3000多个核心呢。。。。快得飞起来,一般Caffe的网络GPU都是CPU的30倍左右。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容

  • Caffe GitHub页面 1. Caffe目录结构 data/用于存放下载的训练数据docs/ 帮助文档exa...
    sixfold_yuan阅读 1,661评论 3 14
  • 很实用的编程英语词库,共收录一千五百余条词汇。 第一部分: application 应用程式 应用、应用程序app...
    春天的蜜蜂阅读 1,328评论 0 22
  • 一、总体流程 caffe主要有四个功能模块。 a) Blob 主要用来表示网络中的数据,包括训练数据,网络各层自身...
    人生若离阅读 3,079评论 0 1
  • 计算机英语(编程词汇大全) application 应用程式 应用、应用程序 application framew...
    朱森阅读 580评论 0 1
  • //作者:JRZAlan //备注:第一次做简书,希望能对大家起到帮助。 这是对一些计算机编程语言的一些英语单词,...
    JRZAlan阅读 16,413评论 0 77