何时在Caffe中使用原地层?

23

通过将底部和顶部Blob设置为相同的值,我们可以告诉Caffe进行“原地”计算以保留内存消耗。

目前我知道可以安全地使用“BatchNorm”,“Scale”和“ReLU”层进行就地计算(如果我错了,请让我知道)。虽然似乎对于其他层(此问题似乎是一个例子),它似乎存在一些问题。

何时在Caffe中使用就地计算层?
它如何与反向传播配合使用?


@Shai,感谢您的回答,它确实有所帮助! - dontloo
1个回答

12

正如你所注意到的,在原地层通常不会立即"out of the box"运行。
对于某些层,例如"ReLU"和其他神经元激活层,这是相当微不足道的。
然而,对于其他层,需要在代码中进行特殊处理。例如"PReLU"层的实现具有特定的缓存bottom_memory_成员变量,用于存储反向传播所需的信息。
您可以看到其他层的类似代码,它们专门测试if (top[0] == bottom[0]),以查看该层是否用于"in-place"情况。

此外,对于输入和输出具有不同形状的原地层毫无意义,因此像"Convolution""InnerProduct""Pool"这样的层不被视为"原地"层候选。


谢谢。BatchNorm层的in-place=Truein-place=False怎么样?有时候,我看到论文中使用in-place=False来进行BatchNorm层的操作。这种情况下我们有什么好处吗? - John
@user8264,我对BatchNorm层的内部不太熟悉,所以无法发表评论。有时候使用in_place需要更多的计算量(为了节省空间)...你真的需要问指定in_place=False的人... - Shai

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