08_多层感知机

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 d2lbatch_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) # 数据类型、形状都一样,但是值全为 0return 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 = 256W1 = 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 = 128W1 = 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),即深度神经网络。

总结

  • 感知机 是一种简单的二分类模型,基于加权和和阶跃激活函数进行推理。
  • 推理过程:通过计算输入特征的加权和,然后使用阶跃函数决定输出类别(0 或 1)。
  • 训练过程:通过感知机算法迭代调整权重和偏置,使得模型能够正确分类训练数据。
  • 局限性:感知机只能处理线性可分问题,无法解决复杂的非线性问题。

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

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

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

相关文章

安卓实现miniLzo压缩算法

LZO官方源码 http://www.oberhumer.com/opensource/lzo 找到miniLZO点击Dowload miniLZO下载源码 http://www.oberhumer.com/opensource/lzo/download/minilzo-2.10.tar.gz demo源码(包含安卓) https://github.com/xzw421771880/MiniLzo_Mobile.git 1.代码部分 1.1.测试…

如何在ubuntu下用pip安装aider,解决各种报错问题

aider中文文档网站上给出的安装说明比较简单&#xff1a; https://aider.doczh.com/docs/install.html 但是在一个干净的ubuntu环境中按文档中的命令安装时&#xff0c;会报错&#xff0c;经过一番尝试之后&#xff0c;解决了报错问题&#xff0c;成功完成了安装。 成功安装执…

Kotlin flow详解

流式数据处理基础 Kotlin Flow 是基于协程的流式数据处理 API&#xff0c;要深入理解 Flow&#xff0c;首先需要明确流的概念及其处理方式。 流(Stream)如同水流&#xff0c;是一种连续不断的数据序列&#xff0c;在编程中具有以下核心特征&#xff1a; 数据按顺序产生和消费支…

DeepSeek V3 深度解析:MoE、MLA 与 GRPO 的架构革新

简介 DeepSeek&#xff08;深度求索&#xff09;是一家源自中国的人工智能公司&#xff0c;成立于2023年&#xff0c;总部位于中国杭州。前身是国内量化投资巨头幻方量化的子公司。公司专注于开发低成本、高性能的AI模型&#xff0c;致力于通过技术创新推动人工智能技术的普惠…

Flask学习笔记(三)--URL构建与模板的使用

一、URL构建url_for()函数对于动态构建特定函数的URL非常有用。 该函数接受函数的名称作为第一个参数&#xff0c;并接受一个或多个关键字参数&#xff0c;每个参数对应于URL的变量部分。from flask import Flask, redirect, url_forapp Flask(__name__)app.route(/admin)def …

Pyside6 + QML - 从官方的例程开始

导言如上所示&#xff0c;登上Qt Pyside6的官方网址&#xff1a;https://doc.qt.io/qtforpython-6/index.html&#xff0c;点击“Write your first Qt application”的"Start here!"按钮。 效果&#xff1a;工程代码&#xff1a; github:https://github.com/q1641293…

Python爬虫实战:研究Pandas,构建物联网数据采集和分析系统

1. 引言 1.1 研究背景 物联网(Internet of Things, IoT)作为新一代信息技术的重要组成部分,已广泛应用于智能交通、环境监测、智慧家居等多个领域。据 Gartner 预测,到 2025 年全球物联网设备数量将达到 750 亿台,产生的数据量将突破 zettabyte 级别。物联网平台作为数据…

深度学习入门基石:线性回归与 Softmax 回归精讲

一、线性回归&#xff1a;从房价预测看懂 “连续值预测” 逻辑 线性回归是深度学习的 “敲门砖”&#xff0c;它的核心思想是用线性关系拟合数据规律&#xff0c;解决连续值预测问题—— 比如根据房屋特征估算房价、根据温度湿度预测降雨量等。 1. 从生活案例到数学模型 拿房价…

GPT-5-Codex CLI保姆级教程:获取API Key配置与openai codex安装详解

朋友们&#xff0c;就在 2025 年 9 月中旬&#xff0c;OpenAI 悄悄扔下了一颗重磅炸弹&#xff1a;GPT-5-Codex。 如果你以为这只是又一次平平无奇的模型升级&#xff0c;那可就大错特错了。 我可以这么说&#xff1a;软件开发的游戏规则&#xff0c;从这一刻起&#xff0c;可能…

基于Spark的用户实时分析

Spark的最简安装 1. 下载并解压 Spark 首先,我们需要下载 Spark 安装包。您可以选择以下方式之一: 方式一:从官网下载(推荐) # 在 hadoop01 节点上执行 cd /home/hadoop/app wget https://archive.apache.org/dist/spark/spark-2.3.1/spark-2.3.1-bin-hadoop2.7.tgz方…

OpenCV 风格迁移、DNN模块 案例解析及实现

图像风格迁移是计算机视觉领域极具趣味性的技术之一 —— 它能将普通照片&#xff08;内容图像&#xff09;与艺术画作&#xff08;风格图像&#xff09;的特征融合&#xff0c;生成兼具 “内容轮廓” 与 “艺术风格” 的新图像。OpenCV 的 DNN&#xff08;深度神经网络&#x…

MySQL 日志:undo log、redo log、binlog以及MVCC的介绍

一、MySQL 日志&#xff1a;undo log、redo log、binlogundo log&#xff08;回滚日志&#xff09;&#xff1a;是 Innodb 存储引擎层生成的日志&#xff0c;实现了事务中的原子性&#xff0c;主要用于事务回滚和 MVCC&#xff08;隔离性&#xff09;。 redo log&#xff08;重…

【面板数据】省及地级市农业新质生产力数据集(2002-2025年)

农业新质生产力是以科技创新为核心驱动力&#xff0c;以科技化、数字化、网络化和智能化为主线&#xff0c;通过技术革命性突破、生产要素创新性配置、产业深度转型升级&#xff0c;实现农业全要素生产率显著跃升的先进生产力形态 本数据基于2002-2025年各省政府工作报告中关于…

20250917在荣品RD-RK3588-MID开发板的Android13系统下使用tinyplay播放wav格式的音频

input keyevent 24 1|console:/sdcard # cat /proc/asound/cards console:/sdcard # ls -l /dev/snd/【需要打开Android13内置的音乐应用才会有声音出来&#xff0c;原因未知&#xff01;】 1|console:/sdcard # tinyplay /sdcard/Music/kiss8.wav -D 1 -d 020250917在荣品RD-R…

总共分为几种IP

IP&#xff08;Internet Protocol&#xff09;地址根据不同的分类标准可分为多种类型&#xff0c;以下是常见的分类方式&#xff1a;按版本分类IPv4&#xff1a;32位地址&#xff0c;格式为四组十进制数字&#xff08;如192.168.1.1&#xff09;&#xff0c;约43亿个地址&#…

【Linux】常用命令(六)

【Linux】常用命令&#xff08;六&#xff09;1. yum命令1.1 基本语法1.2 常用命令2. 从服务器把数据cp到本地3. uname命令3.1 常用命令1. yum命令 全称&#xff1a;Yellowdog Updater, Modified作用&#xff1a;是 RPM 包管理器的前端工具&#xff0c;用于基于 RPM 的 Linux …

go grpc开发使用

1、安装proto 下载 Windows 版本 打开官方发布页面 访问 Protocol Buffers 的 GitHub Releases 页面&#xff1a; &#x1f449; https://github.com/protocolbuffers/protobuf/releases 解压 ZIP 文件 将下载的 ZIP 文件解压到一个你容易找到的目录&#xff0c;例如&#xff1…

MyBatis分页:PageHelper

MyBatis分页&#xff1a;PageHelper &#x1f4d6; 前言&#xff1a;为什么需要分页&#xff1f; 在处理大量数据时&#xff0c;一次性从数据库查询并返回所有结果是不可行的&#xff0c;这会带来巨大的性能和内存开销。分页是解决这一问题的标准方案。而PageHelper是一个极其流…

Gin框架:构建高性能Go Web应用

Gin框架&#xff1a;构建高性能Go Web应用 Gin是Go语言中最受欢迎的Web框架之一&#xff0c;以其高性能、简洁API和丰富的中间件支持而闻名。本文将带你从零开始&#xff0c;逐步掌握Gin框架的核心概念和高级特性&#xff0c;并通过实际代码示例演示如何构建高效的Web应用程序。…

IO进程——线程、IO模型

一、线程Thread1、引入1.1 概念相当于是一个轻量级的进程&#xff0c;为了提高系统的性能引入线程&#xff0c;在同一进程中可以创建多个线程&#xff0c;共享进程资源1.2 进程和线程比较相同点&#xff1a;都为操作系统提供了并发执行的能力不同点&#xff1a;调度和资源&…