MSE:Mean Square Error 平均 平方 误差
numpy/matplotlib b两个绘图的包 常用方式:import matplotlib.pyplot as plt
forward()前馈函数,前馈运算,沿着图的方向直到算出最后的loss
loss()损失函数
for a,b in zip(data_a,data_b): 将data_a和data_b里面对应的信息一组一组的输出
plt.plot(a,b):以a为横坐标,b为纵坐标
plt.xlabel("a")横坐标标识为a
plt.ylabel("b")纵坐标标识为b
plt.show()图像展示
梯度下降:w(参数)=w-a(学习率)*(cost函数或者损失函数lost对w的偏导) 一般找到局部最优
epoch:训练的轮数 for epoch in range(100)训练100轮
绘图可以使用指数加权均值,这样的话可以让震荡的曲线光滑
随机梯度下降和梯度下降的区别:
1.梯度下降 所有数据的损失函数对参数的求导的均值,随机是拿人一个数据的损失函数对参数求导
2.有效的可能避免停滞在鞍点,因为噪声的原因,跨越平滑曲线,实践中更有效
3.随机梯度每一组数据更改一下参数w,效率低,效果好,梯度下降所有数据求完算平均值再更改参数w,这样的话,效率高,效果差,所以一般使用批量的进行,会综合两种情况,用batch即mini-batch
cost:平均损失
loss:单个损失
Linear Model:线性模型
Backward 反向传播 求loss对参数w的偏导,然后乘以学习率,可以改变w了
非线性函数充当激活函数
Tensor是一个类,可以表示标量、向量、矩阵、高维数据
里面有两个成员:data:w权重/参数 grad:损失函数对权重的导数 tensor类型具有传递性
变成tenor类型:w=torch.Tensor([1.0])
w.requires_grad = True 指定要计算梯度
l=loss(x,y)计算出损失
l.backward()这个函数就可以自动的求出之前要求计算梯度的参数,每次进行backward后loss函数计算图就会被释放了,下一次计算图可能不一样,解决内存问题
w.data=w.data-0.01*w.grad.data// w是tensor类型也就是张量而且计算梯度,也就是使用w会造成建立计算图,对训练产生一定的困扰,w.data也是一个tensor类型但是不产生计算图,w.data.item()是一个标量,可以直接读出来或者处理梯度
w.grad.data.zero()对loss对w的偏导清零,防止出现偏导值累加,比如得出的loss值其实是加上前面的loss值得累加和
训练过程,四个步骤:
1.准备数据集
2.设计模型(计算y-hat)
3.构造损失函数和优化器
4.训练周期(前馈计算损失,反馈计算梯度,更新参数)
构建模型模板(使用Module不用自定义backward,Module中自定义有)
class LinearModel(torch.nn.Module):
def __init__(self):
super(LinearModel,self).__init__()
self.linear = torch.nn.Linear(1,1)(构造对象,(权重/模型参数,偏置值) nn是neural network)
def forward(self,x):(必须要有,重写父类)
y_pred = self.linear(x)
return y_pred
model = LinearModel()(实例化,model(x)直接想forward函数传入x)
def func(*args,**kwargs):
pass
func(a,b,c,d,x=4,y=5)(这样可以传入不定量元素和字典)
构造损失函数:
criterion = torch.nn.MSELoss(size_average=False)
优化器:
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) //model.parameters()可以找到模型中的变量,lr为学习率
训练:
for epoch in range(100):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
print(epoch, loss)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print('w =',model.linear.weight.item())
print('b =',model.linear.bias.item())
测试:
x_test = torch.Tensor([[4.0]])
y_test = model(x_test)
print('y_pred',y_test.data)