第三章-利用autograd/Variable实现线性回归

import torch as t
from torch.autograd import Variable as V
from matplotlib import pyplot as plt
from IPython import display

#为了在不同的计算机上运行时下面的输出一致,设置随机种子,每次得到的随机数是固定的
t.manual_seed(1000)

def get_fake_data(batch_size = 8):
    # 产生随机数据: y = x*2+3,加上了一些噪声
    x = t.randn(batch_size,1)*20
    y = x*2+(1+t.randn(batch_size,1))*3
    return x,y

# 随机初始化参数
w = V(t.randn(1,1),requires_grad = True)
b = V(t.zeros(1,1),requires_grad = True)

lr = 0.0001 #学习率

for ii in range(5000):
    x,y = get_fake_data()
    x,y = V(x),V(y)

    #forward:计算loss
    y_pred = x.mm(w)+b.expand_as(y)
    loss = 0.5*(y_pred-y)**2
    loss = loss.sum()

    #backwrad:计算计算梯度
    loss.backward()

    #更新参数
    w.data.sub_(lr * w.grad.data)
    b.data.sub_(lr * w.grad.data)

    #只使用本次数据的梯度,所以要梯度清零
    w.grad.data.zero_()
    b.grad.data.zero_()

    if ii%1000 == 0:
        #画图
        display.clear_output(wait=True)
        x = t.arange(0,20).float().view(-1,1) # -1代表不确定的数,注意 t.arange的输出结果为 Long
        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,20)
        plt.ylim(0,41)
        plt.show()
        plt.pause(0.5)

print(w.data.item(),b.data.item())

结果:

1.98751699924469 3.1595630645751953

第三章-利用autograd/Variable实现线性回归