在Caffe中缩放层

17

我正在查看 Caffe深度残差网络的prototxt文件,发现了一个名为"Scale"的层。

layer {
    bottom: "res2b_branch2b"
    top: "res2b_branch2b"
    name: "scale2b_branch2b"
    type: "Scale"
    scale_param {
        bias_term: true
    }
}
然而,在Caffe层目录中并没有此层。是否有人可以解释一下这个层的功能和参数的含义,或者指向一个关于Caffe最新文档的链接?
2个回答

19

您可以在此处找到有关Caffe的详细文档。

具体来说,对于"Scale"层,文档描述如下:

  

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

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

res2b_branch2b <- res2b_branch2b * \alpha + \beta

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


1
那么,Shai,把一个卷积层与1x1的过滤器尺寸放在res2b_branch2b之后是否等同于将它们合并?如果我们这样做,输出将为y = W*x + b,它会学习W和b对吧?因此,当我们不提供后面的底部层时,这是否等同于规模层? - Dharma
1
@Dharma 只有当 x 是一维数组时才相等。不要混淆内积和标量乘法。 - Shai
哦,好的。那么在这种情况下,它只学习两个参数alpha和beta,而不是整个W矩阵。我说得对吗? - Dharma
@Dharma 是的,只有一个标量 \alpha。 - Shai
2
如果您正在使用 Wolfram 语言进行操作,则 Scale 相当于 ConstantTimesLayer[] 后跟 ConstantPlusLayer[] - Miladiouss

11

caffe.proto文件中,也有一些关于它的文档,您可以搜索“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是不必要的,但不确定。请看评论。) 除此之外:

  • lr_mult: 0 - 关闭“该参数”学习 - 我认为第一个"param {"始终(?)指的是权重,第二个指的是偏置(lr_mult并非特定于ScaleLayer)
  • filler:一个"FillerParameter"【查看caffe.proto】,告诉如何填充省略的第二个blob。默认值为一个常数"value:..."。
  • bias_filler:告诉如何填充可选的偏置blob的参数
  • bias_term:是否有偏置blob

以上都来自caffe.proto。另外:我只测试过上面的层,使用两个填充值都为1.2。


1
dasWesen。您已经提供了权重和偏置项。因此,您可以将lr_mult = 0,这样您就不需要学习它们,并且将decay_mult = 0,这样您就不需要惩罚权重。 - Dharma
@Dharma:等一下,我已经在编辑过程中了,但是:我认为 decay_mult 不再必要。至少这些额外的正则化项不会改变(损失)梯度的方向,因为这些项是常数,涉及的变量(比例和偏差)不能更改。-- 但是如果 decay_mult=0,它可能会运行得更快。 - dasWesen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接