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

论文阅读---《Unsupervised T ransformer-Based Anomaly Detection in ECG Signals》

题目:基于Transformer的无监督心电图(ECG)信号异常检测

摘要

        异常检测是数据处理中的一个基本问题,它涉及到医疗感知数据中的不同问题。技术的进步使得收集大规模和高度变异的时间序列数据变得更加容易,然而,为了确保一致性和可靠性,需要复杂的预测分析模型。随着收集数据的规模和维度的增加,深度学习技术,例如自编码器(AE)、循环神经网络(RNN)和长短期记忆(LSTM),受到越来越多的关注,并被认为是最先进的异常检测技术。最近,基于Transformer架构的发展被提出作为改进的注意力机制的知识表示方案。我们提出了一种无监督的基于Transformer的方法来评估和检测心电图(ECG)信号中的异常。模型架构包括两部分:嵌入层和标准的Transformer编码器。我们在两个著名的数据集ECG5000和MIT-BIH Arrhythmia中引入、实现、测试和验证了我们的模型。根据实际和预测的ECG时间序列序列之间的损失函数结果来检测异常。我们发现,使用Transformer编码器作为异常检测的替代模型能够在ECG时间序列数据中实现更好的性能。建议的模型在检测ECG信号中的异常方面具有显著的能力,并在两个数据集上优于文献中的深度学习方法。在ECG5000数据集上,该模型可以以99%的准确率、99%的F1分数、99%的AUC分数、98.1%的召回率和100%的精确度检测异常。在MIT-BIH Arrhythmia数据集上,该模型的准确率为89.5%,F1分数为92.3%,AUC分数为93%,召回率为98.2%,精确度为87.1%。

引言

        异常检测对许多当代应用来说至关重要,并随着传感器使用的爆炸式增长而变得尤为重要。心电图(ECG)时间序列数据的异常检测近年来引起了相当大的关注,因为它对控制ECG时间序列过程的质量和识别异常数据源行为有着重要的影响。在时间序列数据的异常检测过程中,涉及使用复杂的算法和模型来检测在选定时间段内的异常数据。有效的异常检测器能够识别正常和异常时间序列数据之间的差异。 

        随着对实时异常检测的需求日益增长,人们已经意识到需要智能、稳健和计算效率高的模型,并且这种需求正在在大多数实时应用中受到更多关注。由于错误事件的不可避免性,这些模型在大多数时间序列应用中发挥着关键作用。时间序列数据的特性对于选择合适的异常检测方法至关重要。成功的异常检测器通过测量时间序列数据的统计偏差来识别异常,例如自回归移动平均(ARIMA)、累积和统计(CUSUM)和指数加权移动平均(EWMA)。然而,另一方面,传统的时间序列异常检测方法在模型的期望效率和准确性方面存在缺陷。

        最近,已经开发了几种用于异常检测的智能计算方法。其中,深度学习和神经网络是准确高效的热门算法。然而,从2000年代末开始,人们对于在大量和高度变异的在线时间序列数据中识别异常的兴趣逐渐增长。除了常用的技术,如自编码器(AEs)、循环神经网络(RNNs)、卷积神经网络(CNN)和长短期记忆(LSTM),当代深度神经架构通常用于异常检测和医疗预测。尽管这些方法已经发展以克服之前提出的技术,但它们大多数在处理时间序列数据时具有固有的特性限制其使用。例如,LSTM神经网络通过使用乘性门在特殊单元(记忆单元)的内部状态中施加常量误差流,克服了RNN面临的梯度消失问题。此外,LSTM网络不需要预先指定的时间窗口,并且可以准确地建模复杂的多变量序列,因为它们具有学习系列中长期相关性的能力。然而,这些方法的主要目标是生成更真实的序列,而不是提取有助于后续任务的有意义的特征。

        目前,在自然语言处理(NLP)中,首次引入了遵循预测过程的Transformer架构作为对循环神经网络RNNs的高效替代方案。因此,在这项工作中,我们介绍了一种基于Transformer架构的异常检测模型,用于检测人类心跳时间序列信号中的异常,例如室性早搏(PVC)、室上性早搏(SP)或异位心搏(EB),以及其他心电图(ECG)异常。在这里,我们使用中引入的Transformer编码器来开发新颖的无监督Transformer异常检测。该模型通过比较预测数据和原始数据之间的损失函数,学习正常数据的分布模式并检测异常。提出的模型在检测ECG时间序列数据方面优于当前最先进的深度学习建模方法。

        在接下来的文章中,我们将在相关工作部分对心电图时间序列中的深度学习异常检测的现有文献进行调查。在材料和方法部分,我们将介绍所提出的模型和使用的数据集。实验设置和结果分析将在结果和讨论部分展示。最后,本文以结论结束。

相关工作

       我们介绍一些用于心电图时间序列异常检测的现有深度学习模型。在[21]中,作者使用LSTM单元神经网络架构构建了一个用于健康心电图信号的预测模型。使用LSTM网络的一个额外优势是,ECG信号可以直接输入网络,无需复杂的预处理。研究结果乐观,并显示LSTM模型可能适用于检测心电图信号中的异常。此外,在[18]中,作者提出了基于LSTM网络的编码器-解码器框架,用于学习重构正常时间序列行为,并通过重构误差检测三个可预测时间序列数据集:电力需求、航天飞机和心电图。结果显示,该模型具有鲁棒性,可以检测可预测、不可预测、周期性、非周期性和准周期性的时间序列。值得注意的是,在[22]中,作者将AE与LSTM相结合,使用来自心肌梗死患者的心电图数据,展示了该系统可以准确分类不规则波间隔。在[23]中,堆叠LSTM网络用于时间序列的异常检测。该方法的有效性在四个数据集上得到了证明:心电图、航天飞机、电力需求和多传感器发动机数据集。在[24]中,作者专注于使用LSTM和GAN融合模型(LSTM-GAN)来识别时间序列数据中的异常。作者通过两组时间序列数据验证了算法的输出。实验结果表明,与传统算法相比,LSTM-GAN在处理时间序列数据方面表现出更优异的性能。Schlegl等人[25]开发了基于Anomaly Detection Generative Adversarial Nets(AnoGAN)模型的深度卷积生成对抗网络(DC-GAN)用于异常检测。作为无监督学习模型,AnoGAN使用正常数据进行学习。通过将其与查询数据进行比较,可以检测异常。在该方法中,决策边界是主观的。因此,需要根据条件进行多次实验,以应用决策边界。LSTM还可用于无监督学习,例如在[26]中,作者使用MIT-BIH心律失常数据集以无监督学习方式检测心电图信号中的异常。

        然而,只有少数模型在时间序列异常检测中使用了基于Transformer的架构。在[27]中,作者提出了一种基于Transformer和生成对抗网络(GAN)的时间序列数据异常检测方法。基于Transformer的生成器可以提取时间序列数据的上下文特征以提高性能。在训练和异常检测阶段,作者使用了两个编码器和两个解码器的Transformer块。他们展示了该模型在异常检测方面比使用三个数据集(Secure Water Treatment(SWaT)、Water Distribution(WADI)和KDD Cup 1999)的最先进的异常检测技术具有更好的性能。在[28]中,作者在时间序列数据中使用了Transformer架构;该模型包含三个编码器块和一个解码器块。输入的时间序列数据被分成训练序列和标签序列,其中训练序列被输入到编码器,而标签序列被输入到解码器。他们还用多分支注意力机制替换了原始的多头自注意力方法。对于WADI和SWaT数据集,F1分数分别为0.84和0.91。

        从以上讨论中,我们意识到基于Transformer的异常检测方法在检测心电图异常方面具有巨大的潜力,这是由于Transformer的高效性和同时获取长距离上下文数据的能力。我们将采用Transformer方法作为一种未经监督学习的模型来检测心电图时间序列数据中的异常,这在此领域之前尚未被使用过。然而,[29]等文献以及一些最近发表的论文考虑了需要大量标记的端到端学习方法,这是监督学习的特点。对于时间序列数据,标记数据可能并不总是可用的。我们的工作仅考虑了无监督学习,以更好地适应输入信号。此外,我们的模型与现有模型不同,因为它由两个标准的编码器Transformer层组成,没有解码器。因此,在这项工作中,我们将调查Transformer编码器在心电图时间序列异常检测方面的能力,并将我们的发现与最先进的深度学习模型在准确性和F1分数上进行比较,详细内容稍后说明。

 数据与方法

ECG

        时间序列是按照时间顺序组织的数据点的集合。通常,时间序列是在连续的相似间隔时间点上采集的序列。在这项工作中,我们使用了ECG5000数据集和MIT-BIH Arrhythmia数据集来验证所提出的模型。这两个数据集都属于心电图领域。

 ECG500

        在我们的实验中,我们使用了一个包含5000个心电图(ECG5000)时间序列的数据集[30]。原始数据来自PhysioNet的BIDMC Congestive Heart Failure Database (CHFDB)。在两个处理过程中,数据首先被预处理:首先提取每个心跳,并将每个心跳插值为相同的长度,等于140个时间步长。根据图1,有五种不同的心跳类型:正常(N)、R-on-T VPC(R-on-T)、室性早搏(PVC)、室上性早搏(SP)或异位心搏(EB),以及未分类的心跳(UB)。

        ECG5000数据集是通过从外推的心电图中选择5000个序列创建的,其中2989个序列是正常心跳,剩下的2011个序列是异常心跳。对于我们提出的模型,数据被按照80:10:10的比例划分为三个集合——训练集、验证集和测试集。由于我们采用了无监督学习,我们从训练集和验证集中排除了异常数据。在训练阶段,模型学习了正常心跳的潜在空间。表1列出了每个数据集中序列的数量。

MIT-BIH Arrhythmia

         MIT-BIH Arrhythmia数据库是一种临床数据库,其中包含了在贝斯以色列医院(BIH)心律失常实验室对48名患者进行的两通道心电图(ECG)记录。每个记录持续半小时。在本研究中,选择了修改后的肢体导联Ⅱ信号。根据美国医学仪器协会(AAMI)[33]的建议,将选择的心跳分为以下五类:正常心跳(N)、室上性异位心跳(S)、室性异位心跳(V)、融合心跳(F)和未知心跳(Q)。根据AAMI的建议,我们选择了48个记录中的44个用于我们的实验,并移除了四个记录(102、104、107和217),因为它们质量较差。

        信号预处理是一个重要的步骤,特别是在处理生理数据,如心电图(ECG)时,需要考虑所有潜在的噪声来源,比如运动伪影和电源干扰,这些噪声可能会影响后续模型的性能。我们的预处理阶段包含两个步骤。首先,我们应用滤波器来消除噪声,然后提取心跳信号。我们尝试了不同的滤波器,如巴特沃斯带通滤波器、带通滤波器和中值滤波器,我们发现两个中值滤波器的效果更好。本研究中采用了以下预处理步骤:

        中值滤波器:我们使用了一个滑动窗口为200毫秒的中值滤波器。然后,我们使用一个600毫秒的窗口,再次应用了第二个中值滤波器。原始信号的基线包含在第二个滤波器的输出中。将第二个滤波器的输出从未经处理的ECG数据中减去,以消除基线漂移(见图2)。这一步增强了基线校正,并消除了一些伪影。

        心跳提取:这涉及在每个心跳周围选择一个邻域。该间隔是通过在心跳前后±50毫秒处进行R峰标注来估计的。

        在心跳提取之后,正常序列的总数为72,722个,而异常序列的总数为10,579个。由于正常序列的数量比异常序列大很多,我们从中随机采样了18,824个序列。数据被划分为80%的训练数据和20%的测试数据。将训练数据再分为训练数据和验证数据,其中只包含N心跳。表2总结了每个数据集中序列的数量。

 提议的无监督Transformer架构

        在本论文中,我们介绍了一种基于Transformer的网络,用于心电图信号的异常检测。整体模型架构由两个部分组成:嵌入层和标准Transformer编码器(见图3)。所有正常的心电图信号时间序列数据,形式为一个2D张量,包含序列长度 × 特征数量,首先被编码成嵌入序列,然后输入到一个多层双向Transformer网络中,生成对应的表示。最后的线性稠密层预测输入的心电图信号,具有相同的输入序列长度。

         引入了嵌入层用于将输入张量映射到更高维度的特征空间。由于输入维度与Transformer隐藏层的大小相关,我们将该层分为两部分:一个线性稠密层,用于将输入投影到更高维度的向量,以及一个Dropout层,以避免过拟合。我们使用了正弦位置编码来对输入序列的顺序进行编码:

        其中,pos表示位置,i表示维度,dmodel表示模型的嵌入大小(即特征向量的维度)。         

        在寻找最佳模型配置的过程中,我们测试了使用一个和两个Transformer编码器块的情况。第一个Transformer编码器块创建了嵌入序列输入的等效隐藏表示。然后,为了逐步生成更高层次的表示,这些表示被作为输入传递给第二个Transformer编码器块。单个Transformer块(如图3所示)包括两个主要子层:一个位置感知的全连接前馈网络和一个多头自注意层(FFN)。两个子层都采用残差连接和层标准化。如图4所示,组成多头注意力层的h个并行缩放点积注意力层中的每一个被称为一个头。通过缩放点积注意力,将查询向量和一组键值对转换成输出向量。

         其中,Q、K和V分别表示由多个查询、键和值向量组成的矩阵,每个向量作为一行堆叠,查询/键向量的维度为dk。在计算注意力之前,多头注意力通过使用不同的线性稠密层将Q、K和V映射到各种较低维度的特征子空间。然后,使用一个额外的稠密层将h个头的输出连接在一起,并投影到最终的隐藏表示中,如下所示:

        Transformer的自注意机制通过学习输入序列的内在关系。自注意机制中的查询、键和值向量都是相似的。换句话说,在序列中的每个位置,都会计算该位置与其他位置之间的注意力。因此,每个观察值的隐藏表示捕捉了全局序列信息,并通过对序列中所有位置的加权求和来强调第i个观察值周围的区域。

         接着,对每个位置的隐藏状态进行了位置感知的前馈网络(FFN)处理,处理是独立且相同的。该前馈网络由两个线性变换组成,它们之间有一个ReLU激活函数:

        其中,xi是由多头注意力层产生的第i个隐藏状态,W1和W2是权重矩阵,b1和b2分别是内部和输出稠密层的偏差项。

异常分数和阈值

        因为我们实现了一种无监督的模式,模型仅在一个 N 心跳序列上进行训练。该模型预测输入序列的原始值。我们的模型的损失函数是平均绝对误差(MAE),其计算方式如下所示,即方程(7)。在类似于的情况下,通常使用均方根误差(RMSE)作为损失函数。然而,我们发现MAE是最佳选择,因为它表现更好。

        MAE是每个信号实际值yi和模型预测值xi之间的总绝对差异。通过训练,模型学习了正常信号的显著性和激活特征,从而导致更低的损失预测误差。该模型通过计算预测的损失误差是否大于一个固定的阈值来检测测试数据中的异常。在本文中,阈值等于训练正常数据的平均损失值加上两个标准偏差,如下所示的方程式: 

        在使用训练数据计算了阈值后,该过程被转化为一个二元分类问题。在异常检测阶段,通过比较预测误差来判断数据序列是正常还是异常,而这个计算出的阈值起到了决定作用。使用测试数据时,将一个特定的输入序列提供给模型,然后将预测误差与计算得到的阈值进行比较。如果预测误差超过阈值,那么该输入序列被归类为异常;否则,被归类为正常。 图5展示了我们的异常检测模型的图形化架构过程,以便更清楚地理解。

结果与结论

 实验配置

        为了对我们的模型进行微调,我们进行了许多实验,尝试了不同数量的Transformer编码器块(包含多头注意力层和接着的前馈层),不同的隐藏状态大小和不同数量的注意力头。仅在第一个密集层上实施了0.2的丢弃率的Dropout。我们使用Adam优化器,学习率为1e-4,并使用了早停技术。模型最多训练70个epochs,但在此之前所有实验都已经收敛。我们在批次大小为16个序列的情况下,仅使用正常数据对模型进行了训练。所有实验均使用Python(v3.7.6)、Tensorflow(v1.14.0)和Keras(v2.3.1)机器学习库进行实现。我们在Windows 10 Pro 64位操作系统上运行所有实验,使用了AMD Ryzen 5 3600 6核处理器(主频3.59 GHz)、NVIDIA 185 GEFORCE RTX 2080 SUPER(GPU)以及32GB的内存。

性能指标

        真正例(True Positive,TP)表示在二元分类器中被准确地预测为正例的值,真负例(True Negative,TN)表示被正确地预测为负例的值。假正例(False Positive,FP)是负例的预期值,但被错误地预测为正例,而假负例(False Negative,FN)是正例的预期值,但被错误地预测为负例。我们的模型的异常检测结果通过以下指标进行评估:ROC曲线下面积(AUC)、准确度(accuracy)、精确率(precision)、召回率(recall)和F1得分(F1-scores)。 

        AUC(曲线下面积):AUC是通过构建基于假正例(FP)和真正例(TP)的接收者操作特征曲线(ROC曲线)来计算的。

ECG500 数据库实验结果

        该提议的模型是在正常心跳上进行训练的,因此学习了正常信号的分布。异常心跳不遵循这个分布,因此当将它们输入模型时,模型无法准确预测。为了直观地观察这一点,我们使用测试数据集在图6中展示了输入时间序列和预测时间序列。该图显示实际和预测的正常心跳信号大致相同(图6b)。然而,当输入是一个异常心跳信号时,模型将其映射到连续的正常心跳的潜在空间,如图6a所示,这为异常检测提供了机会。尽管某些异常样本通常与它们的正常预测相似,但局部差异可以帮助区分它们。

        如表3所示,我们训练了一系列无监督的Transformer网络来确定最佳的编码器块数量(1或2)、嵌入大小(32、64、128或256)和注意力头数量(16或32)。表现最佳的模型包含两个编码器块、128的嵌入大小和32的注意力头,取得了令人印象深刻的结果,F1分数为99%,准确度为99%,召回率为98.1%,精确率为100%。计算得到的阈值为0.29。然而,从表3中我们可以观察到,较大的嵌入大小获得了更好的模型性能。由于我们的模型处理不同时间步的心跳信号,因此更适用于顺序时间序列数据。图7展示了ROC曲线,该曲线绘制了真正例率(True Positive Rate,TPR)与假正例率(False Positive Rate,FPR)在不同分类阈值下的变化,以表示模型在区分正类和负类方面的能力。我们的模型实现了99%的AUC分数,表明该模型是一个完美的分类器模型,因为较高的AUC分数意味着更好的预测能力。

        由于ECG5000数据集已经在之前的研究中被使用过,将我们的模型与其他有监督和无监督方法进行比较对于了解其优劣势以及在异常检测领域的地位非常关键。在表4中展示了一些有监督和无监督算法在相同数据集上的结果。在[41]和[42]中,数据集的划分为4500个心跳(80%)用于测试,500个心跳(20%)用于训练和验证任务(20%)。在[41]中,作者使用变分递归自编码器(VRAE)来表示数据,然后应用聚类和Wasserstein距离来检测异常,成功地在ECG5000数据集上实现了超越现有有监督和无监督方法的异常检测性能。同样地,在[42]中,作者使用相同的变分自编码器(VAE)方法结合局部相似度评分在我们的两个数据集上,即ECG5000和MIT-BIH Arrhythmia,在AUC方面取得了与文献中类似的结果。然而,我们的模型在所有评估指标上都超过了这些深度学习模型,具有99%的F1分数,99%的准确率,98.1%的召回率和100%的精确率。然而,由于我们使用了不同的数据划分方法,这种比较被认为是不公平的。因此,我们将我们的结果与[43]和[44]最近获得的结果进行了比较,因为数据的划分为80%的训练集、10%的验证集和10%的测试集,与我们在这里所做的完全相同。[43]中的作者使用了Concat Attention Autoencoder(CAT-AE)、AE-without-Attention和VAE,声称在异常检测中达到了最先进的准确率和精确率。另一方面,[44]中的作者使用了无监督的LSTM自编码器。如表4所示,我们的模型在使用相同数据划分方法的情况下,超越了这些深度学习模型。

 MIT-BIH Arrhythmia数据库实验结果

        图8展示了异常和正常心跳的示例,以及它们对应的预测结果。正常心跳在模型的预测下表现得相当准确,如图8b所示。毫无疑问,模型已经捕捉到了正常心脏周期模式的基本形态行为。模型可以尽量调整输出来适应正常的潜在空间,同时不断努力最小化预测误差。模型试图仅使用心脏周期的正常属性来预测输入,因此异常心跳被映射到一个正常心跳的潜在空间。正如预期的,这导致了异常心跳的较低预测质量和较高的预测误差,如图8a所示。 

        如表5所示,我们训练了多个Transformer编码器网络来确定最佳的注意力-前馈块数量(1或2)、嵌入大小(512或1024个神经元)和注意力头数量(16或32)。从表5可以看出,不同模型的Transformer编码器异常检测结果在MIT-BIH测试数据集上表现相近。然而,表现最佳的模型配置包含两个块,64的嵌入大小和32个注意力头。我们表现最好的Transformer编码器模型实现了89.5%的准确率,92.3%的F1分数,98.2%的召回率和87.1%的精确率。图9展示了最佳模型在测试集上的ROC曲线,AUC得分为93%,这意味着该模型在区分异常和正常信号方面表现相对良好。计算得到的阈值为0.12。

        表6显示了我们的结果与其他使用MIT-BIH数据集的深度学习异常检测模型的比较。在[26]中,作者使用堆叠LSTM并应用无监督训练,因为在训练模型时不需要异常类别。数据集的划分为80%训练和20%测试。因此,我们还将我们的模型与他们的模型进行了比较,因为他们遵循了相同的训练过程和数据划分。我们的模型实现了92.3%的F1分数,98.2%的召回率和87.1%的精确率,而他们的模型报告了81%的F1分数,87%的召回率和82%的精确率,这表明我们的模型优于无监督的LSTM尝试。此外,在[45]中,作者使用了一种新颖的混合架构,由LSTM单元和多层感知器(MLP)组成,数据集的划分为70%训练和30%测试。他们在监督学习方式下实现了87%的F1分数和75%的灵敏度,这也低于我们的结果,然而更高的准确率可能归因于他们使用了监督学习。最后,在[42]中,作者使用了无监督的变分自编码器,并采用AAMI数据集划分,但其F1分数和准确率分别为76.55%和87.77%,分别是最低的。与使用有监督或无监督深度学习模型的最新应用异常检测方法相比,我们的模型表现更好。然而,该模型在异常检测方面的性能仍然缺乏令人满意的F分数。

 总结

        我们提出了一种稳健有效的无监督Transformer异常检测模型,用于处理时间序列数据。该模型被用于检测人类心跳时间序列信号中的异常,例如早搏(premature ventricular contraction,PVC)、室上性早搏(supraventricular premature,SP)和其他心电图异常。该模型的架构由Transformer编码器网络和线性密集解码器网络组成。心电图时间序列异常检测方法基于序列预测方法,包含两个阶段:模型训练,在此阶段模型学习正常数据的分布;异常检测,在此阶段计算心电图时间序列的异常得分以识别异常情况。我们通过使用预先设定的阈值(训练损失的均值加上两倍的标准差)将异常检测方法调整为无监督框架。

        我们已经展示了如何利用Transformer编码器进行心电图时间序列的异常检测。我们在ECG5000和MIT-BIH Arrhythmia数据集上的结果表明,Transformer编码器在这个任务中是一个可行的替代方案。我们将Transformer编码器与几种最先进的深度学习模型进行了对比测试,结果表明我们的模型在准确率、F1分数、召回率和精确率等方面表现优于其他模型。对于ECG5000心跳数据集,我们实现了99%的准确率、99%的F1分数、100%的精确率、98.1%的召回率和99%的AUC得分,展现了在确定ECG心跳信号异常方面的出色能力。此外,我们的模型在MIT-BIH Arrhythmia数据集上表现良好,具有92.3%的加权F1分数、89.5%的准确率、93%的AUC得分、98.2%的召回率和87.1%的精确率。此外,我们提出的模型在使用MIT-BIH Arrhythmia数据集进行最近的ECG分析中表现出比其他深度学习模型更加稳健的性能。尽管本研究主要集中在将模型与深度学习异常检测方法进行比较,但我们未来的工作目标是扩展对其他时间序列数据异常检测技术的研究。

相关文章:

论文阅读---《Unsupervised T ransformer-Based Anomaly Detection in ECG Signals》

题目:基于Transformer的无监督心电图(ECG)信号异常检测 摘要 异常检测是数据处理中的一个基本问题,它涉及到医疗感知数据中的不同问题。技术的进步使得收集大规模和高度变异的时间序列数据变得更加容易,然而&#xff…...

收藏这8个好用的原型设计工具,轻松制作原型图

在设计工作中,原型设计是非常关键的一步,而原型设计工具又能帮助设计师更轻松地完成设计工作。今天本文将与大家分享8个好用的原型设计工具,一起来看看吧! 1、即时设计 即时设计是一个能在线协作的原型工具,也就是说…...

王道计网 第四章笔记

4.1 生活在网络层的“工人”是路由器,他负责各种异构网络的连接,但是因为他只生活在前三层所以从网络层之上的东西他不能管理,所以网路层之上的数据对于路由器来说必须是相同的、透明的。 常见的网络层协议有IP 和 ICMPTCP IP传输层协议FTP应用层协议一句话区分IP和MAC地址…...

C# Blazor 学习笔记(9):动态css/class绑定

文章目录 前言相关资料css和class绑定直接绑定间接绑定 前言 之前我们说到,我们组件化有三个目的。 不用写CSS不用写html不用写交互逻辑 为了解决第一个目的,我们需要动态css 相关资料 Blazor入手教程(二)css和class绑定 cs…...

vue3学习-Pinia状态管理

Pinia 定义一个Store import { defineStore } from pinia export const useStore defineStore(main, {})这个 name,也称为 id,是必要的,Pinia 使用它来将 store 连接到 devtools。 将返回的函数命名为 use… 是跨可组合项的约定&#xff0…...

TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用

TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用 TextBrewer是一个基于PyTorch的、为实现NLP中的知识蒸馏任务而设计的工具包, 融合并改进了NLP和CV中的多种知识蒸馏技术&#xff0…...

乍得ECTN(BESC)申请流程

根据TCHAD/CHAD乍得法令,自2013年4月1日起,所有运至乍得的货物都必须申请ECTN(BESC)电子货物跟踪单。如果没有申请,将被视为触犯乍得的条例,并在目的地受到严厉惩罚。ECTN是英语ELECTRONIC CARGO TRACKING NOTE的简称;…...

【100天精通python】Day28:文件与IO操作_JSON文件处理

目录 专栏导读 1. JSON数据格式简介 1.1 示例JSON数据 1.2 JSON文件的特点 2 json模块的常用操作 2.1 读写JSON文件的示例 2.2 解析JSON字符串 2.3 修改JSON数据 2.4 查询和操作嵌套数据 2.5 处理包含特殊字符的JSON文件 2.6 处理日期和时间 2.7 处理大型JSON文…...

配置两台数据库为主从数据库模式

一、主库配置 1、修改配置文件 /etc/my3306.cnf #mysql服务ID,保证整个集群环境中唯一,默认为1server-id1#是否只读,1代表只读,0代表读写read-only0#忽略的数据,指不需要同步的数据库#binlog-ignore-dbmysql#指定同步…...

linux允许root远程ssh登录

修改文件/etc/ssh/sshd_config # cat /etc/ssh/sshd_config ... #LoginGraceTime 2m #PermitRootLogin prohibit-password #StrictModes yes #MaxAuthTries 6 #MaxSessions 10 ...将 #PermitRootLogin prohibit-password标注为: PermitRootLogin yes样例&#xf…...

Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机接口数据吞吐量(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来获取相机当前数据吞吐量(C) Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在BGAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过BGAPI SDK获取数…...

Spring @Scheduled单线程单实例的坑

文章目录 前言背景验证解决方案 前言 在 Java Spring 项目中经常会用 Scheduled 来实现一些定时任务的场景,有必要了解一些它使用时的问题和内部实现机制。本文是偶然间发现的一个问题,刷新了我的认知,分享给大家。 其他相关文章&#xff1…...

7-数据结构-(带头节点)单链表的增删改查

问题: 单链表带头结点的创建以及输出,以及带与不带头节点的区别 思路: 单链表,逻辑上是线性结构,由许多单链表结点,串成一串。其单链表结构体中,数据项由data数据域和结点指针域。带头节点是为…...

每天一道leetcode:剑指 Offer 53 - II. 0~n-1中缺失的数字(适合初学者二分查找)

今日份题目: 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。 示例1 输入: [0,1,3] 输出: 2 示例2 …...

玩机搞机---安卓新机型payload.bin刷写救砖 无需专用线刷包

目前的新机型官方卡刷包解包后都是payload.bin分区格式的卡刷固件。而有个别一些机型没有线刷包,当这些机型出现系统问题的时候有以下几种方法参考救砖。遇到类似故障的朋友可以借鉴参考下. 其中的不足和相关的资源可以参考这两个博文。任何教程的目的只是拓展你的…...

配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】——“cpolar内网穿透”

配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】 文章目录 配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】前言1. 创建一条固定数据隧道2. 找到“保留二级子域名”栏位3. 重新编辑之前建立的临时数据隧道4. 进入“在线隧道列表”页面5. 在其他浏览器访问…...

【枚举】CF1706 C

有人一道1400写了一个小时 Problem - C - Codeforces 题意: 思路: 首先先去观察样例: 很显然,对于n是奇数的情况,只有一种情况,直接操作偶数位就好了 主要是没搞清楚n是偶数的情况 其实有个小技巧&…...

uniapp-疫情应急管理系统学生端

1 疫情资讯展示 <template><view class"container"><uni-section title"自定义卡片内容" type"line"><uni-card title"基础卡片" class"card-box" v-for"(item,index) in epidemicNewsList"…...

FreeRTOS的线程间通信

一、分类 FreeRTOS的线程间通信分为这几大类 由于我还在学习中&#xff0c;目前显从信号开始记录学习 二、逐块讲解 1、信号&#xff08;osSignalWait osSignalSet&#xff09; FreeRTOS从V8.2.0版本开始提供任务通知这个功能&#xff0c;每个任务多有一个32位的通知值&am…...

Linux内存管理工作原理:

Linux使用虚拟内存和内存映射来管理内存。每个进程都有独立的虚拟地址空间&#xff0c;通过将虚拟地址映射到物理内存&#xff0c;实现对内存的管理和访问。 虚拟地址空间划分&#xff1a;32位系统中&#xff0c;内核空间占1GB&#xff0c;用户空间占3GB&#xff1b;64位系统中…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...