Caffe学习日记4

1. class Blob

解析:

(1)void FromProto(const BlobProto& proto, bool reshape = true);:反序列化函数,从BlobProto中恢复Blob对象。

(2)void ToProto(BlobProto* proto, bool write_diff = false) const;:序列化函数,将内存中的Blob对象保存到

BlobProto中。

(3)shared_ptr data_;:存放指向data的指针。

(4)shared_ptr diff_;:存放指向diff的指针。

(5)shared_ptr shape_data_;:存放指向shape_data_的指针

(6)vector shape_;:形状信息

(7)int count_;:存放有效元素数目信息。

(8)int capacity_;:存放Blob容器的容量信息。

(9)DISABLE_COPY_AND_ASSIGN(Blob);:禁用拷贝构造函数、赋值运算符重载。

说明:Caffe类中成员变量都带有后缀“_”,这样在函数实现中容易区分临时变量和类成员变量。


2. Caffe Model Zoo

解析:Caffe Model Zoo提供了一个分享模型的平台,世界各地的研究人员可以把自己的训练成果共享给社区中更多的

人使用,以节省人力和物力。


3. class SyncedMemory

解析:CPU/GPU共享内存类,该类负责存储分配以及主机和设备数据同步。

(1)enum SyncedHead { UNINITIALIZED, HEAD_AT_CPU, HEAD_AT_GPU, SYNCED };:状态机变量,表示4种状态:未初始化,CPU数据有效,GPU数据有效,已同步。

(2)void to_cpu();:数据同步至CPU。

(3)void to_gpu();:数据同步至GPU。

(4)void* cpu_ptr_;:位于CPU的数据指针。

(5)void* gpu_ptr_;:位于GPU的数据指针。

(6)size_t size_;:存储空间大小。

(7)SyncedHead head_;:状态机变量。

(8)bool own_cpu_data_;:标志是否拥有CPU数据所有权(否,即从别的对象 )

(9)bool cpu_malloc_use_cuda_;:是否使用CUDA标记。

(10)bool own_gpu_data_;:标志是否拥有GPU数据所有权。

(11)int gpu_device_;:GPU设备号。

(12)CaffeMallocHost/CaffeFreeHost和malloc/free功能相同,即分配/释放内存/显存的函数。如果使用了GPU,则

在在GPU上分配和释放,否则在内存上分配和释放。

说明:通过将构造函数声明为explicit(显式)的方式可以抑制隐式转换。


4. #include

解析:

(1)CHAR_MIN:char最小值。

(2)SCHAR_MAX:signed char最大值。

(3)SCHAR_MIN:signed char最小值。

(4)UCHAR_MAX:unsigned char最大值。

(5)SHRT_MAX:short最大值。

(6)SHRT_MIN:short最小值。

(7)USHRT_MAX:unsigned short最大值。

(8)INT_MAX:int最大值。

(9)INT_MIN:int最小值。

(10)UINT_MAX:unsigned int最大值。

(11)UINT_MIN:unsigned int最小值。

(12)LONG_MAX:long最大值。

(13)LONG_MIN:long最小值。

(14)ULONG_MAX:unsigned long最大值。

(15)FLT_MANT_DIG:float类型的尾数。

(16)FLT_DIG:float类型的最少有效数字位数。

(17)FLT_MIN_10_EXP:float类型的负指数的最小值(以10为底)。

(18)FLT_MAX_10_EXP:float类型的正指数的最大值(以10为底)。

(19)FLT_MIN:float类型正数最小值。

(20)FLT_MAX:float类型正数最大值。


5. #ifndef与#pragma once异同

解析:为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式。

#pragma once用来防止某个头文件被多次include,而#ifndef,#define,#endif用来防止某个宏被多次定义。


6. class Layer

解析:Layer是Caffe的基本计算单元,至少有一个输入Blob(Bottom Blob)和一个输出Blob(Top Blob),部分

Layer带有权值(Weight)和偏置项(Bias),有两个运算方向:前向传播(Forward)和反向传播(Backward),

其中前向传播计算会对输入Blob进行某种处理(有权值和偏置项的Layer会利用这些对输入进行处理),得到输出

Blob;而反向传播计算则对输出Blob的diff进行某种处理,得到输入Blob的diff(有权值和偏置项的Layer可能也会计算

权值Blob、偏置项Blob的diff)。


7. message LayerParameter

解析:

(1)repeated float loss_weight = 5;:为每个Top Blob分配对损失函数的权重,每个Layer都有默认值,要么为0,表

示不参与目标函数计算;要么为1,表示参与损失函数计算。

(2)repeated ParamSpec param = 6;:指定训练参数(例如相对全局学习常数的缩放因子,以及用户权值共享的名

称或其它设置)。

(3)repeated BlobProto blobs = 7;:承载了该层数值参数的Blob。

(4)repeated bool propagate_down = 11;:是否对Bottom Blob进行反向传播过程。该字段的维度应与Bottom Blob

个数一致。


8. layer_factory.hpp:81] Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: Input (known types: )

解析:添加头文件head.h,如下所示:

#include "caffe/common.hpp"  
#include "caffe/layers/input_layer.hpp"  
#include "caffe/layers/inner_product_layer.hpp"  
#include "caffe/layers/dropout_layer.hpp"  
#include "caffe/layers/conv_layer.hpp"  
#include "caffe/layers/relu_layer.hpp"  
#include "caffe/layers/pooling_layer.hpp"  
#include "caffe/layers/lrn_layer.hpp"  
#include "caffe/layers/softmax_layer.hpp"  
namespace caffe
{
	extern INSTANTIATE_CLASS(InputLayer);
	extern INSTANTIATE_CLASS(InnerProductLayer);
	extern INSTANTIATE_CLASS(DropoutLayer);
	extern INSTANTIATE_CLASS(ConvolutionLayer);
	REGISTER_LAYER_CLASS(Convolution);
	extern INSTANTIATE_CLASS(ReLULayer);
	REGISTER_LAYER_CLASS(ReLU);
	extern INSTANTIATE_CLASS(PoolingLayer);
	REGISTER_LAYER_CLASS(Pooling);
	extern INSTANTIATE_CLASS(LRNLayer);
	REGISTER_LAYER_CLASS(LRN);
	extern INSTANTIATE_CLASS(SoftmaxLayer);
	REGISTER_LAYER_CLASS(Softmax);
}
说明:Net在Caffe中代表一个完整的CNN模型,它包含若干Layer实例,看到的ProtoBuffer文本文件(prototxt)描述

的经典网络结构(LeNet,AlexNet),这些结构反映在Caffe代码实现上就是一个Net对象。Net中既包括Layer对象,

又包括Blob对象。其中,Blob对象用于存放每个Layer输入/输出中间结果,Layer则根据Net描述对指定的输入Blob进

行某些计算处理(卷积、下采样、全连接、非线性变换、计算代价函数等),输出结果放到指定的输出Blob中。输入

Blob和输出Blob可能为同一个。所有的Layer和Blob对象都用名字区别,同名的Blob表示同一个Blob对象,同名的

Layer表示同一个Layer对象,而Blob和Layer同名则不代表它们有任何直接关系。


9. message NetParameter

解析:

(1)optional bool force_backward = 5 [default = false];:网络是否强制每个层执行后向传播计算。如果设置为

false,那么是否执行后向传播计算由网络结构、学习速率自动确定。

(2)optional NetState state = 6;:网络的当前状态(包括phase、level和stage)。

(3)optional bool debug_info = 7 [default = false];:在运行Net::Forward、Net::Backward、Net::Update时是否打印

结果的调试信息。

(4)repeated LayerParameter layer = 100;:组成 Net的所有层,每个层配置都包括连接属性与行为,由

LayerParameter定义。

 

10. class Net

解析:

(1)layers_:记录Net prototxt中出现的每个Layer。

(2)layer_names:记录Net prototxt中出现的每个Layer的名称。

(3)layer_names_index_:记录Net prototxt中每个Layer名称与顺序索引的对应关系。

(4)layer_need_backward_:记录每个Layer是否需要反向传播过程。

(5)blobs_:记录Net中所有Blob。

(6)blob_names_:记录每个Blob名称。

(7)blob_names_index_:记录每个Blob名称与顺序索引的对应关系。

(8)blob_need_backward_:记录每个Blob是否需要反向传播过程。

(9)bottom_vecs_:blobs_的影子,记录每个Layer的输入Blob。

(10)bottom_id_vecs_:与bottom_vecs_关联,用于在blobs_中定位每个Layer的每个输入Blob。

(11)bottom_need_backward_:与bottom_vecs_关联,标志每个Blob是否需要反向传播过程。

(12)top_vecs_:blobs_的影子,记录每个Layer的输出Blob。

(13)top_id_vecs_:与top_vecs_关联,用于在blobs_中定位每个Layer的每个输出Blob。

(14)blob_loss_weights_:Net中每个Blob对损失函数的投票因子。一般损失层为1,其它层为0。

(15)net_input_blob_indices_:Net输入Blob在blobs_中的索引。

(16)net_output_blob_indices_:Net输出Blob在blobs_中的索引。

(17)net_input_blobs_:Net输入Blob。

(18)net_output_blobs_:Net输出Blob。

(19)params_:Net权值Blob,用于存储网络权值。

(20)param_display_names_:Net中权值Blob的名称。

(21)learnable_params_:Net中可训练的权值Blob。

(22)params_lr_:learnable_params_中每个元素的学习速率倍乘因子。

(23)has_params_lr_:标志learnable_params_中每个元素是否有学习速率倍乘因子。

(24)params_weight_decay_:learnable_params_中每个元素的权值衰减倍乘因子。

(25)has_params_decay_:标志learnable_params_中每个元素是否有权值衰减倍乘因子。

说明:以param开头的权值Blob和以blob开头的Layer输入/输出Blob,虽然都是Blob类型,但在网络中的地位截然不

同。权值Blob会随着学习过程而更新,归属于“模型”。Layer输入/输出Blob则只会随网络输入变化,归属于“数据”。


11. message DataParameter和TransformationParameter

解析:

(1)Caffe数据读取层(DataLayer)是Layer的派生类,除了读取LMDB、LEVELDB外,也可以从原始图像直接读

取(ImageDataLayer)。如下所示:

(2)Caffe的数据变换器(DataTransformer)主要提供了对原始输入图像的预处理方法,包括随机切块、随机镜

像、幅度缩放、去均值、灰度/色度变换等。


12. 深度学习模型参数组成

解析:

(1)可学习参数:又称训练参数、神经网络权系数、权重,其数值由模型初始化参数、误差反向传播过程控制,一

般不可人工干预。可学习参数在内存中使用Blob对象保持,必要时以二进制ProtoBuffer文件(*.caffemodel)形态序

列化并存储于磁盘上,便于进一步微调(finetune,又称精调)、共享(例如参数服务器Parameter Server,PS)、

性能评估(benchmark)。

(2)结构参数:包括卷积层/全连接层/下采样层数目、卷积核数目、卷积核大小等描述网络结构的参数,一旦设定

好,在网络训练阶段不能更改;值得注意的是,训练阶段网络结构参数和预测阶段网络结构参数很可能不同。结构参

数使用ProtoBuffer文本格式(*.prototxt)描述,网络初始化时通过该描述文件构建Net对象、Layer对象形成有向无环

图结构,在Layer与Layer之间、Net输入源和输出阱均为持有数据和中间结果的Blob对象。 

(3)训练超参数:用来控制网络训练收敛的参数,训练阶段可以自动或手动调节以获得更好的效果,预测阶段不需

要该参数。训练超参数同样使用ProtoBuffer文本格式(*.prototxt)描述,训练阶段利用该描述文件构建求解器

(Solver)对象,该对象按照一定规则在训练网络时自动调节这些超参数值。


13. BVLC

解析:BVLC:Berkeley Vision and Learning Center。 


14. Caffe前向传播

解析:在Caffe中CNN前向传播过程由Net+Layer组合完成,中间结果和最终结果则使用Blob承载。可以用

NetParameter对象或net.prototxt文件初始化Net构造函数,二者都调用了Init()函数,传递给该函数的参数param是

NetParameter对象,Init()函数完成了非常关键的网络初始化和层初始化操作。


15. Caffe反向传播

解析:CNN进行前向传播阶段,依次调用每个Layer的Forward函数,得到逐层的输出,最后一层与目标函数比较得到

损失函数,计算误差更新值,通过反向传播路径逐层到达第一层,所有权值层在反向传播结束后一起更新。损失层

(Loss Layer)是CNN的终点,接受两个Blob作为输入,其中一个为CNN的预测值,另一个是真实标签。Caffe中实

现了多种损失层,分别用于不同场合。其中,SoftmaxWithLossLayer实现了Softmax+交叉熵损失函数计算过程,适

用于单label的分类问题;另外还有欧式损失函数(用于回归问题)、Hinge损失函数(最大间隔分类,SVM)、

Sigmoid+交叉熵损失函数(用于多属性/多分类问题)等。


16. Caffe中的求解器

解析:

(1)随机梯度下降法(SGD)。

(2)AdaDelta。

(3)自适应梯度法(ADAGRAD)。

(4)Adam。

(5)Nesterov加速梯度法(NAG)。

(6)RMSprop。


17. extract_features.exe特征提取

解析:Caffe提供的使用工具extract_features.exe实现了特征提取功能,该程序需要一个训练好的网络和一个数据输

入层,运行后可得到相应数据通过网络某个中间层产生的特征图并保存到磁盘。


18. Caffe计算图像均值

解析:均值是所有训练样本的均值,减去之后再进行训练会提高其速度和精度。如下所示:

compute_image_mean.exe examples/mnist/mnist_train_lmdb examples/mnist/mean.binaryproto

说明:mean_binaryproto是生成的二进制均值文件。


19. Train和Test损失曲线

解析:

(1)train loss不断下降,test loss不断下降,说明网络仍然在学习。

(2)train loss不断下降,test loss趋于不变,说明网络过拟合。

(3)train loss趋于不变,test loss趋于不变,说明学习遇到瓶颈,需减小学习速率或批量数据尺寸。

(4)train loss趋于不变,test loss不断下降,说明数据集100%有问题。

(5)train loss不断上升,test loss不断上升(最终变为NaN),可能是网络结构设计不当、训练超参数设置不当、程

序bug等某个问题引起的,需要进一步定位。


20. Netscope [3][4]

解析:Netscope是个支持Caffe的神经网络结构在线可视化工具。


21. Caffe中的Blob [5]

解析:图像本身(多张图像)是一个Blob实例,卷积层的输入(多个feature maps)是一个Blob实例,卷积层的输出

(多个feature maps)是一个Blob实例,卷积操作中的卷积核(多个滤波器)是一个Blob实例。


22. Windows安装Faster RCNN(Python)[6][7][8][9]

解析:坑多。Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: ROIPooling.


23. 用BVLC CaffeNet Model模型进行图像分类

解析:

D:\caffe-master\Build\x64\Release\classification.exe \  #二进制程序名
D:\caffe-master\models\bvlc_reference_caffenet\deploy.prototxt \  #模型描述文件
D:\caffe-master\models\bvlc_reference_caffenet\bvlc_reference_caffenet.caffemodel \  #*.caffemodel模型权值文件
D:\caffe-master\data\ilsvrc12\imagenet_mean.binaryproto \  #图像均值文件
D:\caffe-master\data\ilsvrc12\synset_words.txt \  #图像类别标签信息
D:\caffe-master\examples\images\cat.jpg  #输入待分类图像
命令行输出的预测结果,如下所示:
---------- Prediction for D:\caffe-master\examples\images\cat.jpg ----------
0.3134 - "n02123045 tabby, tabby cat"
0.2380 - "n02123159 tiger cat"
0.1235 - "n02124075 Egyptian cat"
0.1003 - "n02119022 red fox, Vulpes vulpes"
0.0715 - "n02127052 lynx, catamount"
上述给出了5个预测结果,按照概率分布从高到低的顺序排列,这种预测结果称为Top-5预测结果,对当前样本而言,

分类正确率为5项之和。除了Top-5预测结果外,还有Top-3、Top-1等预测结果。


参考文献:

[1] Caffe Model Zoo:http://caffe.berkeleyvision.org/model_zoo.html

[2] caffe源码阅读(2)-Layer:http://www.cnblogs.com/korbin/p/5608878.html

[3] Netscope:http://ethereon.github.io/netscope/#/editor

[4] Caffe神经网络模型结构可视化:http://blog.csdn.net/solomon1558/article/details/53144606

[5] Caffe基本数据结构Blob:http://www.cnblogs.com/zjutzz/p/5960289.html

[6] windows下跑python版subcnn和faster rcnn:http://blog.csdn.net/chenzhi1992/article/details/52618386

[7] Solutions to caffe-layer creation failure:http://m.blog.csdn.net/article/details?id=50499948

[8] caffe中增加triplet loss layer的实现:http://blog.csdn.net/tangwei2014/article/details/46812153

[9] Windows下编译fast rcnn:http://blog.csdn.net/lien0906/article/details/47007319#reply

你可能感兴趣的:(深度学习)