PyTorch深度学习实战(9)—— 用autograd实现线性回归

在上文中讲解了如何利用Tensor实现线性回归,本文将讲解如何利用autograd实现线性回归,读者可以从中体会autograd的便捷之处。

In: import torch as t
    %matplotlib inline
    from matplotlib import pyplot as plt
    from IPython import display 
    import numpy as np
 
In: # 设置随机数种子,保证结果可复现
    t.manual_seed(1000) 
    
    def get_fake_data(batch_size=8):
        ''' 产生随机数据:y = x * 2 + 3,加上了一些噪声'''
        x = t.rand(batch_size,1) * 5
        y = x * 2 + 3 + t.randn(batch_size, 1)
        return x, y
 
 In: # 来看看产生x-y分布是什么样的
    x, y = get_fake_data()
    plt.scatter(x.squeeze().numpy(), y.squeeze().numpy())
 
 Out:<matplotlib.collections.PathCollection at 0x7fcd1c1ed3c8>

In: # 随机初始化参数
    w = t.rand(1,1, requires_grad=True)
    b = t.zeros(1,1, requires_grad=True)
    losses = np.zeros(500)
    
    lr =0.005 # 学习率
    
    for ii in range(500):
        x, y = get_fake_data(batch_size=32)
        
        # forward:计算loss
        y_pred = x.mm(w) + b.expand_as(y)
        loss = 0.5 * (y_pred - y) ** 2
        loss = loss.sum()
        losses[ii] = loss.item()
        
        # backward:自动计算梯度
        loss.backward()
        
        # 更新参数
        w.data.sub_(lr * w.grad.data)
        b.data.sub_(lr * b.grad.data)
        
        # 梯度清零
        w.grad.data.zero_()
        b.grad.data.zero_()
        
        if ii%50 ==0:
            # 画图
            display.clear_output(wait=True)
            x = t.arange(0, 6).float().view(-1, 1)
            y = x.mm(w.data) + b.data.expand_as(x)
            plt.plot(x.numpy(), y.numpy()) # predicted
            
            x2, y2 = get_fake_data(batch_size=20) 
            plt.scatter(x2.numpy(), y2.numpy()) # true data
            
            plt.xlim(0,5)
            plt.ylim(0,13)   
            plt.show()
            plt.pause(0.5)
            
    print(f'w: {w.item():.3f}, b: {b.item():.3f}')

Out:w: 2.026 b: 2.973

In: plt.plot(losses)
    plt.ylim(5,50)

相比于上文的线性回归,利用autograd实现的线性回归不需要手动实现反向传播,可以自动计算微分。这一点不单是在深度学习中,在许多机器学习的问题中都很有用。需要注意的是,在每次反向传播之前,需要先把梯度值清零,避免累加

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shangjg3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值