何时在 Caffe 中使用就地图层?

When to use in-place layers in Caffe?

通过将底部和顶部 blob 设置为相同,我们可以告诉 Caffe 进行 "in-place" 计算以节省内存消耗。

目前我知道我可以安全地使用就地 "BatchNorm""Scale""ReLU" 层(如果我错了请告诉我)。虽然它似乎对其他层有一些问题(this issue 似乎是一个例子)。

何时在 Caffe 中使用就地层?
它如何与反向传播一起工作?

如您所见,就地图层通常不起作用 "out of the box"。
对于某些层,它非常微不足道("ReLU" 和其他神经元激活层)。
但是,对于其他人来说,它需要在代码中进行特殊处理。例如,"PReLU"层的实现有特定的缓存bottom_memory_成员变量,用于存储反向传播所需的信息。
您可以看到其他层的类似代码,这些代码专门测试 if (top[0] == bottom[0]) 以查看该层是否用于 "in-place" 情况。

此外,输入和输出具有不同形状的就地层毫无意义,因此层如 "Convolution""InnerProduct""Pool"不被视为 "in-place" 层的候选对象。