AI遮天传 DL-反馈神经网络RNN

news2024/11/18 13:41:50

本文会先介绍动态系统的概念,然后介绍两种简单的反馈神经网络,然后再介绍两种门控神经网络(LSTM, GRU),最后是关于反馈神经网络的应用(本次以语音识别为例)。

RNN: Recurrent neural network,一般叫它“反馈神经网络”或者“循环神经网络”。

一、动态系统

日常生活中,动态系统随处可见,蝴蝶扇动翅膀,它的翅膀是随着时间变化的,人走路、内燃机工作、股票等等,都是随着时间变化的。我们把这些系统成为动态系统。

 我们最后要讲的语音识别就是使用RNN来建模一个动态系统的典型的例子。

1.1 反馈连接 

1.1.1 前馈网络 

我们前面所学的CNN、MLP等,都是像上面一样有一个输入输出层,中间有n个隐含层。这个网络训练好以后,它的信息的流向是从输入层到输出层,中间没有其它流向,这样的网络我们叫它前馈网络

1.1.2 反馈网络

层间反馈 

对应的,反馈网络,信息有反向流动比如有一个从输出层到隐含层的反向连接:输入->隐含->输出->隐含->输出->隐含->输出->...  (循环、反馈神经网络名字的由来)

或者是:输入->隐含->输出->输入->隐含->输出->... 

层内反馈

另一种反馈连接是在层内部的连接,因为一个层内部它有很多个神经元,假如我们让这些神经元互连,那么它也会在这一层的内部进行不停地循环,也就是每个时刻这100个神经元的状态都可能是不同的。


  • 前馈网络
    • 无反馈
  • 反馈网络
    • 层间反馈: 从输出层到输入层, 或者从隐藏层到输入层
    • 层内反馈

反馈连接的存在导致神经元的状态 (以及输出)将随时间变化


1.2 RNNs是动态系统

如上是Jordan网络和Elman网络,及其动态方程,h(t)表示第t时刻的h,它由当前时刻的输入x(t)和上一时刻的输出y(t-1) 或 上次隐含层的输出h(t-1)决定。

1.2.1 使用RNN对动态系统建模

比如我们有一个动态系统,该动态系统性质复杂,我们没有办法对这个系统进行一个精确的建模,但是我们能有测量这个系统的输入和输出随时间变化的一个曲线。

为了对这个动态系统进行建模,我们可以构建一个RNN模型,调整RNN里面的参数,使得这个RNN的输入和输出的关系与该物理系统是一样的。通过数据的拟合来调整神经网络的参数,使得RNN输入与输出的关系能够很好地匹配上这个物理系统。

为什么可行? 

  • RNN中的隐藏状态

h(t+1)=f(h(t),x(t),y(t))

对之前的事件有记忆,即前一时刻影响后一时刻:h(t+1), h(t)

        期望隐藏状态能捕获对象系统中过去的信息或时间依赖性

        这种记忆类似于动物的短期记忆

  • 给定很多系统的输入输出对,存在有效的算法来学习RNN的参数

        通过时间反向传播 (BPTT)

1.2.2 解释大脑如何工作*

  • 用一个已存储的模式的部分信息或近似信息来恢复该模式的整体信息

说人话就是上面两张图片是同一个人,我们认识左边这张图片以后,即便是这个人戴上墨镜,我们依然也认得他。

这个过程我们认为是动态系统演化的过程。

Hopfield网络

我们把这个动态系统简化为一个二维的,图片中的红点表示上面左边完整的人物图片,绿点表示该人戴了墨镜不完整的信息,上面这些箭头表示它在平面上随时间演化的过程。

因为我们大脑里存在大量的反馈链接,我们可以把大脑看作一个反馈神经网络,一个动态系统。当我们看到戴墨镜的他后,大脑的绿点就开始沿着箭头演化,逐渐收敛到红点,于是我们认出了这个人。收敛到的位置我们成为:吸引子

  • 这可能是大脑中的动态过程

1.3 RNN的历史

二、简单RNNs

2.1 Jordan网络

2.2 Elman网络

上面两种RNN网络结构已经讲过,这里来讲一下:通过时间反向传播(BPTT) 

我们在学习全连接或者CNN时接触到了反向传播算法,我们用它来更新权重参数。在这里,RNN使用BPTT来更新参数。

2.3 通过时间反向传播(BPTT) 

将网络的时间操作展开为前馈网络,该网络在每个时间步长都会增加一层。

因为该网络和时间有关,如 h(t+1)=f(h(t),x(t),y(t))  ,我们可以将公式展开,这样不同时刻(t-1, t, t+1, t+2...)的公式(权重参数)就像是不同层的隐含层一样,可以用来计算了。

我们假设只有两个神经元:

展开以后,不就是一个前馈网络了吗?此时,就没有任何的反馈链接了。

这样我们就可用BP算法去优化、学习这个前馈网络的参数了。(不是优化这里展开后的网络的w11,w12,他们展开后是不变的,我们优化的是全部展开后,整个RNN变为一个更长的前馈神经网络,我们更新的是每一部分的W11,W12...。)

注:当然这也和我们所学的前馈网络不太一样,一个是神经元的个数没发生变化,另一个是权值W11 W12...没有发生变化,我们变化的是神经元的状态h11 h12...。所以我们可以从上图看到,W后面没有括号t,且展开时W11, W12...并没有发生变化。

2.3.1 展开Elman网络

接下来我们就要根据上面所说的,把一个RNN网络按时间展开成一个前馈网络了。

神经网络的展开方式和任务有关,任务设定不同,返回神经网络的展开也不同。

情况 1:

  • 𝒙 仅出现在第一层
  • 标签 𝒓 只出现在最后一层
  • Recursive NN做图像分类 就是这样的工作形式

如上图,原本的隐层h内部进行时间循环,我们这里展开成前馈网络,即上图的多个橙色层,它们的权重W都是一样的,原因上面也说了,变化的只是状态h,因此展开时W已经定下来了,和t有关的只是h。 

情况 2:

  • 𝒙 是固定的但出现在所有层中
  • 标签 𝒓 只出现在最后一层
  • 例如图像分类 (Liang, Hu, CVPR 2015)

和上面情况1的区别在于,展开的每次都要把x作为输入给到隐层单元。绿色、橙色箭头权值共享。

图像分类:每次隐层的节点都能同时接收到上一时刻的输出和初始图像作为输入,把信息做一次前馈计算,输出到下一层。

其实上面两种情况都不太常见,常见的是下面这两个例子。  

情况 3:

  • 𝒙 随时间变化
  • 标签 𝒓 只出现在最后一层
  • 例如,句子分类

每个时间都会有不同的x给到这个系统,所以在展开的时候,除了接收上一时刻的输出,还要接收一个随时间变化的输入x。

句子分类:根据不同的词(输入x),最后得出结论是正面的还是负面的(输出y)

情况 4:

  • 𝒙 随时间变化
  • 标签 𝒓 在所有层都出现
  • 例如,语音识别

即在每一时刻多了y的输出。

语音识别:比如I like deep learning 这句话,不同时刻的输入会有该时刻的输出。

至于其它情况,具体情况具体分析啦。

2.4 新的图示表示

我们用一种新的图示来表示Elman网络和Jordan网络及其展开。

2.4.1 Elman网络 

  • 用圆圈来表示向量 (一个圆表示一层,即用圈代替前面的矩形)
  • 将时间步长作为上标

  • 前向传播运行时间是 𝑂(𝑞) 并且无法减少(展开q次)
  • 等效于图灵机

这种展开就是上面的情况4,比如语音识别。

2.4.2 Jordan网络

它的功能不那么强大,无法模拟通用图灵机

2.5 强制教学(Teacher forcing)

某些网络(例如Jordan网络) 具有从一个时间步的输出下一个时间步的计算值的连接,那么应该在下一时间步中输入什么来表示输出?

上图,r为标签,我们是将r连接给下一层时刻呢还是把y给它。刚开始训练的时候,y可能不太对,这样不太好训练,所以不如把r连给它,这个想法称为强制教学

强制教学(Teacher forcing): 训练过程中,使用参考信号(期望的标签r)

好处:所有时间步都可解耦,因此训练可以并行化。因为使用标签r作为下一个的输入,此时和时间没有关系了,不需要等待。

训练时可以有r,但是在测试时,不存在参考信号,因此我们必须使用网络在时间 𝑡 时的输出y。(这样训练和测试的时候,网络结构不同,就会带来一些问题,比如训练的时候,没见过错误的信号,测试的时候就胡乱瞎输出了)

网络在训练过程中得到的输入类型可能与测试时得到的输入类型完全不同。

因此在训练的时候,我们可以一会使用强制教学,一会让它自用运行(即接收y),这样既能加快训练速度,又能让网络看到一些错误的信号。

2.6 双向RNN

  • 在很多应用中,当前时间步的预测可能依赖于整个输入的序列(过去和未来)

人话:我们上面所讲的当前时刻的输出依赖于上一时刻(过去),但其实在很多应用中,它可能还依赖于未来。 

Bank is the side of a river.

Bank provides various financial services.

第一个句子中的Bank是河岸的意思,第二个句子中的Bank是银行的意思。但是当你只读到第一个单词的时候,不知道这里的Bank是河岸还是银行,因此也要依赖于“未来”。

  • 双向 RNNs将一个随时间向前移动的RNN与另一个随时间向后移动的RNN组合在一起
  • 每个时间段的整个网络的输出都会收到两个RNN的输入,前后文同时判断Bank的含义。

同时接收一个从左向右的RNN和一个从右向左的RNN作为输入得到输出。 

2.7 深度RNNs

我们上面举的例子包括拆分Elman网络时,隐含层只有一层,即便展开参数也都是共享的。实际上它可以有很多层。

我们有多种构建RNNs的方式,层间、层内、层间+层内...

2.8 思考

从上图可以看到,这里的h(t)虽然可以记忆一些东西,但随着时间延申,之前的记忆指数衰减!

  • 该结论可以推广到多维Elman网络,需要一些关于U的假设,例如,U是对称的
  • 在Jordan网络上可以得出相同的结论,将 𝒚(𝑡) 表示为𝒚(0) 和 𝒙 1 , … , 𝒙(𝑡)的函数

三、门控RNNs 

为了解决记忆太短的问题,人们提出了门控RNNs。

3.1 长短时记忆 (LSTM) 单元

可以视为Jordan网络和Elman网络的组合。将两个网络的特点组合一下,即可得到LSTM。

  • 输出连接到输入
  • 自循环用于捕获有关过去的信息

重画 Jordan 网络:用圆圈表示操作 ,变量在箭头上指示 ,忽略偏置 𝒃

第一步:添加一个自循环(添加Elman特点)

这一步可能有些小白看不懂,上面说了,是Jordan和Elman的组合,组合自然就是把他俩加起来了哈哈,红色的部分还是层内(Elman)自循环,整体外部是层间自循环(Jordan)。

至于为什么不用h来自反馈而引入一个c去记忆呢,其实用h自反馈这种思想将在下面GRU提到,这里我们先使用c。

第二步:添加三个门(函数,输出在0-1之间,0关闭,1完全打开,之间就是半开半闭)

此时虽然Jordan和Elman都组合了起来,但并没有改变短记忆的特点,因此我们添加三个门来控制信息流。 

  • 遗忘门f 控制上一时刻记忆c(t-1)有多少传到当前时刻c(t),(f是0的话就全忘了,1的话就全记住,即f越小,忘的就越快。)
  • 输入门i 控制当前输入h(t)有多少要放到记忆c(t)里面。
  • 输出门o 影响下一个时刻输入进去给h信息的多少

这些门由什么决定呢?

 我们根据x(t)和y(t-1)得到的结果,进行非线性变换映射到0-1之间。有时也可以由c(t),c(t-1)决定。

术语

3.1.1 思考

1. LSTM能否保留比Elman网络更长的短期记忆?

当然可以

2. 为什么

假设三个门的值均为1(当然门的值是变化的由x(t)和y(t-1)决定),我们从公式中可以看出每次一循环的信息都被保留下来了,我们当时用c模拟Elman网络自循环,c(t) = c(t-1)+h(t) 这样c不断累加,就能不断存贮之前的信息。

3. 永远保持 𝑡 = 𝑛 时获得的记忆 𝒄 (𝑛) 的理想情况是什么?

原因见2

3.1.2 LSTM优点

与简单的RNNs相比,门控机制使模型能够将记忆保留更长的时间

Long short-term memory network”

门控机制已广泛用于深度学习模型中,不仅在RNN中,而且在CNN中

  • Highway Network (Srivastava et al., ICML 2015 Deep Learning workshop)
  • SEnet (Hu et al., CVPR 2018) – SKnet (Li et al., CVPR 2019 )
  • 注意力机制(前馈模型没有记忆)

3.2 门控循环单元(GRU)

在Elman网络中,𝒉 用于捕获历史信息

h^{(t)} = \sigma _{h}(W_{h}x^{(t)}+U_{h}h^{(t-1)}+b_{h})

在没有门的LSTM单元中,为此引入了一个新的c

h^{(t)} = \sigma _{h}(W_{h}x^{(t)}+U_{h}y^{(t-1)}+b_{h})

c^{(t)}=c^{(t-1)}+h^{(t)}

那么为什么不直接使用h?

这是GRU的第一个想法

h^{(t)} = z^{(t)}\odot h^{(t-1)}+(1-z^{(t)})\odot \widetilde{h}^{(t)}

其中 z^{(t)}\in (0,1) z也是个门,且 \widetilde{h}^{(t)} = \sigma _{h}(W_{h}x^{(t)}+U_{h}h^{(t-1)}+b_{h})

即在LSTM中去掉了c,用h自己和自己求和(前一时刻+后一时刻)。

我们也看到了上图其实不止在c处发生了变化,这里就要引入GRU的第二个和第三想法

  • 更新门z  用来控制h自反馈,此消彼长。
  • 重置门r  调节输入

由x(t)和h(t-1)决定。

GRU

3.3 LSTM和GRU哪一个更优?

  • LSTM 和 GRU 在许多任务上表现相似
  • LSTM和GRU还有许多其他变体,但是它们在所有任务中都无法明显击败这两个标准模型(Greff et al., TNNLS 2017)

四、语音识别

根据上面所学知识,比如动态系统、展开Elman网络时的不同情况、双向RNNs,我们可以来了解一下语音识别。

语音识别和自然语音他们都有一个共同特点:序列数据,所以很适合用反馈神经网络进行建模。

如上图,输入是一个随时间变化的WAV格式的信号, 输出则是上方对应的因素,比如I like ...,

- 表示当时没有一个对应的因素,因为人说话时同一个因素有的人发音长有的人发音短,中间拉声的时间可能会不一样。

4.1 语音识别常用模型 

4.1.1 基本流程 

RNN设置

这是一个Elman网络的展开方式,对应上面我所写的情况4,(LSTM和GRU也可以做类似的展开,毕竟都是反馈神经网络。)

目标函数 

4.1.2 使用双向LSTM进行语音识别

与上面所讲的双向RNN一样,这里的RNN是LSTM,其上一时刻的两个不同方向的输出作为这一时刻的输入。

注:这里的双向LSTM的g或者h可以是右侧的h或者c。

4.1.3 深度 RNN – 百度的 Deep Speech 2

 卷积后接RNN

4.2 数据预处理

通常模型的输入不是原始的wav信号,而是频谱信号

  • (Graves et al., 2013)使用基于傅立叶变换的滤波器组对音频数据进行编码,该滤波器组以mel等级分布,拥有40个系数(加上能量),再加上它们的第 一和第二时间导数。
  • 因此,每个输入向量的大小为123。
  • 对数据进行归一化,以使在整个训练集上输入向量的每个元素有零均值和 单位方差。

4.3 基准数据集

基准数据集

  • TIMIT, 较小
  • Switchborad, 260 小时
  • LibriSpeech, 1000 小时
  • CHiME, 有各种环境噪音

许多基准数据集仅用于测试,您需要使用自己的训练集

  • Deep speech 2 ,英语系统接受了11,940个小时的英语语音训练,而 普通话(Mandarin)系统则接受了9,400个小时的训练。数据合成被用来 进一步扩充数据。

研究人员倾向于开源他们的模型,但不开源训练集 ,这使得评估不同模型变得困难。

五、主要文献与延伸阅读

  • Goodfellow, Bengio and Courville, 2016 Deep Learning, MIT Press, Chapters 10
  • Understanding LSTM networks http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 
  • Sutskever, Fernandez, Gomez, Schmidhuber (2006) Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks ICML
  • Graves, Mohamed, Hinton (2013) Speech recognition with deep recurrent neural networks IEEE ICASSP
  • Amodei, Ananthanarayanan, Anubhai et al. (2016) DeepSpeech2: End-to-End Speech Recognition in English and Mandarin ICML

  • Greff, Srivastava, Koutník, Steunebrink, Schmidhuber (2017) LSTM: a search space odyssey IEEE Trans. on Neural Networks and Learning Systems
  • Liang, Hu (2015) Recurrent convolutional neural network for object recognition CVPR

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

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

相关文章

1565_AURIX_TC275_开关电源模式相关寄存器

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这个寄存器可以设置开关电源的开关频率,之前在文档中看到过这个默认的数值是1.5M的频率,现在看来应该是这个1.56M的一个近似了。准确的数值不是1.5M而是1.56M。 1. …

任务四:标准化组织概览

标准化组织概览一、标准化组织1、ITU电信标准化部门无线电通信部门电信发展部门2、3GPP3、3GPP24、CCSA二、TDD-LTE与FDD-LTE系统的对比三、LTE技术特点及基本指标1、LTE主要技术特点2、峰值数据速率3、控制面延迟4、用户面延迟5、用户吞吐量6、频谱效率7、移动性8、覆盖9、频谱…

同事跳槽拿下阿里 P6Offer,程序员:会点基础还真不行

前阵子,同事程序员 H 偷偷的向阿里菜鸟投递了自己的简历... 不久后程序员 H 就收到了阿里菜鸟的面试通知,经历 5 轮面试,一举成功拿下 offer 并定级 P6。 小天趁着未来的阿里大佬还在身边,向程序员 H 讨教了一下面试阿里菜鸟的经…

法则三:架构师如何在一定时间内最大化自己的增量价值

法则三:架构师如何在一定时间内最大化自己的增量价值 作为一个架构师,必须要创造足够的商业价值,才能保障自己职业的长期。 那么你作为架构师,该如何为你的公司、部门或团队提供可量化的增量价值呢? 主要有扩大收入与…

2022.12.11 学习周报

文章目录摘要文献阅读1.题目2.摘要3.传统RNN存在的问题4.RNN与IndRNN的对比4.1 隐含层状态更新公式4.2 结构示意图4.3 IndRNN的优势5.IndRNN的分析5.1 RNN5.2 LSTM5.3 IndRNN的初始化5.4 梯度截断5.5 IndRNN6.实验结果6.1 Adding Problem6.2 Sequential MNIST Classification6.…

Spring 体系常用项目

如今做Java尤其是web几乎是避免不了和Spring打交道了,但是Spring是这样的大而全,新鲜名词不断产生,学起来给人一种凌乱的感觉,我就在这里总结一下,理顺头绪。 Spring Spring 概述 Spring 是一个开源框架&#xff0c…

R语言学习笔记——基础篇:第六章-基本图形

R语言 R语言学习笔记——入门篇:第六章-基本图形 文章目录R语言一、条形图1.1、垂直与水平条形图补——数据为因子时绘制垂直与水平条形图1.2、堆砌条形图与分组条形图1.3、数据整合条形图1.4、条形图的微调1.5、棘状图二、饼图三、直方图四、核密度图4.1、简易核密…

CSS基础-装饰,基线,光标类型,边框圆角(胶囊),文字溢出,元素隐藏,边框合并,css画三角形...

CSS基础-装饰 目录CSS基础-装饰1.1 认识基线(了解)1.2 文字对齐问1.3 垂直对齐方式(拓展)项目中 vertical-align 可以解决的问题2.1 光标类型3.1 边框圆角3.2 边框圆角的常见应用4.1 溢出部分显示效果5.1 元素本身隐藏(拓展)元素整体透明度(拓展)边框合并(拓展)用CSS画三角形技…

关键字(五):const和volatile

关键字一."令人误解"的关键字—const1.const的基本特质2.const的各种应用场景1.修饰变量2.修饰数组3.修饰指针4.修饰函数的参数5.修饰返回值二.最易变的关键字—volatile一."令人误解"的关键字—const 1.const的基本特质 简单的示例 const所修饰的变量不可…

[附源码]计算机毕业设计海南与东北的美食文化差异及做法的研究展示平台Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java在线图书馆信息管理系统g6977

好的选题直接决定了毕业设计好坏,甚至决定了能否毕业。今天,我们就来聊一聊毕设该怎么选题。 这里分三个选题标准。 第一,参考所在学校往年选题类型和难度 可以向学长学姐了解往年的选题类型,以及使用的技术,不用向…

Kotlin如何延时准确的循环执行事件,比如倒计时或每一秒执行一次事件

前言 延时循环执行事件很简单,且有很多方式,但想要延时相对精确,就需要稍微设计一下了 普通的方案 线程内阻塞的方案 这种方案很简单,示例代码如下 while (true){block()//执行逻辑Thread.sleep(1000)//延时1秒} 但缺点也是显而易见,其是线程阻塞的,比较浪费资源 异步或挂…

26-Vue之ECharts-柱状图

ECharts-柱状图前言柱状图实现步骤柱状图常见效果标记显示前言 本篇来学习下柱状图的实现 柱状图实现步骤 ECharts 最基本的代码结构准备x轴的数据准备 y 轴的数据准备 option , 将 series 中的 type 的值设置为: bar <!DOCTYPE html> <html lang"en">…

【算法】动态规划 ⑥ ( 骑士的最短路径 II | 问题分析 | 代码示例 )

文章目录一、问题分析二、代码示例骑士的最短路径 II : 在 国际象棋 中 , 骑士 类似 与 象棋 中的 马 , 走 " 日 " 字 格子 ; 骑士有 8 种走法 : " 日 " 字 格子 , 参考 百度百科 左走一格向前走两格左走一格向后走两格左走两格向前走一格左走两格向后走…

Jackson注解自定义数据脱敏策略

Jackson注解自定义数据脱敏策略1.前言2.脱敏注解3.定义好一套需要脱敏的规则4.自定义JSON序列化5.在实体类上标注对应的脱敏规则5.写一个接口进行测试1.前言 有时候&#xff0c;我们返回给前端的数据需要脱敏&#xff0c;避免用户信息被泄漏&#xff0c;就像你点外卖一样&…

node.js安装+卸载,npm+cnpm安装+卸载 vue安装+卸载

node.js安装卸载&#xff0c;npmcnpm安装卸载 vue安装卸载 使用指令整理&#xff1a; #获取node.js版本号&#xff08;验证电脑是否安装&#xff09; node -v #node.js官网地址 #https://nodejs.org/en/ #获取npm版本号&#xff08;npm:Nodejs软件包管理工具)&#xff08;验证…

unix网络编程(四) 线程池并发服务器

线程池并发服务器概念线程池和任务队列任务队列线程池操作线程池的函数初始化线程池销毁线程池向线程池添加任务任务的回调函数测试概念 线程池是一个抽象概念&#xff0c;可以简单的认为若干线程在一起运行&#xff0c;线程不退出&#xff0c;等待有任务处理。 为什么要有线程…

通过选择集获取元素

通过使用内置对象document上的getElementsByTagName方法来获取页面上的某一种标签&#xff0c;获取的是一个选择集&#xff0c;不是数组&#xff0c;但是可以用下标的方式操作选择集里面的标签元素 <!DOCTYPE html> <html lang"en"> <head><me…

Javaweb安全——Weblogic反序列化漏洞(一)

从原生反序列化过程开始谈起。 原生反序列化 序列化就是把对象转换成字节流&#xff0c;便于保存在内存、文件、数据库中&#xff1b;反序列化即逆过程&#xff0c;由字节流还原成对象。 大致是这么一个过程&#xff0c;简单画了个图&#xff1a; 测试类如下&#xff1a; p…

spring mvc——@RequestMapping注解的作用

RequestMapping注解 1、RequestMapping注解的功能 从注解名称上我们可以看到&#xff0c;RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来&#xff0c;建立映射关系。 SpringMVC 接收到指定的请求&#xff0c;就会来找到在映射关系中对应的控制器方法来处理…