pytorch的nn.functional作用和用法


nn.Conv2是一個類,而F.conv2d是一個函數

這兩個功能並無區別,這兩種實現方式同時存在的原因如下

在建圖過程中,往往有兩種層,一種如全連接層 當中是有Variable ,另外一種是如Pooling  Relu層,當中是沒有Variable

如果所有的層都用nn.funcitonal來定義,那么所有的Variable如weight  bias等,都需要用戶來手動定義,非常不方便

如果所有的層都要nn來定義,那么簡單的都需要來建類比較麻煩。

 

這里要說明一個事情

****************************原文  https://www.zhihu.com/question/66782101  **********************

兩者的相同之處:

1  nn.Xxx和nn.functional.xxx的實際功能是相同的,即nn.Conv2d和nn.functional.conv2d都是進行卷積,nn.Dropout和nn.funtional.dropout都是進行dropout...

運行效率也是近乎相同的。

nn.functional.xxx是函數接口,而nn.Xxx是nn.funcitonal.xxx的封裝類,並且nn.xxx都繼承於一個共同的祖先,nn.Module。這一點導致nn.Xxx除了具有nn.funcitonal.xxx功能之外,內部附帶了nn.Module相關的屬性和方法。如train  eval  load_state_dict

兩者的差別之處:

調用方式不同

nn.Xxx需要先實例化並傳入參數,然后以函數調用的方式調用實例化的對象並傳入數據。

nn.Xxx不需要自己定義和管理weight,而nn.funcitonal.xxx需要自定義weight,每次調用的時候需要手動傳入weight。不利於代碼復用。

什么時候使用nn.functional.xxx,什么時候使用nn.Xxx

依賴於解決問題的復雜度和個人的愛好。在nn.Xxx不能滿足功能的時候,nn.funcitonal.xxx是更好的選擇。

 


免責聲明!

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



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