caffe中關於(ReLU層,Dropout層,BatchNorm層,Scale層)輸入輸出層一致的問題


在卷積神經網絡中。常見到的激活函數有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層


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM