在卷积神经网络中。常见到的激活函数有Relu层
layer { name: "relu1" type: "ReLU" bottom: "pool1" top: "pool1" }其中可选参数为:negative_slope:默认为0. 对标准的ReLU函数进行变化,如果设置了这个值,那么数据为负数时,就不再设置为0,而是用原始数据乘以negative_slope
relu层有个很大的特点:bottom(输入)和top(输出)一致,原因是:RELU层支持in-place计算,这意味着bottom的输出和输入相同以避免内存的消耗
caffe中的in-place操作:caffe利用in-place计算可以节省内(显)存,同时还可以省去反复申请和释放内存的时间
作者:朱坚升
链接:https://www.zhihu.com/question/46501015/answer/101576664
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相同名字的bottom和top这些blob就是同一个blob,占用的是同一个空间。
简单来解释就是:int a;a = 0;a = 1;你可以无数次对这个a进行改变。对于blob来说也是一样。
至于谁先谁后,那就是看你的网络定义哪个layer在前,它就先计算。如果有两个layer输出的blob名称是一样的,那么它们的输入blob也一定会有这个blob,也就是,如果layer不是对输入blob本身操作,就不允许输出blob同名。
比如:layer1和layer2的输入和输出blob都是blob1,它们都是对blob1进行操作,这是允许的,直接按顺序计算就可以了。
layer1的输入blob是blob1,输出blob是blob_out,layer2的输入blob是blob2,输出blob也是blob_out,那么这就是不允许的。
因为它们不是对它们的输入blob本身进行操作,假设你允许这样的操作,那么后运算的layer会将blob_out覆盖成后运算的结果,前面运算的blob_out的结果就消失了。
当然,layer1和layer2的输入和输出blob都是blob1,它们都是对blob1进行操作,比如layer1先计算,然后layer2后计算,计算layer2的结果也是会把layer1的结果给覆盖,只不过是网络已经不需要这个layer1的结果而已,因为它已经前向传播过去了...
一般来说,convolution、pooling层应该没办法支持,因为top blob和bottom blob的size不一致。
目前已知的支持in-place操作的层有:ReLU层,Dropout层,BatchNorm层,Scale层
原文地址:https://www.cnblogs.com/laowangxieboke/p/10286521.html