[英]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.