【转】Caffe初试(八)Blob,Layer和Net以及对应配置文件的编写

深度网络(net)是一个组合模型,它由许多相互连接的层(layers)组合而成。Caffe就是组建深度网络的这样一种工具,它按照一定的策略,一层一层的搭建出自己的模型。它将所有的信息数据定义为blobs,从而进行便利的操作和通讯。Blob是caffe框架中一种标准的数组,一种统一的内存接口,它详细描述了信息是如何存储的,以及如何在层之间通讯的。

1、blob

Blobs封装了运行时的数据信息,提供了CPU和GPU的同步。从数学上来说,Blob就是一个N维数组。它是caffe中的数据基本单位,就像matlab中以矩阵为基本操作对象一样。只是矩阵是二维的,而Blob是N维的。N可以是2,3,4等等。对于图片数据来说,Blob可以表示为(N*C*H*W)这样一个4D数组。其中N表示图片的数量,C表示图片的通道数,H和W分别表示图片的高度和宽度。当然,除了图片数据,Blob也可以用于非图片数据。比如传统的多层感知机,就是比较简单的全连接网络,用2D的Blob,调用innerProduct层来计算就可以了。

2、layer

层是网络模型的组成要素和计算基本单位。层的类型比较多,如Data,Convolution,Pooling,ReLUmSoftmax-loss,Accuracy等,一个层的定义大致如下图:

从bottom进行数据的输入,计算后,通过top进行输出。图中的黄色多边形表示输入输出的数据,蓝色矩形表示层。

每一种类型的层都定义为三种关键的计算:setup,forward and backword

setup:层的建立和初始化,以及在整个模型中的连接初始化。

forward:从bottom得到输入数据,进行计算,并将计算结果送到top,进行输出。

backward:从层的输出端top得到数据的梯度,计算当前层的梯度,并将计算结果送到bottom,向前传递。

3、Net

就像搭积木一样,一个net由多个layer组合而成。

现给出一个简单的2层神经网络的模型定义(加上loss层就变成三层了),先给出这个网络拓扑。

第一层:name为mnist,type为Data,没有输入(bottom),只有两个输出(top),一个为data,一个为label

第二层:name为ip,type为InnerProduct,输入数据data,输出数据ip

第三层:name为loss,type为SoftmaxWithLoss,有两个输入,一个为ip,一个为label,有一个输出loss,没有画出来。

对应的配置文件prototxt就可以这样写:

name: "LogReg"
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  data_param {
    source: "input_leveldb"
    batch_size: 64
  }
}
layer {
  name: "ip"
  type: "InnerProduct"
  bottom: "data"
  top: "ip"
  inner_product_param {
    num_output: 2
  }
}
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "ip"
  bottom: "label"
  top: "loss"
}  

第一行将这个模型取名为LogReg,然后是三个layer的定义,参数都比较简单,只列出必须的参数。

时间: 2024-10-07 02:10:58

【转】Caffe初试(八)Blob,Layer和Net以及对应配置文件的编写的相关文章

如何在caffe中增加layer以及caffe中triple loss layer的实现

关于triplet loss的原理,目标函数和梯度推导在上一篇博客中已经讲过了,具体见:triplet loss原理以及梯度推导,这篇博文主要是讲caffe下实现triplet loss,编程菜鸟,如果有写的不优化的地方,欢迎指出. 1.如何在caffe中增加新的layer 新版的caffe中增加新的layer,变得轻松多了,概括说来,分四步: 1)在./src/caffe/proto/caffe.proto 中增加 对应layer的paramter message: 2)在./include/

Caffe中增加新的layer以及Caffe中triplet loss layer的实现

关于Tripletloss的原理,目标函数和梯度推导在上一篇博客中已经讲过了,具体见:Tripletloss原理以及梯度推导,这篇博文主要是讲caffe下实现Tripletloss,编程菜鸟,如果有写的不优化的地方,欢迎指出. 尊重原创,转载请注明:http://blog.csdn.net/tangwei2014 1.如何在caffe中增加新的layer 新版的caffe中增加新的layer,变得轻松多了,概括说来,分四步: 1)在./src/caffe/proto/caffe.proto 中增

如何给caffe添加新的layer ?

如何给caffe添加新的layer ? 初学caffe难免会遇到这个问题,网上搜来一段看似经典的话, 但是问题来了,貌似新版的caffe并没有上面提到的vision_layer:

【转】Caffe初试(九)solver及其设置

solver算是caffe的核心的核心,它协调着整个模型的运作.caffe程序运行必带的一个参数就是solver配置文件.运行代码一般为 #caffe train --solver=*_solver.prototxt 在Deep Learning中,往往loss function是非凸的,没有解析解,我们需要通过优化方法来求解.solver的主要作用就是交替调用前向(forward)算法和后向(backward)算法来更新参数,从而最小化loss,实际上就是一种迭代的优化算法. 到目前的版本,c

【Caffe代码解析】Layer网络层

Layer 功能: 是全部的网络层的基类,当中.定义了一些通用的接口,比方前馈.反馈.reshape,setup等. #ifndef CAFFE_LAYER_H_ #define CAFFE_LAYER_H_ #include <algorithm> #include <string> #include <vector> #include "caffe/blob.hpp" #include "caffe/common.hpp" #

caffe增加新的layer

---恢复内容开始--- 在caffe中如果想要增加新的功能层,必须要自己在caffe的安装目录下(source code)中增加相应的文件 大体步骤如下: 在caffe/src/caffe/proto/caffe.proto中增加对应layer的parameter message,  有两部分,现在LayerParameter中注册新层名字,注意选取不重复的ID, 然后写上新层的message传递的参数 在caffe/include/caffe/layers/中添加相应的新层的hpp文件,看其

caffe中的Blob块

首先说明:Blob定义了一个类模板. 让我们看一下Blob的头文件里有什么哈: 定义了一个全局变量: const int kMaxBlobAxes = 32; 看看它的构造函数: Blob() : data_(), diff_(), count_(0), capacity_(0) {}: explicit Blob(const int num, const int channels, const int height,const int width); explicit Blob(const v

Caffe计算net、layer向前向后传播时间

在caffe中计算某个model的整个net以及各个layer的向前向后传播时间,可以使用下面的命令格式: ./build/tools/caffe time --model=examples/mnist/mytest/execise1_train_test.prototxt -iterations 100 -gpu 0 其中model指向待测model的prototxt文件,-iterations后面的100表示迭代100次,-gpu 0 表示使用第一张显卡来计算时间,若使用CPU计算,将sol

【转】Caffe初试(七)其它常用层及参数

本文讲解一些其它的常用层,包括:softmax-loss层,Inner Product层,accuracy层,reshape层和dropout层及它们的参数配置. 1.softmax-loss softmax-loss层和softmax层计算大致是相同的.softmax是一个分类器,计算的是类别的概率(Likelihood),是Logistic Regression的一种推广. Logistic Regression只能用于二分类,而softmax可以用于多分类. softmax与softmax