在学习Caffe model中关于Layers内容时,发现一个问题,ReLU层的top blob和bottom blob相同,如下:1
2
3
4
5
6layer {
name: "conv2/relu_3x3_reduce"
type: "ReLU"
bottom: "conv2/3x3_reduce"
top: "conv2/3x3_reduce"
}
后来查资料发现这是caffe的in-place操作,是为了节省内(显)存,以及省去反复申请和释放内存的时间。
bottom blob和top blob名称相同,说明是同一个blob,占用的是内存的同一块空间。在这里也就是说,该ReLU操作是对输入blob本身进行操作,再将其输出。
如果定义的两个layer
的top blob名称是一样的,那么这两个layer
的bottom blob也一定是该top blob,并且按layer
的定义顺序对该bottom blob进行操作。如果layer不是对bottom blob本身进行操作,那么top blob就不能与bottom blob相同,也不允许多个layer的top blob同名。因为假如这样做,后运算的layer会将top blob覆盖成其运算的结果,前面的layer的运算结果就消失了。
convolution、pooling层由于输入输出的size一般不一致,所以不能支持in-place操作;而ReLU函数是逐个对元素进行计算,不该变size,所以支持。AlexNet、VGGnet等都是在ReLU层使用in-place计算,ResNet中,BatchNorm和Scale也都使用了in-place计算。
目前已知支持in-place的有:ReLU层、Dropout层、BatchNorm层、Scale层。(除此之外,其他大部分layer貌似在定义时name
和top
是相同的。)