一个神经网络大致流程为:
- 初始化参数
- 抽选训练数据
- 拟合
- 计算Loss
- 梯度回传
- 参数更新
- 重复第2步开始
定义一个简单方程y = 6.66x + 8.88
,手写一个简单神经网络来找到他的参数a = 6.66, b = 8.88
import torch
import random
#初始化参数 a = 1, b = 0
a = torch.ones(1,requires_grad=True)
b = torch.zeros(1,requires_grad=True)
lr = 0.01 #学习率
for i in range(300):
x = random.random()
preds = a * x + b
y = x * 6.66 + 8.88
loss = (y - preds) ** 2
loss.backward()
with torch.no_grad():
a -= a.grad * 0.01
b -= b.grad * 0.01
a.grad.zero_()
b.grad.zero_()
print(a.data, b.data)
//tensor([6.5724]) tensor([8.9243])
训练300轮后,已经很接近原始a ,b了,观看其中的训练过程
#初始化参数 a = 1, b = 0
a = torch.ones(1,requires_grad=True)
b = torch.zeros(1,requires_grad=True)
aa = []
bb = []
lr = 0.01 #学习率
for i in range(300):
x = random.random()
preds = a * x + b
y = x * 6.66 + 8.88
loss = (y - preds) ** 2
loss.backward()
# print(a.grad,b.grad,loss.data)
with torch.no_grad():
a -= a.grad * 0.01
b -= b.grad * 0.01
a.grad.zero_()
b.grad.zero_()
aa.append(a.data.clone())
bb.append(b.data.clone())
print(a.data,b.data)
plt.plot(aa,label='a')
plt.plot(bb,label='b')
plt.legend()
plt.show()
//tensor([6.5724]) tensor([8.9243])
将学习率调高 lr = 0.08
训练速度大大增加