使用人工神经网络模型训练一个非线性回归

首先让我们了解一下人工神经元:

神经科学家们对大脑进行深人研究后,发现人脑的智能活动离不开脑内的物质基础,包括它的结构以及其中的生物、化学、电学作用。在神经元网络理论和神经系统结构理论中,以神经元作为脑神经系统的基本结构。人工智能研究者们基于对神经元基本结构的掌握,提出了人工神经元模型和人工神经网络。他们发现人工神经网络在理论上可以拟合任何非线性函数。一般情况下,神经元的数目越多,连接数越多,神经网络的复杂度就越高,其所能表达复杂函数的能力就越强。

因此,我们可以将神经元进行数学上的抽象,得到人工神经元模型。我们把神经元树突接收到的不同信号当作不同的x变量,并为不同的信号赋予不同的传输权重wi。每个变量根据权重进行线性累加,然后经过一个激活函数f得到一个新值,这个值就是输出y。

 多个人工神经元组成了人工神经网络,人工神经网络分为三层,输入层,隐含层,输出层

在没有激活函数的时候相当于多个线性模型叠加

下面是代码的实现:

导入包

import torch
import matplotlib.pyplot as plt
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F

生成一批数据样本:

x = torch.unsqueeze(torch.linspace(-3, 3, 1000), dim=1)
y = x.pow(3) + 0.3 * torch.rand(x.size())

下面定义一个只有一层隐含层的神经网络,这里我们用ReLU作为激活函数 

Linear是一个类,实例化了两个Linear类hide和out

可以说 nn.Linear 是属于 nn.Module 的一个组成部分,用于定义线性变换层

class Net(nn.Module):
    def __init__(self, input_feature, num_hide, outputs):
        super(Net, self).__init__()  # 超类,执行父类的初始化
        self.hide = nn.Linear(input_feature, num_hide)
        self.out = nn.Linear(num_hide, outputs)

    def forward(self, x):
        x = F.relu(self.hide(x))
        x = self.out(x)
        return x
cuda = torch.cuda.is_available()
if cuda:
    net = Net(input_feature=1, num_hide=20, outputs=1).cuda()
    inputs = x.cuda()
    target = y.cuda()
else:
    net = Net(input_feature=1, num_hide=20, outputs=1)
    inputs = x
    target = y

 这里是想要在GPU上进行运算,在GPU上的运行速度是CPU几倍到几十倍不等

定义优化函数和损失函数 

sge = optim.SGD(net.parameters(), lr=0.01)
criterion = nn.MSELoss()

 训练函数

def train(model, criterion, sge, epochs):
    for _ in range(epochs):
        output = model(inputs)
        loss = criterion(output, target)
        sge.zero_grad()
        loss.backward()
        sge.step()
        if epochs % 80 == 0:
            draw(output, loss)

 

  • 如果使用了 CUDA 加速,将 output 转移到 CPU 上(output = output.cpu())。
  • 使用 plt.cla() 清除当前图形中的所有轴。
  • 使用 plt.scatter() 绘制原始数据的散点图,其中 x.numpy() 和 y.numpy() 分别表示数据的 x 值和 y 值。
  • 使用 plt.plot() 绘制输出曲线,其中 x.numpy() 表示 x 值,output.data.numpy() 表示模型输出的 y 值,'r-' 表示红色实线,lw=5 表示线宽为 5。
  • 使用 plt.text() 在图形中添加一个文本框,显示损失值。
  • 使用 plt.pause(0.005) 暂停一小段时间以更新图形。
def draw(output, loss):
    if cuda:
        output = output.cpu()  # 若使用了CUDA加速这一步要还原为CPU数据类型
    plt.cla()
    plt.scatter(x.numpy(), y.numpy())
    plt.plot(x.numpy(), output.data.numpy(), 'r-', lw=5)  # 红色,宽度5
    plt.text(1, 1, 'loss=%s' % (loss.item()), fontdict={'size': 20, 'color': 'red'})
    plt.pause(0.005)

训练10000次 

if __name__ == '__main__':
    train(net, criterion, sge, 10000)
    print('train_over')

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值