Caffe 入门

来源:互联网 发布:淘宝哪些鞋店是正品 编辑:程序博客网 时间:2024/06/08 14:53
  1. Caffe的模型需要两个重要的参数文件,网络模型和参数配置。分别是.prototxt 以及 .solver.prototex

  2. 绘制网络模型的时候,可以使用CAFFE中的python/draw_net.py

  3. 网络模型的输入为数据层,数据层是每个模型的最底层,是模型的入口,不仅提供数据的输入,也提供数据从Blobs转换成别的格式进行保存输出。通常数据的预处理(如减去均值, 放大缩小, 裁剪和镜像等),也在这一层设置参数实现。数据来源可以来自高效的数据库(如LevelDB和LMDB),也可以直接来自于内存。如果不是很注重效率的话,数据也可来自磁盘的hdf5文件和图片格式文件。关于数据层的参数设置,可以参考这篇博文http://www.cnblogs.com/denny402/p/5070928.html

  4. 关于*.slover.prototex中的参数理解,可以参考两篇博文:https://www.zhihu.com/question/24529483 以及 http://www.cnblogs.com/denny402/p/5074049.html
  5. Caffe的Blob结构是caffe进行数据传输的内存接口,其是一个标准的数组结构,按照图像数量N×通道数K×图像高度H×图像宽度W进行排列,按行为主存储。由于blob中最重要的是values 和 gradients两类数据,所以,blobs存储单元中对应data和diff两个数据节点,前者是网络中传递的普通数据,后者是通过网络计算得到的梯度。Blob数据既可以存储在CPU上,又可以存储在GPU上,因此有两种数据访问方法,静态不改变数值的方法(只读),和动态改变数值的方法(可写),参照这篇文章http://blog.csdn.net/u011037837/article/details/52420953
  6. caffe中的layer是网络执行计算的核心单元,一个layer包含3中基本操作:初始化setup,重置layer及相互之间的连接,forward从bottom中接受数据,计算前向传播后输出到top层,backward:给定top层的输出梯度,计算输入的梯度并传递到bottom层. Layer中input data用bottom表示output data用top表示。每一层定义了三种操作setup(Layer初始化), forward(正向传导,根据input计算output), backward(反向传导计算,根据output计算input的梯度)。forward和backward有GPU和CPU两个版本的实现。
  7. Net由一系列的Layer组成(无回路有向图DAG),Layer之间的连接由一个文本文件描述。模型初始化Net::Init()会产生blob和layer并调用Layer::SetUp。在此过程中Net会报告初始化进程。这里的初始化与设备无关,在初始化之后通过Caffe::set_mode()设置Caffe::mode()来选择运行平台CPU或GPU,结果是相同的。
  8. Caffe slover通过协调Net的前向推断计算和反向梯度计算对参数进行更新,从而减小loss的目的。其学习过程分为两个部分:Solver优化,更新参数,以及Net计算loss和gradient
  9. 每一次solver迭代完成以下工作:

    • 调用前向过程计算输出和loss
    • 调用后向计算梯度
    • 根据solver方法,利用梯度更新参数
    • 根据学习率,历史数据和求解方法更新solver状态(可以周期性的记录solver的快照)
  10. 关于VGG
    VGG与AlexNet相比,出来使用更多层以外,VGGNet所有的卷积层都是同样大小的kernel,尺寸为3*3,卷积间隔为1,同时有padding。VGGNet的网络模型特点如下:

    • 3*3是最小能捕捉上下左右和中心概念尺寸
    • 两个3*3就是5*5的卷积层,可以替代大的kernel尺寸
    • 多个3*3卷积比一个大尺寸的kernel卷积有更多的非线性,是的判别函数更加有力的表达
    • 多个3*3的卷积层比一个大尺寸的kernel有更少的参数
  11. VGGNet相比AlexNet只需要很少的迭代次数就可以收敛,原因如下:

    • 更深的网络和较小的kernel尺寸具有隐式的规则作用
    • 先训练浅层网络,在得到A网络的参数后,训练更深的网络E,同时使用A中得到的参数初始化对应的层
    • 针对多尺度多分辨率的处理:直接训练一个分类器,每次数据输入时,每张图片被随机重新缩放在一个尺度范围内,然后训练网络。卷积神经网络对与缩放有一定的不变性,通过multi-scale训练可以增加这种不变形的能力。
  12. 关于caffe的调试

    • 首先,写.prototxt文件后,放到网上的网络可视化网站上验一下网络是不是写对了,例如这个网站https://ethereon.github.io/netscope/#/editor 或者用caffe/python/draw.py来看网络结构
    • run一下网路,看到loss是下降的,一般不会有大的错
    • 用python 将.prototxt代表的网络结构导入进python环境,之后import caffe,运行一次net.forward(),查看每一个blobs中的输出以及parameter的输出,尤其是输入数据如果是图片的话,可以使用opencv打开输入图片看是否正常,在使用backword看下输出的梯度是否正常
    • 使用caffe只能从其中的固定结构中搭建网络,但是如果要自己创造一种网络层的话,需要自己写c++代码,这个时候测试这部分对不对,可以使用gdb或者使用caffe/src/caffe/test中的代码测试
原创粉丝点击