@[TOC]pytorch作业(第1周第2节)
(1) 要想估算回归模型,首先需要有几个测试点,这里只有x和y,x是自变量,y是因变量,因变量没法设置,所以我们就设置x,所以x需要设成随机数,但是x设成多少呢?
根据后面 torch.rand(20,1)给的提示,这里就按着这个进行设置。也设置成 20 x 1。
注:至于这里产生多少个随机数就不用管了,是直到拟合成功时就OK了。
torch.rand(20,1): 返回在区间[0,1)[0,1)上由均匀分布的随机数填充的张量,目前是20行,1列
torch.randn(20,1):返回一个从均值为0、方差为1的正态分布,目前是20行,1列
(2) 题目中要设整斜率,我们知道,x前面的那个2就是斜率,我们将这个值变化一下。原式变为:
y = 4 * x + (5 + torch.randn(20,1))
这个斜率设的越大,点越往上,越不好看,而且越大,越容易引起梯度爆炸!
(3) 现将学习率,与终止时间改小了,学习时间变长了
import torch
import matplotlib.pyplot as plt
# 1. 首先为画出散点做准备
x = torch.rand(20, 1) * 10
y = 4 * x + (5 + torch.randn(20, 1))
# 为回归模型的参数做准备,我们的目的就是找到恰当的 w 和 b
w = torch.randn(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)
# 3. 定义个学习率为求梯度做准备
lr = 0.005
# 4. 开始迭代(先设个1000次试试。如果不行,我们再改多一些)
for iteration in range(5000):
wx = torch.mul(w, x)
y_pred = torch.add(wx, b)
# 5. 为了每次减少,我们订一个损失函数
loss = (0.5 * (y - y_pred) ** 2).mean()
loss.backward()
# 6. 每次w和b都减少一点,慢慢逼近
w.data.sub_(lr * w.grad)
b.data.sub_(lr * b.grad)
# 7. 每次用完把梯度清零一下
w.grad.zero_()
b.grad.zero_()
# 8. 每次把图画一下
if iteration % 20 == 0:
plt.cla() # plt.cla() # 防止社区版可视化时模型重叠
plt.scatter(x.data.numpy(), y.data.numpy())
plt.plot(x.data.numpy(), y_pred.data.numpy(), 'r-', lw=3) # 绘制线 r代表红色,- 代表画横线,lw折线图的线条宽度
plt.text(2, 20, 'Loss =%.4f' % loss.data.numpy(), fontdict={
'size':20, 'color': 'red'})
plt.xlim(1.5, 10)
plt.ylim(8, 28)
plt.title("Iteration: {}\nw: {} b: {}".format(iteration, w.data.numpy(), b.data.numpy()))
plt.pause(0.5)
# 9. 设置停止条件
if loss.data.numpy() < 0.05:
break
# 10. 显示图
plt.show()
结果:
因现设的是随机参数,所以每位在各自电脑上运行,效果肯定不一样,所以这里就画出我的结果给大家仅供参考。
答: (1) 结点:表示数据,如向量,矩阵,张量等。
(2) 边:表示运算,如加、减、乘、除、卷积等。
答:
动态图:其与搭建同时进行,具有灵活、易调节等优点,例:Pytorch。
静态图:是先搭建,后运算,具有高效,但不灵活,例:TensorFlow。