【04】caffe网络layer top和bottom可以一样的相关解释

Caffe model里为啥有的layer top和bottom还能一样的?例如我们有时候会在网络结构中会看到下面这样的定义,其中的输入bottom和输出的层名称都是"conv1_1",实际上产生这样的同名通常是我们利用python接口定义网络时使用了in_place=True参数设置造成的,caffe利用in-place计算可以节省内(显)存,同时还可以省去反复申请和释放内存的时间。

layer {
  name: "relu1_1"
  type: "ReLU"
  bottom: "conv1_1"
  top: "conv1_1"
}

解释:

相同名字的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的结果而已,因为它已经前向传播过去了...

一般来说,因为top blob和bottom blob的size不一致,所以中间过程的值都需要保存,那么convolution、pooling层没办法支持。

目前已知的支持in-place操作的层有:ReLU层,Dropout层,BatchNorm层,Scale层。

参考:Caffe model里为啥有的layer top和bottom还能一样的?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值