Caffe学习(1): Caffe Tutorial阅读笔记

来源:互联网 发布:学生绿色上网软件 编辑:程序博客网 时间:2024/05/21 10:46

Caffe定义网络的基本组成结构:blob,net,layer

  • blob:信息(数据)存储,传递,操作的载体,实际上就是网络中的数据,并且描述了数据如何在layer,net中传递以及存储
  • layer: 模型和计算的基础,相当于模型的行为定义
  • net: layer的整合,连接

solving:实现模型与优化分离

blob

  • 从数值上来说,blob是一个以C语言的方式存储的一块N维矩阵
  • 它是网络中被处理的实际数据的一个封装
  • blob存储一批数据的方式:number N * channel K * height H * width W(总共可以有4维)
    • Number(N)(每次载入的数量)称为batch size(批大小),批处理能够提升性能
    • Channel(K) 称为特征维度,如RGB图像的K = 3
    • blob的维度是4D的,但是可以通过shape以及InnerProductLayer 来实现
    • parameter blob:参数节点(我的理解是对于每层,都要对应一些参数),假如全连接层(相当于普通神经网络)的输入是1024,输出是1000,那么该层的参数节点大小为1000*1024(因为output = parameter * input)

关于blob的实现细节

  • 对于每一个blob,都会存用两块内存来存数据:一个是原始数据data,一个是梯度diff(通过网络计算出来的)
  • 实际的数据可能存在CPU也可能存在GPU中,对于每一种情况,有两种方式来读取数据(而对于gpu数据,只需要将cpu改成gpu,如果要访问diff,则把data改成diff):
const Dtype* cpu_data() const;  //只能读数据Dtype* mutable_cpu_data();// 能改变数据的值
  • 关于读取数据,有以下几点需要注意:

    • 如果不想改变值,最好用const call
    • 不要保存上面代码返回的指针,每次要访问数据时,都用函数来获得指针(因为这里面涉及 到CPU与GPU的数据同步问题)
  • 涉及到GPU计算的时候,中间计算数据以及梯度都会保留在GPU中

layer : 计算、连接

  • layer是模型的基本组成以及计算单元,不同的layer允许不同的操作,比如:
    • convolve filters(卷积)
    • pooling(池化,相当于降采样)
    • take inner products(全连接)
    • apply nonlinearities like rectified-linear and sigmoid and other elementwise transformations
    • normalize(归一化)
    • load data
    • compute losses like softmax and hinge
  • 这里有关于各种layer的具体介绍

  • 关于每一个layer,定义了三种关键的计算操作:setup,forward,backward

    • setup是在模型初始化的时候对layer进行初始化以及连接的操作
    • Forward是给定输入(在网络底部),计算输出,并且发送到网络顶部
    • backward是根据对于输出的梯度,计算出layer关于参数以及输入的梯度,然后再反向传播到更前面的layer中
  • 更具体来说,需要有两个版本的Forward和Backward函数需要实现——GPU和CPU版本,如果没有GPU的实现,该层会以CPU的作为后备。这给快速实验提供了方便(当然了,跑起来的时候就会有额外的内存消耗了GPU——CPU——计算——GPU)

  • 如果需要做出自己定制的layer,至少需要:

    • 模块化代码
    • 定义Setup,Forward,Backward操作

Net

  • 网络中通过各个layer的输出的组合,可以计算出一个完成给定任务的函数
  • 而每一个layer的backward的组合,可以从loss中计算出梯度,并且完成指定的任务
  • Caffe是端到端的机器学习引擎
  • 在Caffe中,Net是若干个Layer连接而成的DAG
  • 一个典型的网络以输入数据为起点,以loss为终点
  • 在Caffe中,一个Net通过文本建模语言来定义
  • 模型的初始化通过Net::init()来处理,主要做了两件事情:
    • 搭建整个DAG,创建blobs和layers,调用每一个layer的SetUP()函数
    • 做一些bookkeeping的工作,比如检查整个网络结构的正确性
  • 构建网络之后,可以通过对Caffe::set_mode()来设置在哪个网络上面跑,以及在Caffe::mode()来查看当前在哪个设备上跑

模型格式

  • 模型是通过prototxt来定义的
  • 学习到的模型参数是通过binary proto buffer (binaryproto).caffemodel 文件来存储的