一文详解多层感知机(MLP)

文章目录

        • What(是什么)
        • Where(用在哪)
        • How(怎么用)
            • 多层感知机解决分类问题(以`minist`分类为例)
            • 多层感知机解决回归问题
            • 多层感知机解决噪声处理的问题

What(是什么)

多层感知机(Multilayer Perceptron,MLP)是一种基本的前馈人工神经网络,由多层神经元组成。它是一种全连接(fully connected)的神经网络

多层感知机的特点:

  • 多层结构: MLP 至少包含三层:输入层(Input Layer)、至少一个隐藏层(Hidden Layer)、输出层(Output Layer)。隐藏层可以有多个,通常在两个以上。
  • 全连接: 每一层的神经元与上一层的所有神经元都有连接。这意味着每个神经元都接收上一层所有神经元的输入,并将自己的输出传递给下一层的所有神经元。
  • 非线性激活函数: 在每个隐藏层和输出层的神经元上使用非线性激活函数,如ReLU(Rectified Linear Unit)、sigmoid 或 tanh(双曲正切函数),以使神经网络能够学习复杂的非线性关系。
  • 训练方法: MLP 使用反向传播算法(Backpropagation)和优化器(如随机梯度下降)来训练网络,通过最小化损失函数来调整网络参数

一个典型的多层感知机:
在这里插入图片描述
可以看到,感知机的每一层之间采用全连接的方式连接,且感知机最少具有1个隐藏层。

Where(用在哪)

多层感知机的应用场景非常广泛,包括但不限于以下场景:

  1. 非线性分类问题:与简单的感知机不同,MLP 可以通过多个隐藏层和非线性激活函数来学习和表示复杂的非线性决策边界。这使得它能够处理那些线性不可分的数据集,如手写数字识别(MNIST 数据集)和图像分类。

  2. 回归问题:MLP 可以用来预测连续值,例如股票价格预测、房价预测等。输出层可以是一个或多个神经元,根据具体问题的需求。

  3. 模式识别和特征学习:MLP 在处理复杂的模式识别任务时表现出色,例如语音识别、人脸识别等。通过多层的特征提取和组合,MLP 能够学习到更高级的数据表示。

  4. 序列数据处理:虽然传统的 MLP 不适合处理序列数据,但可以通过一些变种结构(如循环神经网络或者结合卷积神经网络)来处理时间序列数据、文本数据等。

  5. 噪声数据的处理:MLP 可以通过训练来适应并处理部分噪声存在的数据,使得在实际应用中能够更加鲁棒地处理各种复杂场景。

How(怎么用)
多层感知机解决分类问题(以minist分类为例)

方式1:调用torch.nn手动构建全连接网络模型来实现MLP模型

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

# 定义一个简单的多层感知机(MLP)模型
class MLP(nn.Module):
    def __init__(self):
        super(MLP, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 128)  # 输入大小为图像大小 28x28,输出大小为128
        self.fc2 = nn.Linear(128, 64)       # 隐藏层大小为64
        self.fc3 = nn.Linear(64, 10)        # 输出层大小为10,对应10个数字类别
    
    def forward(self, x):
        x = x.view(-1, 28 * 28)  # 将图像展平成向量
        x = torch.relu(self.fc1(x))  # 第一层:ReLU激活函数
        x = torch.relu(self.fc2(x))  # 第二层:ReLU激活函数
        x = self.fc3(x)              # 输出层,不用激活函数,因为后面会用CrossEntropyLoss

        return x

# 设置训练参数
batch_size = 64
learning_rate = 0.001
num_epochs = 10

# 加载MNIST数据集
train_dataset = datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor())

train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)

# 初始化模型、损失函数和优化器
model = MLP()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

# 训练模型
for epoch in range(num_epochs):
    for batch_idx, (data, targets) in enumerate(train_loader):
        optimizer.zero_grad()
        outputs = model(data)
        loss = criterion(outputs, targets)
        loss.backward()
        optimizer.step()
        
        if (batch_idx + 1) % 100 == 0:
            print(f'Epoch [{epoch+1}/{num_epochs}], Step [{batch_idx+1}/{len(train_loader)}], Loss: {loss.item():.4f}')

# 在测试集上评估模型
model.eval()
with torch.no_grad():
    correct = 0
    total = 0
    for data, targets in test_loader:
        outputs = model(data)
        _, predicted = torch.max(outputs.data, 1)
        total += targets.size(0)
        correct += (predicted == targets).sum().item()
    
    print(f'Accuracy on test set: {100 * correct / total:.2f}%')

方式2:使用sklearn自动构建MLP模型

from sklearn.neural_network import MLPClassifier
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载MNIST数据集
mnist = fetch_openml('mnist_784', version=1)
X, y = mnist['data'], mnist['target']

# 数据预处理和划分
X = X / 255.0  # 将像素值缩放到 [0, 1] 区间
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 定义MLP分类器模型
mlp_clf = MLPClassifier(hidden_layer_sizes=(100, 50), max_iter=10, alpha=1e-4,
                        solver='adam', verbose=10, random_state=42,
                        learning_rate_init=0.001)

# 训练模型
mlp_clf.fit(X_train, y_train)

# 预测并评估模型
y_pred = mlp_clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy on test set: {accuracy * 100:.2f}%')

多层感知机解决回归问题
from sklearn.neural_network import MLPRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 生成一个简单的回归数据集
X, y = make_regression(n_samples=1000, n_features=10, noise=0.1, random_state=42)

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 定义MLP回归模型
mlp_reg = MLPRegressor(hidden_layer_sizes=(50, 25), max_iter=500, alpha=0.001,
                       solver='adam', random_state=42)

# 训练模型
mlp_reg.fit(X_train, y_train)

# 预测并评估模型
y_pred = mlp_reg.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error on test set: {mse:.2f}')

多层感知机解决噪声处理的问题

MLP去噪的实质,是使用多层感知机的回归模型,通过训练数据来拟合一条回归曲线,来实现去噪的功能。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.neural_network import MLPRegressor

# 生成带噪声的信号数据
np.random.seed(0)
X = np.linspace(0, 10, 100).reshape(-1, 1)
y_true = np.sin(X).ravel()
noise = np.random.normal(0, 0.1, y_true.shape)
y_noisy = y_true + noise

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = X[:80], X[80:], y_noisy[:80], y_noisy[80:]

# 定义MLP回归模型
mlp_reg = MLPRegressor(hidden_layer_sizes=(50, 25), max_iter=500, alpha=0.001,
                       solver='adam', random_state=42)

# 训练模型
mlp_reg.fit(X_train, y_train)

# 预测并评估模型
y_pred_train = mlp_reg.predict(X_train)
y_pred_test = mlp_reg.predict(X_test)

# 绘制结果
plt.figure(figsize=(10, 6))
plt.scatter(X_train, y_train, color='blue', label='Training data with noise')
plt.plot(X_train, y_true[:80], color='green', linestyle='--', linewidth=2, label='True underlying function')
plt.plot(X_train, y_pred_train, color='red', linewidth=2, label='MLP predicted function (train)')
plt.plot(X_test, y_pred_test, color='orange', linewidth=2, label='MLP predicted function (test)')
plt.title('MLP for Noise Removal')
plt.legend()
plt.xlabel('X')
plt.ylabel('y')
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/780507.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

A Threat Actors 出售 18 万名 Shopify 用户信息

BreachForums 论坛成员最近发布了涉及 Shopify 的重大数据泄露事件。 据报道,属于近 180,000 名用户的敏感数据遭到泄露。 Shopify Inc. 是一家总部位于安大略省渥太华的加拿大公司。 开发和营销同名电子商务平台、Shopify POS 销售点系统以及专用于企业的营销工…

Vue3+.NET6前后端分离式管理后台实战(二十九)

1,Vue3.NET6前后端分离式管理后台实战(二十九)

Idea新增Module报错:sdk ‘1.8‘ type ‘JavaSDK‘ is not registered in ProjectJdkTable

文章目录 一,创建Module报错二,原因分析三,解决方案1,点击上图的加号,把JDK8添加进来即可2,点击左侧[Project],直接设置SDK为JDK8 四,配置检查与验证 一,创建Module报错 …

网络基础:IS-IS协议

IS-IS(Intermediate System to Intermediate System)是一种链路状态路由协议,最初由 ISO(International Organization for Standardization)为 CLNS(Connectionless Network Service)网络设计。…

数据统计与数据分组18-25题(30 天 Pandas 挑战)

数据统计与数据分组 1. 知识点1.18 分箱与统计个数1.19 分组与求和统计1.20 分组获取最小值1.21 分组获取值个数1.22 分组与条件查询1.23 分组与条件查询及获取最大值1.24 分组及自定义函数1.25 分组lambda函数统计 2. 题目2.18 按分类统计薪水(数据统计&#xff09…

关于忠诚:忠于自己的良知、理想、信念

关于忠诚: 当我们面对公司、上司、爱人、恋人、合作伙伴还是某件事,会纠结离开还是留下,这里我们要深知忠诚的定义,我们不是忠诚于某个人、某件事、或者某个机构,而是忠诚于自己的良知,忠诚于自己的理想和…

pin是什么?管脚

1.平面分割 1)启动Allegro PCB design ,打开.brd。深色部分属于一个net,要做一下修改,将上面的pin包含进shape中,i进行a,b两步操作,删除以前存在的Anti Etch下的line,再将其进行补齐 使它保住上…

grpc-go客户端接口添加

【1】 proto相关文件同服务端,如已经生成,可以直接使用服务端的文件(包) 【2】新建一个目录“WHG_CLIENT”,目录下新建一个main.go文件 package mainimport ("context""log""grpc-go-maste…

Spring的核心概念理解案列

IDEA开发的简单“登陆成功”小项目 IDEA项目结构: 每一部分代码和相应的解读: com.itTony文件下有dao(实体)层,service(服务)层,编写的2个类(HelloSpring和TestSpring&…

RK3588编译rkmpp,拉取海康威视网络摄像头264码流并运行yolo

硬件:EVB评估版 SOC:Rockchip RK3588 背景: 由于项目需要,需要拉取264码流,并通过将yolov5s.pt将模型转化为rknn模型,获取模型分析结果。取流可以通过软件解码或者硬件解码,硬件解码速度更快&…

yum install epel-release 遇到的问题

问题: 安装epel的时候,执行 yum install -y epel-release 报错“Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infrastock error was 14: curl#6 - "Could not resolve host: mirrorlist.centos.…

【TB作品】51单片机 Proteus仿真 00002仿真-智能台灯色调倒计时光强

实验报告:基于51单片机的智能台灯控制系统 背景 本实验旨在设计一个基于51单片机的智能台灯控制系统,该系统可以通过按键进行手动控制,并能根据环境光强度自动调节台灯亮度。此外,系统还具备倒计时关灯功能。 器件连接 51单片…

四大常见的排序算法JAVA

1. 冒泡排序 相邻的元素两两比较,大的放右边,小的放左边 第一轮比较完毕之后,最大值就已经确定,第二轮可以少循环一次,后面以此类推 如果数组中有n个数据,总共我们只要执行n-1轮的代码就可以 package Bu…

ARMv8寄存器详解

文章目录 一、ARMv8寄存器介绍二、通用寄存器三、 PSTAE寄存器四、特殊寄存器五、系统寄存器 一、ARMv8寄存器介绍 本文我来给大家介绍一下ARMv8的寄存器部分,ARMv8中有34个寄存器,包括31个通用寄存器、一个栈指针寄存器SP(X31),一个程序计数器寄存器PC…

【图书推荐】《HTML5+CSS3 Web前端开发与实例教程(微课视频版)》

本书用来干什么 详解HTML5、CSS3、Flex布局、Grid布局、AI技巧,通过两个网站设计案例提升Web前端开发技能,为读者深入学习Web前端开发打下牢固的基础。 配套资源非常齐全,可以当Web前端基础课的教材。 内容简介 本书秉承“思政引领&#…

C生万物之文件操作

文章目录 一、为什么使用文件?二、什么是文件?1、程序文件2、数据文件3、文件名 三、文件的打开和关闭1、文件指针2、文件的打开和关闭 四、文件的顺序读写1. 8个重要的库函数1.1 单字符输入输出【fputc和fgetc】1.2 文本行输入输出【fputs和fgets】1.3 …

robotframework-appiumLibrary 应用 - 实现 app 自动化

1、安装appiumLibrary第三方库 运行pip命令:pip install robotframework-appiumlibrary 若已安装,需要更新版本可以用命令:pip install -U robotframework-appiumlibrary 2、安装app自动化环境。 参考我的另外一篇专门app自动化环境安装的…

elastic-job 定时任务 —— elasticjob 介绍与使用教程

文章目录 Elastic-Job 介绍相关依赖elastic-job 目录结构SimpleJob 简单作业编码下载并启动 ZooKeeper编写定时任务代码并启动 Elastic-Job 介绍 概述: Elastic-Job 是当当网开源的一个分布式调度解决方案,基于 Quartz 二次开发的,由两个相…

科普新能源充电桩

充电桩是新能源电动车的配套基础设施,为电动车提供充电服务,与我们的生活也是息息相关,本篇文章来科普一下充电桩基础知识。 充电桩的分类 按照供电方式分类 交流充电桩:特点是小电流、桩体较小、安装灵活;直流充电…

Linux shell编程学习笔记63:free命令 获取内存使用信息

0 前言 在系统安全检查中,内存使用情况也是一块可以关注的内容。Linux提供了多个获取内存信息的命令很多。今天我们先研究free命令。 1 free命令的功能、用法和选项说明 1.1 free命令的功能 free 命令可以显示系统内存的使用情况,包括物理内存、交换…