Pytorch——回归问题

1.前言

我会这次会来见证神经网络是如何通过简单的形式将一群数据用一条线条来表示. 或者说, 是如何在数据当中找到他们的关系, 然后用神经网络模型来建立一个可以代表他们关系的线条.

2.数据准备

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

import torch
import matplotlib.pyplot as plt

#制造一些数据
x = torch.unsqueeze(torch.linspace(-1,1,100),dim = 1)   #torch.Size([100, 1]) #把[a,b,c]变成[[a,b,c]]
#print(x)
y = 2*(x.pow(2)) + 0.5*torch.rand(x.size())  #torch.rand为均匀分布,返回一个张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数。张量的形状由参数sizes定义
#print(y)
#画图
plt.scatter(x.data.numpy(),y.data.numpy())  
plt.show()

在这里插入图片描述

3.搭建神经网络

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

from torch import nn
import torch.nn.functional as F

class NetWork(nn.Module):

    def __init__(self,n_input,n_hidden,n_output):
        super(NetWork,self).__init__()
        self.hidden = nn.Linear(n_input,n_hidden)
        self.output_for_predict = nn.Linear(n_hidden,n_output)

    def forward(self,x):
        x = F.relu(self.hidden(x))   #对x进入隐层后的输出应用激活函数(相当于一个筛选的过程)
        output = self.output_for_predict(x)    #做线性变换,将维度为1
        return output

network = NetWork(n_input = 1,n_hidden = 8, n_output = 1)
print(network)  #打印模型的层次结构

在这里插入图片描述

4.训练搭建的神经网络

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

from torch import nn
import torch.nn.functional as F

class NetWork(nn.Module):

    def __init__(self,n_input,n_hidden,n_output):
        super(NetWork,self).__init__()
        self.hidden = nn.Linear(n_input,n_hidden)
        self.output_for_predict = nn.Linear(n_hidden,n_output)

    def forward(self,x):
        x = F.relu(self.hidden(x))   #对x进入隐层后的输出应用激活函数(相当于一个筛选的过程)
        output = self.output_for_predict(x)    #做线性变换,将维度为1
        return output

network = NetWork(n_input = 1,n_hidden = 8, n_output = 1)
print(network)   #打印模型的层次结构

optimizer = torch.optim.SGD(network.parameters(),lr = 0.2)
criterion = torch.nn.MSELoss()   #均方误差,用于计算预测值与真实值之间的误差

for i in range(500):   #训练步数(相当于迭代次数)
    predication = network(x)
    loss = criterion(predication, y)    #predication为预测的值,y为真实值

    optimizer.zero_grad()
    loss.backward()      #反向传播,更新参数
    optimizer.step()     #将更新的参数值放进network的parameters

5.可视化操作

x = torch.unsqueeze(torch.linspace(-1,1,100),dim = 1)   #torch.Size([100, 1]) #把[a,b,c]变成[[a,b,c]]
#print(x)
y = 2*(x.pow(2)) + 0.5*torch.rand(x.size())  #torch.rand为均匀分布,返回一个张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数。张量的形状由参数sizes定义
#print(y)
#画图
# plt.scatter(x.data.numpy(),y.data.numpy())  
# plt.show()

from torch import nn
import torch.nn.functional as F

class NetWork(nn.Module):

    def __init__(self,n_input,n_hidden,n_output):
        super(NetWork,self).__init__()
        self.hidden = nn.Linear(n_input,n_hidden)
        self.output_for_predict = nn.Linear(n_hidden,n_output)

    def forward(self,x):
        x = F.relu(self.hidden(x))   #对x进入隐层后的输出应用激活函数(相当于一个筛选的过程)
        output = self.output_for_predict(x)    #做线性变换,将维度为1
        return output

network = NetWork(n_input = 1,n_hidden = 8, n_output = 1)
print(network)   #打印模型的层次结构

plt.ion()   # 打开交互模式
plt.show()

optimizer = torch.optim.SGD(network.parameters(),lr = 0.2)
criterion = torch.nn.MSELoss()   #均方误差,用于计算预测值与真实值之间的误差

for i in range(500):   #训练步数(相当于迭代次数)
    predication = network(x)
    loss = criterion(predication, y)    #predication为预测的值,y为真实值

    optimizer.zero_grad()
    loss.backward()      #反向传播,更新参数
    optimizer.step()     #将更新的参数值放进network的parameters

    if i % 10 == 0:
        plt.cla()   # 清坐标轴
        plt.scatter(x.data.numpy(),y.data.numpy())
        plt.plot(x.data.numpy(),predication.data.numpy(),'ro', lw=5)   #画预测曲线,用红色o作为标记
        plt.text(0.5,0,'Loss = %.4f' % loss.data.numpy(), fontdict = {'size': 20, 'color':  'red'})
        plt.pause(0.1)
发布了119 篇原创文章 · 获赞 338 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_37763870/article/details/104780427