前言
案例代码https://github.com/2012Netsky/pytorch_cnn/blob/main/4_time_series_bikes.ipynb
一、requires_grad=True自动梯度
二、计算损失前为none
三、 计算损失后不为none
四、梯度清零
五、不计算梯度 更新参数
#!/usr/bin/env python
# coding: utf-8
get_ipython().run_line_magic('matplotlib', 'inline')
import numpy as np
import torch
torch.set_printoptions(edgeitems=2)
t_c = torch.tensor([0.5, 14.0, 15.0, 28.0, 11.0, 8.0,
3.0, -4.0, 6.0, 13.0, 21.0])
t_u = torch.tensor([35.7, 55.9, 58.2, 81.9, 56.3, 48.9,
33.9, 21.8, 48.4, 60.4, 68.4])
t_un = 0.1 * t_u
def model(t_u, w, b):
return w * t_u + b
def loss_fn(t_p, t_c):
squared_diffs = (t_p - t_c)**2
return squared_diffs.mean()
# requires_grad=True自动梯度 计算损失后会自动梯度
params = torch.tensor([1.0, 0.0], requires_grad=True)
# 为计算损失前为none
params.grad is None
# 损失计算
loss = loss_fn(model(t_u, *params), t_c)
# 梯度计算
loss.backward()
# 梯度值(w b)
params.grad
# 计算损失后不为none
params.grad is None
# 梯度清零
if params.grad is not None:
params.grad.zero_()
def training_loop(n_epochs, learning_rate, params, t_u, t_c):
for epoch in range(1, n_epochs + 1):
if params.grad is not None: # <1>
params.grad.zero_()
t_p = model(t_u, *params)
loss = loss_fn(t_p, t_c)
loss.backward()
# 不计算梯度 更新参数
with torch.no_grad(): # <2>
params -= learning_rate * params.grad
if epoch % 500 == 0:
print('Epoch %d, Loss %f' % (epoch, float(loss)))
return params
training_loop(
n_epochs = 5000,
learning_rate = 1e-2,
params = torch.tensor([1.0, 0.0], requires_grad=True), # <1>
t_u = t_un, # <2>
t_c = t_c)