PyTorch模块类
文章目錄
- PyTorch模塊類
- 基于模塊類的簡單線性回歸類
- 線性回歸類的實例化和方法調(diào)用
- 1.使用name_parameters方法和parameters方法獲取模型的參數(shù)
- 2.使用train方法和eval方法進行模型訓練和測試狀態(tài)的轉(zhuǎn)換
- 3.使用named_buffers方法和buffers方法獲取張量的緩存
- 4.使用named_children方法和children方法獲取模型的子模塊
- 5.使用apply方法遞歸地對子模塊進行函數(shù)應用
- 總結(jié)
PyTorch模塊類
PyTorch通過繼承模塊類nn.Module,在類的內(nèi)部定義子模塊的實例化,通過前向計算調(diào)用子模塊,最后實現(xiàn)深度學習模型的搭建。
構(gòu)建模塊類時,首先導入torch.nn庫,然后基于繼承nn.Module的方法構(gòu)建深度學習模塊。整個模塊的函數(shù)主要由兩部分組成:通過__init__方法初始化整個模塊,forward方法對該模型進行前向計算。其中,在使用__init__方法的時候,可以在類內(nèi)部初始化子模塊。通過使用super()函數(shù)來獲取當前類的父類,然后調(diào)用父類的構(gòu)造方法,從而初始化一些必要的變量和參數(shù)。
例如:
import torch.nn as nnclass Model(nn.Module):# 定義類的初始化函數(shù),...是用戶的傳入?yún)?shù)def __init__(self, ...):super(Model, self).__init__()# 根據(jù)傳入的參數(shù)定義子模塊...# 定義前向計算的輸入?yún)?shù),...一般是張量或者其他的參數(shù)def forward(self, ...):# 根據(jù)傳入的張量和子模塊計算返回張量ret = ...return ret基于模塊類的簡單線性回歸類
對于線性回歸模型來說,其是輸入一個特征的張量,做線性變換后輸出一個預測的張量。為了能夠構(gòu)造線性變換需要知道輸入特征的維度大小,并且知道線性回歸的權重和偏置。
在forward方法中,輸入一個特征張量x,做線性變換,加偏置的值,最后輸出預測的值。需要注意的是模型的初始化部分,權重和偏置是模型的參數(shù),并且一開始被初始化使得每個分量為標準正態(tài)分布。另外,需要使用nn.Parameter來包裝這些參數(shù)使之成為子模塊,以外在后續(xù)訓練的時候需要對參數(shù)進行優(yōu)化,只有將張量轉(zhuǎn)換為參數(shù)才能在后續(xù)的優(yōu)化中被優(yōu)化器訪問到。
import torch import torch.nn as nnclass LinearModel(nn.Module):def __init__(self, ndim):super(LinearModel, self).__init__()self.ndim = ndimself.weight = nn.Parameter(torch.randn(ndim, 1))self.bias = nn.Parameter(torch,.randn(1))def forward(self, x):return x.mm(self.weight) + self.bias在使用線性回歸模型之前,首先要對模型進行初始化,初始化的任務由舒適化模型的類實例開始。對于如上代碼中構(gòu)造的線性回歸模型來說,假如輸入的特征大小為n,可以直接調(diào)用LinearModel(n)來構(gòu)造線性回歸模型的一個實例。如果需要預測的是m×n大小的張量對應的輸出值,可以將m×n輸入線性回歸的模型實例中。
lm = LinearModel(5) x = torch.randn(4, 5)print(lm(x))得到的輸出結(jié)果為:
tensor([[-2.7862],[ 1.3666],[-3.9845],[-3.6125]], grad_fn=<AddBackward0>)線性回歸類的實例化和方法調(diào)用
1.使用name_parameters方法和parameters方法獲取模型的參數(shù)
通過調(diào)用name_parameters方法,返回的是一個python的一個生成器,通過訪問生成器的對象得到的是該模型所有參數(shù)的名稱和對應的張量值。
通過調(diào)用parameters方法,返回的也是一個生成器,訪問生成器的結(jié)果是該模型的所有參數(shù)對應的張量值。
PyTorch的優(yōu)化器直接接受模型的參數(shù)生成器作為函數(shù)的參數(shù),并且會根據(jù)梯度來優(yōu)化生成器里的所有張量。
print(lm.named_parameters()) print(list(lm.parameters())) <generator object Module.named_parameters at 0x00000212276D7580> [Parameter containing: tensor([[-0.2208],[-0.2866],[-1.4014],[ 0.6780],[ 0.1449]], requires_grad=True), Parameter containing: tensor([-0.6338], requires_grad=True)]2.使用train方法和eval方法進行模型訓練和測試狀態(tài)的轉(zhuǎn)換
在模型的使用過程中,有些子模塊有兩種狀態(tài),即訓練狀態(tài)和預測狀態(tài),PyTorch的模型經(jīng)常需要在兩種狀態(tài)中相互轉(zhuǎn)換。通過調(diào)用train方法會把模塊轉(zhuǎn)換到訓練狀態(tài),調(diào)用eval方法會轉(zhuǎn)換到預測狀態(tài)。
PyTorch的模型在不同狀態(tài)下的預測準確率會有差異,在訓練或預測的時候要轉(zhuǎn)換到相應的狀態(tài),否則可能最后的預測準確率會降低,甚至得到錯誤的結(jié)果。
3.使用named_buffers方法和buffers方法獲取張量的緩存
除了通過反向傳播得到梯度來進行訓練的參數(shù)外,還有一些參數(shù)并不參與梯度傳播,但是會在訓練中得到更新,例如批次歸一化層的平均值和方差。
通過調(diào)用register_buffer方法可以在模塊中加入這種類型的張量,通過named_buffers可以獲得緩存的名字和緩存張量的值組成的生成器,通過buffers方法可以獲取張量值組成的生成器。
4.使用named_children方法和children方法獲取模型的子模塊
在對子模塊進行迭代時,需要用到named_children方法和children方法來獲取子模塊的名字、子模塊的生成器以及只有子模塊的生成器。
由于PyTorch模塊的構(gòu)造可以嵌套,所以子模塊還可能有自身的子模塊,如果要獲取模塊中的所有模塊信息,可以使用named_modules和modules來得到。
5.使用apply方法遞歸地對子模塊進行函數(shù)應用
如果需要對PyTorch所有模塊應用一個函數(shù),可以使用apply方法通過傳入一個函數(shù)或匿名函數(shù)來遞歸地應用。傳入的函數(shù)以模塊為參數(shù),在函數(shù)內(nèi)部對模塊進行修改。
總結(jié)
PyTorch提供了nn.modeule抽象類,通過繼承這一個抽象類,并且在創(chuàng)建類的時候構(gòu)建子模塊,PyTorch實現(xiàn)了深度學習的模塊化,即可以通過組合子模塊稱為更大的深度學習模塊,最后將所有的模塊組合在一起構(gòu)造深度學習模型。這個構(gòu)造過程充分利用了深度學習子模塊的相似性。
通過在模型中構(gòu)建一系列的不同參數(shù)的子模塊實例,并且把它們組合在一起,就能方便地構(gòu)造復雜的深度學習模型。同時,PyTorch的模塊抽象類還提供了一系列方法,方便地在模型訓練和預測之間進行轉(zhuǎn)換,以及能夠快速獲取一個模型所有的參數(shù),方便優(yōu)化器的調(diào)用。
總結(jié)
以上是生活随笔為你收集整理的PyTorch模块类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简述PyTorch
- 下一篇: PyTorch的计算图和自动求导机制