专栏首页AI异构caffe详解之卷积层

caffe详解之卷积层

从零开始,一步一步学习caffe的使用,期间贯穿深度学习和调参的相关知识!

卷积层参数说明

layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1  #lr_mult: 学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr。如果有两个lr_mult, 则第一个表示权值的学习率,第二个表示偏置项的学习率。一般偏置项的学习率是权值学习率的两倍。
  }
  param {
    lr_mult: 2  #偏置项的学习率
  }
  convolution_param {
    num_output: 20 #卷积核(filter)的个数
    kernel_size: 5 #卷积核的大小
    stride: 1 #卷积核的步长,默认为1
    pad: 0 #扩充边缘,默认为0,不扩充
    group: 2 #默认为0(通达卷积的实现方式)
    weight_filler {
      type: "xavier" #权值初始化。 默认为“constant",值全为0,很多时候我们用"xavier"算法来进行初始化,也可以设置为”gaussian"
    }
    bias_filler {
      type: "constant" #偏置项的初始化。一般设置为"constant",值全为0
    }
  }
}

卷积配置参数意义

卷积计算公式

卷积计算过程图示

上图取自CS231n,展示了三维卷积的计算过程,输入数据的三个维度,对应第二个卷积核生成了第二个Feature Map

Feature Map大小计算

如上图所示,输出Feature Map大小计算公式如下:

权值与偏置的初始化方法

caffe源文件filler.hpp中提供了7种权值初始化的方法。在计算机视觉的领域中权重参数的初始化常用xavier,偏置的初始化常用constant,并且初始化为0

Filler<Dtype>* GetFiller(const FillerParameter& param) {
  const std::string& type = param.type();
  if (type == "constant") {
    return new ConstantFiller<Dtype>(param);
  } else if (type == "gaussian") {
    return new GaussianFiller<Dtype>(param);
  } else if (type == "positive_unitball") {
    return new PositiveUnitballFiller<Dtype>(param);
  } else if (type == "uniform") {
    return new UniformFiller<Dtype>(param);
  } else if (type == "xavier") {
    return new XavierFiller<Dtype>(param);
  } else if (type == "msra") {
    return new MSRAFiller<Dtype>(param);
  } else if (type == "bilinear") {
    return new BilinearFiller<Dtype>(param);
  } else {
    CHECK(false) << "Unknown filler name: " << param.type();
  }
  return (Filler<Dtype>*)(NULL);
}

结合 .prototxt 文件中的 FillerParameter来看看怎么用

message FillerParameter {
  // The filler type.
  optional string type = 1 [default = 'constant'];
  optional float value = 2 [default = 0]; // the value in constant filler
  optional float min = 3 [default = 0]; // the min value in uniform filler
  optional float max = 4 [default = 1]; // the max value in uniform filler
  optional float mean = 5 [default = 0]; // the mean value in Gaussian filler
  optional float std = 6 [default = 1]; // the std value in Gaussian filler
  // The expected number of non-zero output weights for a given input in
  // Gaussian filler -- the default -1 means don't perform sparsification.
  optional int32 sparse = 7 [default = -1];
  // Normalize the filler variance by fan_in, fan_out, or their average.
  // Applies to 'xavier' and 'msra' fillers.
  enum VarianceNorm {
    FAN_IN = 0;
    FAN_OUT = 1;
    AVERAGE = 2;
  }
  optional VarianceNorm variance_norm = 8 [default = FAN_IN];
}
constant初始化
optional string type = 1 [default = 'constant'];
optional float value = 2 [default = 0]; // the value in constant filler

caffe中默认的初始化方式,它就是把权值或着偏置初始化为一个常数,具体是什么常数,自己可以定义。它的值等于上面的.prototxt文件中的 value的值,默认为0

xavier初始化
  // Normalize the filler variance by fan_in, fan_out, or their average.
  // Applies to 'xavier' and 'msra' fillers.
  enum VarianceNorm {
    FAN_IN = 0;
    FAN_OUT = 1;
    AVERAGE = 2;
  }
  optional VarianceNorm variance_norm = 8 [default = FAN_IN];

xavier是和relu完美配合的初始化。xavier诞生时并没有用relu做例子,但是实际效果中xavier还是和relu很搭配的。

xavier初始化定义为:定义参数所在层的输入维度为n,输出维度为m,那么参数将以均匀分布的方式在

的范围内进行初始化。具体的原理可以参靠 CNN数值——xavier (https://zhuanlan.zhihu.com/p/22028079) 它的思想就是让一个神经元的输入权重的(当反向传播时,就变为输出了)的方差等于:1 / 输入的个数;这样做的目的就是可以让信息可以在网络中均匀的分布一下。 对于权值的分布:是一个让均值为0,方差为 1 / 输入的个数 的均匀分布。 如果我们更注重前向传播的话,我们可以选择 fan_in,即正向传播的输入个数;如果更注重后向传播的话,我们选择 fan_out, 因为,等着反向传播的时候,fan_out就是神经元的输入个数;如果两者都考虑的话,那就选 average = (fan_in + fan_out) /2

参考

caffe中权值初始化方法 CNN数值——xavier

本文分享自微信公众号 - AI异构(gh_ed66a0ffe20a),作者:许柯

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-02-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 神经网络架构搜索——可微分搜索(DAAS)

    神经架构搜索(NAS)的搜索成本为通过权值共享方法大大减少。这些方法通过优化所有可能的边缘和操作的超级网络,从而确定离散化的最佳子网,即修剪弱候选者。在操作或边...

    AI异构
  • Intel OpenCL 之 Pipeline(四):Pipeline不理想的几种情况

    pipeline不理想的情况主要有两类,一类是影响II的,一类是不影响II的。影响II的会导致II值大于1,不影响II的称为Serial Regions。

    AI异构
  • 神经网络架构搜索——可微分搜索(SGAS)​

    NAS技术都有一个通病:在搜索过程中验证精度较高,但是在实际测试精度却没有那么高。传统的基于梯度搜索的DARTS技术,是根据block构建更大的超网,由于搜索的...

    AI异构
  • 手写ORM入门篇(一)

    对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编...

    指尖改变世界
  • go中的接口与多态

    本来想格式化下盘,谁知道格式化完以后啥都没有,连系统都没了,几乎和 rm -rf / 有得一拼!

    机智的程序员小熊
  • 【swagger】C# 中 swagger 的使用及避坑

    开发 web api 的时候,写文档是个痛苦的事情,而没有文档别人就不知道怎么调用,所以又不得不写。

    丹枫无迹
  • 优雅的windowsC++项目的配置

    生成目录:$(SolutionDir)bin$(Platform)$(Configuration)

    gongluck
  • Heartbeat + haproxy + MySQL主从复制 实现读写分离及高可用

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1148526
  • 码上淘,阿里O2O不再从支付出发:有何优劣与劣势?

    阿里6月10日在杭州正式发布”码上淘“战略。在发布会之前,如果提到“码”,人们第一时间会想到支付。但这一次,阿里谈的不是支付,而是基于”码“的连接。通过5类码...

    罗超频道
  • Sentinle集群流控【源码笔记】

    本文从集群流控概览入手,按照概览的步骤逐步分析各个步骤的源码实现过程。由于集群流控中token server可以是独立部署也可以是使用内嵌模式(即集群应用中的其...

    瓜农老梁

扫码关注云+社区

领取腾讯云代金券