Pytorch中torch.nn.**和torch.nn.functional.**的區(qū)別
torch.nn.**
torch.nn.**是一個繼承了torch.nn.Module的類,使用前必須先構(gòu)造對象,然后再調(diào)用。如果直接使用則會報錯
例如
a = torch.randn(3,4) print(a) sigmoid = torch.nn.Sigmoid() a = sigmoid(a) print(a) a = torch.nn.Sigmoid(a)
tensor([[ 0.2462, -2.1680, -1.4064, -0.0268], [-0.4800, -0.4670, 1.7318, 0.3498], [ 0.0137, -2.1080, -0.0825, -0.1350]]) tensor([[0.5612, 0.1027, 0.1968, 0.4933], [0.3823, 0.3853, 0.8496, 0.5866], [0.5034, 0.1083, 0.4794, 0.4663]]) Traceback (most recent call last): Traceback (most recent call last): File "C:\文件\Llama\tmp.py", line 8, in <module> a = torch.nn.Sigmoid(a) ^^^^^^^^^^^^^^^^^^^ File "C:\Users\90929\AppData\Local\conda\conda\envs\lce\Lib\site-packages\torch\nn\modules\module.py", line 485, in __init__ raise TypeError( TypeError: Sigmoid.__init__() takes 1 positional argument but 2 were given
torch.nn.functional.**
torch.nn.functional.**是一個純數(shù)學(xué)函數(shù),可以直接使用
a = torch.randn(3,4) print(a) a = torch.nn.functional.sigmoid(a) print(a)
tensor([[-0.1516, 0.5398, 0.3226, -0.4956], [-0.2250, 0.6393, 0.4432, 0.4215], [-0.5741, 0.0689, 0.3078, -1.5994]]) tensor([[0.4622, 0.6318, 0.5799, 0.3786], [0.4440, 0.6546, 0.6090, 0.6039], [0.3603, 0.5172, 0.5763, 0.1681]])
區(qū)別
PyTorch中torch.nn與torch.nn.functional的區(qū)別是:1.繼承方式不同;2.可訓(xùn)練參數(shù)不同;3.實現(xiàn)方式不同;4.調(diào)用方式不同。
1.繼承方式不同
torch.nn 中的模塊大多數(shù)是通過繼承torch.nn.Module 類來實現(xiàn)的,這些模塊都是Python 類,需要進行實例化才能使用。而torch.nn.functional 中的函數(shù)是直接調(diào)用的,無需實例化.
2.可訓(xùn)練參數(shù)不同
torch.nn 中的模塊可以包含可訓(xùn)練參數(shù),可以使用model.parameters() 方法獲取所有的可訓(xùn)練參數(shù),用于優(yōu)化算法的訓(xùn)練。而torch.nn.functional 中的函數(shù)沒有可訓(xùn)練參數(shù)。
3.實現(xiàn)方式不同
torch.nn 中的模塊是基于面向?qū)ο蟮姆椒▽崿F(xiàn)的,而torch.nn.functional 中的函數(shù)是基于函數(shù)式編程實現(xiàn)的。因此,使用torch.nn.functional 可以更方便地進行函數(shù)組合、復(fù)用等操作,而torch.nn 則更適合用于定義有狀態(tài)的模塊。
4.調(diào)用方式不同
torch.nn 中的模塊是通過類的實例進行調(diào)用,通常需要先創(chuàng)建模型實例,再將輸入數(shù)據(jù)傳入模型中進行前向計算。而torch.nn.functional 中的函數(shù)可以直接調(diào)用,只需要將輸入數(shù)據(jù)傳入函數(shù)中即可進行前向計算。
總之,torch.nn 和torch.nn.functional 都是用于構(gòu)建神經(jīng)網(wǎng)絡(luò)模型的模塊,但其實現(xiàn)方式、調(diào)用方式、可訓(xùn)練參數(shù)等方面有所不同。使用時需要根據(jù)具體需求選擇合適的模塊和函數(shù)
聯(lián)系
torch.nn的類會在forward()方法中調(diào)用torch.nn.functional的函數(shù),所以可以理解為nn模塊中的方法是對nn.functional模塊中方法的更高層的封裝。
如何選擇
1. 何時選擇torch.nn
在定義深度神經(jīng)網(wǎng)絡(luò)的layer時推薦使用nn模塊。
一是因為當(dāng)定義有變量參數(shù)的層時(比如conv2d, linear, batch_norm),nn模塊會幫助我們初始化好變量,而我們只需要傳入一些參數(shù);
二是因為model類本身是nn.Module,看起來會比較協(xié)調(diào)統(tǒng)一;
三是因為可以結(jié)合nn.Sequential。
四是當(dāng)使用dropout時推薦使用nn模塊,因為可以在測試階段通過eval()方法方便地關(guān)閉dropout。
2. 何時選擇torch.nn.functional
nn.functional中的函數(shù)相比nn更偏底層,所以雖然封裝性不高,但透明度很高,可以在其基礎(chǔ)上定義出自己想要的功能
到此這篇關(guān)于Pytorch中torch.nn.**和torch.nn.functional.**的區(qū)別的文章就介紹到這了,更多相關(guān)Pytorch torch.nn.**和torch.nn.functional.**內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python實現(xiàn)Office文檔(Word/Excel/PowerPoint)批量轉(zhuǎn)換為PDF
在處理不同格式的Office文檔(如Word、Excel和PowerPoint)時,將其轉(zhuǎn)換為PDF格式是常見的需求,本文就跟隨小編來看看如何使用Python將Word/Excel/PowerPoint批量轉(zhuǎn)換為PDF吧2024-10-10python里讀寫excel等數(shù)據(jù)文件的6種常用方式(小結(jié))
這篇文章主要介紹了python里讀寫excel等數(shù)據(jù)文件的6種常用方式(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04一文教會你用nginx+uwsgi部署自己的django項目
uWSGI是一個Web服務(wù)器,它實現(xiàn)了WSGI協(xié)議、uwsgi、http等協(xié)議,下面這篇文章主要給大家介紹了關(guān)于用nginx+uwsgi部署自己的django項目的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2022-08-08