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是更好的選擇。