2017-09-18 10 views
1

私はpytorchを使用しており、単純な線形回帰モデルの仕組みを理解しようとしています。私は、単純なLinearRegressionModelクラス使用していpytorchは単純な線形回帰モデルの勾配をどのように計算しますか?

class LinearRegressionModel(nn.Module): 
    def __init__(self, input_dim, output_dim): 
     super(LinearRegressionModel, self).__init__() 
     self.linear = nn.Linear(input_dim, output_dim) 

    def forward(self, x): 
     out = self.linear(x) 
     return out 

model = LinearRegressionModel(1, 1) 

次は私が損失基準とオプティマイザをインスタンス化

最後に
criterion = nn.MSELoss() 

optimizer = torch.optim.SGD(model.parameters(), lr=0.01) 

私は次のコードを使用モデル訓練する:

for epoch in range(epochs): 
    if torch.cuda.is_available(): 
     inputs = Variable(torch.from_numpy(x_train).cuda()) 

    if torch.cuda.is_available(): 
     labels = Variable(torch.from_numpy(y_train).cuda()) 

    # Clear gradients w.r.t. parameters 
    optimizer.zero_grad() 

    # Forward to get output 
    outputs = model(inputs) 

    # Calculate Loss 
    loss = criterion(outputs, labels) 

    # Getting gradients w.r.t. parameters 
    loss.backward() 

    # Updating parameters 
    optimizer.step() 

私の質問は、オプティマイザがloss.backward()step()メソッドを使用してパラメータを更新しますか?モデル、損失基準、オプティマイザはどのように結びついていますか?

答えて

4

PyTorchはテンソルと変数のこの概念を持っています。関数nn.Linearを使用すると、Wとbの2つの変数、すなわち変数が作成されます。変数は、テンソルとその勾配とその作成関数に関する情報をカプセル化するラッパーです。

w.grad 

loss.backward()を呼び出す前に試してみると、Noneが返されます。 loss.backward()を呼び出すと、現在のグラデーションが含まれます。これらの勾配を以下の簡単な手順で手動で更新することができます。

w.data -= learning_rate * w.grad.data 

複雑なネットワークを構築している場合、上記の単純な手順が複雑になる可能性があります。 SGDのようなオプティマイザは、Adamがこれを担当します。これらのオプティマイザのオブジェクトを作成すると、モデルのパラメータが渡されます。 nn.Moduleには、学習可能なすべてのパラメータをオプティマイザに返すthis parameters()関数が含まれています。これは、以下の手順で行うことができます。

optimizer = torch.optim.SGD(model.parameters(), lr=0.01) 
1
loss.backward() 

は、勾配を計算し、パラメータに格納します。 そして、あなたはここにチューニングする必要があるparemetersに渡す:

optimizer = torch.optim.SGD(model.parameters(), lr=0.01) 
関連する問題