【Pytorch】学習記録(4) Pytorchを使って線形回帰を実現する

前のセクションでは単純な線形モデルを使用していましたが、この章では pytorch が提供するツールを使用して線形回帰を実装します。Module、Loss関数の構築、確率的勾配降下オプティマイザの構築などを紹介します。これらは pytorch によって提供されるため、この章の主な役割は、線形モデルの構築をより便利に実現するために pytorch によって提供されるツールを使用する方法です。

 

まず最初に、前に述べたことを復習しましょう。最初のステップは、線形モデルを決定し、次に最適化のための損失関数を定義することです。pytorch で最適化する場合、sgd (確率的勾配降下法) が使用され、sgd を使用する中心的なステップは、重みに関する各損失関数の偏導関数 (勾配)を求めること。終わり。次に、線形モデルを実装するために pytorch が提供するツールを使用し始めました。

  1. データセットの準備
  2. y_hat を計算するクラス (nn.Moudle から継承) を使用してモデルを構築します。
  3. 損失関数とオプティマイザーを構築する (pytorch API を使用)
  4. トレーニング サイクルを作成します (前方、後方、更新。フィードフォワードは損失を計算し、フィードバックは勾配を計算し、確率的勾配降下法は重みを更新します)

ここで準備したサンプル データセットは、以下に示すように非常に単純で、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 に示します。

図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)

おすすめ

転載: blog.csdn.net/m0_55080712/article/details/122855031