BP神经网络学习内容分享:多层感知机与神经网络

ops/2024/10/21 5:35:53/

一、多层感知机

多层感知机(MLP, Multilayer Perceptron)是一种经典的人工神经网络模型,由多个神经元层组成,广泛应用于各种机器学习任务中。以下将介绍MLP的基本原理、结构与训练方法。 

1.多层感知机的基本原理

多层感知机(MLP)是一种基于神经网络的机器学习模型,由输入层、隐藏层和输出层组成。MLP通过学习输入数据与目标输出之间的关系,调整神经元之间的权重和偏置,实现对未知数据的预测。在训练过程中,MLP通过反向传播算法不断优化权重和偏置,使输出结果逐渐接近真实值。 

2.多层感知机的结构 

 MLP主要由输入层、隐藏层和输出层组成,层与层之间是全连接的。

(1)输入层(Input Layer):

输入层接收原始数据或特征,并将其传递给下一层。其中输入层的节点数由输入特征的维度决定。

(2)隐藏层(Hidden Layers):

隐藏层是连接输入层和输出层的中间层,用于学习数据的复杂特征表示。每个隐藏层包含多个神经元(节点),每个神经元都与上一层的所有节点连接,并输出一个加权和经过激活函数处理的值。隐藏层的层数和每层中的神经元数目可以根据需要进行调整,是深度学习模型中的一项重要超参数。

(3)输出层(Output Layer):

输出层接收来自最后一个隐藏层的信号,并输出模型的预测结果。输出层的节点数通常由任务的性质决定,如二分类问题通常只有一个节点,多分类问题有多个节点。

(4)权重与偏置(Weights and Biases):

每个连接都有一个相应的权重,表示连接的强度,用于调整输入的影响。每个神经元都有一个偏置项,用于调整神经元的激活阈值。权重和偏置是模型需要学习的参数,在训练过程中会根据损失函数来更新。

其中,wi是inputi的权重,b是偏置项,f是激活函数,如Sigmoid、ReLU等。

(5)激活函数(Activation Function):

激活函数用于引入非线性映射,使神经网络能够学习复杂的非线性关系。常用的激活函数包括Sigmoid、ReLU、Tanh等。

3.多层感知机的训练方法

MLP的训练方法主要包括前向传播和反向传播。前向传播是将输入数据通过神经网络计算得到输出结果的过程,反向传播是根据输出结果与真实值之间的误差调整神经元之间的权重和偏置。在训练过程中,通过迭代更新权重和偏置,使输出结果逐渐接近真实值。常用的优化算法包括梯度下降、随机梯度下降等。 

4.多层感知机的应用实例

MLP在许多领域都有广泛的应用,例如分类、回归、聚类等。在分类问题中,MLP可以将输入数据映射到不同的类别上;在回归问题中,MLP可以预测未知数据的连续值;在聚类问题中,MLP可以用于无监督学习,将相似的数据聚类在一起。 

5.总结

多层感知机(MLP)是一种强大的非线性模型,能够解决许多复杂的分类和回归问题。通过调整神经元之间的权重和偏置,MLP可以实现对未知数据的预测。在训练过程中,使用合适的优化算法和激活函数是提高MLP性能的关键。未来随着技术的发展和应用需求的增加,MLP将在更多领域发挥重要作用。 

二、神经网络

1.深度学习的基本概念

深度学习(Deep Learning)是机器学习的一个分支,它使用多层的神经网络进行机器学习。深度学习中的“深度”指的是神经网络的层数,一般来说,层数超过8层的神经网络被称为深度学习网络。深度学习的目标是让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据。其基本架构是人工神经网络,通过构建具有多个隐层的机器学习模型和利用海量的训练数据,来学习更有用的特征,从而最终提升分类或预测的准确性。

深度学习的实质是通过自动学习样本数据的内在规律和表示层次,形成更加抽象的高层表示,以发现数据的分布式特征表示。这种特征学习的方式可以减少人为设计的不完备性,提高模型的泛化能力和准确性。同时,深度学习对数据量的依赖性很高,数据量越大,其性能表现也越好。

2.深度学习与浅层神经网络的区别

综上所述,深度学习与浅层神经网络在结构、特征学习能力、应用场景和训练难度等方面存在显著差异。随着大数据和计算技术的发展,深度学习在各个领域的应用越来越广泛,成为人工智能领域的重要研究方向之一。

三、增加隐藏层对模型有哪些影响

在BP(反向传播)神经网络中增加隐藏层是提升模型复杂度和学习能力的一种常见方法。隐藏层的数量和每层中的神经元数量直接影响网络的深度和容量,进而影响模型对复杂数据的拟合能力和泛化性能。下面我们将探讨增加隐藏层对BP神经网络模型表现的影响。

1.隐藏层的作用

特征提取:隐藏层能够自动从输入数据中提取有用的特征,这些特征对于后续的分类或回归任务至关重要。

非线性变换:通过激活函数(如ReLU、Sigmoid、Tanh等),隐藏层能够引入非线性,使得网络能够学习复杂的非线性关系。

增加模型容量:随着隐藏层数量的增加,模型的容量(即能够表示的函数空间)也随之增加,从而能够拟合更复杂的函数。

2.增加隐藏层的影响

(1)正面影响:

提高拟合能力:更多的隐藏层意味着网络能够学习更复杂的特征表示,从而提高对训练数据的拟合能力。

可能提高泛化能力:在适当的情况下,增加隐藏层可以帮助模型学习到更一般化的特征,从而提高在未见过的数据上的表现。

(2)负面影响:

过拟合风险增加:随着模型复杂度的增加,模型更容易在训练数据上表现过好,但在测试数据上表现不佳,即出现过拟合现象。

训练难度增加:更多的隐藏层意味着更多的参数需要优化,这可能导致训练过程变得更加困难,需要更多的训练数据和计算资源。

梯度消失/爆炸问题:在深层网络中,梯度在反向传播过程中可能会变得非常小或非常大,导致训练不稳定或难以收敛。

3.代码实现增加隐藏层的影响

接下来是代码:

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader# 定义数据预处理
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))])# 加载数据集
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)train_loader = DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=64, shuffle=False)# 定义模型
class SingleHiddenLayerNet(nn.Module):def __init__(self, input_size, hidden_size, num_classes):super(SingleHiddenLayerNet, self).__init__()self.fc1 = nn.Linear(input_size, hidden_size)self.relu = nn.ReLU()self.fc2 = nn.Linear(hidden_size, num_classes)def forward(self, x):x = x.view(x.size(0), -1)  # Flatten the image tensorsx = self.relu(self.fc1(x))x = self.fc2(x)return xclass DoubleHiddenLayerNet(nn.Module):def __init__(self, input_size, hidden_sizes, num_classes):super(DoubleHiddenLayerNet, self).__init__()self.fc1 = nn.Linear(input_size, hidden_sizes[0])self.relu1 = nn.ReLU()self.fc2 = nn.Linear(hidden_sizes[0], hidden_sizes[1])self.relu2 = nn.ReLU()self.fc3 = nn.Linear(hidden_sizes[1], num_classes)def forward(self, x):x = x.view(x.size(0), -1)  # Flatten the image tensorsx = self.relu1(self.fc1(x))x = self.relu2(self.fc2(x))x = self.fc3(x)return x
# 初始化模型和优化器
input_size = 28 * 28
hidden_size_single = 100
hidden_sizes_double = [100, 100]
num_classes = 10
learning_rate = 0.001
epochs = 5model_single = SingleHiddenLayerNet(input_size, hidden_size_single, num_classes)
model_double = DoubleHiddenLayerNet(input_size, hidden_sizes_double, num_classes)criterion = nn.CrossEntropyLoss()
optimizer_single = optim.Adam(model_single.parameters(), lr=learning_rate)
optimizer_double = optim.Adam(model_double.parameters(), lr=learning_rate)# 训练函数
def train_model(model, train_loader, optimizer, criterion, epochs):model.train()for epoch in range(epochs):running_loss = 0.0for images, labels in train_loader:optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item() * images.size(0)epoch_loss = running_loss / len(train_loader.dataset)print(f'Epoch [{epoch + 1}/{epochs}], Loss: {epoch_loss:.4f}')# 评估函数
def evaluate_model(model, test_loader):model.eval()correct = 0total = 0with torch.no_grad():for images, labels in test_loader:outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'Accuracy of the model on the test images: {100 * correct / total}%')# 训练模型
train_model(model_single, train_loader, optimizer_single, criterion, epochs)
train_model(model_double, train_loader, optimizer_double, criterion, epochs)# 评估模型
evaluate_model(model_single, test_loader)
evaluate_model(model_double, test_loader)

 实验结果分析如下:

 


http://www.ppmy.cn/ops/101011.html

相关文章

QStackedWidget使用整理

需求1做一个主窗口中有一个视频区域,平时放视频,特定条件下显示图片 stackWidget new QStackedWidget((QWidget *)parent_); QWidget *w1,*w2; w1 new QWidget(); w1->setObjectName("video"); …

PowerShell脚本编写:自动化Windows开发工作流程

在现代软件开发中,自动化已经成为提高效率和降低人为错误的重要手段之一。Windows开发者尤其依赖于自动化脚本来简化日常工作流程。PowerShell作为Windows的强大命令行工具和脚本语言,为开发者提供了丰富的功能和灵活性,使得多种开发和管理任…

Tomcat涡轮:企业级WEB动力引擎全解析

目录 一、WEB技术基础 1.1 HTTP协议和B/S结构 1.2 前端三大核心技术 二、WEB框架与资源访问 2.1 WEB资源和访问 2.2 后台应用架构 2.2.1 单体架构 2.2.2 微服务架构 2.2.3 单体架构和微服务比较 三、Tomcat的功能与安装 3.1 Tomcat简介 3.2 安装Tomcat ​编辑 3.…

2024安卓iOS免签封装源码/解决APP误报毒/可打包和上传APP/自动实现5分钟随机更换签名

源码简介: 2024全新安卓iOS免签封装源码,它可处理apk报毒,解决APP误报毒。不仅可打包APP,也可上传APK。自动实现5分钟随机更换包名和签名系统源码。 解决app误报毒,可打包APP可上传APK,并且自动实现5分钟…

SAP采购合同中不同有效期价格联动是何原因?

近期遇到采购同事的反馈,某个采购合同中有3条不同年度的价格记录,当更改第三条(最近一笔)价格的时候,发现第一条价格也跟着变了。但第二条价格并没有随之变化。 初步检查还发现一个特点,就是两条同步变化的…

docker compose用法详解

下面是每个 docker compose 配置参数的用法和示例: 全局选项用法示例 --ansi 控制何时打印 ANSI 控制字符。示例: docker compose --ansi never up 禁用 ANSI 控制字符的打印(颜色和格式)。 --compatibility 在向后兼容模式下运…

TypeScript为何需要定义比较复杂的泛型类型?

TypeScript 中需要定义复杂的泛型类型主要是为了增强代码的通用性、灵活性、可复用性和类型安全性。 首先,泛型可以创建可重复利用的组件。例如在处理不同类型的数据时,通过泛型可以编写通用的函数、类或接口,而不必为每种具体的数据类型单独…

苹果机器人计划:能否成为智能家居的破局者?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…