import numpy as np
from matplotlib import pyplot as plt
import torch
torch.manual_seed(100)
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
y = 3 * x.pow(2) + 2 + 0.2 * torch.rand(x.size())
# plt.scatter(x.numpy(), y.numpy())
# plt.show()
# w, b 需要学习,需设置参数 requires_grad=True
w = torch.rand(1, 1, dtype=torch.float, requires_grad=True)
b = torch.zeros(1, 1, dtype=torch.float, requires_grad=True)
# print(w1) # tensor([[0.6017]])
# print(b1) # tensor([[0.]])
lr = 0.001
for i in range(800):
# 损失函数, 只作为收敛的观察,不参与后续的计算
y_predict = w * np.power(x, 2) + b
loss = 0.5 * (y_predict - y) ** 2
loss = loss.sum()
# 自动计算梯度,梯度存放在grad属性中
loss.backward()
# 手动更新参数,需要用 torch.no_grad, 使上下文环境中切段自动求导的计算
with torch.no_grad():
w -= lr * w.grad
b -= lr * b.grad
# 梯度清零
w.grad.zero_()
b.grad.zero_()
plt.plot(x.numpy(), y_predict.detach().numpy(), 'r-', label='predict')
plt.scatter(x, y, color='blue', marker='o', label='true')
plt.xlim(-1, 1)
plt.ylim(2, 6)
plt.legend()
plt.show()
print(w, b)