这里默认大家已经在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)