博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pytorch学习03——线性回归
阅读量:495 次
发布时间:2019-03-07

本文共 4192 字,大约阅读时间需要 13 分钟。

线性回归

注:实现线性回归的网络架构

建立数据集

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

import torchimport matplotlib.pyplot as pltx = 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())                 # noisy y data (tensor), shape=(100, 1)# 画图plt.scatter(x.data.numpy(), y.data.numpy())plt.show() # 显示图片

在这里插入图片描述

补充知识:

torch.squeeze()

这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的数去掉第一个维数为一的维度之后就变成(3)行。

torch.unsqueeze()

对数据维度进行扩充。给指定位置加上维数为一的维度,比如原本有个三行的数据(3),在0的位置加了一维就变成一行三列(1,3)。

plt.scatter()

matplotlib画散点图

建立神经网络

建立一个神经网络我们可以直接运用 torch 中的体系. 先定义所有的层属性**(init())**, 然后再一层层搭建(forward(x))层于层的关系链接. 建立关系的时候, 我们会用到激励函数。

import torchimport torch.nn.functional as F     # 激励函数都在这class Net(torch.nn.Module):  # 继承 torch 的 Module	# 下面几句是官方固定    def __init__(self, n_feature, n_hidden, n_output):        super(Net, self).__init__()     # 继承 __init__ 功能        # 定义每层用什么样的形式        self.hidden = torch.nn.Linear(n_feature, n_hidden)   # 隐藏层线性输出        self.predict = torch.nn.Linear(n_hidden, n_output)   # 输出层线性输出    def forward(self, x):   # 这同时也是 Module 中的 forward 功能        # 正向传播输入值, 神经网络分析出输出值        x = F.relu(self.hidden(x))      # 激励函数(隐藏层的线性值)        x = self.predict(x)             # 输出值        return x# 定义网络结构net = Net(n_feature=1, n_hidden=10, n_output=1)print(net)  # net 的结构"""Net (  (hidden): Linear (1 -> 10)  (predict): Linear (10 -> 1))"""

训练网络

在训练神经网络中,都是使用梯度下降的方法,在传统梯度下降方法上面出现了很多的改进方法,目前最常使用的有:

  1. SGD+momentum
  2. Adam
# optimizer 是训练的工具optimizer = torch.optim.SGD(net.parameters(), lr=0.2)  # 传入 net 的所有参数, 学习率loss_func = torch.nn.MSELoss()      # 预测值和真实值的误差计算公式 (均方差)# 迭代100次,去求解最优参数for t in range(100):    prediction = net(x)     # 喂给 net 训练数据 x, 输出预测值    loss = loss_func(prediction, y)     # 计算两者的误差    optimizer.zero_grad()   # 清空上一步的残余更新参数值    loss.backward()         # 误差反向传播, 计算参数更新值    optimizer.step()        # 将参数更新值施加到 net 的 parameters 上

可视化训练过程

可视化可以更好的理解是如何训练的

import matplotlib.pyplot as pltplt.ion()   # 画图plt.show()for t in range(200):    ...    loss.backward()    optimizer.step()    # 接着上面来    # 这个意思是每5轮绘画一张图    if t % 5 == 0:        # plot and show learning process        plt.cla()        plt.scatter(x.data.numpy(), y.data.numpy())        plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)        plt.text(0.5, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={
'size': 20, 'color': 'red'}) plt.pause(0.1) #plt.pause() 希望利用模型预测一个结果,可视化一个结果

完整代码

import torchimport matplotlib.pyplot as pltimport torch.nn.functional as F     # 激励函数都在这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())                 # noisy y data (tensor), shape=(100, 1)class Net(torch.nn.Module):  # 继承 torch 的 Module    def __init__(self, n_feature, n_hidden, n_output):        super(Net, self).__init__()     # 继承 __init__ 功能        # 定义每层用什么样的形式        self.hidden = torch.nn.Linear(n_feature, n_hidden)   # 隐藏层线性输出        self.predict = torch.nn.Linear(n_hidden, n_output)   # 输出层线性输出    def forward(self, x):   # 这同时也是 Module 中的 forward 功能        # 正向传播输入值, 神经网络分析出输出值        x = F.relu(self.hidden(x))      # 激励函数(隐藏层的线性值)        x = self.predict(x)             # 输出值        return xnet = Net(n_feature=1, n_hidden=10, n_output=1)print(net)  # net 的结构# optimizer 是训练的工具optimizer = torch.optim.SGD(net.parameters(), lr=0.2)  # 传入 net 的所有参数, 学习率loss_func = torch.nn.MSELoss()      # 预测值和真实值的误差计算公式 (均方差)plt.ion()   # 画图plt.show()# 迭代200次,去求解最优参数for t in range(200):    prediction = net(x)     # 喂给 net 训练数据 x, 输出预测值    loss = loss_func(prediction, y)     # 计算两者的误差    optimizer.zero_grad()   # 清空上一步的残余更新参数值    loss.backward()         # 误差反向传播, 计算参数更新值    optimizer.step()        # 将参数更新值施加到 net 的 parameters 上    # 这个意思是每5轮绘画一张图    if t % 5 == 0:        # plot and show learning process        plt.cla()        plt.scatter(x.data.numpy(), y.data.numpy())        plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)        plt.text(0.5, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={
'size': 20, 'color': 'red'}) plt.pause(0.1) # plt.pause() 希望利用模型预测一个结果,可视化一个结果

结果:

在这里插入图片描述

转载地址:http://llacz.baihongyu.com/

你可能感兴趣的文章