PyTorch笔记2-关系拟合(回归)

来源:互联网 发布:网络教育学历国家承认 编辑:程序博客网 时间:2024/06/03 20:11

本系列笔记为莫烦PyTorch视频教程笔记 github源码

import torchfrom torch.autograd import Variableimport torch.nn.functional as F      # activation functionimport matplotlib.pyplot as plt% matplotlib inline

建立数据集

我们创建一些假数据来模拟真实的情况. 比如一个一元二次函数: y = a * x^2 + b, 我们给 y 数据加上一点噪声来更加真实的展示它.

x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)  # x data(tensor), shape(100,1)y = x.pow(2) + 0.2*torch.rand(x.size())  # rand [0,1) 为添加噪声# 用 Variable 来修饰这些数据 tensorx, y = Variable(x), Variable(y)# 画图plt.scatter(x.data.numpy(), y.data.numpy())   # 散点图plt.show()

这里写图片描述

建立神经网络

建立一个神经网络可以直接运用 torch 中的体系。先定义所有的层属性(init()),然后一层层搭建(forward(x))层与层的关系连接(前向传播)

  • 注1:torch.nn.Linear.init 分别定义parameters(W b)和初始化了parameters(W b),这里采用 torch 默认的 parameters 设置就好 参见
  • 注2:该模型拟合二次函数,为回归模型,输出层不需要激励函数
class Net(torch.nn.Module):    def __init__(self, n_feature, n_hidden, n_output):        super(Net, self).__init__()        # 定义每层的形式, 带一个隐藏层        self.hidden = torch.nn.Linear(n_feature, n_hidden)   # 隐藏层        self.predict = torch.nn.Linear(n_hidden, n_output)   # 输出层    def forward(self, x):        a1 = F.relu(self.hidden(x))     # 隐藏层用 relu        y = self.predict(a1)        return ynet = Net(n_feature=1, n_hidden=10, n_output=1)print(net)
Net (  (hidden): Linear (1 -> 10)  (predict): Linear (10 -> 1))

训练网络

训练的步骤很简单,如下:

# optimizer 是训练的工具loss_func = torch.nn.MSELoss()    # 用均方差计算 cost functionoptimizer = torch.optim.SGD(net.parameters(), lr=0.5)   # 随机梯度下降,学习率为0.5for t in range(100):    prediction = net(x)    loss = loss_func(prediction, y)    optimizer.zero_grad()    # clear gradients for next train    loss.backward()          # 反向传播    optimizer.step()         # 更新参数(w、b)

可视化训练过程

为了可视化整个训练的过程, 更好的理解是如何训练, 每迭代10次就出图并查看 loss

# optimizer 是训练的工具loss_func = torch.nn.MSELoss()    # 用均方差计算 cost functionoptimizer = torch.optim.SGD(net.parameters(), lr=0.5)   # 随机梯度下降,学习率为0.5for t in range(100):    prediction = net(x)    loss = loss_func(prediction, y)    optimizer.zero_grad()    # clear gradients for next train    loss.backward()          # 反向传播    optimizer.step()         # 更新参数(w、b)    # 没迭代10次,输出 loss    if t % 10 == 0:        plt.subplot(5,2,int(t/10+1))        plt.scatter(x.data.numpy(), y.data.numpy())        plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)        plt.text(-0.5, 0.6, 'L=%.8f' % (loss.data[0]), fontdict={'size': 10, 'color':  'red'})

这里写图片描述

Learning rate decay

随时间慢慢衰减学习率 learning rate 可以加快学习,同时让 cost 在更小范围内波动,参考
function adjust_learning_rate 定义了学习率衰减,每经过一次 lr_decay_epoch,learning rate 就会衰减为原来的 decay_rate
optimizer 是通过 param_group 来管理参数的,其保存了 learning rate, momentum等,demo

def adjust_learning_rate(optimizer, epoch, decay_rate=.9, lr_decay_epoch=10):    """learning rate 衰减为原来的 decay_rate by lr_decay_epoch"""    if epoch % lr_decay_epoch:        return optimizer    for param_group in optimizer.param_groups:        param_group['lr'] = param_group['lr'] * decay_rate# optimizer 是训练的工具loss_func = torch.nn.MSELoss()    # 用均方差计算 cost functionoptimizer = torch.optim.SGD(net.parameters(), lr=0.5)   # 随机梯度下降,学习率为0.5for t in range(100):    prediction = net(x)    loss = loss_func(prediction, y)    adjust_learning_rate(optimizer, t)    optimizer.zero_grad()    # clear gradients for next train    loss.backward()          # 反向传播    optimizer.step()         # 更新参数(w、b)    # 没迭代10次,输出 loss    if t % 10 == 0:        plt.subplot(5,2,int(t/10+1))        plt.scatter(x.data.numpy(), y.data.numpy())        plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)        plt.text(-0.5, 0.6, 'L=%.8f' % (loss.data[0]), fontdict={'size': 10, 'color':  'red'})

这里写图片描述

原创粉丝点击