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