pytorch作业(第1周第2节)

@[TOC]pytorch作业(第1周第2节)

Week1 任务2

1. 调整线性回归模型停止条件及 y = 2*x +(5 + torch.randn(20,1))中的斜率,训练一个线性回归模型

分析:

(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()

结果:
因现设的是随机参数,所以每位在各自电脑上运行,效果肯定不一样,所以这里就画出我的结果给大家仅供参考。
pytorch作业(第1周第2节)_第1张图片

2. 计算图的两个主要概念是什么?

答: (1) 结点:表示数据,如向量,矩阵,张量等。
    (2) 边:表示运算,如加、减、乘、除、卷积等。

3. 动态图与静态图的区别是什么?

答:
  动态图:其与搭建同时进行,具有灵活、易调节等优点,例:Pytorch。
  静态图:是先搭建,后运算,具有高效,但不灵活,例:TensorFlow。

你可能感兴趣的:(pytorch作业,pytorch)