【问题标题】:Scale layer in CaffeCaffe 中的缩放层
【发布时间】:2016-09-21 12:21:27
【问题描述】:

我正在查看Caffe prototxt for deep residual networks 并注意到"Scale" 层的外观。

layer {
    bottom: "res2b_branch2b"
    top: "res2b_branch2b"
    name: "scale2b_branch2b"
    type: "Scale"
    scale_param {
        bias_term: true
    }
}

但是,此层在Caffe layer catalogue 中不可用。有人可以解释这一层的功能和参数的含义或指向 Caffe 的最新文档吗?

【问题讨论】:

    标签: neural-network deep-learning caffe conv-neural-network resnet


    【解决方案1】:

    您可以在 caffe here 上找到详细文档。

    具体来说,对于"Scale" 层,文档reads:

    计算两个输入 Blob 的乘积,后者 Blob 的形状“广播”以匹配前者的形状。相当于平铺后一个 Blob,然后计算元素乘积。
    第二个输入可以省略,在这种情况下,它作为层的参数学习。

    在您的情况下,(单个“底部”)似乎这一层学习了一个比例因子来乘以"res2b_branch2b"。此外,由于scale_param { bias_term: true } 意味着该层不仅学习乘法缩放因子,而且学习常数项。因此,前向传递计算:

    res2b_branch2b <- res2b_branch2b * \alpha + \beta
    

    在训练过程中,网络会尝试学习 \alpha 和 \beta 的值。

    【讨论】:

    • Shai,那么是不是相当于在res2b_branch2b后面放了一个filter size为1x1的卷积层。如果我们这样做,输出也将是 y = W*x + b,它会学习 W 和 b,对吗?那么当我们不提供后者底层时,这是否等同于 Scale 层?
    • @Dharma 只有当x 是一维时才等效。不要混淆内积和标量乘法。
    • 哦,好的。然后它只学习两个参数 alpha 和 beta,而不是在这种情况下整个 W 矩阵。我说的对吗?
    • @Dharma 是的,只有一个 标量 \alpha
    • 如果您在 Wolfram 语言中执行此操作,Scale 等价于 ConstantTimesLayer[] 后跟 ConstantPlusLayer[]。
    【解决方案2】:

    caffe.proto file 中也有一些关于它的文档,你可以搜索“ScaleParameter”。

    非常感谢您的帖子 :) Scale 层正是我想要的。如果有人想要一个按标量(0.5)缩放然后“添加”-2(并且这些值不应该改变)的图层示例:

    layer {
      name: "scaleAndAdd"
      type: "Scale"
      bottom: "bot"
      top: "scaled"
      param {
        lr_mult: 0
        decay_mult: 0
      }
      param {
        lr_mult: 0
        decay_mult: 0
      }
      scale_param {
        filler {
          value: 0.5    }
        bias_term: true
        bias_filler {
          value: -2
        }
      }
    }
    

    (也许,decay_mult 在这里是不必要的。但不知道。见 cmets。) 除此之外:

    • lr_mult: 0 - 关闭“那个参数”的学习 - 我认为 第一个 "param {" always(?) 指权重,第二个是偏差(lr_mult 不是 ScaleLayer 特定的)
    • filler:一个“FillerParameter”[see caffe.proto] 告诉如何填充省略的第二个 blob。默认是一个常量“值:...”。
    • bias_filler:参数告诉如何填充可选的偏置 blob
    • bias_term: 是否有bias blob

    全部取自 caffe.proto。并且:我只测试了上面两个填充值 = 1.2 的层。

    【讨论】:

    • 达斯韦森。您已经提供了权重和偏差项。所以你把 lr_mult=0 这样你就不需要学习它们,而 decay_mult = 0 这样你就不需要惩罚权重了。
    • @Dharma:等等,我已经在编辑中了,但是:我认为 decay_mult 是没有必要的。至少这样的额外正则化项不会改变(损失)梯度的方向。那是因为这些术语是常数,因为所涉及的变量(=规模和偏差)不允许改变。 -- 但是如果使用 decay_mult=0,它可能会运行得更快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 2016-04-26
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多