CAFFE源码
王里扬洛夫
人的命运啊,主要是靠个人的奋斗,同时也要考虑历史的行程啊!
展开
-
CAFFE源码学习笔记之十-data_layer
一、前言CAFFE在搭建CNN网络的时候,第一层就是数据层,所以本节梳理一下同样很庞大的DataLayer层。 先给一个网络结构: Layer类: 层的基类;BaseDataLayer类:数据层的基类;BasePrefetchingDataLayer类:预取层,主要是预先读取若干批次的数据,平衡CPU与GPU带宽和GPU计算速度。从继承关系可以看出,该层是多线程系统主要发挥作用的地方。原创 2017-04-07 11:01:09 · 1476 阅读 · 0 评论 -
CAFFE源码学习笔记之初始化Filler
一、前言 为什么CNN中的初始化那么重要呢?我想总结的话就是因为他更深一点,相比浅层学习,比如logistics或者SVM,最终问题都转换成了凸优化,函数优化的目标唯一,所以参数初始化随便设置为0都不影响,因为跟着梯度走,总归是会走向最小值的附近的。但是CNN不一样: 1、多层神经网络加上各种非线性变换的激活函数,最终的目标函数是个非凸函数,也就是有多个局部最小值。2、如果使用sigmod类的激原创 2017-04-25 17:19:26 · 1284 阅读 · 0 评论 -
CAFFE源码学习之优化方法solver
一、前言 solver就是来计算损失函数最小化的优化方法,在caffe中,提供了六种不同的优化方法:(1)SGD;(2)AdaGrad;(3)AdaDelta;(4)Adam;(5)RMSProp;(6)Nesterov;优化方法需要优化的目标函数就是针对整个数据集的所有数据的平均loss,如果必要还有正则项:L(w)=1N∑N1fw(x(i))+λr(w)L(w)=\frac{1}{N原创 2017-04-20 21:58:15 · 1653 阅读 · 0 评论 -
CAFFE源码学习笔记之二-Syncmemory
一、前言 在CPU与GPU合作的异构体系中,CPU负责逻辑性强的事务处理,GPU只负责高度线程化的数据处理。在这个体系中,CPU和GPU之间将会存在大量的数据交换,其中涉及到的内存操作就有 Malloc(), Free(), memset(), cudaMalloc(), cudaMemset(), cudaMencpy(), cudaFree()…….. 在C++中仅仅是new和原创 2017-03-30 20:41:48 · 1149 阅读 · 0 评论 -
CAFFE源码学习笔记之九-data_transformer
一、前言 在将图像传输到数据层之前,还需要对图像数据进行预处理。主要的工作是将Datum、const vector、cv::Mat&、vector 、Blob*类型的数据转变为Blob型的数据,以及对数据进行减均值、镜像和切割等操作。 二、源码分析 1、TransformationParameter 在开始看源码之前,首先列出protobuf中的transformer参数,这些参数就是要对数原创 2017-04-06 20:04:10 · 1587 阅读 · 0 评论 -
CAFFE源码学习笔记之batch_norm_layer
一、前言 网络训练的过程中参数不断的变化导致后续的每一层输入的分布也发生变化,而学习的过程使得每一层都需要适应输入的分布。所以就需要谨慎的选择初始化,使用小的学习率,这极大的降低了网络收敛的速度。为了使每层的输入分布大致都在0均值和单位方差,需要对每层的输入进行归一化。 为了使 二、源码分析 1、layersetup函数 batch_norm参数:message BatchNorm原创 2017-04-13 16:35:48 · 6625 阅读 · 1 评论 -
CAFFE源码学习笔记之八-阻塞队列blocking_queue
一、前言 我的理解是在CAFFE中,数据的产生即从存储系统中读取出来和数据的消耗即被读入数据层进行计算必然是异步的,也就是生产者和消费者模型。所以才有了双阻塞队列来实现数据在数据层与存储系统之间的同步。为什么使用队列? 因为图像数据只需要按照固定的顺序一步一步输入即可,不存在随机访问,不存在随机写入,同时queue底层是由链式表构成的,其访问速度不会随着元素的增加而增加。如何实现多线程下的阻塞?原创 2017-04-05 15:04:39 · 1071 阅读 · 0 评论 -
CAFFE源码学习笔记之softmax_layer
一、前言 在全连接层之后,接着就是softmax层。softmax已经介绍过,是表征分类是该类的概率的大小。具体原理见logistic回归与softmax 所以,softmax layer输出的是原始的输入在每一个分类标签上的概率。 二、源码分析 1、成员变量 为什么设置outer_num_和inner_num_? inner_num_实际该层输入的图像的尺寸,由于正常网络下,其输入为n原创 2017-04-12 16:15:36 · 1649 阅读 · 1 评论 -
CAFFE源码学习笔记之六-Blob
一、前言 自下往上的顺序,在梳理完caffe的内存模型、全局资源管理、多线程系统这些基础设施之后,可以来看看包裹syncedmemory的这个Blob了。 Blob是caffe的基本数据结构,主要的作用是: 1、syncedmemory的一层封装,存储数据,并且是网络中数据交流的载体; 2、近似为N维的数组。 第一点很好理解,都是syncedmemory起到的作用。第二点N维的数组,在c+原创 2017-03-31 16:00:27 · 1347 阅读 · 0 评论 -
CAFFE源码学习笔记之内积层-inner_product_layer
一、前言 内积层实际就是全连接。经过之前的卷积层、池化层和非线性变换层,样本已经被映射到隐藏层的特征空间之中,而全连接层就是将学习到的特征又映射到样本分类空间。虽然已经出现了全局池化可以替代全连接,但是仍然不能说全连接就不能用了。 二、源码分析 1、成员变量全连接的输入时一个M*K的矩阵,权重是K*N的矩阵,所以输出是一个M*N的矩阵 int M_;//num_input int K_;原创 2017-04-11 15:12:52 · 4343 阅读 · 0 评论 -
CAFFE源码学习笔记之激活层
一、前言 在网络中,经过一级卷积层和池化层的处理后,一般都需要进入激活层,进行一次非线性变化或者线性变换。激活层所用激活函数,最开始使用sigmod和tanh函数。但是这两个函数的梯度在越远离x=0的地方越小,最后基本趋近于0,使得网络收敛的速度变慢,造成所谓的“梯度弥散”问题。 为了解决该问题,ReLu激活函数被提出,其公式就是:out_put=max(0,input)out\_put=m原创 2017-04-11 14:20:33 · 838 阅读 · 0 评论 -
CAFFE源码学习笔记之七-layer_factory以及layer基类
一、前言 caffe的几大基本模块中之一——Blob已经梳理完毕,现在该轮到Layer了。这一章先梳理layer基类和工厂类,为data_layer做一下铺垫。Layer定义了layer的初始化,前向传播,后向传播。前向传播可以计算loss,后向传播计算梯度信息。layer类是caffe中最为庞大的一类,所以作者使用工厂模式,这样当我们使用caffe中已经有的层或者自己定义的层时只需要注册就行了。原创 2017-04-01 16:34:48 · 843 阅读 · 0 评论 -
CAFFE源码学习笔记之十一-卷积层conv_layer
一、前言vison layer主要是处理图像相关,以图像数据为输入,输出为经过卷积或者pooling后的特征图。该大类包含Convolution(conv_layer.hpp)、Pooling(pooling_layer.hpp)、Local Response Normalization(LRN)(lrn_layer.hpp)、im2col等。 在大多数深度学习模型中,数据经过数据层后,一些分割层原创 2017-04-09 13:29:04 · 3086 阅读 · 0 评论 -
CAFFE源码学习笔记之池化层pooling_layer
一、前言 池化层的输入来自上一个卷积层的输出,主要作用是提供了平移不变性,并且减少了参数的数量,防止过拟合现象的发生。比如在最大池化中,选择区域内最大的值为采样点,这样在发生平移的时候,采样点不变。 池化层一般没有参数,所以反向传播的时候,只需对输入参数求导,不需要进行权值更新。平均值效果不佳,一般选择最大池化。 二、源码分析 1、LayerSetUp函数 跟卷积层类似,主要是导入池化层的原创 2017-04-10 21:15:17 · 4295 阅读 · 0 评论 -
CAFFE源码学习笔记之五-internal_thread
一、前言 该类实际是boost::thread的包裹器。boost十分强大,可以不用修改就在linux和windows使用,避免了使用内核函数的移植性问题。二、源码分析 类的构造函数就默认初始化boost::thread,析构函数直接调用线程停止函数。 成员函数包括开始线程,结束线程,判断线程是否开始,要求线程结束class InternalThread { public: Intern原创 2017-03-31 10:29:56 · 1410 阅读 · 0 评论 -
CAFFE源码学习笔记之三-common
一、前言 Syncedmemory类包含的头文件只有一个common.hpp。而common也是整个caffe的基础设施之一,主要作用是管理全局的资源。在caffe中的全局资源有哪些呢? 根据代码,可以总结为: 1、随机数; 2、GPU设备信息; 3、并行的训练时的solver_rank等。caffe就是将这些全局信息用全局静态变量表示,看起简直有点too young too simple原创 2017-03-30 22:06:03 · 1264 阅读 · 0 评论 -
CAFFE源码学习笔记之一
单纯的将自己的笔记上的内容一点点搬运过来。 在复习卷积神经网络的同时还能学习一下系统级c++程序的规范和技巧。 ××××××××××××××××× 一、前言 本系列就是要把caffe这样一个系统级的框架从头到尾梳理一下,在我读caffe的时候是按照自顶向下的方式进行的,就是先从程序入口入手,快速梳理一下整体的框架和结构。在大体摸清了框架之后在开始顺着每个模块自下而上的将每个模块整理一遍。原创 2017-03-30 11:18:46 · 990 阅读 · 0 评论 -
CAFFE源码学习笔记之四-device_alternate
一、前言 common中包含的头文件中有一个device_alternate,里面主要是和cuda有关系的宏: CUDA_CHECK; CUBLAS_CHECK; CURAND_CHECK; CUDA_KERNEL_LOOP; 同时还对block中的线程数以及block的维度声明为常量。 二、源码分析 首先是NO_GPU宏,主要是当设置为CPU_ONLY后,如果你仍然固执地要用for原创 2017-03-31 09:46:43 · 3531 阅读 · 1 评论