Caffe学习日记3

来源:互联网 发布:js日期时间插件 编辑:程序博客网 时间:2024/06/03 04:14

1. Windows安装Caffe

解析:下载地址:https://github.com/Microsoft/caffe。详细安装步骤参考[1]。


2. NuGet

解析:当需要分享开发的工具或是库,需要建立一个Nuget package,然后把这个package放到Nuget的站点。如果想

要使用别人已经开发好的工具或是库,只需要从站点获得这个package,并且安装到自己的Visual Studio项目或是解

决方案里。


3. warning LNK4099:未找到PDB“vc100.pdb” [2] 

解析:PDB(Program Database)文件是VS生成的用于调试的符号文件,保存着调试的信息。


4. Caffe依赖库

解析:

(1)ProtoBuffer:在Caffe中主要用于参数管理。

(2)Boost:在Caffe中主要使用它的智能指针。

(3)GFLAGS:在Caffe中主要用于命令行参数解析。

(4)GLOG:在Caffe中主要用于日志记录。

(5)BLAS:在Caffe中主要用于向量和矩阵的计算。比如,Intel MKL、ATLAS、OpenBLAS等。

(6)HDF5:新型数据存储格式。

(7)OpenCV:在Caffe中主要用于图像存取和预处理功能等。

(8)LMDB和LEVELDB:在Caffe中主要用于数据管理。

(9)Snappy:用来压缩和解压缩的C++库。


5. ReLU

解析:修正线性单元(Rectified linear unit,ReLU)激活函数:


6. GLOG日志格式

解析:[日期] [时间] [进程号] [源码文件:代码行号] [输出信息]


7. gtest库

解析:Google开源的C++单元测试框架Google Test。


8. LeNet模型结构图 [3]


解析:根据prototxt和LeNet模型结构图可以清晰地看到LeNet的网络结构。数据源mnist负责从预处理得到的Imdb数据库中读取图像数据data和标签数据label,图像数据送入后续CNN结构中进行处理。CNN结构包含一组由卷积层conv(1,2)+下采样层poll(1,2)交替形成的特征层,以及两个全连接层ip1和ip2(类似于多层感知器结构)。对ip2的输出进一步同标签数据label对比,可计算分类准确率accuracy和损失值loss。LeNet的设计蕴含了CNN的精髓,理解该模型对设计更大模型(比如ImageNet数据集上的AlexNet、GoogleNet、VGG等)有重要参考价值。


9. 利用Caffe模型进行预测

根据训练好的LeNet-5模型权值文件examples\mnist\lenet_iter_10000.caffemodel对测试数据集进行预测,如下所示:

$ ./build/tools/caffe.bin test \-model examples\mnist\lenet_train_test.prototxt \-weights examples\mnist\lenet_iter_10000.caffemodel \-iterations 100
(1)./build/tools/caffe.bin test:表示只做预测(前向传播计算),不进行参数更新(后向传播计算)。

(2)-model examples\mnist\lenet_train_test.prototxt:指定模型描述文本文件。

(3)-weights examples\mnist\lenet_iter_10000.caffemodel \:指定模型预先训练好的权值文件。

(4)-iterations 100:指定测试迭代次数。参与测试的样例数目为(iterations * batch_size),batch_size在model 

prototxt中设定,为100时刚好覆盖全部10000个测试样本。

说明:Linux下的./build/tools/caffe.bin对应Windows下的.\Build\x64\Release\caffe.exe。LeNet-5最终训练模型的权值

保存在examples\mnist\lenet_iter_10000.caffemodel文件中,训练状态保存在

examples\mnist\lenet_iter_10000.solverstate文件中,这两个文件都是ProtoBuffer二进制格式文件。


10. ILSVRC

解析:ImageNet Large Scale Visual Recognition Competition 2013 (ILSVRC2013)


11. mnist数据集

解析:

(1)train-images-idx3-ubyte:训练集,图片。

(2)train-labels-idx1-ubyte:训练集,标签。

(3)t10k-images-idx3-ubyte:测试集,图片。

(4)t10k-labels-idx1-ubyte:测试集,标签。

说明:图片文件中像素按行组织,像素值0表示背景(白色),像素值255表示前景(黑色)。


12. 制作数据集和卷积神经网络结构

解析:深度学习最核心的两个方面分别是数据和模型,其中数据是带标签的图片集,分为训练集和测试集;模型是描

述CNN结构的有向无环图(DAG),表示对原始数据的处理方式。卷积神经网络结构根据需求而异,比如分类、识

别、检测、定位等,如何制作数据集可以参考文献[4]。


13. MatConvNet

解析:MatConvNet是计算机视觉领域中卷积神经网络的MATLAB工具箱。


14. RCNN核心思想

解析:(1)找出候选框;(2)利用CNN提取特征向量;(3)利用SVM进行特征向量分类。


15. OverFeat

解析:Integrated Recognition, Localization and Detection using Convolutional Networks.


16. FCN图像语义分割

解析:Fully Convolutional Networks for Semantic Segmentation. 


17. LSD直线检测算法
解析:LSD: a Line Segment Detector。


18. VGGNet图像分类

解析:VGG16。


19. 卷积与相关  


20. VS 2013和Caffe工程环境搭建(CPU)[5]

解析:

(1)项目 -> 属性 -> 配置属性 -> VC++目录 -> 包含目录

D:\caffe-master\includeD:\NugetPackages\boost.1.59.0.0\lib\native\includeD:\NugetPackages\glog.0.3.3.0\build\native\includeD:\NugetPackages\gflags.2.1.2.1\build\native\includeD:\NugetPackages\protobuf-v120.2.6.1\build\native\includeD:\NugetPackages\OpenBLAS.0.2.14.1\lib\native\includeD:\NugetPackages\OpenCV.2.4.10\build\native\include
(2)项目 -> 属性 -> 配置属性 -> VC++目录 -> 库目录

D:\NugetPackages\lmdb-v120-clean.0.9.14.0\lib\native\lib\x64D:\NugetPackages\LevelDB-vc120.1.2.0.0\build\native\lib\x64\v120\ReleaseD:\NugetPackages\OpenCV.2.4.10\build\native\lib\x64\v120\ReleaseD:\caffe-master\Build\x64\ReleaseD:\opencv 2.4.10\build\x64\vc12\libD:\NugetPackages\boost_date_time-vc120.1.59.0.0\lib\native\address-model-64\libD:\NugetPackages\boost_filesystem-vc120.1.59.0.0\lib\native\address-model-64\libD:\NugetPackages\boost_system-vc120.1.59.0.0\lib\native\address-model-64\libD:\NugetPackages\glog.0.3.3.0\build\native\lib\x64\v120\Release\dynamicD:\NugetPackages\boost_thread-vc120.1.59.0.0\lib\native\address-model-64\libD:\NugetPackages\boost_chrono-vc120.1.59.0.0\lib\native\address-model-64\libD:\NugetPackages\gflags.2.1.2.1\build\native\x64\v120\static\LibD:\NugetPackages\hdf5-v120-complete.1.8.15.2\lib\native\lib\x64D:\NugetPackages\protobuf-v120.2.6.1\build\native\lib\x64\v120\ReleaseD:\NugetPackages\OpenBLAS.0.2.14.1\lib\native\lib\x64D:\boost_1_59_0\lib64-msvc-12.0

(3)项目 -> 属性 -> 配置属性 -> 链接器 -> 输入 -> 附加依赖项

libboost_date_time-vc120-mt-1_59.liblibboost_filesystem-vc120-mt-1_59.liblibboost_system-vc120-mt-1_59.liblibglog.liblibcaffe.libgflags.libgflags_nothreads.libhdf5.libhdf5_hl.liblibprotobuf.liblibopenblas.dll.aShlwapi.libopencv_core2410.libopencv_highgui2410.libopencv_imgproc2410.libLevelDb.liblmdb.libopencv_video2410.libopencv_objdetect2410.libkernel32.libuser32.libgdi32.libwinspool.libcomdlg32.libadvapi32.libshell32.libole32.liboleaut32.libuuid.libodbc32.libodbccp32.lib

(4)项目 -> 属性 -> 配置属性 -> C/C++ -> 预处理器 -> 预处理器定义 -> CPU_ONLY

(5)项目 -> 属性 -> 配置属性 -> C/C++ -> 常规 -> 将警告视为错误 -> 否


21. Blob基本用法

解析:Blob在内存中表示4维数组,维度从低到高为(width_,height_,channels_,num_),用于存储数据或权值

(data)和权值增量(diff),在进行网络计算时,每层的输入和输出都需要通过Blob对象缓冲,Blob是Caffe的基本

存储单元。

(1)假设Blob<float> a.Reshape(1, 2, 3, 4)。其中,a.num()=1,a.channels()=2,a.height()=3,a.width()=4。

a.mutable_cpu_data为[0, 23],a.mutable_cpu_diff为[23, 0],a.Update=a.mutable_cpu_data-a.mutable_cpu_diff。

(2)将Blob类型值保存到磁盘,或者从磁盘载入内存,可以分别通过ToProto(),FromProto()实现,需要包含

#include <caffe/util/io.hpp>头文件。BlobProto对象实现了磁盘、内存之间的数据通信,这对于保存、载入训练好的模

型权值非常实用。

(3)BlobShape和BlobProto(src/caffe/proto/caffe.proto)

// Specifies the shape (dimensions) of a Blob.message BlobShape {  repeated int64 dim = 1 [packed = true];}message BlobProto {  optional BlobShape shape = 7;  repeated float data = 5 [packed = true];  repeated float diff = 6 [packed = true];  repeated double double_data = 8 [packed = true];  repeated double double_diff = 9 [packed = true];  // 4D dimensions -- deprecated.  Use "shape" instead.  optional int32 num = 1 [default = 0];  optional int32 channels = 2 [default = 0];  optional int32 height = 3 [default = 0];  optional int32 width = 4 [default = 0];}

解析:

1)message BlobShape描述了Blob的形状信息,message BlobProto描述了Blob在磁盘中序列化后的形态。

2)repeated int64 dim = 1 [packed = true];:只包含若干int64类型值,分别表示Blob每个维度的大小。packed表示这

些值在内存中紧密排布,没有空洞。

3)optional BlobShape shape = 7;:可选,包括一个BlobShape对象。

4)repeated float data = 5 [packed = true];:包括若干浮点元素,存储数据或权值,元素数目由shape或(num,

channels,height,weight)确定,这些元素在内存中紧密排布。

5)repeated float diff = 6 [packed = true];:包括若干浮点元素,用于存储增量信息,维度与data数组一致。


22. @brief

解析:C++注释中的函数简要说明。


23. Protobuf数据类型

解析:proto文件中数据类型可分为两大类:复合数据类型和标准数据类型。复合数据类型包括枚举和message类

型,标准数据类型包含整型,浮点,字符串等。proto文件经过protoc编译成C++代码,会生成对应的XXX.pb.h和

XXX.pb.cc。message会对应生成一个class,里面存放对应的data members,处理这些数据的函数,以及对应的打

包和解包函数。Protobuf消息定义由至少一个字段组合而成,类似于C语言中的结构。每个字段都有一定的格式。字

段格式:限定修饰符 | 数据类型 | 字段名称 | = | 字段编码值 | [字段默认值]。如下所示:

(1)限定修饰符:required必须赋值,不能为空,否则该条message会被认为是uninitialized。除此之

外,required字段跟optional字段并无差别。optional字段可以赋值,也可以不赋值。假如没有赋值的话,会被赋上默

认值。repeated字段可以包含0-N个元素。其特性和optional一样,但是每一次可以包含多个值,可以看作是在传递一

个数组的值。

(2)数据类型:bool;double;float;int32;uint32;int64;uint64;sint32(使用可变长编码,编码负数比int32更

高效);sint64(使用可变长编码,编码负数比int64更高效);fixed32;fixed64;sfixed32;sfixed64;string;

bytes。

(3)字段名称:protobuf建议字段的命名采用以下划线分割的驼峰式。比如first_name。

(4)字段编码值

(5)字段默认值


24. Protobuf文件中的package

解析:为避免名称冲突,可以给每个文件指定一个package名称,对于Java解析为Java中的包,对于C++则解析为名

字空间。


25. std::ostringstream

解析:typedef basic_ostringstream<char> ostringstream;ostringstream的继承关系ostringstream -ostream -> ios -

> ios_base。


参考文献:

[1] Windows+VS 2013详细Caffe编译安装教程:http://blog.csdn.net/xiercmdhacker/article/details/51834563

[2] 怎样解决warning LNK4099:未找到PDB“vc100.pdb”:http://blog.csdn.net/vchelpdoc/article/details/12873161

[3] Caffe学习系列(18): 绘制网络模型:http://www.cnblogs.com/denny402/p/5106764.html

[4] CAFFE学习笔记:http://www.cnblogs.com/NanShan2016/tag/caffe/

[5] VS2013和Caffe工程环境搭建(CPU模式):http://blog.csdn.net/wuzhiyang95_xiamen/article/details/52574668

1 0
原创粉丝点击