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

news2025/1/11 5:59:57

文章目录

        • 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()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyTorch入门笔记

学习参考: PyTorch简单入门视频 深入浅出PyTorch 小土堆笔记 前置知识 AI vs ML vs DL AI(Artificial Intelligence):通过让机器模仿人类进而超越人类ML(Machine Learning):让机器模仿人类的一…

招聘应聘,HR如何测试候选人的领导能力?

作为企业的HR, 如何通过测评的方式来了解一个人的领导能力? 这里仅仅是说测评的方式,除此以外,还有很多方式,比如:背景调查,无领导小组讨论等等..... 对于一个人的领导能力测试,主要…

不使用AMap.DistrictSearch,通过poi数据绘制省市县区块

个人申请高德地图key时无法使用AMap.DistrictSearch,可以通过poi数据绘制省市县区块 1.进入POI数据网站找到需要的省市县,下载对应的GeoJson文件 ,此处为poi数据网站链接 2.​ 处理geoJson数据,可以直接新建json文件,…

录音转文字软件免费版哪个好?6个转文字工具让你轻松记录

随着小暑的到来,炎热的天气容易让人心浮气躁,影响工作效率。 在这个季节里,掌握一些办公技巧尤为关键。尤其是当我们需要整理会议记录或讲座内容时,如果能有一种方法,可以迅速将那些冗长的录音转换成清晰的文字&#…

Zabbix 6.0 案例

自定义监控内容 案列:自定义监控客户端服务器登录的人数 需求:限制登录人数不超过 3 个,超过 3 个就发出报警信息 1.在客户端创建自定义 key 明确需要执行的 linux 命令 who | wc -l 2.在被监控主机的配置文件目录中(/etc/za…

虚拟机的网络配置

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️ 每一步都向着梦想靠近,坚持就是胜利的序曲 一 …

7.3、指针所占内存空间

代码 #include <iostream> using namespace std;int main() {//指针所占内存空间int a 10;//int*p;//p &a;int* p &a;//在32为操作系统下&#xff0c;指针占4个字节空间大小//在64为操作系统下&#xff0c;指针占8个字节空间大小cout << "sizeof(…

【JVM排查问题】JProfiler性能分析工具连接远程服务器Docker容器中的Java服务

1、下载JProfiler https://www.ej-technologies.com/download/jprofiler/version_13 下载Windows版本以及Linux版本 Windows用于可视化、Linux用于在Docker容器中启动 2、将Linux版本的JProfiler上传到Docker容器中&#xff0c;宿主机cp命令到容器中 docker cp /home/data/s…

NPDP|产品经理的沟通协调能力:塑造产品成功的核心力量

在快速发展的商业环境中&#xff0c;产品经理的角色愈发重要。他们不仅要负责产品的战略规划、需求管理、项目管理&#xff0c;更要与团队内外各方进行有效的沟通协调。那么&#xff0c;产品经理的沟通协调能力到底有多重要呢&#xff1f;本文将深入探讨这一话题。 沟通是产品成…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP23S08(SPI接口)的I/O扩展器Proteus仿真

一、仿真原理图: 二、仿真效果: 三、STM32CubeMX配置: 1)、时钟配置: 2)、SPI配置: 四、部分软件: 1)、main主函数: /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file :…

MySQL环境搭配

下载版本37滴 下载第二个 之后进行安装 进入安装界面 next 选择默认的 进行下一步 安装成功后&#xff0c;进行一系列配置&#xff0c;成功界面如下&#xff1a; 配置 MySQL8.0 环境变量 如果不配置 MySQL 环境变量&#xff0c;就不能在命令行直接输入 MySQL 登录命令。 步…

八、函数的嵌套调用和链式访问

1.嵌套调用 函数和函数之间可以根据实际的需求进行组合的&#xff0c;也就是互相调用的。 #include <stdio.h> void new_line() {printf("hehe\n"); } void three_line() {int i 0;for (i 0; i < 3; i){new_line();} } int main() {three_line();return…

Google 发布了最新的开源大模型 Gemma 2,本地快速部署和体验

Gemma 2 是 Google 最新发布的开源大语言模型。它有两种规模&#xff1a;90 亿&#xff08;9B&#xff09;参数和 270 亿&#xff08;27B&#xff09;参数&#xff0c;分别具有基础&#xff08;预训练&#xff09;和指令调优版本&#xff0c;拥有 8K Tokens 的上下文长度&#…

gltf格式数据获取

之前写过两个文章&#xff0c;描述了三维模型怎样转换为gltf格式 SuperMap webgl 中使用的gltf模型制作方法_gltf 制作-CSDN博客 OBJ转GLTF格式步骤-CSDN博客 这两篇文章都可以将三维通用格式数据转换为gltf格式&#xff0c;但是过程都比较长&#xff0c;有的还需要安装开发…

Qt——升级系列(Level Eight):界面优化

目录 QSS 背景介绍 基本语法 QSS设置方式 指定控件样式设置 全局样式设置 从文件加载样式表 使用Qt Designer 编辑样式 选择器 选择器概况 子控件选择器 伪类选择器 样式属性 盒模型 控件样式示例 按钮 复选框、单选框 输入框 列表 菜单栏 登录界面 绘图 基本概念 绘制各种形…

探索哈希函数:数据完整性的守护者

引言 银行在处理数以百万计的交易时&#xff0c;如何确保每一笔交易都没有出错&#xff1f;快递公司如何跟踪成千上万的包裹&#xff0c;确保每个包裹在运输过程中没有丢失或被替换&#xff1f;医院和诊所为庞大的患者提供有效的医疗保健服务&#xff0c;如何确保每个患者的医疗…

Arthas实战(1)- 运行Arthas

1. 下载Arthas 下载到服务器&#xff1a; wget https://github.com/alibaba/arthas/releases/download/arthas-all-3.7.1/arthas-bin.zip解压 Arthas unzip arthas-bin.zip -d arthas删除压缩包 rm -f arthas-bin.zip 2. 启动Arthas 运行 Arthas java -jar arthas/arthas-bo…

vivado联合modelsim仿真

一. 编译Vivado仿真库 打开Vivado&#xff0c;Tools -> Compile Simulation Libraries 二. 设置仿真工具和库路径 因为新建工程的默认仿真工具是Vivado Simulator&#xff0c;所以要使用Modelsim仿真&#xff0c;每个新工程都要设置一次&#xff0c;方法如下&#xff1a; …

【测试】五子棋项目测试报告

目录 一、项目概述及测试目标 二、项目功能 三、测试类型 1&#xff09;功能测试 ​编辑 2&#xff09;自动化测试 四、测试总结 一、项目概述及测试目标 本项目是一个基于Web的五子棋实时对战应用&#xff0c;旨在提供用户之间的多人实时游戏体验。项目采用前…

阿里巴巴图标库iconfont的使用方式

文章目录 什么是 iconfong创建一个自己的项目如何使用Unicode 使用方法Font class 使用方式Symbol 使用方式还有一种使用方式 在线链接&#xff08;不推荐&#xff0c;但可用于测试&#xff09; 什么是 iconfong Iconfont 是一种图标字体服务。它将各种图标设计转换为字体格式…