PyTorch 中,nn 與 nn functional 有什麼區別?

時間 2021-05-06 18:28:10

1樓:老實人

上面使用者有糖吃可好 講的已經挺好了,我再插兩句:

在建圖過程中,往往有兩種層,一種含引數、有Variable,如全連線層,卷積層、Batch Normlization層等;另一種不含引數、無Variable,如Pooling層,Relu層,損失函式層等。

閱讀原始碼發現 nn.裡面的是繼承自nn.module 初始化為例項化乙個類,如果含引數,則會幫你初始化好引數。

而nn.functional.裡面則是相當於直接乙個函式控制代碼給你,如果需要引數,則需要你自己輸入引數,且並不會「記住」這個引數。

如果要涉及到引數計算的,那用nn. 裡的;如果不需要涉及更新引數,只是一次性計算,那用nn.functional.裡面的。

2樓:學而時習

可以粗略理解為nn是對func的封裝,nn在func之上。

如果你對C/C++熟悉,那麼就可以理解為乙個是類,乙個是(無全域性變數和靜態區域性變數)函式。類是會包含成員變數的(引數、權重、變數),函式就是一入一出。

3樓:光子重構

各位答主說的還算全面,突然想到乙個例子來說一下 nn.functional 的作用。

有這麼一種情況, 我想行為不同,但引數矩陣相同的兩個 layer 共享引數, 該怎麼做呢?

如果行為相同那就簡單了,直接多次呼叫 nn 裡面的 Module 就好了。

行為不同咋搞呢,比如說,我想讓兩個 dilation 不同但 kernel 相同的 Conv2d 層共享引數,此時 nn.functional 就派上用場了:

import

torch

import

torch.nn

asnn

import

torch.nn.functionalasF

class

Model(nn

.Module

):def

__init__

(self

):super

(Model

,self).

__init__

()self

.weight=nn

.Parameter

(torch

.Tensor(10

,10,3

,3))def

forward

(self,x

):x_1=F

.conv2d(x

,self

.weight

,dilation=1

,padding=1

)x_2=F

.conv2d(x

,self

.weight

,dilation=2

,padding=2

)return

x_1+

x_2這個操作很像 MXNet 裡共享引數的做法。 無奈的是在 MXNet 裡不管行為相同還是不同,都得這麼做, 而 pytorch 的 nn 模組則可以大大方便相同行為層的引數共享。

這個操作會有用的,尤其是做 detection 和 segmentation 的同學。

4樓:

補充一點。nn.functional中的函式僅僅定義了一些具體的基本操作,不能構成PyTorch中的乙個layer。

當你需要自定義一些非標準layer時,可以在其中呼叫nn.functional中的操作。

pytorch與tensorflow未來哪乙個會佔據更大的使用者群體?

HetingJian pytorch永遠滴神,對於初學者半個小時就能寫個CNN還要啥自行車,我是完全從不會入手的pytorch,就簡單的功能來說對新手太友好遼。 破圓的角 這麼說吧。很久沒用tf,2.0出來的時候用colab玩了一下。我人傻了。推薦用顯式的檢測錯誤的方式來檢測epoch的結束。確實我...

pytorch中,相同的batchsize,多GPU會比單GPU快多少?雙路能是單路的兩倍嗎?

張懷文 相同的batchsize,多gpu會不會比單卡快都是個問題。我遇到過多卡時候,每個卡頻率撞牆的問題,甚至比單卡慢。就是快的時候,也不會有N張卡,提速N倍的能力。多卡並行相關程式的開銷 多卡策略的開銷都不小。 勒布朗詹姆斯哈登 不會,pytorch有很多計算都是只在第一塊卡上進行的。而且如果雙...

PyTorch與TensorFlow 2 x各有什麼優勢?

雄立東方 我就想問,為啥tf2.3 的tensor轉成numpy這麼難!這麼難!這麼難!官方說的.numpy 壓根不能用啊! 松鼠打不過袋鼠 之前覺得tensorflow優勢在於部署,尤其是伺服器端,現在發現pytorch伺服器端的torchserve越做越好了,基本可以滿足快速部署的需求。如果是嵌...