zoukankan      html  css  js  c++  java
  • caffe中关于(ReLU层,Dropout层,BatchNorm层,Scale层)输入输出层一致的问题

    在卷积神经网络中。常见到的激活函数有Relu层

    layer {
      name: "relu1"
      type: "ReLU"
      bottom: "pool1"
      top: "pool1"
    }
    其中可选参数为:negative_slope:默认为0. 对标准的ReLU函数进行变化,如果设置了这个值,那么数据为负数时,就不再设置为0,而是用原始数据乘以negative_slope

    relu层有个很大的特点:bottom(输入)和top(输出)一致,原因是:RELU层支持in-place计算,这意味着bottom的输出和输入相同以避免内存的消耗

    caffe中的in-place操作:caffe利用in-place计算可以节省内(显)存,同时还可以省去反复申请和释放内存的时间

    作者:朱坚升
    链接:https://www.zhihu.com/question/46501015/answer/101576664
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    相同名字的bottom和top这些blob就是同一个blob,占用的是同一个空间。

    简单来解释就是:int a;a = 0;a = 1;你可以无数次对这个a进行改变。对于blob来说也是一样。

    至于谁先谁后,那就是看你的网络定义哪个layer在前,它就先计算。如果有两个layer输出的blob名称是一样的,那么它们的输入blob也一定会有这个blob,也就是,如果layer不是对输入blob本身操作,就不允许输出blob同名。

    比如:layer1和layer2的输入和输出blob都是blob1,它们都是对blob1进行操作,这是允许的,直接按顺序计算就可以了。
    layer1的输入blob是blob1,输出blob是blob_out,layer2的输入blob是blob2,输出blob也是blob_out,那么这就是不允许的。

    因为它们不是对它们的输入blob本身进行操作,假设你允许这样的操作,那么后运算的layer会将blob_out覆盖成后运算的结果,前面运算的blob_out的结果就消失了。

    当然,layer1和layer2的输入和输出blob都是blob1,它们都是对blob1进行操作,比如layer1先计算,然后layer2后计算,计算layer2的结果也是会把layer1的结果给覆盖,只不过是网络已经不需要这个layer1的结果而已,因为它已经前向传播过去了...
    一般来说,convolution、pooling层应该没办法支持,因为top blob和bottom blob的size不一致。

    目前已知的支持in-place操作的层有:ReLU层,Dropout层,BatchNorm层,Scale层

  • 相关阅读:
    eclipse 异常Unhandled event loop exception
    eclipse序列化生成serialVersionUID
    [转载]给10万pv的WordPress选择最便宜高可用的硬件以及WordPress高并发支持
    struts2日常
    JQuery表格展开与内容筛选
    记一次简单的清理挖矿程序过程
    【原创总结】服务为什么会报404?
    【原创总结】Tomcat进程为什么起不来?
    【原创总结】服务为什么会报500的错误?
    【原创】关于nginx.pid丢失的解决办法
  • 原文地址:https://www.cnblogs.com/laowangxieboke/p/10286521.html
Copyright © 2011-2022 走看看