通过将底部和顶部Blob设置为相同的值,我们可以告诉Caffe进行“原地”计算以保留内存消耗。
目前我知道可以安全地使用“BatchNorm”,“Scale”和“ReLU”层进行就地计算(如果我错了,请让我知道)。虽然似乎对于其他层(此问题似乎是一个例子),它似乎存在一些问题。
何时在Caffe中使用就地计算层?
它如何与反向传播配合使用?
通过将底部和顶部Blob设置为相同的值,我们可以告诉Caffe进行“原地”计算以保留内存消耗。
目前我知道可以安全地使用“BatchNorm”,“Scale”和“ReLU”层进行就地计算(如果我错了,请让我知道)。虽然似乎对于其他层(此问题似乎是一个例子),它似乎存在一些问题。
何时在Caffe中使用就地计算层?
它如何与反向传播配合使用?
正如你所注意到的,在原地层通常不会立即"out of the box"运行。
对于某些层,例如"ReLU"
和其他神经元激活层,这是相当微不足道的。
然而,对于其他层,需要在代码中进行特殊处理。例如"PReLU"
层的实现具有特定的缓存bottom_memory_
成员变量,用于存储反向传播所需的信息。
您可以看到其他层的类似代码,它们专门测试if (top[0] == bottom[0])
,以查看该层是否用于"in-place"情况。
此外,对于输入和输出具有不同形状的原地层毫无意义,因此像"Convolution"
,"InnerProduct"
,"Pool"
这样的层不被视为"原地"层候选。
in-place=True
和in-place=False
怎么样?有时候,我看到论文中使用in-place=False
来进行BatchNorm层的操作。这种情况下我们有什么好处吗? - Johnin_place=False
的人... - Shai