caffe inplace 操作

所谓的in-place操作,即就地操作,就是说一个函数的输入图像src与输出图像dst是同一图像。比如,高斯滤波函数GaussianBlur( )支持in-place,那么我们就可以:

GaussianBlur(src,src,Size(3,3),2,2);

而不需要:

GaussianBlur(src,dst,Size(2,2),2,2);

caffe利用in-place计算可以节省内(显)存,同时还可以省去反复申请和释放内存的时间。
相同名字的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层


所谓的in-place操作,即就地操作,就是说一个函数的输入图像src与输出图像dst是同一图像。比如,高斯滤波函数GaussianBlur( )支持in-place,那么我们就可以:

GaussianBlur(src,src,Size(3,3),2,2);

而不需要:

GaussianBlur(src,dst,Size(2,2),2,2);

猜你喜欢

转载自blog.csdn.net/qq_15505637/article/details/80854755