深入解析:08_多层感知机

news/2025/9/22 12:33:27/文章来源:https://www.cnblogs.com/yxysuanfa/p/19104926

1. 单层感知机

1.1 感知机

在这里插入图片描述
在这里插入图片描述

① 线性回归输出的是一个实数,感知机输出的是一个离散的类。

在这里插入图片描述

1.2 训练感知机

① 如果分类正确的话y<w,x>为正数,负号后变为一个负数,max后输出为0,则梯度不进行更新。

② 如果分类错了,y<w,x>为负数,下图中的if判断就成立了,就有梯度进行更新。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.3 收敛半径

在这里插入图片描述

1.4 XOR问题

在这里插入图片描述

1.5 总结

在这里插入图片描述

2. 多层感知机

在这里插入图片描述

2.1 学习XOR

① 先用蓝色的线分,再用黄色的线分。

② 再对蓝色的线和黄色的线分出来的结果做乘法。

在这里插入图片描述

2.2 单隐藏层

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

① 不用激活函数的话,所以全连接层连接在一起依旧可以用一个最简单的线性函数来表示。

在这里插入图片描述

2.3 Sigmoid 函数

在这里插入图片描述

2.4 Tanh函数

在这里插入图片描述

2.5 ReLU

① ReLU的好处在于不需要执行指数运算。

② 在CPU上一次指数运算相当于上百次乘法运算。

在这里插入图片描述

2.6 多类分类

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.7 总结

在这里插入图片描述

1. 多层感知机(使用自定义)

import torch
from torch import nn
from d2l import torch as d2l
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
# 实现一个具有单隐藏层的多层感知机,它包含256个隐藏单元
num_inputs, num_outputs, num_hiddens = 784, 10, 256 # 输入、输出是数据决定的,256是调参自己决定的
W1 = nn.Parameter(torch.randn(num_inputs, num_hiddens, requires_grad=True))
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
W2 = nn.Parameter(torch.randn(num_hiddens, num_outputs, requires_grad=True))
b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))
params = [W1,b1,W2,b2]
# 实现 ReLu 激活函数
def relu(X):
a = torch.zeros_like(X) # 数据类型、形状都一样,但是值全为 0
return torch.max(X,a)
# 实现模型
def net(X):
#print("X.shape:",X.shape)
X = X.reshape((-1, num_inputs)) # -1为自适应的批量大小
#print("X.shape:",X.shape)
H = relu(X @ W1 + b1)
#print("H.shape:",H.shape)
#print("W2.shape:",W2.shape)
return (H @ W2 + b2)
# 损失
loss = nn.CrossEntropyLoss() # 交叉熵损失
# 多层感知机的训练过程与softmax回归的训练过程完全一样
num_epochs ,lr = 30, 0.1
updater = torch.optim.SGD(params, lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)

在这里插入图片描述

2. 多层感知机(使用框架)

① 调用高级API更简洁地实现多层感知机。

import torch
from torch import nn
from d2l import torch as d2l
# 隐藏层包含256个隐藏单元,并使用了ReLU激活函数
net = nn.Sequential(nn.Flatten(),nn.Linear(784,256),nn.ReLU(),nn.Linear(256,10))
def init_weights(m):
if type(m) == nn.Linear:
nn.init.normal_(m.weight,std=0,)
net.apply(init_weights)
# 训练过程
batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss()
trainer = torch.optim.SGD(net.parameters(), lr=lr)
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)

在这里插入图片描述

# 单层感知机函数
%matplotlib inline
import torch
from torch import nn
from d2l import torch as d2l
# 数据集
batch_size = 256
train_iter,test_iter = d2l.load_data_fashion_mnist(batch_size)
# 初始化模型参数
num_inputs = 784
num_outputs = 10
num_hiddens = 256
W1 = nn.Parameter(torch.randn(num_inputs, num_hiddens, requires_grad=True) * 0.01)
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
params = [W1, b1]
def relu(X):
a = torch.zeros_like(X)
return torch.max(X, a)
# 定义网络
def net(X):
X = X.reshape((-1, num_inputs))
H = relu(X @ W1 + b1)
return H
# loss = nn.CrossEntropyLoss(reduction='none')
loss = nn.CrossEntropyLoss()
num_epochs, lr = 10, 0.1
# updater = torch.optim.SGD(params, lr=lr)
updater = torch.optim.Adam(params, lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)
# 3层感知机函数
%matplotlib inline
import torch
from torch import nn
from d2l import torch as d2l
# 数据集
batch_size = 256
train_iter,test_iter = d2l.load_data_fashion_mnist(batch_size)
# 初始化模型参数
num_inputs = 784
num_outputs = 10
num_hiddens1 = 256
num_hiddens2 = 128
W1 = nn.Parameter(torch.randn(num_inputs, num_hiddens1, requires_grad=True) * 0.01)
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
W2 = nn.Parameter(torch.randn(num_hiddens1, num_hiddens2, requires_grad=True) * 0.01)
b2 = nn.Parameter(torch.zeros(num_hiddens2, requires_grad=True))
W3 = nn.Parameter(torch.randn(num_hiddens2, num_outputs, requires_grad=True) * 0.01)
b3 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))
params = [W1, b1,W2,b2,W3,b3]
def relu(X):
a = torch.zeros_like(X)
return torch.max(X, a)
# 定义网络
def net(X):
X = X.reshape((-1, num_inputs))
H1 = relu(X @ W1 + b1)
H2 = relu(H1 @ W2 + b2)
return (H2 @ W3 + b3)
# loss = nn.CrossEntropyLoss(reduction='none')
loss = nn.CrossEntropyLoss()
# 三层 学习率修改为0.01 效果会好一些
num_epochs, lr = 10, 0.01
# updater = torch.optim.SGD(params, lr=lr)
updater = torch.optim.Adam(params, lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)

在这里插入图片描述

d2l.predict_ch3(net, test_iter)

在这里插入图片描述

感知机(Perceptron)简介

感知机(Perceptron)是最简单的神经网络模型之一,最早由 Frank Rosenblatt 在 1958 年提出。它是一个二分类模型,能够根据输入的特征,判断一个样本属于哪一类。尽管感知机本身非常简单,但它为后来的深度学习模型奠定了基础,尤其是多层感知机(MLP)和其他神经网络。

感知机是 线性分类器,意味着它只能对线性可分的任务进行有效的分类。对于无法用直线(或超平面)划分的任务,单层感知机是无法处理的,但通过将其扩展到多层神经网络,问题得到了很好的解决。

感知机的结构

感知机由以下几个部分组成:

  1. 输入层:感知机接受一个输入向量 x=[x1,x2,...,xn]\mathbf{x} = [x_1, x_2, ..., x_n]x=[x1,x2,...,xn],表示样本的特征。
  2. 权重(Weights):每个输入特征 xix_ixi 都有一个对应的权重 wiw_iwi
  3. 偏置项(Bias):为了使模型更具有表达能力,感知机还有一个偏置项 bbb
  4. 激活函数:感知机通常使用一个阶跃函数(step function)作为激活函数,根据加权和与阈值的比较来决定输出。
感知机的数学表示

感知机的输出 yyy 是通过以下步骤计算的:

  1. 加权和

    z=∑i=1nwixi+b z = \sum_{i=1}^{n} w_i x_i + b z=i=1nwixi+b

    其中,xix_ixi 是输入特征,wiw_iwi 是与 xix_ixi 对应的权重,bbb 是偏置项。

  2. 激活函数(阶跃函数):

    y={1if z≥00if z<0 y = \begin{cases} 1 & \text{if } z \geq 0 \\ 0 & \text{if } z < 0 \end{cases} y={10if z0if z<0

    这里,阶跃函数(step function)会将加权和 zzz 映射为一个二值输出 yyy

感知机的推理过程

推理过程是指给定输入特征,感知机如何输出分类结果。其推理过程可以通过以下几个步骤来描述:

  1. 输入:将样本的特征 x=[x1,x2,...,xn]\mathbf{x} = [x_1, x_2, ..., x_n]x=[x1,x2,...,xn] 输入到感知机中。

  2. 加权和计算:感知机首先计算输入特征和权重的加权和(即 z=∑i=1nwixi+bz = \sum_{i=1}^{n} w_i x_i + bz=i=1nwixi+b)。

  3. 激活函数应用:然后,感知机将加权和 zzz 传递给阶跃激活函数,决定输出是 1 还是 0。

    • 如果 z≥0z \geq 0z0,则输出 1,表示样本属于一类。
    • 如果 z<0z < 0z<0,则输出 0,表示样本属于另一类。
  4. 输出:感知机的最终输出 yyy 是二值化的分类结果(0 或 1)。

感知机的推理示例

假设我们有以下输入特征 x=[x1,x2]\mathbf{x} = [x_1, x_2]x=[x1,x2],并且给定权重 w=[w1,w2]\mathbf{w} = [w_1, w_2]w=[w1,w2] 和偏置 bbb,感知机的输出通过以下步骤计算:

  1. 输入向量:x=[x1,x2]=[1.0,2.0]\mathbf{x} = [x_1, x_2] = [1.0, 2.0]x=[x1,x2]=[1.0,2.0]
  2. 权重:w=[w1,w2]=[0.5,0.5]\mathbf{w} = [w_1, w_2] = [0.5, 0.5]w=[w1,w2]=[0.5,0.5]
  3. 偏置项:b=−1.0b = -1.0b=1.0

首先,计算加权和 zzz

z=w1⋅x1+w2⋅x2+b=0.5⋅1.0+0.5⋅2.0−1.0=0.5+1.0−1.0=0.5 z = w_1 \cdot x_1 + w_2 \cdot x_2 + b = 0.5 \cdot 1.0 + 0.5 \cdot 2.0 - 1.0 = 0.5 + 1.0 - 1.0 = 0.5 z=w1x1+w2x2+b=0.51.0+0.52.01.0=0.5+1.01.0=0.5

然后,使用阶跃激活函数对 zzz 进行处理:

y={1if z≥00if z<0 y = \begin{cases} 1 & \text{if } z \geq 0 \\ 0 & \text{if } z < 0 \end{cases} y={10if z0if z<0

由于 z=0.5≥0z = 0.5 \geq 0z=0.50,所以 y=1y = 1y=1

感知机的训练过程

感知机的训练过程采用 感知机算法,该算法通过调整权重和偏置,使感知机的输出尽量接近实际目标。

  1. 初始化权重和偏置:权重和偏置通常被初始化为小的随机值。

  2. 预测输出:对于每个训练样本,计算感知机的预测输出。

  3. 计算误差:根据实际标签和预测输出之间的差异计算误差:

    误差=ytrue−ypredicted \text{误差} = y_{\text{true}} - y_{\text{predicted}} 误差=ytrueypredicted

  4. 权重更新:使用感知机学习规则来调整权重和偏置。如果预测错误,权重会根据误差进行调整。更新公式如下:

    wi=wi+η⋅误差⋅xi w_i = w_i + \eta \cdot \text{误差} \cdot x_i wi=wi+η误差xi

    b=b+η⋅误差 b = b + \eta \cdot \text{误差} b=b+η误差

    其中 η\etaη 是学习率,控制更新的步长。

  5. 重复:通过迭代多个训练样本,直到误差为零或达到最大迭代次数。

感知机的局限性

感知机有以下几个限制:

  1. 线性可分性:感知机只能解决线性可分的问题。如果数据集是非线性可分的,感知机就无法准确分类。例如,无法分类像 XOR 问题那样的非线性数据。

  2. 单层感知机:单层感知机是一个线性分类器,如果要处理更复杂的问题,我们需要将感知机扩展为多层感知机(MLP),即深度神经网络。

总结

感知机的工作原理为后续的深度学习模型,如多层感知机(MLP)和卷积神经网络(CNN),提供了基本的启示。

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

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

相关文章

9.8C++作业 - 实践

9.8C++作业 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Co…

(一)React面试(虚拟DOM/类组件) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

浏览器访问页面卡顿刷新页面方法

浏览器访问页面卡顿刷新页面方法浏览器访问页面卡顿刷新页面方法 同一个网址在一个浏览器中开了多个tab页窗口,会出现卡顿等转圈圈的现象 扩展浏览器缓存空间通过修改启动参数增加缓存容量: "C:\Program Files …

完整教程:散斑深度相机原理

完整教程:散斑深度相机原理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

k8s Understanding Kubernetes Security Components

Understanding Kubernetes Security Components In Kubernetes, security is implemented through several components that work together to control access and permissions. Lets explore ServiceAccounts, Roles,…

如何用 Dify 无代码工作流实现 AI 自动化抓取与分析 LinkedIn 招聘数据

如何用 Dify 无代码工作流实现 AI 自动化抓取与分析 LinkedIn 招聘数据在本指南中,您将学习到以下内容:Dify 是什么? 为什么要将它与一体化搜索插件整合? 将 Dify 与 Bright Data 插件集成的优势 创建 Dify 搜索工…

2025/9/22

2025/9/22学习统一建模语言 学习数据结构,链表

WSL+共享文件夹搭建zephyr工作环境

之前使用window是编译,但是发现编译真的太慢了,所以还是尝试安装ubuntu来开发: 我这里有一个搭建好的,可以直接wsl安装,但是不支持完整的SDK工具,只支持esp32和arm sdk版本是 0.17.4,只安装了(arm,esp32, es…

如果 Spring Cloud Feign 配置了 OkHttp3 非阻塞 IO(NIO),那么还需要reactor 模型来提高性能吗

目录先明确核心区别:OkHttp3与Reactor模型的定位为什么可能还需要Reactor模型?何时需要引入Reactor?何时可以不引入Reactor?总结 如果 Spring Cloud Feign 配置了 OkHttp3 非阻塞 IO(NIO),那么还需要reactor 模…

数据结构-单链表基础2

0.基本结构和函数 前置内容,可以访问数据结构-单链表基础1点击查看代码 typedef int ElemType; typedef struct LNode {ElemType data;struct LNode *next; } LNode, *linkList; void CreateList_R(linkList *L, int …

LLM的MCP协议通讯方式详解:Stdio、SSE与流式HTTP的选择与实践 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Trellix自动化大规模修复开源漏洞,已修补超6万个项目

Trellix通过自动化工具加速修复Python的tarfile模块中存在15年的路径遍历漏洞(CVE-2007-4559),已成功修补61,895个开源项目,并与GitHub合作实现大规模批量拉取请求的自动化修复流程。Trellix自动化大规模修复开源漏…

AI 编程工具选型速览(2025-09 版) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

爆款游戏背后:尚娱如何借助阿里云 Kafka Serverless 轻松驾驭“潮汐流量”?

阿里云 Kafka 不仅为尚娱提供了高可靠、低延迟的消息通道,更通过 Serverless 弹性架构实现了资源利用率和成本效益的双重优化,助力尚娱在快速迭代的游戏市场中实现敏捷运营、稳定交付与可持续增长。作者:横槊、永安…

Vben Admin5.0 keepAlive缓存和onActivated未生效

根据文档 https://doc.vben.pro/guide/essentials/route.html#keepalive 需要打开页面缓存,缓存才会生效 在配置文件preferences.ts下开启export const overridesPreferences = defineOverridesPreferences({// overr…

yakit + proxifier 解决`all tls strategy failed报错

yakit + proxifier 解决`all tls strategy failed报错场景 在 proxifier + yakit 时,某一个 https 的 url总会遇到`all tls strategy failed 失败的情况,其余的 url,甚至换成 burp 都 ok,百思不得其解。 解决思路 …

版本速递 | 华为云Versatile智能体平台 新增特性介绍(2025年9月发布)

本文分享自华为云社区《版本速递 | 华为云Versatile智能体平台 新增特性介绍(2025年9月发布)》,作者:Versatile运营小助手。< 华为云Versatile智能体平台 体验入口 >(请在PC端打开) 版本概览 Versatile 92…

详细介绍:传输层TCP 与 安全层SSL/TLS

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

PE程序常见脱壳方案

PE程序常见脱壳方案 基础知识 PE文件格式 PE(Portable Executable)是Windows平台下的可执行文件格式。理解PE结构是成功脱壳的前提,加壳程序的核心策略就是通过篡改、加密或隐藏原始PE头信息来保护代码,这意味着脱…

spring ai基于内存RAG尝鲜

RAG,数据检索增强生成,简单点说你提供一个数据集,让语言模型根据你的数据集回答问题。 1.新增依赖 这次的练习demo是将一个pdf作为数据集,喂给模型做训练生成内存向量库,以此回答问题。下面新增的依赖是pdf阅读和…