前のセクションでは単純な線形モデルを使用していましたが、この章では pytorch が提供するツールを使用して線形回帰を実装します。Module、Loss関数の構築、確率的勾配降下オプティマイザの構築などを紹介します。これらは pytorch によって提供されるため、この章の主な役割は、線形モデルの構築をより便利に実現するために pytorch によって提供されるツールを使用する方法です。
まず最初に、前に述べたことを復習しましょう。最初のステップは、線形モデルを決定し、次に最適化のための損失関数を定義することです。pytorch で最適化する場合、sgd (確率的勾配降下法) が使用され、sgd を使用する中心的なステップは、重みに関する各損失関数の偏導関数 (勾配)を求めること。終わり。次に、線形モデルを実装するために pytorch が提供するツールを使用し始めました。
- データセットの準備
- y_hat を計算するクラス (nn.Moudle から継承) を使用してモデルを構築します。
- 損失関数とオプティマイザーを構築する (pytorch API を使用)
- トレーニング サイクルを作成します (前方、後方、更新。フィードフォワードは損失を計算し、フィードバックは勾配を計算し、確率的勾配降下法は重みを更新します)
ここで準備したサンプル データセットは、以下に示すように非常に単純で、x と y は両方とも 3×1 行列です。
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])
フロントでトレーニングしていたときは、導関数を手動で探す必要がありましたが、pytorch では、導関数を手動で探す必要はなくなりました。計算グラフの構築に移りますが、計算グラフがうまく構築できれば、傾きなどは自動的に計算され、最適化を行うことができます。簡単な計算グラフを図 1 に示します。
x が入力された後、線形単位演算を通じて y_hat が取得され、損失関数に入力されて損失値が取得されます。損失値を計算した後、損失に対して逆方向を呼び出し、計算グラフ全体を逆伝播することができます。以下はモデル構築のコード部分です。
class LinearModel (torch.nn.Module) : # 必须继承自 torch.nn.Module
def __init__(self) : # 所有的模型至少都要实现 init 和 forward
super(LinearModel, self).__init__() # 这行不用管他为什么,直接写上就对了
self.linear = torch.nn.Linear(1, 1) # 构造对象,linear 中已经包含了 ω 和 b,两个参数分别为输入输出的 size
# 用 module 构造出来的对象,会自动帮助实现 backward 的过程
def forward (self, X) : # forward 是前馈的过程中所要进行的计算
y_pred = self.linear (x)
return y_pred
model = LinearModel()
# 优化器
criterion = torch.nn.MSELoss(size_average = False)
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)
以下はトレーニング プロセスです。この一連のプロセスはフレームワーク内で実行され、その原理は前述のマニュアル トレーニングとまったく同じです。明らかに、フレームワークを使用するとコードの量を大幅に削減できます。
for epoch in range(100) :
y_pred = model(x_data) # 先在前馈中算y_hat
loss = criterion(y_pred, y_data) # 计算损失
print(epoch, loss)
optimizer.zero_grad () # 一定注意--梯度清零--
loss.backward() # 反向传播
optimizer.step () # 进行更新
# 训练情况的输出
print('W = ',model.linear.weight.item())
print('b = ',model.linear.bias.item())
# Test Model
x_test = torch.Tensor([[4.0]])
y_test = model(x_test)
print('y_pred =',y_test.data)
上記はモデル トレーニングの完全なルーチンです。
完全な再現可能なコードは次のとおりです。
import torch
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])
class LinearModel(torch.nn.Module): # 必须继承自 torch.nn.Module
def __init__(self): # 所有的模型至少都要实现 init 和 forward
super(LinearModel, self).__init__() # 这行不用管他为什么,直接写上就对了
self.linear = torch.nn.Linear(1, 1) # 构造对象,linear 中已经包含了 ω 和 b,两个参数分别为输入输出的 size
# 用 module 构造出来的对象,会自动帮助实现 backward 的过程
def forward(self, X): # forward 是前馈的过程中所要进行的计算
y_pred = self.linear(x)
return y_pred
model = LinearModel()
# 优化器
criterion = torch.nn.MSELoss(size_average = False)
optimizer = torch.optim.SGD(model.parameters(), lr = 0.01)
for epoch in range(100):
y_pred = model(x_data) # 先在前馈中算y_hat
loss = criterion(y_pred, y_data) # 计算损失
print(epoch, loss)
optimizer.zero_grad() # 一定注意--梯度清零--
loss.backward() # 反向传播
optimizer.step() # 进行更新
# 训练情况的输出
print('W = ', model.linear.weight.item())
print('b = ', model.linear.bias.item())
# Test Model
x_test = torch.Tensor([[4.0]])
y_test = model(x_test)
print('y_pred =', y_test.data)