关于caffe中的solver:

cafffe中的sover的方法都有:

  • Stochastic Gradient Descent (type: "SGD"),
  • AdaDelta (type: "AdaDelta"),
  • Adaptive Gradient (type: "AdaGrad"),
  • Adam (type: "Adam"),
  • Nesterov’s Accelerated Gradient (type: "Nesterov") and
  • RMSprop (type: "RMSProp")

solver都干了点什么?

1,创建训练网络与测试网网络.

2,进行前向传播与误差反向传播,更新参数,优化网络.

3, 间歇地进行用验证集进行测试test网络.

4, 在优化过程中,可以选择进行快照,进行保存中间状态.

数据输入层 (data layer):

在caffe中, 数据通过caffe进入.通常情况下,数据可以直接从内存中读中,可以从高效的LevelDB/LMDBD Database 中读入, 也可以从HDF5格式的硬盘文件中读去或着通常的图片文件.

通常我们对数据的预处理,我们可以参考TransformationParams里的设定.

Database 层: 类型为Data

这就是从LMDB/LeverlDB文件中读取数据的层;

In-Memory层: type:MemoryData

当我们想直接从内存中读取数据的话,那就需要调用MemoryDataLayer::Reset(c++程序)或Net.input_arrays(python程序),来指明数据源.

HDF5 Input层,类型为:HDF5Data

它的作用为从HDF5文件类型里读放数据,我们就看一个例子哦

  1. 2 layer {
  2. 3 name: "mnist"
  3. 4 type: "HDF5Data"
  4. 5 top: "data"
  5. 6 top: "label"
  6. 7 include {
  7. 8 phase: TRAIN
  8. 9 }
  9. 13 hdf5_data_param {
  10. 14 source: "mydata/train_list.txt" //是个坑哦,下面下面解释;
  11. 15 batch_size: 200
  12. 17 }

上面的代码需要一地方解释:在定义.proto文件里的data层时注意,hdf5_data_param的source不要直接写我们生成的HDF5文件的路径,而是写一个.txt文件的,并在.txt文件里写入你生成的HDF5文件的路经,一个HDF5文件路径占一行,一定要这样哦。原因是因为,我们可以要读入多个HDF5文件,所以要这样写哦。

HDF5 Output层 类型为:HDF5Output

它的作用为把数据写成HDF5格式

另外还有,Images, Windows, Dummy.

激活函数层: 如果要用激活函数的话,就相当于增加一层哦

ReLU激活函数(rectified-linear and Leaky-ReLU):类型为ReLU.

在标准的ReLU激活函数中,当输入为x时,如果x>0,则输出 x,如果输入<=0,则输出0,即输出为max(0,x).

在非标准的ReLU激活函数中,当输入x<=0时, 输出为x * negative_slop(它是一个参数,默认为0).

sigmoid激活函数:类型为 Sigmoid.

这个不用多解释了.

tanh激活函数,类型为: TanH.

这个也不用多解释了.

Abolute Value:类型为 AbsVal.

计算绝对值的函数.

power激活函数:类型为:Power.

The Power layer computes the output as (shift + scale * x) ^ power for each input element x.

BNLL激活函数:类型为 BNLL.

The BNLL (binomial normal log likelihood) layer computes the output as log(1 + exp(x)) for each input element x.

caffe中的layer:

convolution层:

layer的类型为:Convolution.,它有很参数,具体可以看caffe.proto里的message ConvolutionParam{}的定义.

num_output :输出的 feature map的个数啦,是否有偏置项啦,是否有把图像的边缘补充/卷积核的大小./步长/权值如何填充/偏置如何填充等.

看一个例子:

  1. layer {
  2. name: "conv1"
  3. type: "Convolution"
  4. bottom: "data"
  5. top: "conv1"
  6. # learning rate and decay multipliers for the filters
  7. param { lr_mult: 1 decay_mult: 1 }
  8. # learning rate and decay multipliers for the biases
  9. param { lr_mult: 2 decay_mult: 0 }
  10. convolution_param {
  11. num_output: 96 # learn 96 filters
  12. kernel_size: 11 # each filter is 11x11
  13. stride: 4 # step 4 pixels between each filter application
  14. weight_filler {
  15. type: "gaussian" # initialize the filters from a Gaussian
  16. std: 0.01 # distribution with stdev 0.01 (default mean: 0)
  17. }
  18. bias_filler {
  19. type: "constant" # initialize the biases to zero (0)
  20. value: 0
  21. }
  22. }
  23. }

pooling层:类型为:Pooling

这一层也有很多参数选择, 如pooling的核的大小/步长/pad(即上面的是否为边界加一些默认的值), 还有pooling的方法:现在有max/ average/stochastic三个方法.,具体看一下caffe.proto里的定义.

  1. layer {
  2. name: "pool1"
  3. type: "Pooling"
  4. bottom: "conv1"
  5. top: "pool1"
  6. pooling_param {
  7. pool: MAX
  8. kernel_size: 3 # pool over a 3x3 region
  9. stride: 2 # step two pixels (in the bottom blob) between pooling regions
  10. }
  11. }

LRN层:,类型为LRN.      即local response normalizaiton,它的作用是通过normalizing 局部输入区域,达到侧向抑制的目的(为什么,还不确定,记得在论文里看到过类似的方法).它分为两种模式,一种是across-channels,一种是within_channels .在arcoss-channel里, 分选择在相邻的feature-map之间进行,它的区域差不多为local_size *1 *1, 如果选择within_channels的话,该操作会选择在同一个feature map上操作,它的区域相当于 1* local_size * local_size.

Inner Product 层: 类型为:InnerProduct

它就是我们据说的全连接层.

caffe中的dropout 层

对于dropout层,说一下(论文中我们都会看到当我们有训练过程中dropout为(比如)0.3时,我们在测试时我们不会进行dropout,而是把输出乘以0.7。所以呢,caffe是怎么实现的呢?

当我们定义的net.prorotxt文件中,有了dropout这一层的时候,然后呢,caffe会根据你是训练还是测试进行不同的操作,当训练时,我们有一部分的神经元被dropout,然后,剩余的乘以1/(1-0.3). 然后,在测试时,dropout直接把数据进行从上一层复制到下一层,不进行操作。

明白了吧。。所以,我们不用在网络中进行定义 乘以0.7这一步。。你只需要分成训练还是测试就可以了。下面是一个dropout的例子:

  1. layer {
  2. name: "drop1"
  3. type: "Dropout"
  4. bottom: "ip11"
  5. top: "ip11"
  6. dropout_param {
  7. dropout_ratio: 0.3
  8. }
  9. }

loss层:

在caffe中,默认的以loss结尾的layer可以作为loss层,但是中间的层同样可以作为loss层.原因是这样的:

有一个和这个相关的参数:loss_weight,它决定了你的每个loss层占最好的loss的大小.

在以loss结尾的layer里面, loss_wight的大小为1. 在不是以loss结尾的layer里面,它的loss_weight为0.

如:

  1. layer {
  2. name: "loss"
  3. type: "SoftmaxWithLoss"
  4. bottom: "pred"
  5. bottom: "label"
  6. top: "loss"
  7. loss_weight: 1 #这个是默认的,可以不写的.
  8. }

如果我们想在一个net里,包含多个loss层的话,我们就可以设置他们对应的loss_weight在大小,这就相当于一个权值.(如一个网络中,我们即用softmaxWithloss用来分类,也用EuclideanLoss用来计算重构输入的loss).

最后在计算总的loss的时候,它的输出可以用下面的伪代码表示:

  1. loss := 0
  2. for layer in layers:
  3. for top, loss_weight in layer.tops, layer.loss_weights:
  4. loss += loss_weight * sum(top)

softmax: 类型为:SoftmaxWithLoss

它的类型为:SoftmaxWithLoss.它其实就是一个 softmax层,然后跟了个multinomial logistic loss层. 它比单独用softmax层可以使梯度值更稳定.

sum-of-squares/也叫euclidean:

就是平时我们说的平方差代价函数.

hinge Loss: 类型:HingeLoss

最常用在 SVM 中的最大化间隔分类中等. hinge loss常分为1vs all hinge和squared hinge loss,即 L1 与L2hange.

  1. # L1 Norm
  2. layer {
  3. name: "loss"
  4. type: "HingeLoss"
  5. bottom: "pred"
  6. bottom: "label"
  7. }
  8.  
  9. # L2 Norm
  10. layer {
  11. name: "loss"
  12. type: "HingeLoss"
  13. bottom: "pred"
  14. bottom: "label"
  15. top: "loss"
  16. hinge_loss_param {
  17. norm: L2
  18. }
  19. }

sigmoid cross-entropy loss:

就是平常所见的交叉熵损失函数. 类型:SigmoidCrossEntropyLoss

infogain loss:信息增益损失函数: ,类型:InfogainLoss

一些功能的layer:

splitting(把一个输入分成多个输出),类型:splitting

在caffe.proto里为什么没有找到呢.它的作用就是把一个输入复制为多个输入哦;

Flattening:类型为:Flatten

偏平的意思,如 flattens an input of shape n * c * h * w to a simple vector output of shape n * (c*h*w))。

Reshape:(重新调整维度),类型为:Reshape

Cocatenation(把多个输入可以串联起来):类型为:Concat

Slicing(可以对输入进行切片)

类型为:Slice: 它的作用是把输入按维度进行切片。具体看一个例子哈:

  1. layer {
  2. name: "slicer_label"
  3. type: "Slice"
  4. bottom: "label"
  5. ## 假设label的维度是:N x 5 x 1 x 1
  6. top: "label1"
  7. top: "label2"
  8. top: "label3"
  9. top: "label4"
  10. slice_param {
  11. axis: 1 # 指定维度,维度应该是从0开始的;
  12. slice_point: 1 # 将label[~][:1][~][~]赋给label1
  13. slice_point: 2 # 将label[~][1:3][~][~]赋给label2
  14. slice_point: 3 # 将label[~][3:4][~][~]赋给label3
  15. slice_point: 4 # 将label[~][4:][~][~]赋给label3
  16. }
  17. }

还有,切片的位置数,肯定比最后切出来的片数少一个哈。不用解释的啦。

另外还有:Elementwise Operations(类型为Eltwise), Argmax(类型为ArgMax), Softmax(类型为Softmax),

Mean-Variance Normalization(类型为MVN)

由于以上内容我只用到了一少部分,所以大部分没有详细写叱 ,随着不断的深入学习,我会再详细补充的,

 

 

 

caffe中各层的作用:的更多相关文章

  1. TensorFlow与caffe中卷积层feature map大小计算

    刚刚接触Tensorflow,由于是做图像处理,因此接触比较多的还是卷及神经网络,其中会涉及到在经过卷积层或者pooling层之后,图像Feature map的大小计算,之前一直以为是与caffe相同 ...

  2. Caffe中Interp层的使用

    最近实验当中借鉴了FPN网络,由于FPN网络对图片shape有要求,采用了两种方式,其一是在data_layer.cpp中,对原图进行padding操作:其二是需要对特征图进行类似crop操作,使得两 ...

  3. caffe中卷积层和pooling层计算下一层的特征map的大小

    pool层,其中ceil是向上取整函数 卷积层:

  4. (原)torch和caffe中的BatchNorm层

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6015990.html BatchNorm具体网上搜索. caffe中batchNorm层是通过Batc ...

  5. 【神经网络与深度学习】如何在Caffe中配置每一个层的结构

    如何在Caffe中配置每一个层的结构 最近刚在电脑上装好Caffe,由于神经网络中有不同的层结构,不同类型的层又有不同的参数,所有就根据Caffe官网的说明文档做了一个简单的总结. 1. Vision ...

  6. TCP/IP中链路层的附加数据(Trailer数据)和作用

    1.TCP/IP中链路层的附加数据是什么 在用wireshark打开报文时,链路层显示的Trailer数据就是附加数据,如图 2.如何产生 1.例如以太网自动对小于64字节大小的报文进行填充(未实验) ...

  7. caffe 中 python 数据层

    caffe中大多数层用C++写成. 但是对于自己数据的输入要写对应的输入层,比如你要去图像中的一部分,不能用LMDB,或者你的label 需要特殊的标记. 这时候就需要用python 写一个输入层. ...

  8. caffe中关于(ReLU层,Dropout层,BatchNorm层,Scale层)输入输出层一致的问题

    在卷积神经网络中.常见到的激活函数有Relu层 layer { name: "relu1" type: "ReLU" bottom: "pool1&q ...

  9. Altium_Designer-PCB中各层作用详解

    一直以来,对PCB中各层,比如:solder层.paste层.Top overlay层等等这些一知半解.今天仔细看了下,向大家介绍一下,有不对的地方还请指正. 1.mechanical机械层是定义整个 ...

随机推荐

  1. Python常用模块之sys

    Python常用模块之sys sys模块提供了一系列有关Python运行环境的变量和函数. 常见用法 sys.argv 可以用sys.argv获取当前正在执行的命令行参数的参数列表(list). 变量 ...

  2. Unit03 - 对象内存管理 、 继承的意义(上)

    Unit03 - 对象内存管理 . 继承的意义(上) 1.内存管理:由JVM来管理的  1)堆:    1.1)存储所有new出来的对象(包含成员变量)    1.2)没有任何引用所指向的对象就是垃圾 ...

  3. Unit02-OOP-对象和类,数组(下)

    Unit02-OOP-对象和类,数组(下) 1.方法的签名: 方法名+参数列表 2.方法的重载(Overload):  1)发生在一个类中,方法名称相同,参数列表不同  2)编译器在编译时自动根据签名 ...

  4. IBM服务器诊断面板

    IBM服务器一般会有一个服务器操作员信息面板(诊断面板),服务器一般的硬件故障都会在诊断面板上提示,但这些提示可能只是一个大概的诊断故障,有助于系统管理员更好的维护. 一.IBM X3650 M3诊断 ...

  5. ios - 纯代码创建collectionView

    开始考虑好一点点时间,因为一般的都是用xib,或者storyboard来写的.这次用纯代码...废话较多请看 首先把storyboard干掉,工程里面的main干掉 由于干掉了storyboard则启 ...

  6. px、em、rem区别介绍

    px.em.rem区别介绍 PX px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的. PX特点 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能 ...

  7. 全网扫描扫描10000端口后的优化脚本&域名列表指定端口的批量测试

    方法一: #coding=utf-8 import urllib2 import threading from time import ctime,sleep print "Start-Ti ...

  8. Android -- 自定义View小Demo,动态画圆(一)

    1,转载:(http://blog.csdn.NET/lmj623565791/article/details/24500107),现在如下图的效果: 由上面的效果图可以看到其实是一个在一个圆上换不同 ...

  9. 【实践】纯jquery实现图片滑动无缝轮播,带左右按钮及控制按钮

    在此随笔之前,博主已经做过一次图片滑动轮播,如过你也有看过就会知道里面的效果在自动轮播的时候有一个不太美观的效果,就是当最后一张图片滑动切换到第一张图片的时候会看到一个快速向左滑动的效果,这是很不美观 ...

  10. 看门外汉如何实现:C#操作 MongoDB基本CURD的事务控制

    第一部分 基本设计 目前最新版本的C#驱动MongoDB-CSharpDriver-2.2.3,比之前的版本更新比较大,在网上很难找到这个版本的相关C#操作资料,以下都是个人自发研究.测试的,如有雷同 ...