1.參數(shù)管理
nn模塊下的類實(shí)例在創(chuàng)建時(shí)會(huì)自動(dòng)創(chuàng)建并管理參數(shù),這些參數(shù)在訓(xùn)練過程中會(huì)自動(dòng)被優(yōu)化。而nn.functional模塊下的函數(shù)通常不包含狀態(tài)(比如可訓(xùn)練的參數(shù)),它們僅僅執(zhí)行一些確定的數(shù)學(xué)操作。
2.調(diào)用方式不同
nn模塊中的層在被創(chuàng)建后,可以像函數(shù)一樣直接調(diào)用。例如,layer = nn.Linear(10, 20); output = layer(input)。而nn.functional中的函數(shù)則需要直接傳入輸入數(shù)據(jù)和權(quán)重等參數(shù),例如output = nn.functional.linear(input, weight)。
3.自動(dòng)求導(dǎo)機(jī)制
使用nn模塊,PyTorch會(huì)自動(dòng)處理梯度計(jì)算和反向傳播。而使用nn.functional模塊,用戶需要手動(dòng)處理這些過程。
4.使用場(chǎng)景不同
nn模塊適合用于設(shè)計(jì)并實(shí)現(xiàn)含有可學(xué)習(xí)參數(shù)的復(fù)雜模型,例如卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)等。而nn.functional更多地用于實(shí)現(xiàn)一些簡(jiǎn)單的、不含有可學(xué)習(xí)參數(shù)的操作,例如激活函數(shù)、池化等。
5.代碼風(fēng)格的差異
使用nn模塊通常使得代碼更具有對(duì)象化,更容易管理,而使用nn.functional則使得代碼更具有函數(shù)式編程的風(fēng)格,具有更大的靈活性。
延伸閱讀
PyTorch中nn.Module的作用和使用
在PyTorch中,nn.Module是所有神經(jīng)網(wǎng)絡(luò)模塊的基類,它為網(wǎng)絡(luò)層的設(shè)計(jì)和參數(shù)的管理提供了方便。我們可以通過繼承nn.Module來自定義自己的網(wǎng)絡(luò)層或者完整的網(wǎng)絡(luò)模型。
nn.Module提供了一些基礎(chǔ)的功能,如參數(shù)管理、設(shè)備轉(zhuǎn)移等。所有繼承自nn.Module的類都應(yīng)該在其構(gòu)造函數(shù)中首先調(diào)用nn.Module的構(gòu)造函數(shù),即super().__init__()。
nn.Module中的一個(gè)重要功能是管理模型的參數(shù)。任何在nn.Module子類中定義為屬性的nn.Parameter或者nn.Module,都會(huì)被自動(dòng)添加到模型的參數(shù)列表中。這意味著,當(dāng)我們使用優(yōu)化器來優(yōu)化模型的參數(shù)時(shí),這些參數(shù)會(huì)被自動(dòng)包含進(jìn)去。
此外,nn.Module還提供了一些其他的功能,如將模型的所有參數(shù)和緩沖區(qū)移動(dòng)到CPU或GPU、將模型的狀態(tài)保存為字典、從字典中加載模型的狀態(tài)等。這些功能大大簡(jiǎn)化了PyTorch模型的使用和管理。