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