当前位置: 首页 > news >正文

RNN之:LSTM 长短期记忆模型-结构-理论详解(Matlab向)

前言

递归!循环神经网络Recurrent Neural Network

循环神经网络(又称递归神经网络,Recurrent Neural Network,RNN)。是一种用于处理序列数据的神经网络结构,具有记忆功能,能够捕捉序列中的时间依赖关系。RNN通过循环连接的方式,将当前时间步的输入和上一时间步的隐藏状态作为输入,计算当前时间步的隐藏状态和输出,从而实现对序列数据的建模和预测。

说到递归描述,各位肯定会想到马尔科夫链,循环神经网络和马尔科夫链具有一定的相似性,两者都是用来捕捉和描述序列数据的变化规律。

但两者在其原理上有根本区别:

马尔可夫链需要满足马尔可夫状态,即知道t时刻的状态时,t+1时刻的状态的概率分布明确。我们可以通过转移矩阵基于t时刻的信息计算t+1、t+2等未来时刻中不同状态的预期概率。因此未来状态仅受当前状态影响,过去发生过什么并不重要。因此它可以常常用来描述理想状态下物理场中概率变化目标的属性。而循环神经网络则不需要满足任何前提条件,它可以基于过去任何长短时间的数据,基于统计经验给出未来的最可能状态。

但是相较于循环神经网络而言,马尔可夫链在实际应用中具有天生缺陷:

  • 是马尔可夫链的转移矩阵的概率映射是线性的,并不能很好的描述非线性的长迭代状态(比如,转移矩阵会随时间步长发生变化)。所以马尔可夫链在自然语言中的处理和应用非常拉跨。对于RNN而言,由于其本身结构的复合性,RNN的状态转移可以满足非线性的变化需求。
  • 同时马尔可夫状态的设定过于理想,现实世界的应用工程中,状态空间本身,转移矩阵的难以精确求解。而对于RNN而言,无论满足满足马尔可夫状态,都可以从递归过程中挖掘统计规律。因此在一些具有统计学特性外的外部附加规则的预测任务中(比如游戏抽卡),RNN能够反应与时间步长相关的特征。

然而,对于传统的RNN,随着序列长度的增加,计算得到的梯度在反向传播过程中会逐渐消失或爆炸,导致模型难以训练。这种现象被称为“梯度消失”或“梯度爆炸”,它限制了RNN捕捉和利用长距离依赖关系的能力。这对于许多需要理解长期依赖关系的任务,如自然语言处理、语音识别等,是一个严重的挑战。

LSTM的诞生

1997年,由德国慕尼黑工业大学的计算机科学家Sepp Hochreiter与Jürgen Schmidhuber共同提出了LSTM(Long Short-Term Memory)模型。LSTM是一种特别的RNN,旨在解决传统RNN在处理长序列数据时遇到的梯度消失和梯度爆炸问题。

原文链接:Long Short-Term Memory | MIT Press Journals & Magazine | IEEE Xplore

原文PDF:nc.dvi

Sepp Hochreiter与Jürgen Schmidhuber在实验中对LSTM和之前其他RNN模型做了进一步对比:利用无噪声和有噪声的序列对不同的RNN进行训练,这些序列长度较长,对于有噪声序列而言,其中只有少数数据是重要的,而其余数据则起到干扰作用。

表:LSTM与RTRL(RealTime Recurrent Learning)、ELM(Elman nets,又称单循环网络)和RCC(Recurrent Cascade-Correlation,级联相关学习架构)在长序列无噪声数据中的表现对比

可以发现,相较于RTRL、ELM、RCC等传统模型,LSTM在长序列无噪声模型中的训练成功率更高,同时训练速度更快。

注:表中LSTM的Block为一个LSTM单元,Block为4代表4层LSTM单元进行堆叠,Size代表一个Block或LSTM单元中memory cell(记忆单元,也就是长期记忆)并列的数量,为了方便计算,这些记忆单元共享输入门和输出门和遗忘门。其实,文中所说的Size其实就是我们现在说的隐藏单元数量,由于1997年计算机技术不是很发达,GPU并行计算的运用不多,所以原文的结构写得很复杂。(具体示例结构如原文图2所示,由于是编码训练的形式,原文展示得很复杂,看不懂没关系,不影响后面理解)。

其中,原文对Size的表述是:Memory cell blocks of size S form a structure where S memory cells share the same input gate and the same output gate. These blocks facilitate information storage. However, as with conventional neural nets, it is not so easy to code a distributed input within a single cell. Since each memory cell block has as many gate units as a single memory cell, namely two, the block architecture can be even slightly more efficient (see paragraph on computational complexity in Section).

表:LSTM与RTRL、BPTT(Back-Propagation Through Time)和RCC在长序列无局部规律性数据中的表现对比

由于长期记忆(细胞记忆)的特性,在无局部规律数据中,LSTM的表现相较于RTRL、BPTT和CH模型在训练速度及跟踪能力上有质的差异,不仅训练迭代需求缩小了十倍以上,而且表现出极好的追踪能力。这也是为什么在那么多RNN模型中,LSTM可以获得成功的原因。

简单来说而言:LSTM(Long Short-Term Memory)是一种特殊的递归神经网络(RNN),旨在解决传统RNN在处理长序列数据时遇到的梯度消失和梯度爆炸问题。LSTM通过引入“记忆单元”和“门控机制”,能够高效建模长期和短期依赖关系。

长短期记忆网络 LSTM(Long Short-Term Memory)的基本结构

常规LSTM单元的结构如图1所示,在一些论文中常被为“记忆细胞”(Memory Cell),但在中文语境我更倾向于称之为LSTM单元,这样不容易产生混淆。

这是由于GPU的推广,目前的LSTM设计类似于多个“传统的记忆细胞”并联在一起,组成一个集合体,对应LSTM开山论文中的“Cell block”,来传输多维的记忆信息,而在开山论文中,Memory cell代表只能处理数值而非多维向量的单元,因此在当前时代,Memory cell和Cell block在很多语境下基本上是一个东西,所以这个cell究竟是那个cell?这个描述不是很严谨。

一般而言,这就是,当其在处理数据时,数据内容在内部循环流动,序列数据或任何长度的单维度数据(dim=1)在输入LSTM时,按照不同的时间步长t,依次输入模型,在这一过程中当前的细胞状态(cell sate)和隐藏状态(hidden state)在不断变化。

它包含三个关键的门控机制:输入门(Input Gate)、遗忘门(Forget Gate)和输出门(Output Gate)。其详细信息如下图所示:

图1:LSTM单元经典结构细节(一图流),以下介绍与改图一一对应

图中:

  • 为了简化表达,不同位置weight、Bias代表不同权重乘法和偏置加法操作,尽管名字相同,但不同位置的weight、Bias的参数相互独立
  • “()”括号内的数值代表在该环节传输或该参数的“张量”大小,如Weight(N*N)代表权重矩阵的张量规模是N*N。
  • 短期记忆(隐藏状态 h_t)和长期记忆(细胞状态 C_t)的张量尺度必须一致,均为 N 维向量,N是可以自己需求设计数值,称为隐藏单元的数量

遗忘门(Forget Gate)

遗忘门决定了前一时刻的记忆细胞状态中有多少信息需要保留或遗忘。

它接收当前的输入X_t和上一时间步的隐藏状态h_{t-1}​,通过Sigmoid函数输出一个0到1之间的值,表示遗忘的比例。

计算公式为:

f_t=sigmoid(W_{f1}\cdot h_{t-1}+W_{f2} \cdot X_t+b_f)                    (1)

其中W_{f}b_f​是遗忘门的权重和偏置的参数矩阵,为了区分对应隐藏状态和当前输入的权重矩阵相互独立,格外加了数字下表如:W_{f1},后同。

输入门(Input Gate)

输入门决定了当前时间步的输入信息中有多少需要被加入到细胞状态中。

如一图流所示,它包含两个部分:首先,使用Sigmoid函数决定哪些信息需要更新(Potential Memory to remember),i_t;其次,使用Tanh函数生成一个候选长期(Potential Long-Trem menmory),也就是\tilde{C}_t

计算公式为:

i_t=sigmoid(W_{i1}\cdot h_{t-1}+W_{i2} \cdot X_t+b_{i1})                                 (2)

\tilde{C}_t=tanh(W_{i3}\cdot h_{t-1}+W_{i4} \cdot X_t+b_{i2})                                        (3)

细胞状态-长期记忆(Cell-State)

        Cell-State负责在序列的各个时间步长之间存储和传递信息,简单的来说,它就是长期记忆。它像是一个传输带,在整个序列处理过程中,信息在上面流动,只有少量的线性操作被应用于信息本身,信息流动相对简单。

每次迭代中,细胞状态更新公式为:

C_t=C_{t-1}\cdot f_t +i_t\cdot \tilde{C}_t                                                  (4)

根据式(1)、(2)、(3),(4)可完整展开为:

C_t=C_{t-1}\cdot sigmoid(W_{f1}\cdot h_{t-1}+W_{f2} \cdot X_t+b_f)+sigmoid(W_{i1}\cdot h_{t-1}+W_{i2} \cdot X_t+b_{i1})\cdot tanh(W_{i3}\cdot h_{t-1}+W_{i4} \cdot X_t+b_{i2})        (5)

        其中,C_t为该时间步输出的细胞状态,C_{t-1}为上一时间步输出的的细胞状态,其中f_t由遗忘门计算而出,决定了上一刻信息保留的程度。i_t\cdot \tilde{C}_t是选择门从隐藏状态与当前时间步或取信息产生的。总结而言:遗忘门决定了前一时刻的记忆细胞状态中有多少信息需要保留,输入门决定了当前时间步的输入信息中有多少需要被加入到细胞状态中。

隐藏状态-短期记忆(Hidden State)与输出门(Output Gate)

        输入门决定了基于当前时间步的细胞状态、输入数据和上一时间步的隐藏状态,输出当前时间步隐藏状态h_t,对于序列预测,ht就是LSTM对于下一时间步输入 X_{t+1}的预测。如果你是以序列输出且以回归损失函数反向传播的。

它接收当前的输入xt​和上一时间步的隐藏状态ht−1​,通过Sigmoid函数输出一个0到1之间的值,表示输出的比例。

计算公式为:

h_t=tanh(W_{i3}\cdot h_{t-1}+W_{i4} \cdot X_t+b_{i2})\cdot tanh(C_t)                      (6)

  同样可以完整展开为: 

   h_t=tanh(W_{i3}\cdot h_{t-1}+W_{i4} \cdot X_t+b_{i2})\cdot tanh(C_{t-1}\cdot sigmoid(W_{f1}\cdot h_{t-1}+W_{f2} \cdot X_t+b_f)+sigmoid(W_{i1}\cdot h_{t-1}+W_{i2} \cdot X_t+b_{i1})\cdot tanh(W_{i3}\cdot h_{t-1}+W_{i4} \cdot X_t+b_{i2}))   (7)

长短期记忆网络 LSTM(Long Short-Term Memory)的具体设计细节及应用注意事项

LSTM的参数

LSTM的参数量计算

如基本结构介绍及一图流中所示,LSTM的模型参数主要包括权重和偏置,其中权重根据计算对象分为输入参数权重(Input Weight)和针对隐藏状态的权重(Recurrent Weight),偏置则对应遗忘门、输入门和输出门中的计算。具体信息可以参照一图流,里面已经标的很清楚了

我们来简单地举个例子,下图是我设计的一个简单的LSTM模型,其中输入为长度807的序列数据,LSTM隐藏单元的大小被设置成4000,因此HiddenState和Cell State的大小都为4000

图二

根据图一的展示,对应图二我们可以简单的计算得到

输入参数的权重参数数量为:

 4(输入接口)*[4000*1](单个权重矩阵大小)*[807*3](输入数据维度=所有空间长度累乘*通道长度)=16000*2421=38736000;

隐藏状态的权重参数数量为:

   4(输入接口)*[4000*4000](单个权重矩阵大小)=16000*4000=64000000;

偏置参数的数量为:

4(四个处理点位)*[4000*1](单个偏置矩阵大小)=16000*1=16000;

总参数为:16000+64000000+38736000= 102752000

注:在matlab中,LSTM的设计总是对象单一时间步的,比如这里,当我的输入具有空间属性时,LSTM会先将其flatten至序列再进行处理,所以输入参数的数量就是:所有空间长度累乘*通道长度。并不是你输入一个序列长度为100(S)通道为3的数据,程序就建立输入维度为3的模型,在计算中迭代100次。而是输入维度为300,不限迭代次数模型。

在设计LSTM的输入时,一般不包含空间属性,只有通道属性、批次、和时间步,也就是CBT。在计算参数的例子中,故意加入了空间属性,也是为了说明这一特性。

当LSTM输入图像时

状态激活方法 StateActivation Fuction 与 门激活方法 GateActivation Function

在LSTM(长短期记忆网络)中,状态激活方法(State Activation Function)和门激活方法(Gate Activation Function)起着至关重要的作用。它们分别用于生成候选记忆状态和控制信息的流动。虽然默认情况下,状态激活方法使用tanh函数,门激活方法使用sigmoid函数,但在实际应用中,这些激活函数可以根据具体需求进行调整和替换。

状态激活方法(State Activation Function)

默认激活函数:tanh

tanh函数(双曲正切函数)将输入映射到-1到1之间,其输出均值为0,这有助于保持梯度在传播过程中相对稳定,从而在一定程度上缓解梯度消失问题。

softsign

softsign函数是另一种非线性激活函数,其输出范围也是-1到1,但与tanh函数相比,softsign函数在输入接近0时具有更大的梯度,这有助于模型在训练初期更快地收敛。此外,softsign函数在输入绝对值较大时,其输出趋近于±1的速度更慢,这有助于避免梯度爆炸问题,以改善模型的收敛速度和稳定性。

ReLU(Rectified Linear Unit)

ReLU函数是深度学习中常用的激活函数,其输出在输入为正数时为输入本身,在输入为负数时为0。ReLU函数具有计算简单、非饱和性的特点,能够有效缓解梯度消失问题。尽管ReLU函数在LSTM中不常用作状态激活函数,但在某些特定的应用场景下,如处理稀疏特征或加速训练过程时,可以尝试使用ReLU函数。然而,需要注意的是,由于ReLU函数的输出范围不是-1到1,直接使用ReLU函数可能会破坏LSTM中记忆细胞的0中心化特性,因此在实际应用中需要进行适当的调整。

门激活方法(Gate Activation Function)

默认激活函数:sigmoid

特点:sigmoid函数将输入映射到0到1之间,其输出值可以解释为信息通过门的概率。sigmoid函数在输入较小或较大时,其输出趋近于0或1,这有助于实现门控机制,即控制信息的流动。

hard-sigmoid

hard sigmoid函数作为sigmoid函数的近似,计算速度更快。

Bi-LSTM 

Bi-LSTM特别简单,其结构就是两个LSTM模块镜像并列,然后方向相反,因此其有两条流向相反的细胞状态和两条流向相反的隐藏状态,因此其参数量的计算就是简单的LSTM*2即可(隐藏单元数量相同时),读者可以对应图二和图三进行领悟,这里就没必要展开来讲了。

 图三

LSTM的输入和输出

LSTM及Bi-LSTM的输入一般为序列数据,格式通常为(CBT),即一个通道度、批次度和时间度(图像是SSCB)。

LSTM特别的偏置初始化:unit-forget-gate

unit-forget-gate作为偏置初始化策略时,这通常意味着对遗忘门的偏置进行特定的初始化,以鼓励或抑制遗忘门在训练初期的行为。例如,在某些情况下,可能会将遗忘门的偏置初始化为一个较大的正值,以使得模型在训练开始时倾向于保留更多的信息(因为遗忘门的输出接近于1),这有助于模型更稳定地学习长期依赖关系。

相关文章:

RNN之:LSTM 长短期记忆模型-结构-理论详解(Matlab向)

前言 递归!循环神经网络Recurrent Neural Network 循环神经网络(又称递归神经网络,Recurrent Neural Network,RNN)。是一种用于处理序列数据的神经网络结构,具有记忆功能,能够捕捉序列中的时间…...

vue的路由守卫逻辑处理不当导致部署在nginx上无法捕捉后端异步响应消息等问题

近期对前端的路由卫士有了更多的认识。 何为路由守卫?这可能是一种约定俗成的名称。就是VUE中的自定义函数,用来处理路由跳转。 import { createRouter, createWebHashHistory } from "vue-router";const router createRouter({history: cr…...

C++版的飞翔的小鸟

忙了几天,写了个小鸟游戏打发时间。 MINGWOPENGL 作者很懒,具体看readme.txt吧。 好吧,这就是个当网盘用的,没有售后服务的,而且还不怎么会上传文件。。。😂😂 顺便问下,这破玩意上…...

深入详解自然语言处理(NLP)中的语言模型:BERT、GPT及其他预训练模型的原理与应用

【自然语言处理】——深入详解自然语言处理(NLP)中的语言模型:BERT、GPT及其他预训练模型的原理与应用 自然语言处理(NLP)是人工智能(AI)领域中的重要分支,旨在通过计算机处理和分析…...

EFCore HasDefaultValueSql (续1 ValueGeneratedOnAdd)

前情:EFCore HasDefaultValueSql 小伙伴在使用 HasDefaultValueSql 时,对相关的 ValueGeneratedOnAdd 也有了疑问: ValueGeneratedOnAdd 和 HasDefaultValueSql 是 Entity Framework Core 中用于管理字段默认值的两种不同配置方式&#xff0…...

React PureComponent使用场景

1. 基本概念 1.1 什么是 PureComponent PureComponent 是 React 提供的一个优化类组件,它通过自动实现 shouldComponentUpdate 生命周期方法,对 props 和 state 进行浅比较来决定是否需要重新渲染组件。 1.2 与 Component 的区别 // 普通 Component …...

初学者如何利用AI辅助编程快速搭建软件原型

在当今这个快速发展的科技时代,AI辅助编程已成为软件开发领域的一大助力,尤其在搭建软件原型阶段,更是能帮助开发者快速探索众多想法,创造出新事物。吴恩达老师最近分享了关于搭建简单Web应用原型的一些最佳实践,其中重…...

六、Angular 发送请求/ HttpClient 模块

一、应用 HttpClient 模块 angular/common/http 中的 HttpClient 类基于浏览器提供的 XMLHttpRequest 接口。要想使用 HtpClient 模块,就要先导入 Anqular 的 HttpClientModule。大多数 Web 应用程序都会在根模块 AppModule 中导入它。 编辑 src/app/app.module.ts…...

11_Redis数据类型-Geo地理位置

1.Geo地理位置介绍 1.1 基本概念 Redis中的GEO(Geographic)是一种专门用于处理地理位置信息的功能模块,自Redis 3.2版本引入。它特别适合用于LBS(基于位置的服务)应用,如查找附近的餐馆、用户或兴趣点等。Redis GEO的实现依赖于有序集合(sorted set),并且利用了Geoh…...

电脑每次开机卡到windows图标界面进不去

我遇到的现象是: 可以正常开机,也可以重装系统,主板电池换过,硬盘,内存也没问题,但每次开机都会卡到这个界面不动,也不崩溃,也进不去系统。最后的解决方法:换CPU&#x…...

如何将 DotNetFramework 项目打包成 NuGet 包并发布

如何将 DotNetFramework 项目打包成 NuGet 包并发布 在软件开发过程中,将项目打包成 NuGet 包并发布到 NuGet 库,可以让其他开发者方便地引用和使用你的项目成果。以下是将 WixWPFWizardBA 项目打包成 NuGet 包并发布的详细步骤: 1. 创建 .n…...

7 分布式定时任务调度框架

先简单介绍下分布式定时任务调度框架的使用场景和功能和架构,然后再介绍世面上常见的产品 我们在大型的复杂的系统下,会有大量的跑批,定时任务的功能,如果在独立的子项目中单独去处理这些任务,随着业务的复杂度的提高…...

鸿蒙UI开发——日历选择器

1、概 述 在项目开发中,我们时常会用到日历选择器,效果如下: ArkUI已经为我们提供了组件,我们可以直接使用,下面针对日历组件做简单介绍。 2、CalendarPickerDialog 接口定义如下: // 定义日历选择器弹…...

【python基础——异常BUG】

什么是异常(BUG) 检测到错误,py编译器无法继续执行,反而出现错误提示 如果遇到错误能继续执行,那么就捕获(try) 1.得到异常:try的执行,try内只可以捕获一个异常 2.预案执行:except后面的语句 3.传入异常:except … as uestcprint(uestc) 4.没有异常:else… 5.鉴定完毕,收尾的语…...

【论文复现】量子海洋捕食者算法用于多级图像分割问题

目录 1.摘要2.海洋捕食者算法MPA原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 本文提出了一种基于量子理论的改进海洋捕食者算法(QMPA),专门用于解决多级图像分割问题。QMPA算法利用薛定谔波函数中的概率函数来确定任何时刻粒子的位…...

【python自写包模块的标准化方法】

目标: 自写一个包,提供关于字符串和文件的模块 要求对异常可以检测 str_tools.py: def str_reverse(s):""":param s: 传入的字符串:return: 反转后的字符串"""# i -1# j 0# s2 ""# while i > (-len(s)):# s2 s[i]# …...

STL——二叉搜索树

目录 二叉搜索树的概念 ⼆叉搜索树的性能分析 ⼆叉搜索树的插⼊ ⼆叉搜索树的查找 ⼆叉搜索树的删除 中序遍历结果为升序序列 二叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树 • 若它的左⼦树不为空&#…...

2025年XR行业展望:超越虚拟,融合现实

随着科技的飞速发展,扩展现实(XR)技术正逐渐从科幻走进日常生活。2025年,除了备受瞩目的AI百镜大战,XR行业同样充满期待,一系列创新产品和技术进步有望重塑我们对数字世界的体验。 Meta Quest 3S:VR行业的风向标 作为Meta旗下的拳头产品,Quest系列一直是VR市场的领军…...

python异常机制

异常是什么? 软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,我们称之为异常,英文是Exception,意思是例外。遇到这些例外情况,或者交异常,我们怎么让写的程序做出合理的处理&#xff0c…...

JVM与Java体系结构

一、前言: Java语言和JVM简介: Java是目前最为广泛的软件开发平台之一。 JVM:跨语言的平台 随着Java7的正式发布,Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机平台上运行非Java语言编写的程序。 Java虚拟机根本不关心运行在其内部的程序到底是使用何…...

【Python】Python与C的区别

文章目录 语句结束符代码块表示变量声明函数定义注释格式Python的标识符数据输入input()函数数据输出print()函数 语句结束符 C 语言 C 语言中每条语句必须以分号;结束。例如,int a 10;、printf("Hello, World!");。分号是语句的一部分,用于…...

怎么抓取ios 移动app的https请求?

怎么抓取IOS应用程序里面的https? 这个涉及到2个问题 1.电脑怎么抓到IOS手机流量? 2.HTTPS怎么解密? 部分app可以使用代理抓包的方式,但是正式点的app用代理抓包是抓不到的,例如pin检测,证书双向校验等…...

中学综合素质笔记3

第一章职业理念 第三节 教师观 考情提示: 单选题材料分析题 学习要求: 理解、 识记、 运用 (一)教师职业角色的转变(单选材料分析) 从教师与学生的关系看——对学生 新课程要求教师应该是学生学习的引…...

U盘加密软件哪个好用?免安装、安全、防复制

U盘作为一种便携式存储设备,因其携带方便、使用灵活而广受欢迎。然而,U盘的易失性也使其成为数据泄露的高风险载体。为了确保U盘中数据的安全性,使用专业的U盘加密软件是必不可少的。 免安装 更方便 《U盘超级加密3000》这款软件下载后直接…...

C++异常

1.C语言的错误处理方式 1.1直接终止程序 利用assert和exit都是直接终止程序。 1.2返回错误码 例如C语言程序的很对接口函数都会将错误信息存储在errno中表示错误。当我们自己设计函数时,函数返回值和返回错误码容易混淆,且如果函数调用栈较深时&…...

银河麒麟v10 arm版 鲲鹏 U盘安装 +解决 安装源 设置基础软件仓库时出错

人人为我,我为人人,分享出来,避免他人踩坑 U盘刻录 出现问题 进入系统安装界面,这里可以看到在“软件”-“安装源”选项上报错了,提示“设置基础软件仓库时出错” 2种解决办法 1. 有网的情况(注意自己查地址…...

[network]回顾:集线器(Hub)

集线器(Hub)的发明是计算机网络发展史上的一个重要里程碑。它最初的设计目的是为了解决局域网(LAN)中多台计算机共享网络资源的需求。 #mermaid-svg-OAmOmKYGAXoglS5z {font-family:"trebuchet ms",verdana,arial,sans-…...

【Vue.js 组件化】高效组件管理与自动化实践指南

文章目录 摘要引言组件命名规范与组织结构命名规范目录组织 依赖管理工具自动化组件文档生成构建自动引入和文档生成的组件化体系代码结构自动引入组件配置使用 Storybook 展示组件文档自动生成 代码详解QA 环节总结参考资料 摘要 在现代前端开发中,组件化管理是 V…...

打桩机:灾害救援中的 “应急尖兵”,稳固支撑的保障|鼎跃安全

在自然灾害或突发事故中,如地震、泥石流、洪涝灾害、山体滑坡等,地质条件的不稳定可能导致建筑物倒塌、道路损毁、堤坝决口等情况,严重威胁人员和财产安全。 打桩机是一种用于将桩打入地基的重型机械设备,其主要功能是提供支撑力&…...

java1-相对路径与绝对路径

注意注意~开始新部分啦! 开始正式分享java前,先为大家分享一下一个常用的概念---文件的相对路径与绝对路径. 开篇明义: 相对路径是指一个文件或目录相对于当前工作目录的路径。相对路径不包含根目录,而是从当前目录开始计算。 绝对路径是指一个文件或目录从根目录…...

工厂管理中 BOM(物料清单)

工厂管理中 BOM(物料清单)的一些优点: 1. 提高生产计划准确性 - 准确反映产品所需的物料及数量,为生产计划提供可靠依据,减少因物料估算错误导致的生产延误。 2. 优化成本控制 - 有助于精确计算产品成本&…...

allure报告修改默认语言为中文

1、项目根目录创建.py文件,把代码复制进去 import os from pathlib import Pathdef create_settings_js_file(directory"../pytest_mytt/reports/allures/", filenamesettings.js):# 创建或确认目录存在Path(directory).mkdir(parentsTrue, exist_okTrue…...

浅谈弱电系统RVVP和RVSP电缆的区别(

1、RVVP 1.1RVVP电缆定义? RVVP电缆抗干扰软电缆、屏蔽电缆、信号电缆、控制电缆(名字很多),学名:铜芯-聚氯乙烯绝缘-屏蔽聚氯乙烯护套-软电缆。 1.2RVVP执行标准 主要执行标准为JB/T8734.5-2016,部…...

MySQL 入门大全:常用函数

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...

RV1126+FFMPEG推流项目(1)总体框架讲解

音视频推流项目的讲解 项目介绍 本项目通过 RV1126 采集摄像头和麦克风数据,采用 H.264/H.265 视频编码技术和 AAC 音频编码技术进行压缩和合成复合流,然后推送到流媒体服务器。 项目框图 下图展示了整个项目的总体流程图,核心部分包括&a…...

量子计算遇上人工智能:突破算力瓶颈的关键?

引言:量子计算遇上人工智能——突破算力瓶颈的关键? 在数字化时代的浪潮中,人工智能(AI)正以前所未有的速度改变着我们的生活,从语音助手到自动驾驶,从医学诊断到金融分析,无不彰显其…...

Kafka消费者如何优雅下线

一、背景 我们在Kafka消费程序中,可能会调用dubbo接口,也可能会使用线程池,连接池等,但是在服务下线的时候,kafka的消费总是会报错。比如dubbo接口就会抛出异常RpcException: The channel is closed. 这说明kafka还在…...

Go语言的网络编程

Go语言的网络编程 Go语言(又称Golang)是一种由Google开发的开源编程语言,以简洁、高效和并发为主要特点。网络编程是Go语言的一个重要应用领域,其优秀的并发模型和丰富的标准库使得Go成为开发高性能网络应用的理想选择。本篇文章…...

网络安全 | 网络安全法规:GDPR、CCPA与中国网络安全法

网络安全 | 网络安全法规:GDPR、CCPA与中国网络安全法 一、前言二、欧盟《通用数据保护条例》(GDPR)2.1 背景2.2 主要内容2.3 特点2.4 实施效果与影响 三、美国《加利福尼亚州消费者隐私法案》(CCPA)3.1 背景3.2 主要内…...

外部获取nVisual所在层级方法

Iframe嵌入nVisual,在iframe渲染完成之后,以后通过增加window.addEventListener()方法监听message事件,来获取nvisual当前的所在层级以及所选中的节点列表以及线缆列表。 nVisualPatrolDiagramIdList 变量是获取nVisual当前所在的层级的ID值…...

ARIMA模型 (AutoRegressive Integrated Moving Average) 算法详解与PyTorch实现

ARIMA模型 (AutoRegressive Integrated Moving Average) 算法详解与PyTorch实现 目录 ARIMA模型 (AutoRegressive Integrated Moving Average) 算法详解与PyTorch实现1. ARIMA模型概述1.1 时间序列预测1.2 ARIMA的优势2. ARIMA的核心技术2.1 自回归 (AR)2.2 差分 (I)2.3 移动平…...

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域 Tomcat 配置允许跨域Web 项目配置允许跨域Tomcat 同时允许静态文件和 Web 服务跨域 偶尔遇到一个 Tomcat 部署项目跨域问题,因为已经处理…...

【深度学习量化交易13】继续优化改造基于miniQMT的量化交易软件,增加补充数据功能,优化免费下载数据模块体验!

我是Mr.看海,我在尝试用信号处理的知识积累和思考方式做量化交易,应用深度学习和AI实现股票自动交易,目的是实现财务自由~ 目前我正在开发基于miniQMT的量化交易系统——看海量化交易系统。 MiniQMT是一种轻量级的量化交易解决方案&#xff0…...

【并发篇】CompletableFuture学习

CompletableFuture 异步编程 前言 我们异步执行一个任务时,一般是用线程池 Executor 去创建。 如果不需要有返回值,任务实现 Runnable 接口;如果需要有返回值,任务实现 Callable 接口,调用 Executor 的 submit 方法…...

【动手学电机驱动】STM32-MBD(3)Simulink 状态机模型的部署

STM32-MBD(1)安装 Simulink STM32 硬件支持包 STM32-MBD(2)Simulink 模型部署入门 STM32-MBD(3)Simulink 状态机模型的部署 [STM32-MBD(4)Simulink 状态机实现按键控制] (https://bl…...

springCloudGateWay使用总结

1、什么是网关 功能: ①身份认证、权限验证 ②服务器路由、负载均衡 ③请求限流 2、gateway搭建 2.1、创建一个空项目 2.2、引入依赖 2.3、加配置 3、断言工厂 4、过滤工厂 5、全局过滤器 6、跨域问题...

04、Redis深入数据结构

一、简单动态字符串SDS 无论是Redis中的key还是value,其基础数据类型都是字符串。如,Hash型value的field与value的类型,List型,Set型,ZSet型value的元素的类型等都是字符串。redis没有使用传统C中的字符串而是自定义了…...

zephyr移植到STM32

Zephy如何移植到单片机 1. Window下搭建开发环境1.1 安装Choncolatey1.2 安装相关依赖1.3创建虚拟python环境1.4 安装west1.4.1 使用 pip 安装 west1.4.2 检查 west 安装路径1.4.3 将 Scripts路径添加到环境变量1.4.4 验证安装 1.5 获取zephyr源码和[安装python](https://so.cs…...

Windows使用AutoHotKey解决鼠标键连击现象(解决鼠标连击、单击变双击的故障)

注:罗技鼠标,使用久了之后会出现连击现象,如果刚好过保了,可以考虑使用软件方案解决连击现象: 以下是示例AutoHotKey脚本,实现了调用XButton1用于关闭窗口(以及WinW,XButton2也导向…...

案例研究:UML用例图中的结账系统

在软件工程和系统分析中,统一建模语言(UML)用例图是一种强有力的工具,用于描述系统与其用户之间的交互。本文将通过一个具体的案例研究,详细解释UML用例图的关键概念,并说明其在设计结账系统中的应用。 用…...