簡體   English   中英

pytorch如何計算簡單線性回歸模型的梯度?

[英]How does pytorch compute the gradients for a simple linear regression model?

我正在使用pytorch並試圖理解簡單的線性回歸模型是如何工作的。

我正在使用一個簡單的LinearRegressionModel類:

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()方法更新參數? 模型,損失標准和優化器如何捆綁在一起?

PyTorch有這個張量和變量的概念。 當你使用nn.Linear時,函數會創建2個變量,即W和b。在pytorch中,變量是一個封裝器,它封裝了一個張量,它的漸變和有關其創建函數的信息。 你可以直接訪問漸變

w.grad

當你在調用loss.backward()之前嘗試它時,你得到None。 一旦你調用了loss.backward(),它現在將包含漸變。 現在,您可以使用以下簡單步驟手動更新這些漸變。

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

當您擁有復雜的網絡時,上述簡單步驟可能會變得復雜。 所以像SGD這樣的優化者,Adam會照顧到這一點。 為這些優化器創建對象時,我們會傳入模型的參數。 nn.Module包含這個parameters()函數,它將所有可學習的參數返回給優化器。 可以使用以下步驟完成。

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

計算漸變並將它們存儲在參數中。 你傳遞了需要在這里調整的參數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM