Gau*_*sra 9 python gradient machine-learning linear-regression pytorch
考虑以下使用 PyTorch 实现的线性回归代码:
import torch
X = torch.tensor([1, 2, 3, 4], dtype=torch.float32)
Y = torch.tensor([2, 4, 6, 8], dtype=torch.float32)
w = torch.tensor(0.0, dtype=torch.float32, requires_grad=True)
def forward(x):
return w * x
def loss(y, y_pred):
return ((y_pred - y)**2).mean()
print(f'Prediction before training: f(5) = {forward(5).item():.3f}')
learning_rate = 0.01
n_iters = 100
for epoch in range(n_iters):
# predict = forward pass
y_pred = forward(X)
# loss
l = loss(Y, y_pred)
# calculate gradients = backward pass
l.backward()
# update weights
#w.data = w.data - learning_rate * w.grad
with torch.no_grad():
w -= learning_rate * w.grad
# zero the gradients after updating
w.grad.zero_()
if epoch % 10 == 0:
print(f'epoch {epoch+1}: w = {w.item():.3f}, loss = {l.item():.8f}')
Run Code Online (Sandbox Code Playgroud)
“with”块有什么作用?w 的 require_grad 参数已设置为 True。为什么它被放在 with torch.no_grad() 块下?
该requires_grad
参数告诉 PyTorch 我们希望能够计算这些值的梯度。然而,with torch.no_grad()
告诉 PyTorch 不要计算梯度,并且程序在此处明确使用它(与大多数神经网络一样),以便在更新权重时不更新梯度,因为这会影响反向传播。
小智 3
更新权重时没有理由跟踪梯度;这就是为什么您会在优化器的任何实现中找到用于步骤方法的装饰器(@torch.no_grad())。
“With torch.no_grad”块意味着在不跟踪渐变的情况下执行这些行。
归档时间: |
|
查看次数: |
23596 次 |
最近记录: |