caffe代码梳理

caffe目录结构

命令:tree -d
build ->.build_release //编译结果存放处,子目录结构与主目录类似
cmake //使用CMake编译时会用到,不关注
data //用与存放原始数据和数据获取脚本
distribute //编译后生成发布包的位置,用于迁移
docker //同样是为了便于迁移,使用了Docker工具
docs //doxygen工程文件放在这里,可生成caffe ref_man.pdf
examples //存放Caffe简单例程
include //Caffe头文件集中存放与这个目录
matlab //适用于Matlab做Wrapper,具体可以参考RCNN源码
models //存放示例模型
python //用python Wrapper
scripts //存放脚本
src //Caffe源码
tools //常用工具源码
extra
关注三个子目录:include/、src/、tools/

如何有效阅读Caffe源码

1.从src/caffe/proto/caffe.proto开始
2.看头文件。通过头文件类声明理解整个框架
3.有针对的看cpp和cu文件
4.编写各类工具,集成到Caffe内部,

注:命令:grep -n -H -R “REGISTER_LAYER_CREATOR”
-n -显示行号,便于定位
-H -显示文件名,便于定位
-R -递归查找每个子目录,适合工程较大,分多个目录存放的场景

Caffe支持哪些深度学习特性

这里写图片描述
输入层为二维图像数据,前几层都是卷积层,用于提取低维到高维特征,最后两层为全连接层,类似于多层感知器,用于对前面提供的特征进行分类,卷积层和全连接层统称为权值层。

卷积层
卷积运算:
这里写图片描述
维度可以升为三维四维,公式重新表达为:
这里写图片描述
L个输出通道;K个输入通道;需要LK个卷积核实现通道数目的转换
卷积核大小为IJ;输出通道的特征图大小为MN,
该层每个样本做一次前向传播时卷积层计算量为:
这里写图片描述
从examples/mnist/lenet_val.prototxt中找到卷积参数描述:
num_output:50 //对应公式中的L
kernel_size:5 //对应公式中的I和J
KMN从日志文件中找
Top shape:64 20 12 12 (184320)
Setting up conv2
Top shape:64 50 8 8(204800)
M=N=8
K=20
Calculations(MAC)=55885020=1600000MAC
学习参数数量:Param=I
JKL=25000
计算量-参数比:CPR=Calculations/Params=MN=64

结论:卷积层的输出特征图尺寸越大,CPR值越大,参数重复利用率越高。若输入一批数据(B个样本)则CPR值可再提高B倍

全连接层
每个节点与相邻层的所有节点都有连接关系
这里写图片描述

计算类型:矩阵-向量乘(GEMV)y=Wx                        
x:输入节点组成的向量;D维度;y输出节点组成的向量;V维度;W为VD权值矩阵    
找到全连接参数描述
examples/mnist/lenet_train_val.prototxt                      
inner_product_param//全连接层参数
num_output:500 //该层输出元素个数为500对应公式中的V
运行日志:Top shape:64 50 4 4   D = 5044=800               
全连接层单样本前向传播计算量统计为:CalculationsMAC = VD = 800500=400000
参数量统计为:Params = V*D=400000
CPR值= Calculations/Params = 1 
全连接层的CPR值始终为1,与输入输出维度无关

激活函数
非线性处理单元                             
这里写图片描述                           
这里写图片描述

这里写图片描述                
激活函数相关的Layer类声明都位于include/caffe/neural_layers.hpp中              
主要关注ReLULayer、SigmoidLayer和TanHLayer类

参考:深度学习21天实战Caffe。作者:赵永科

猜你喜欢

转载自blog.csdn.net/weixin_39795049/article/details/82012232
今日推荐