1_从MLP开始

该博客通过Python和PyTorch库演示了如何构建及训练一个多层感知机(MLP)来拟合线性函数y=x+1。网络结构包含一个输入层、一个隐藏层和一个输出层,使用ReLU激活函数,MSE损失函数和SGD优化器。在200次迭代后,展示了模型在训练区间外的预测效果,揭示了MLP可能存在的过拟合问题。
摘要由CSDN通过智能技术生成

从最简单的算法——MLP(Multilayer Perceptron,多层感知机)入手。
本文的代码来着初学者大佬,我在其中增加了测试部分以及作了一些改动和注释还有自己作为一个小白对于MLP算法的一些理解。

这个例子中构建的神经网络结构如下图所示,一个输入层,一个隐藏层,一个输出层;输入层神经元数为1,隐藏层神经元数为6,输出层神经元数为1。激活函数为ReLU函数,损失函数是MSE函数,优化函数是SGD函数。

在这里插入图片描述

程序中给出了一组训练数据,训练数据的x和y满足函数关系y=x+1,当然这个关系神经网络是不知道的,神经网络拿到的只有从-2到2均匀采样得到的x,以及每一个x对应的y。训练完成后,再放入一些x,神经网络便能预测出对应的y值。

# 此代码用于拟合函数y=x+1
import torch
import torch.nn as nn
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt


x=torch.unsqueeze(torch.linspace(-2,2,4000),dim=1)  # 增加一个维度
y=x+1
x,y=Variable(x),Variable(y)  # 设置为Variable变量,可以拥有autograd包中的属性
z=torch.unsqueeze(torch.linspace(3,4,5),dim=1)   #在3到4之间均匀取5个数
z=Variable(z)

plt.ion()     # 进入交互模式

class MLP_Net(nn.Module):
    def __init__(self,n_feature,n_hidden,n_output):
        super(MLP_Net, self).__init__()
        self.hidden=nn.Linear(n_feature,n_hidden)
        self.predict=nn.Linear(n_hidden,n_output)

    def forward(self,x):
        x=F.relu(self.hidden(x))
        x=self.predict(x)
        return x


net=MLP_Net(1,6,1)  # 这里设置的是节点数,隐藏层的数目要在结构中定义
optimizer=torch.optim.SGD(net.parameters(),lr=0.2)
lose_func=nn.MSELoss()

for i in range(200):
    prediction=net(x)
    loss=lose_func(prediction,y)
    optimizer.zero_grad()    # 梯度置零
    loss.backward()
    optimizer.step()
    if i%5==0:
        plt.cla()    # 清除axes
        plt.scatter(x.data.numpy(),y.data.numpy())  # 生成一个关于x和y的散点图
        plt.plot(x.data.numpy(),prediction.data.numpy(),'r-',lw=5)  # 绘制一个关于x轴和y轴的曲线
        plt.pause(0.1)  # 用于暂停几秒


plt.ioff()
plt.show()

# 使用训练好的模型进行训练区间以外的预测

for i in range (5):
    prediction1=net(z)
print(prediction1)

拟合结果如下:
在这里插入图片描述

关掉图像窗口后便会print出测试结果:
在这里插入图片描述

由上图的预测结果可以看出,简单的mlp在训练区间以外的的预测效果很差,也就是很容易出现过拟合的问题;在实际应用中通常需要结合其他算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值