长短期记忆网络 (LSTM) 简介
文章目录
- 一、说明
- 二、传统 RNN 的问题
- 三、为什么梯度消失?
- 四、长短期记忆网络简介
- 五、忘记门
- 六、Update Gate (Input Gate)
- 七、Output Gate
- 八、数学上的内存
- 九、从 LSTM 到 Transformer
- 十、总结
一、说明
机器学习取得进步的领域之一是自然语言处理。对于用于机器翻译和类似任务的模型尤其如此。换句话说,对于可用于执行序列到序列学习的模型,其中一种序列(例如用英语编写的短语)被转换为另一种序列(例如用德语编写的短语)。
多年来,长短期记忆网络 (LSTM 网络) 一直是序列到序列学习中最先进的技术的一部分。在 2017 年 Transformer 突破之后(即 Vaswani 等人在 2017 年的工作)之后,它们被缓慢但肯定地取代了,它们在当今的许多 Seq2Seq 任务中仍然发挥着重要作用,尤其是在部署的模型中。
本文对 LSTM 进行了简要介绍。我们先看一下上下文。我们将介绍经典的递归神经网络,以及为什么训练它们是有问题的。随后,Hochreiter 和 Schmidhuber 在他们 1997 年的工作中介绍了长短期记忆网络。我们还将直观地介绍为什么 LSTM 解决了机器学习中传统上存在的循环段梯度消失问题。
还包括对当代 LSTM 架构的全面分析,其中包括一些变化,以改进基本的 LSTM。特别是,我们将研究如何将内存与隐藏状态、各种门(即 forget、input/update 和 output 门)分开。最后,我们还通过研究 Transformer 在过去几年中取代 LSTM 的原因来展望未来。
以下是阅读本文的要点:
找出经典递归神经网络的问题所在。
确定 LSTM 的工作原理以及它们解决梯度消失问题的原因。
看看当代 LSTM 架构、其组件及其变体。
了解为什么 Transformer 在序列到序列学习中缓慢但肯定地取代了 LSTM。
我们走吧!
二、传统 RNN 的问题
当人们谈论将机器学习应用于自然语言处理领域时,许多人很快就会遇到递归神经网络这个术语。在其基本形式中,即在其原始形式中,递归神经网络 (RNN) 可以通过以下方式可视化:
一个完全循环的网络。由 fdeloche 在维基百科上创建,许可为 CC BY-SA 4.0。未进行任何更改。
在对序列(例如短语)进行标记后,我们可以将单个标记(例如单词)提供给网络;此处的令牌由绿色圆圈x_t显示。这些是具有隐藏状态 h 的网络的 input ,该网络基于此隐藏状态生成输出令牌 o。此外,hidden state 的输出被传递回 hidden state。这样,我们既可以生成输出值,又可以拥有某种内存。
特别是当你展开这个结构,显示后续标记x_{t-1} 等的解析时,我们看到隐藏状态以从左到右的方式跨标记传递。每个令牌都可以使用前面步骤中的信息,因此在转译(例如翻译)令牌时受益于额外的上下文。
网络的结构类似于标准的多层感知器,区别在于我们允许与时间延迟相关的隐藏单元之间的连接。通过这些连接,模型可以保留有关过去的信息,使其能够发现数据中彼此相距甚远的事件之间的时间相关性。
Pascanu 等人 (2013)
虽然这是一个相对较大的进步,特别是对于较大的序列,但经典的RNNs并没有显示出比经典神经网络更大的改进,后者的输入是一组时间步长(即一次有多个标记),根据Hochreiter和Schmidhuber(1997)的说法。深入研究 Hochreiter 6 年前的论文工作,研究人员已经确定了梯度消失问题和当序列很大时必须经过的相对较大的距离误差流是此类模型性能不佳的主要原因之一。
梯度消失问题是指相反的行为,当长期分量以指数速度达到范数 0 时,使模型无法学习时间上遥远事件之间的相关性。
Pascanu 等人 (2013)
三、为什么梯度消失?
经典 RNN 中出现梯度消失问题是因为它们使用一种称为时间反向传播的反向传播变体 (BPTT;维基百科,2010 年)。要了解 BPTT 的工作原理,我们必须再次了解递归神经网络。在下图中,我们可以看到一个循环网络,处理a_t f或某个时间步长的输入,并为下一个时间步长生成一个预测 y_{t+1}。前一次尝试的隐藏状态也被传递给网络,并且通常是 t = 0 处的零向量(Wikipedia, 2010)。
当在时间中展开时,我们可以看到输入a_t在整个时域中的链式通道。我们还看到 hidden 状态随时间变化,不断用于生成后续输入。实际上,我们正在 “复制” 网络,但网络的每个副本都有相同的参数(Wikipedia, 2010)。然后,我们可以简单地应用反向传播来计算梯度,就像我们习惯的那样。
资料来源:Headlessplatt(维基百科)。已获得公共领域的许可。
现在问题来了。传统上,为了确保神经网络能够学习处理非线性数据,网络中添加了非线性激活函数。Sigmoid 一直是一种激活函数,曾经是神经网络中应用的标准函数之一。下图完美地说明了如果反向传播必须经过的 “副本 ”链很长,梯度会消失的原因:Sigmoid 导数的最大值< 0.3。
换句话说,如果我们必须将 Sigmoid 的导数跨三个时间步长链接起来,我们的梯度很快就会接近零。特别是上游层,即上游时间步长,受到这个问题的严重打击,因为当序列变得太长时,它们会停止学习。向梯度消失问题问好!
四、长短期记忆网络简介
在他们1997年的工作中,Hochreiter和Schmidhuber引入了长短期记忆,或LSTM。在这项工作中,作者探讨了 Hochreiter 1991 年的论文,该论文研究了经典 RNN 中梯度消失的问题。他们探讨了它们发生的原因并确定了解决方案:所谓的常差旋转云母 (CEC)。我们稍后将更详细地探讨为什么它会解决消失的梯度,但归结为一件事:因为内存是使用线性运算构建的,所以导数始终为 1.0(因为 f = c x x 的导数等于 1.0)。
当代 LSMT 架构
但是,让我们首先看一下当代 LSTM 网络的架构。下面,您将看到一个乍一看似乎很复杂的可视化。然而,当我们更谨慎地看待它时,情况就不一定如此了。更具体地说,我们可以将各种构建块分为四个主要类别:
内存和输出状态之间的分离。
一个忘记门,帮助我们从内存中删除某些东西。
一个更新(或输入)门,帮助我们向内存添加某些东西。
一个输出门,帮助我们根据输入和现有内存(即基于输入和更新的上下文)生成输出预测。
LSTM 中的所有功能都被分组到一个称为存储单元的单元状结构中。与经典的循环网络类似,当下一次预测发生时,Cell 的输出会流回 Cell。或者,当展开时,就像上面的循环网络一样,相同 cell 的一个副本的输出将传递给该 cell 的另一个副本。在下图中,这由输出 h[t] 和内存 c[t] 的水平流可视化。
具有 Forget Gate、Update Gate 和 Output Gate 的 LSTM 存储单元。
分离内存和输出状态
经典递归神经网络和 LSTM 之间的第一个关键区别是内存与输出是分开的。在经典网络中,这些是紧密集成的,正如我们在上面可视化的展开循环网络中看到的那样。
在经典网络中,输出用于为下一个预测提供上下文。对于 LSTM 来说,情况不再如此。至少,由于 memory 和 output state 之间的这种分离,不再仅适用于 LSTM。
这在上图中可见:
在这里,LSTM 在任何时间点的输入都显示为 x[t]。
输出可视化为 h[t]。事实上,它是递归的,因为它接受来自前一个 cell 的输出(或者更准确地说,相同 cell 的另一个副本)并将其传递给下一个 cell。
内存 c[t] 也是如此,它是新近可用的,在以前的网络中不可用。
这里的想法是,虽然输出可以提供相当多的关于之前发生的事情的背景,但长期记忆对于提供额外的(即长期)背景是必要的。这就是为什么 output 和 memory 不再与 LSTM 紧密集成的原因。现在,将内存与 cell 输出分离的缺点是您必须使两者保持同步。
保持它们同步意味着我们必须忘记从以前的输出中可以忘记的内容,给定当前的输出。这也意味着我们必须记住,给定之前的输出,必须记住当前 1 中的内容。否则,内存就没用了,不是吗?
因此,LSTM 带有门。下面,我们将描述Gers等人(1999)提出的当代变体,作为Hochreiter和Schmidhuber(1997,提出的原始LSTM的扩展。它有三个门,分别是忘记门、更新门和输出门。他们都发挥着独特但重要的作用。现在让我们看看每个单独的门是如何使内存保持同步的。
五、忘记门
假设你正在将序列提供给模型,其中句子已被标记化(当然,通过生成一些词汇表,可以将其转换为整数等价物)。I am going to the gym
在上一次运行中,您已将 LSTM 模型应用于 ,现在将处理 。这意味着您将拥有以下设置:
x[t] 的值将是 的分词化版本。
h[t-1] 的值将是 的(转换的)分词化输出。
c[t-1] 的值将是长期记忆的某种表示形式,此时它仅包括 的(部分)表示。
为什么它可能只是表示的一部分,是因为分词化的输入将同时影响输出 h[t] 和内存 c[t]。
发生这种情况的第一种方式是通过 forget gate,它已在下面以绿色选中。该门由多个组件组成,从上到下:
一个块,它将前一个时间步的内存与忘记门的输出相乘。
一个 Sigmoid 函数,用作决定要忘记什么的机制。
前一个输出和当前输入作为忘记门的输入。
在将(学习的)权重矩阵应用于两个输入之后,首先通过矩阵加法将先前的输出 h[t-1] 和当前输入 x[t] 相加。这些学习的权重通过更多地关注当前输入或先前的输出来确定忘记门的强度。然后将结果添加到 Sigmoid 激活函数中,我们知道该函数将所有输入映射到 0.0 到 1.0 之间的值。
换句话说,当前和以前的输入以及学习的权重决定了必须“遗忘”的内容,因为当矩阵中作为加法结果的某些元素< 0 时,它们可能会更容易被遗忘(因为 Sigmoid 激活的输出更接近 0.0 而不是 1.0)。相反,如果结果为 >= 0,则更有可能在删除过程中省略它们。
删除或遗忘过程本身是通过 Hadamard 矩阵乘法进行的。记忆矩阵是 Hadamard 乘以 Sigmoid 激活矩阵的结果,这意味着所有应该降低强度的元素都被减少,所有必须保留的元素都不会受到显着影响。换句话说,这个门允许我们根据先前输出和当前输入的某些组合来学习要忘记什么。
六、Update Gate (Input Gate)
接下来是更新门(也称为输入门),在下面以绿色显示。与忘记门的任务是从内存中删除信息相反,更新门的任务是将信息添加到内存中。
门本身比忘记门要复杂一些,但别担心,只要有一些解释,也很容易掌握这里发生的事情。
回想一下,这是我们的时间点:
x[t] 的值将是 的分词化版本。
h[t-1] 的值将是 的(转换的)分词化输出。
c[t-1] 的值将是长期记忆的某种表示形式,此时它仅包括 的(部分)表示。
如您所见,它由两个部分组成:一个基于前一个输出 h[t-1] 和当前输入 x[t] 的联合学习加权输入的 Sigmoid 激活n,以及一个接受基于两个输入的另一个联合学习加权输入的 Tanh 激活。这些激活的结果首先被 Hadamard 矩阵相乘,然后通过矩阵加法添加到内存中。
我可以想象这里发生的事情仍然有点模糊。让我们进一步分解。以下是 Sigmoid 和 Tanh 函数及其导数的绘图。
我们首先看一下 Tanh 函数。正如我们所看到的,该函数将所有输入映射到 -1.0 到 +1.0 之间的值。换句话说,它将任何输入标准化为 [-1.0, 1.0] 范围。因此,将先前输出和当前输入的连接加权组合馈送到 Tanh 可确保输入值的一些标准化。这有利于训练过程的稳定性。然而,它并不能真正作为更新,因为使用 Tanh,所有新信息都会被添加。
这就是为什么在这里我们也应用了一个 Sigmoid 函数。正如我们所知,它映射到 0.0 到 +1.0,我们可以看到它学习选择先前输出和当前输入组合的最重要方面。Sigmoid 激活的结果是 Hadamard 矩阵乘以 Tanh 结果,然后将其添加到内存中。
换句话说,Hadamard 矩阵将 Sigmoid 激活结果和 Tanh 激活结果相乘的组合确保 (1) 在给定当前输入的情况下,只有重要的方面才会被添加到内存中;(2) 它们的添加方式在数值上稳定了训练过程。
好东西!
七、Output Gate
最后但并非最不重要的一点是 output gate,它在下面以绿色显示。
它的唯一职责是给定前一个输出和当前输入 h[t-1] 和 x[t] 来制定存储单元的输出 h[t]。然而,这个门真的很重要,因为它将决定预测的正确性(即输出)和所有后续生产的稳定性,仅仅因为它的预测在下一个预测中被重用。
我们再次看到 Tanh 和 Sigmoid 激活的 Hadamard 矩阵乘法。不过,这一次,输入来自不同的方向。
Sigmoid 激活的输入从前一个输出和当前输入流出。与迄今为止的所有 Sigmoid 一样,使用单独的权重矩阵进行加权,此 Sigmoid 激活提供了关于当前输入和先前输出中最重要的内容(用于转导任务)的学习表示。
Tanh 激活的输入从内存流出(通过忘记和添加新信息进行更新),并从本质上标准化内存值,从而稳定训练过程。
通过 Hadamard 矩阵乘法,它们一起产生我们希望正在寻找的输出标记。
为什么 LSTM 不会受到梯度消失的影响
我们知道,经典的 RNN 在训练过程中面临着梯度消失的困难,但 LSTM 没有梯度消失。
但为什么会这样呢?
现在我们了解了 LSTM 的工作原理,并且它们通过门将内存和以前的输出分开,答案很简单:梯度可以在同一存储单元的副本之间自由、持续地流动(即梯度 = 1.0)。
此外,由于使用了 Sigmoid 和 Tanh 激活函数,单元组件内的梯度可以是任何值,因此单元将能够学习如何适应与忘记、更新和输出门相关的矩阵的权重。
我可以想象这很难理解,所以让我们再次将其分解为单独的组件。
八、数学上的内存
让我们仔细看看首先在一次 token pass 中更新内存的方式。简单地说,它是一个线性运算,数学上写成如下:
这里,f_t 表示遗忘门的激活值,它是 Hadamard 矩阵乘以 c[t-1] 的值(我们从上面知道)。
这里,i_t \circ \tilde{c}_t 是更新门的 Sigmoid 激活和 Tanh 激活输出之间的 Hadamard 矩阵乘法,然后简单地将矩阵添加到内存中。
换句话说,它代表了我们上面直观地理解的操作。
记忆激活函数是恒等函数
此外,该记忆流中不存在非线性激活函数,这与经典的 RNN 相反,后者通常是 Sigmoid 激活的。换句话说:激活函数可以描述为恒等函数,或 f(x) = x (Maniac Malko, n.d.)。由于它的梯度为 1.0,我们可以看到误差可以在消失的同一存储单元的副本之间自由流动(就像当梯度< 1.0 时发生的那样,例如在 Sigmoid 情况下)。
与传统 RNN 相比,这一变化解决了 LSTM 中的梯度消失问题。
九、从 LSTM 到 Transformer
在 2010 年代,LSTM 是序列到序列学习活动(如机器翻译)的首选网络类型。
然而,还有一个 LSTM 没有解决的瓶颈:处理必须按顺序进行。
序列的每个部分都必须按顺序馈送到网络,然后基于每个标记计算转导。
这会不必要地减慢训练过程。
在他们的突破性工作中,Vaswani et al. (2017) 提出了 Transformer 架构,它通过剥离架构中反复出现的方面来实现并行。对 Transformers 的兴趣大幅增长确保了 LSTM 已被从基座上移除;它们不再被认为是 NLP 中的最先进的。
尽管如此,它们今天仍在继续使用,即使选择了“自 55.000 年以来”选项,在 Google Scholar 中也有大约 2020 次点击。涵盖了多种应用,其中包括 COVID-19 预测、空气质量预测和产水预测。
这就是为什么 LSTM 不能被丢弃,而是要小心应用。
十、总结
在本文中,我们研究了长短期记忆网络 (LSTM),这是过去几年 NLP(或更普遍地说,时间序列)机器学习中最先进的方法,然后被 Transformer 网络取代。在此过程中,我们首先看到了在训练经典 RNN 时会出现哪些问题,主要是梯度消失问题。我们还看到,发生这种情况是因为像 Sigmoid 这样的经典激活函数产生的导数充其量只能< 1,从而在改进时产生梯度消失。
我们看到,LSTM 通过引入所谓的恒定误差轮播来克服了这个问题。通过将内存与隐藏的非线性激活输出分离,他们可以确保内存的梯度始终为 1.0 — 确保梯度既不会爆炸也不会消失,同时它们可以在时间步之间自由流动。通过三个门,即遗忘门、输入/更新门和输出门,当前输入和以前的预测可以通过删除可以丢弃的内容、添加必须保留的内容来更新内存,最后根据输入和当前内存生成输出。
尽管 LSTM 取得了好处,但它们不再被认为是最先进的方法。这主要是由于 Transformer 网络的诞生,它还有一个额外的好处,即序列不必按顺序处理,而是并行处理。尽管如此,LSTM 仍然被广泛应用,因此不能从研究和工程活动中丢弃。
相关文章:
长短期记忆网络 (LSTM) 简介
文章目录 一、说明二、传统 RNN 的问题三、为什么梯度消失?四、长短期记忆网络简介五、忘记门六、Update Gate (Input Gate)七、Output Gate八、数学上的内存九、从 LSTM 到 Transformer十、总结 一、说明 机器学习取得进步的领域之一是自然语言处理。对于用于机器…...
【电子通识】USB Type-C线缆为什么有的用到E-Marker芯片
USB Type-C接口具备数据传输、充电(基于USB PD协议)和音频视频传输能力。但是,上述功能都有强弱之别,并因此衍生出了无数种规格的USB Type-C线缆。 如下所示直接搜索就可以看到,虽然都是Type-C接口,但存在很多不同种类的线缆规格。 以数据传输为例,USB Type-C可选USB2.0…...
【故障处理系列--移动云云盘根目录在线扩容】
移动云云盘根目录扩容 **目的:**测试harbor仓库服务器的根目录能否在线扩容 1、移动云控制台系统盘扩容 这里以我自己的虚拟机演示 2、查看分区的文件类型 3、安装growpart工具 rootgitlab-cli:~# apt install cloud-guest-utils -y rootgitlab-cli:~# apt ins…...
混沌工程/混沌测试/云原生测试/云平台测试
背景 私有云/公有云/混合云等具有复杂,分布式,环境多样性等特点,许多特殊场景引发的线上问题很难被有效发现。所以需要引入混沌工程,建立对系统抵御生产环境中失控条件的能力以及信心,提高系统面对未知风险得能力。 …...
CQ 社区版 2024.11 | 新增“审批人组”概念、可通过SQL模式自定义审计图表……
CloudQuery 社区 11 月新版本来啦!本月版本依旧是 CUG(CloudQuery 用户组)尝鲜版的更新。 针对审计模块增加了 SQL 模式自定义审计图表;在流程模块引入了“审批人组”概念。此外,在 SQL 编辑器、连接管理等模块都涉及…...
【maven-4】IDEA 配置本地 Maven 及如何使用 Maven 创建 Java 工程
IntelliJ IDEA(以下简称 IDEA)是一款功能强大的集成开发环境,广泛应用于 Java 开发。下面将详细介绍如何在 IDEA 中配置本地 Maven,并创建一个 Maven Java 工程,快速上手并高效使用 Maven 进行 Java 开发。 1. Maven …...
c语言结构体
c语言结构体 1. 结构体的定义 在C语言中,结构体是一种用户自定义的数据类型,它允许你将不同类型的数据组合成一个单一的实体。结构体的定义以struct关键字开头,后面跟着结构体标签(可以省略,但为了方便后续引用&#…...
洛谷二分题
P1024 [NOIP2001 提高组] 一元三次方程求解 题目描述 有形如:𝑎𝑥3𝑏𝑥2𝑐𝑥𝑑0ax3bx2cxd0 这样的一个一元三次方程。给出该方程中各项的系数(𝑎,ᵄ…...
vue3的项目目录和关键文件
注意换插件 vue2的是 Vetur ;vue3的是volar 这里注意volar插件已更名为Vue - Official vite.config.js 放跟vite配置相关的内容 区别于vue2;vue2是vue.config.js;vue2是基于webpack的,vue3是基于vite的 main.js import { creat…...
rabbitmq原理及命令
目录 一、RabbitMQ原理1、交换机(Exchange)fanoutdirecttopicheaders(很少用到) 2、队列Queue3、Virtual Hosts4、基础对象 二、RabbitMQ的一些基本操作:1、用户管理2、用户角色3、vhost4、开启web管理接口5、批量删除队列 一、Ra…...
洛谷 P1308 [NOIP2011 普及组] 统计单词数 C语言
题目: https://www.luogu.com.cn/problem/P1308 复制Markdown 展开 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。 现在,请你编程实现…...
vue基础之5:vue数据代理、事件处理、事件修饰符、键盘事件
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
RK3568平台开发系列讲解(PWM篇)sysyfs 操作 pwm 原理讲解
🚀返回专栏总目录 文章目录 一、高精度定时器介绍沉淀、分享、成长,让自己和他人都能有所收获!😄 📢使用 sysfs 和内核 API 函数对硬件 PWM 进行控制, 而当硬件 PWM 不够用的时候, 可以使用 GPIO 来模拟实现 PWM, 也可以称之为软件 PWM, 软件 PWM 是通过软件编程实…...
python 练习题
目录 1,输入三个整数,按升序输出 2,输入年份及1-12月份,判断月份属于大月,小月,闰月,平月,并输出本月天数 3,输入一个整数,显示其所有是素数因子 4&#…...
SprinBoot整合KafKa的使用(详解)
前言 1. 高吞吐量(High Throughput) Kafka 设计的一个核心特性是高吞吐量。它能够每秒处理百万级别的消息,适合需要高频次、低延迟消息传递的场景。即使在大规模分布式环境下,它也能保持很高的吞吐量和性能,支持低延…...
CSS学习记录03
CSS背景 CSS 背景属性用于定义元素的背景效果。 CSS background-color background-color属性指定元素的背景色。 页面的背景色设置如下: body {background-color: lightblue; } 通过CSS,颜色通常由以下方式指定: 有效的颜色名称-比如“…...
在Java中使用Apache POI导入导出Excel(二)
本文将继续介绍POI的使用,上接在Java中使用Apache POI导入导出Excel(一) 使用Apache POI组件操作Excel(二) 14、读取和重写工作簿 try (InputStream inp new FileInputStream("workbook.xls")) { //Inpu…...
Vue3学习宝典
1.ref函数调用的方式生成响应式数据,可以传复杂和简单数据类型 <script setup> // reactive接收一个对象类型的数据 import { reactive } from vue;// ref用函数调用的方式生成响应式数据,可以传复杂和简单数据类型 import { ref } from vue // 简…...
Unity开发FPS游戏之完结篇
这个系列的前几篇文章介绍了如何从头开始用Unity开发一个FPS游戏,感兴趣的朋友可以回顾一下。这个系列的文章如下: Unity开发一个FPS游戏_unity 模仿开发fps 游戏-CSDN博客 Unity开发一个FPS游戏之二_unity 模仿开发fps 游戏-CSDN博客 Unity开发一个F…...
基于BM1684的AI边缘服务器-模型转换,大模型一体机(二)
目标追踪 注:所有模型转换都是在docker环境中的 先进入docker 这里我们是要在docker环境里编译的,所以先进入docker :~/tpu-nntc# docker run -v $PWD/:/workspace -it sophgo/tpuc_dev:latest初始化环境 root2bb02a2e27d5:/workspace/tpu-nntc# s…...
IDEA连接Apifox客户端
IDEA连接Apifox客户端 一、下载Apifox安装包二、IDEA配置三、配置Apifox和IDEA项目同步 一、下载Apifox安装包 Apifox官网,根据自己的操作系统下载对应的Apifox安装包,我是windows系统所以下载的是windows版。 下载 默认仅为我安装,点击下一…...
vue中引用svg图标
要在 Vue 项目中引用 SVG 图标,有几种常见的方法。这里我将介绍两种方法:一种是直接在组件中内联 SVG 代码,另一种是将 SVG 作为单独的文件引用。 方法一:内联 SVG 代码 你可以直接在 Vue 组件的模板中嵌入 SVG 代码。这种方法适…...
【Laravel】模型封装属性基础
文章目录 概要什么是封装模型属性?使用访问器和修改器封装属性访问器(Accessor)修改器(Mutator)测试业务实现 运行结果小结 概要 随着项目规模的扩大,模型中的属性和方法可能会变得越来越复杂,这…...
【ROS编译未来时间戳报错修正】一种无需重零编译的文件时间戳更新方法分享
问题描述 无论在ROS1还是ROS2使用catkin_make或者colcon build指令后,有时候会出现文件时间戳的问题,通常报错的内容大致如下文件的修改时间在未来XX秒后,警告:检测到时钟错误。您的构建版本可能是不完整的。 解决方法 不完美的…...
tauri使用github action打包编译多个平台arm架构和inter架构包踩坑记录
这些error的坑,肯定是很多人不想看到的,我的开源软件PakePlus是使用tauri开发的,PakePlus是一个界面化将任何网站打包为轻量级跨平台软件的程序,利用Tauri轻松构建轻量级多端桌面应用和多端手机应用,为了实现发布的时候…...
事务常见分类
目录 1.扁平事务 2.带有保存点的扁平事务 3.链事务 4.嵌套事务 5.分布式事务 从事务理论的角度来看,可以把事务分为以下几种类型: 扁平事务(Flat Transactions) 带有保存点的扁平事务(Flat Transactions with Sa…...
深度学习案例:ResNet50模型+SE-Net
本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一 回顾ResNet模型 ResNet,即残差网络,是由微软研究院的Kaiming He及其合作者于2015年提出的一种深度卷积神经网络架构。该网络架构的核心创新在于引入了“残差连接”&…...
第三方Cookie的消亡与Google服务器端标记的崛起
随着互联网用户对隐私保护的关注日益增强,各大浏览器正在逐步淘汰第三方Cookie。这一变革深刻影响了广告商和数字营销人员的用户跟踪和数据分析方式。然而,Google推出的服务器端标记技术为这一挑战提供了新的解决方案。 什么是第三方Cookie? …...
arkTS:使用ArkUI实现用户信息的持久化管理与自动填充(PersistentStorage)
arkUI:使用ArkUI实现用户信息的持久化管理与自动填充(PersistentStorage) 1 主要内容说明2 例子2.1 登录页2.1.1登陆页的相关说明2.1.1.1 持久化存储的初始化2.1.1.2 输入框2.1.1.3 记住密码选项2.1.1.4 登录按钮的逻辑2.1.1.5 注册跳转 2.1.…...
01-Zabbix监控快速入门
01-Zabbix监控快速入门 1、监控知识基本概述1.1 什么是监控1.2 为何需要监控1.3 如何进行监控 2、单机时代如何监控2.1 监控CPU2.2 监控内存2.3 监控磁盘2.4 监控⽹络2.5 监控TCP2.6 监控脚本示例 3、常⻅的监控⽅案3.1 Cacti3.2 Nagios3.3 Zabbix3.4 Prometheus3.5 商业监控⽅…...
docker 怎么启动nginx
在Docker中启动Nginx容器是一个简单的过程。以下是启动Nginx容器的步骤: 拉取Nginx镜像: 首先,你需要从Docker Hub拉取Nginx的官方镜像。使用以下命令: docker pull nginx运行Nginx容器: 使用docker run命令来启动一个…...
1-1 Gerrit实用指南
注:学习gerrit需要拥有git相关知识,如果没有学习过git请先回顾git相关知识点 黑马程序员git教程 一小时学会git git参考博客 git 实操博客 1.0 定义 Gerrit 是一个基于 Web 的代码审查系统,它使用 Git 作为底层版本控制系统。Gerrit 的主要功…...
数据库深入(学习笔记)
多表查询 概述: 多表查询:指从多张表中查询数据笛卡尔积:笛卡尔积是指在数学中,两个集合(A集合,B集合)的所有组合情况。 分类: 连接查询 内连接:相当于查询A、B交集部分数据 隐式内连接:sele…...
PostgreSQL17.x创建数据库及数据库信息查看命令
PostgreSQL17.x创建数据库及数据库信息查看命令 文章目录 PostgreSQL17.x创建数据库及数据库信息查看命令1.创建数据库1. 使用 SQL 命令创建数据库2. 创建数据库并指定字符集3. 验证数据库是否创建成功3. 远程连接1. 修改 PostgreSQL 配置文件2. 修改客户端认证配置4. 指定某个…...
Canal mysql数据库同步到es
Canal与Elasticsearch集成指南 [可视化工具](https://knife.blog.csdn.net/article/details/126348055)下载Canal 1.1.5版本 (alpha-2) 请从GitHub Releases下载Canal 1.1.5版本中间版本alpha-2。仅需下载canal.deployer和canal.adapter组件。 安装Elasticsearch 确保已安装…...
React 前端框架1
一、React 简介 (一)什么是 React React 是一个用于构建用户界面的 JavaScript 库,由 Facebook 开源并维护。它采用了组件化的开发思想,允许开发者将复杂的 UI 拆分成一个个独立、可复用的小组件,就如同搭积木一般&am…...
什么是Batch Normalization?
一、概念 Batch Normalization是在2015年提出的数据归一化方法,主要用在深度神经网络中激活层之前。它的主要作用是加快模型训练时的收敛速度,使模型训练过程更加稳定,避免梯度爆炸或消失,并起到一定的正则化作用,有时…...
rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable
解决方法: 1、先测量pcf8563电源电压,是否满足要求。 2、pcf8563首次操作。第一次读取pcf8563的时间,未初始化,非法,芯片门槛电压检测配置不合理。使用hwclock命令写入一次,即可解决。 hwclock -f /dev/…...
tauri下的两个常用rust web框架:Leptos和Trunk
tauri下有两个常用rust web框架,就是Leptos和Trunk Leptos Leptos 是一个基于 Rust 的 Web 框架。您可以在他们的官方网站上了解更多关于 Leptos 的信息。本指南适用于 Leptos 的 0.6 版本。 Leptos Leptos 是一个用 Rust 编写的现代、高效且安全的 Web 框架。它…...
vscode + conda + qt联合开发
安装vscode 安装conda 清华大学开源软件镜像(Anaconda下载)_清华大学镜像-CSDN博客 conda create新建一个环境,激活这个环境,然后安装pyside6 pip install pyside6 -i https://pypi.tuna.tsinghua.edu.cn/simple 安装成功后输入 pip list查看是否安装…...
mac终端自定义命令打开vscode
1.打开终端配置文件 open -e ~/.bash_profile终端安装了zsh,那么配置文件是.zshrc(打开zsh配置,这里举🌰使用zsh) sudo open -e ~/.zshrc 2.在zshrc配置文件中添加新的脚本(这里的code就是快捷命令可以进…...
关于单片机的原理与应用!
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///目前正在学习C😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于单片…...
【手术显微镜】市场高度集中,由于高端手术显微镜的制造技术主要掌握于欧美企业
摘要 HengCe (恒策咨询)是全球知名的大型咨询机构,长期专注于各行业细分市场的调研。行业层面,重点关注可能存在“卡脖子”的高科技细分领域。企业层面,重点关注在国际和国内市场在规模和技术等层面具有代表性的企业,…...
速盾高防cdn支持移动端独立缓存
随着移动互联网的快速发展,移动端网页访问量也越来越大。然而,移动端的网络环境相对不稳定,用户体验可能会受到影响。因此,使用高防CDN来加速移动端网页访问,成为越来越多网站运营者的首选。 速盾高防CDN是一种分布式…...
java中的运算符
大家好,今天来看看java中运算符的一些知识点,理解好运算符是我们在写代码的一大重点,那么我们就来看看吧。 运算符:对操作数进行操作时的符号.,不同运算筹操作的含义不同. 一、算术算片. 1、基本四则运算符:加减乘除模(一*/%) 注意:都是二元…...
视频流媒体服务解决方案之Liveweb视频汇聚平台
一,Liveweb视频汇聚平台简介: LiveWeb是深圳市好游科技有限公司开发的一套综合视频汇聚管理平台,可提供多协议(RTSP/RTMP/GB28181/海康Ehome/大华,海康SDK等)的视频设备接入,支持GB/T28181上下级联…...
什么是六边形图?
什么是六边形图?) 为什么用六边形图?六边形图的构造原理如何绘制六边形图?(代码示例)结果解读总结 六边形图是一种特殊的二维数据可视化方法,用来展示两个变量之间的关系。它用许多小的六边形&a…...
淘宝天猫API接口探索:店铺商品全览与拍立淘图片搜索实战
在当今的电商时代,淘宝和天猫作为两大巨头,为开发者提供了丰富的API接口,以实现与平台的数据交互。本文将带您探索如何使用淘宝天猫的API接口来获取店铺所有商品列表,以及如何通过拍立淘(图片搜索)功能找到…...
.net6.0 mvc 传递 model 实体参数(无法对 null 引用执行运行时绑定)
说一下情况: 代码没问题,能成功从数据库里查到数据,能将数据丢给ViewBag.XXXX, 在View页面也能获取到 ViewBag.XXXX的值,但是发布到线上后报这个错: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 无法对 …...
电子电气架构 --- 面向服务的汽车诊断架构
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…...