赞
踩
这里默认大家已经在Windows系统下,配置了PyTorch!
Autograd中文:自动微分,是PyTorch进行神经网络优化的核心。自动微分,就是PyTorch自动为我们计算微分。
False
。当设置为True
时,表示该Tensor需要自动微分。注意下面几点:
requires_grad=True
时,信息流经过该结点时,所有中间结点的requreis_grad都会=True。backward()
,PyTorch就会自动求出叶子结点的微分值,并更新存储到叶子结点的grad
属性中。比如说一个 y + w ∗ x + b y+ w * x+ b y+w∗x+b的线性模型:
下面是这个计算过程的计算图:
其中,z是预测输出(计算输出),y是实际输出。loss函数就是用来计算这两个输出之间的差距大小,loss越小,模型预测效果越好!
下面代码可以直接运行!
import torch x_data = [1.0, 2.0, 3.0] y_data = [2.0, 4.0, 6.0] wimport torch x_data = [1.0, 2.0, 3.0] y_data = [2.0, 4.0, 6.0] w = torch.Tensor([1.0]) w.requires_grad = True def forward(x): return w * x def loss(x, y): # 这里采用MSE均方差计算损失值 y_pred = forward(x) return (y_pred - y) ** 2 print("在模型计算之前对于x=4的预测是:", 4, forward(4).item, '\n\n') for epoch in range(20): for x, y in zip(x_data, y_data): l = loss(x, y) l.backward() print('\tgrad:', x, y, w.grad.item()) w.data = w.data - 0.01 * w.grad.data w.grad.data.zero_() print("process:", epoch, l.item(), '\n') print("在模型计算之后对于x=4的预测是:", 4, forward(4).item()) = torch.Tensor([1.0]) w.requires_grad = True def forward(x): return w * x def loss(x, y): # 这里采用MSE均方差计算损失值 y_pred = forward(x) return (y_pred - y) ** 2 print("在模型计算之前对于x=4的预测是:", 4, forward(4).item, '\n\n') for epoch in range(20): for x, y in zip(x_data, y_data): l = loss(x, y) l.backward() print('\tgrad:', x, y, w.grad.item()) w.data = w.data - 0.01 * w.grad.data w.grad.data.zero_() print("process:", epoch, l.item(), '\n') print("在模型计算之后对于x=4的预测是:", 4, forward(4).item())
如果这篇文章对你有帮助的话,谢谢点赞收藏关注啦啦啦!
import torch
import matplotlib.pyplot as plt
x = torch.Tensor([1.4, 5, 11, 16, 21])
y = torch.Tensor([14.4, 29.6, 62, 85.5, 113.4])
plt.scatter(x.numpy(), y.numpy())
plt.show()
样本分布情况如下图所示,可以看出这里的数据符合线性规律,所以我们可以用线性模型去拟合它!
y _ p r e d = w 1 x + w 0 y\_pred = w_1x +w_0 y_pred=w1x+w0
我们用一个函数去衡量 y _ p r e d y\_pred y_pred与 y y y之间的误差,这个函数有很多名字,例如损失函数、准则、目标函数、代价函数或者是误差函数。
这里采用的是 M S E MSE MSE(均方误差),我们可以用Loss表示。
MSE是关于 y _ p r e d y\_pred y_pred与 y y y的函数, y _ p r e d y\_pred y_pred是关于 w 1 w_1 w1和 w 0 w_0 w0的函数,也就是说Loss是关于 w 1 w_1 w1和 w 0 w_0 w0的函数。
模型训练的目标,就是不断修改 w 1 w_1 w1和 w 0 w_0 w0的值,让loss的误差最小。
为了让损失函数L的值降到最小,我们需要调整 w 1 w_1 w1和 w 0 w_0 w0的值。
这里采用梯度下降的方法。梯度就是整个函数增长最快的方向,我们只要沿着这个梯度的反方向移动,理想上就能到达Loss的最低点。(然而现实中的数据都是存在一定噪声的,一般来说Loss是不为0的)
参数的更新:
w t + 1 = w t − d L o s s d w t × α w^{t+1} = w^t - \frac{dLoss}{dw^t}×\alpha wt+1=wt−dwtdLoss×α
def Produce_X(x):
x0 = torch.ones(x.numpy().size)
X = torch.stack((x, x0), dim=1)
return X
x = torch.Tensor([1.4, 5, 11, 16, 21])
X = Produce_X(x)
y = torch.Tensor([14.4, 29.6, 62, 85.5, 113.4])
def train(epochs=1, learning_rate=0.01):
for epoch in range(epochs):
output = inputs.mv(w) # .mv()是矩阵与向量相乘
loss = (output - target).pow(2).sum() # .sum()返回Tensor的所有元素之和
loss.backward()
w.data -= learning_rate * w.grad
w.grad.zero_()
if epoch % 80 == 0: # 每80次做一个输出
draw(output, loss)
return w,loss
import torch import matplotlib.pyplot as plt def Produce_X(x): x0 = torch.ones(x.numpy().size) X = torch.stack((x, x0), dim=1) return X x = torch.Tensor([1.4, 5, 11, 16, 21]) X = Produce_X(x) y = torch.Tensor([14.4, 29.6, 62, 85.5, 113.4]) inputs = X target = y w = torch.rand(2, requires_grad=True) def draw(output, loss): plt.cla() plt.scatter(x.numpy(), y.numpy()) plt.plot(x.numpy(), output.data.numpy(), 'r-', lw=5) plt.text(0.5, 0, 'loss=%s' % (loss.item()), fontdict={'size':20, 'color':'red'}) plt.show() plt.pause(0.005) def train(epochs=1, learning_rate=0.01): for epoch in range(epochs): output = inputs.mv(w) # .mv()是矩阵与向量相乘 loss = (output - target).pow(2).sum() # .sum()返回Tensor的所有元素之和 loss.backward() w.data -= learning_rate * w.grad w.grad.zero_() if epoch % 80 == 0: draw(output, loss) return w,loss w, loss = train(1000, learning_rate=1e-4) print("final loss:", loss.item()) print("weights:", w.data)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。