TFT:一个可解释的变换器

news2026/5/14 23:46:56
原文towardsdatascience.com/tft-an-interpretable-transformer-70147bcf6212简介世界上每家公司都需要预测来规划其运营无论它们在哪个行业运营。公司中有几个预测用例需要解决例如年度计划的销售每月计划的语言代理的客户服务联系sku 销售以规划生产和/或采购等等。尽管有不同的应用场景但它们都满足来自利益相关者的一个需求可解释性如果你过去为利益相关者部署了一个预测模型你可能会遇到这样的问题“模型为什么做出这样的预测”在这篇文章中我探讨了 TFT这是一种用于时间序列预测的可解释变换器。我还提供了 TFT 的逐步实现用于使用 DartsPython 的一个预测库预测沃尔玛数据集中的每周销售额。最后我展示了如何解释模型及其在沃尔玛数据集中 16 周预测范围内的性能。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a44659d827413bdebf9f8b587d88e57c.png图 1可解释人工智能由作者使用 DALL-E 生成的图像如往常一样代码可在 Github 上找到。TFT时序融合变换器它是什么当涉及到时间序列预测时通常它们不仅受其历史值的影响还受其他输入的影响。它们可能包含复杂输入的混合如静态协变量即时间不变的特征如产品的品牌具有已知未来输入的动态协变量如产品折扣以及其他具有未知未来输入的动态协变量如下周的访客数量。已提出几种深度学习模型来处理时间序列预测中的多个输入但它们通常是“黑盒”模型不允许理解每个组件是如何影响预测结果的。时序融合变换器 (TFT) [1] 是一种基于注意力的架构它结合了多步预测和可解释的见解。它具有循环层来学习不同尺度的时序关系自注意力层用于可解释性变量选择网络用于特征选择门控层用于抑制不必要的组件其损失函数是分位数损失用于生成预测区间。在图 2 中你可以看到 TFT 架构将在下一节中更详细地解释。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0d0a24f769ab7f58468714b8774ab3e6.png图 2TFT 架构 (来源)它是如何工作的TFT 包含 5 个主要组件1. 门控机制由门控残差网络 (GRN) 提供它允许在需要时才应用非线性处理。这很重要因为很难提前知道动态协变量和目标之间的非线性关系。当我们拥有小而噪声数据集时更简单的模型可能更有益可以跳过非线性过程。GRN 的工作方式如下它从主要输入a和上下文向量c静态编码器的结果——稍后解释开始。这些输入通过一个具有 ELU [2] 激活函数的 Dense 层当W2,ω a W3,ω c b2,ω 0时该激活函数充当恒等函数而当W2,ω a W3,ω c b2,ω 0时充当常数。然后其输出通过一个新的 Dense 层该层产生 Gated Linear Units (GLUs) [3] 的输入。GLU 具有 sigmoid 激活函数负责控制 GRN 对原始输入a的贡献程度。由于 sigmoid 函数GLU 可以产生一个 0 的输出这将使模型跳过非线性贡献层归一化Layer Normalization将仅接收跳转连接的原始a。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/efff7aef5b1cca2c792d181196c7806f.png图 3门控残差网络内部结构及其工作原理作者制作2. 变量选择网络 (VSN) 帮助模型权衡每个静态和动态协变量的相关性和贡献。除了提供对预测最重要的特征外它还执行特征选择以移除任何可能对性能产生负面影响的不必要噪声输入。每种类型的输入静态、过去和未来都有自己的 VSN如图 2 中的不同颜色所示。输入特征在进入 VSN 之前被转换。分类输入被编码成一个 d 维嵌入向量而数值特征被线性转换成一个 d 维向量。之后VSN 展开成两个分支第一个分支每个在时间t转换的特征E(j)都被连接成一个时间t的所有过去输入的向量例如 [E(1)t, E(2)t, …, E(j-1)t, E(j)t]其中j表示一个特定的特征。这个向量被连接到一个上下文向量c该向量通过一个 GRN其中应用了之前解释的非线性 __ 变换。GRN 的输出被传递到一个 Softmax 层该层产生一个包含每个特征权重的向量。特征选择在这一步进行因为 Softmax 可以产生从 0 到 1 的任何值。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ac7b0ce394bf7d60c83d337d779ae237.png图 4获取每个特征特征重要性的过程作者制作第二个分支在时间t的每个转换特征E都会输入一个独立的 GRN通过非线性处理产生输出~E。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e32949db02fe85b5711a8ca2bdedf9e6.png图 5在时间t使用 GRN 对 E(j) 的转换由作者制作组合步骤通过特征重要性向量和E的非线性变换对两个向量进行逐元素组合生成一个通过其相关性处理过的特征向量权重。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e24d45dfb4cb116b2bbe4d3282c94c5a.png图 6特征权重和转换特征的组合由作者制作3. 静态协变量编码器使用四个不同的 GRN 将静态协变量编码成四个不同的向量用于 VSNs 中时间变量选择的上下文向量s用于 LSTM 编码器-解码器中局部处理时间特征的上下文向量c和h用于在丰富层中用静态信息丰富时间特征的上下文向量ehttps://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1424bb82b0199e7621488cb365621d6e.png图 7静态协变量编码器将静态协变量编码成 4 个不同的上下文向量用于不同的用途由作者制作4. 时间处理在时间序列中非常重要因为周围的观测值通常对未来预测最有用。这种局部上下文已经为基于注意力的架构所开发然而它们仅适用于观测输入不能同时处理已知未来输入。为了克服这个问题作者提出了一种序列到序列模型来处理过去和未来的已知输入。他们将过去输入输入 LSTM 编码器将已知未来输入输入 LSTM 解码器。编码器和解码器还使用上下文向量c和h作为输入 __ so这样静态元数据就可以在创建时间特征时影响局部处理。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/998a1778f086b527fdbad93b6a1d8131.png图 8LSTM 编码器-解码器模型由作者制作编码器和解码器的输出与上下文向量e结合并送入丰富层中的一个具有共享权重的独立 GRN该 GRN 通过静态元数据增强时间特征。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/6c66d46ea99662ae2c25efe65e8f31a3.png图 9在丰富层中创建的最终时间特征由作者制作最后最终的时间特征通过静态元数据进行了丰富被输入到一个可解释的多头注意力层该层学习每个时间步t相对于其前面的输入序列的相关性。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/5b3f987273d2ba3e757c5798b5e7e6b1.png图 10与t相关的时间特征的时序可解释性作者制作5. 分位数预测是通过在每个时间步预测各种分位数来实现的。预测是通过时间融合解码器的输出的线性变换生成的。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f9b739c94288c659bafff3a1ff5c2611.png图 11与t相关的时间特征的时序可解释性作者制作如何在实际中使用和解释 TFT本节将逐步介绍使用与我之前关于TiDE的帖子中相同的数据集实现的 TFT这是一个来自沃尔玛的每周销售数据集可在kaggle上找到许可证 CC0公共领域。我将使用Darts的实现来训练、预测和解释 TFT。数据集包含 2 年 8 个月的每周销售额和 16 列Store– 店铺编号和其中一个静态协变量Dept– 部门编号和另一个静态协变量Type– 店铺类型和另一个静态协变量Size– 店铺大小和最后一个静态协变量Date– 时间序列的时序索引它是每周的它将被用来提取动态协变量如周数和月份_WeeklySales– 目标变量IsHoliday– 一个标识特定周是否有假期的动态协变量Temperature– 一个与特定周平均温度相关的动态协变量_FuelPrice– 一个与特定周燃料价格相关的动态协变量MarkDown 1,2,3,4 and 5-一个与特定周平均折扣相关的动态协变量CPI– 一个与消费者价格指数相关的动态协变量Unemployment– 一个与失业率相关的动态协变量我们首先导入库并定义全局变量如日期列、目标列、静态协变量、动态协变量用 0 填充、动态协变量用线性插值填充、我们序列的频率、预测范围以及要使用的缩放器importpandasaspdimportnumpyasnpfromdatetimeimporttimedeltaimportmatplotlib.pyplotaspltfromdartsimportTimeSeriesfromdarts.dataprocessing.pipelineimportPipelinefromdarts.modelsimportTFTModelfromdarts.dataprocessing.transformersimportScalerfromdarts.utils.timeseries_generationimportdatetime_attribute_timeseriesfromdarts.utils.likelihood_modelsimportQuantileRegressionfromdarts.dataprocessing.transformersimportStaticCovariatesTransformer,MissingValuesFiller TIME_COLDateTARGETWeekly_SalesSTATIC_COV[Store,Dept,Type,Size]DYNAMIC_COV_FILL_0[IsHoliday,MarkDown1,MarkDown2,MarkDown3,MarkDown4,MarkDown5]DYNAMIC_COV_FILL_INTERPOLATE[Temperature,Fuel_Price,CPI,Unemployment]FREQW-FRIFORECAST_HORIZON16# weeksSCALERScaler()TRANSFORMERStaticCovariatesTransformer()PIPELINEPipeline([SCALER,TRANSFORMER])默认缩放器是 MinMax Scaler但只要它有fit()、transform()和inverse_transform()方法我们就可以使用 scikit-learn 中的任何缩放器。同样对于默认为 scikit-learn 中的 Label Encoder 的转换器也是如此。之后我们加载我们的数据集并添加那些我在数据集描述中提到的外生特征# load data and exogenous featuresdfpd.read_csv(data/train.csv)store_infopd.read_csv(data/stores.csv)exo_featpd.read_csv(data/features.csv).drop(columnsIsHoliday)# join all data framesdfpd.merge(df,store_info,on[Store],howleft)dfpd.merge(df,exo_feat,on[Store,TIME_COL],howleft)一旦数据集加载完毕我们需要应用一些预处理来清理数据我们将时间列设置为pd.datetime。我们将负值转换为 0这些负值可能表示退货但我没有花太多时间研究它因为这不属于本文的范围。我们用 0 填充 Markdown 列中的缺失值因为我们假设当值缺失是由于促销不足。我们将标识特定周假期的布尔列转换为二进制列我们将Size静态协变量从连续值转换为分类值。当大小低于百分位数 25 时为*‘small’当高于百分位数 75 时为‘large’最后当它在百分位数 25 和 75 之间时为‘medium’*。最后我们只预测销售量最高的 7 家店铺以减少运行时间我使用所有店铺运行了一次训练 TFT 模型花费了 11 个小时 。df[TIME_COL]pd.to_datetime(df[TIME_COL])df[TARGET]np.where(df[TARGET]0,0,df[TARGET])# remove negative valuesdf[[MarkDown1,MarkDown2,MarkDown3,MarkDown4,MarkDown5]]df[[MarkDown1,MarkDown2,MarkDown3,MarkDown4,MarkDown5]].fillna(0)# fill missing values with nandf[IsHoliday]df[IsHoliday]*1# convert boolean into binarydf[Size]np.where(df[Size]store_info[Size].quantile(0.25),small,np.where(df[Size]store_info[Size].quantile(0.75),large,medium))# make size a categorical variable# reduce running time by forecasting only top 7 storestop_7_storesdf.groupby([Store]).agg({TARGET:sum}).reset_index().sort_values(byTARGET,ascendingFalse).head(7)dfdf[df[Store].isin(top_7_stores[Store])]数据清理完毕后我们可以将数据分为训练集和测试集我决定使用最后 16 周的数据作为测试集并将 pandas 数据框转换为 Darts 时间序列格式。使用_TimeSeries.from_group*dataframe函数我们可以轻松定义静态协变量、我们的目标、时间参考列和序列的频率。我还使用了_fill_missing*dates*参数在有些序列之间有周间隔的情况下将目标变量填充为 0。# 16 weeks to for testtraindf[df[TIME_COL](max(df[TIME_COL])-timedelta(weeksFORECAST_HORIZON))]testdf[df[TIME_COL](max(df[TIME_COL])-timedelta(weeksFORECAST_HORIZON))]# read train and test datasets and transform train datasettrain_dartsTimeSeries.from_group_dataframe(dftrain,group_colsSTATIC_COV,time_colTIME_COL,value_colsTARGET,freqFREQ,fill_missing_datesTrue,fillna_value0)我们有历史数据以时间序列格式因此现在是时候以相同的格式创建动态协变量了如前所述我们使用_fill_missing*dates*参数将_fillna*value0应用于那些我认为数据缺失可以替换为 0 的动态协变量。对于那些应该用插值替换的如Temperature、Fuel Price、CPI和Unemployment我们不设置_fillna*value参数而是使用MissingValuesFiller()函数进行线性插值缺失值。# create dynamic covariates for each serie in the training dartsdynamic_covariates[]forserieintrain_darts:# add the month and week as a covariatecovariatedatetime_attribute_timeseries(serie,attributemonth,one_hotTrue,cyclicFalse,add_lengthFORECAST_HORIZON,)covariatecovariate.stack(datetime_attribute_timeseries(serie,attributeweek,one_hotTrue,cyclicFalse,add_lengthFORECAST_HORIZON,))storeserie.static_covariates[Store].item()deptserie.static_covariates[Dept].item()# create covariates to fill with 0covariatecovariate.stack(TimeSeries.from_dataframe(df[(df[Store]store)amp;(df[Dept]dept)],time_colTIME_COL,value_colsDYNAMIC_COV_FILL_0,freqFREQ,fill_missing_datesTrue,fillna_value0))# create covariates to fill with interpolationdyn_cov_interpTimeSeries.from_dataframe(df[(df[Store]store)amp;(df[Dept]dept)],time_colTIME_COL,value_colsDYNAMIC_COV_FILL_INTERPOLATE,freqFREQ,fill_missing_datesTrue)covariatecovariate.stack(MissingValuesFiller().transform(dyn_cov_interp))dynamic_covariates.append(covariate)我们离使用 TFT 进行拟合和预测只有两步之遥我们只需要缩放协变量、历史数据和编码静态协变量。# scale covariatesdynamic_covariates_transformedSCALER.fit_transform(dynamic_covariates)# scale data and transform static covariatesdata_transformedPIPELINE.fit_transform(train_darts)我们已经准备好使用 TFT 进行训练和预测TFT_params{input_chunk_length:52,# number of weeks to lookbackoutput_chunk_length:FORECAST_HORIZON,hidden_size:2,lstm_layers:2,num_attention_heads:1,dropout:0.1,batch_size:16,n_epochs:3,likelihood:QuantileRegression(quantiles[0.25,0.5,0.75]),random_state:42,use_static_covariates:True,optimizer_kwargs:{lr:1e-3},}tft_modelTFTModel(**TFT_params)tft_model.fit(data_transformed,future_covariatesdynamic_covariates_transformed,verboseFalse)predPIPELINE.inverse_transform(tft_model.predict(nFORECAST_HORIZON,seriesdata_transformed,num_samples50,future_covariatesdynamic_covariates_transformed))TFT可解释性TFT 是一个可解释的 TransformerDarts 只需几行代码就提供了这个功能我们首先定义我们的解释器它接收我们刚刚训练的模型以及我们想要解释的序列的历史数据及其动态协变量。在我们的案例中我们将解释Store 2 – Dept 2的预测。fromdarts.explainabilityimportTFTExplainer explainerTFTExplainer(tft_model,background_seriesdata_transformed[1],background_future_covariatesdynamic_covariates_transformed[1],)explainability_resultexplainer.explain()之后我们可以通过其两个变体来解释模型可变网络选择编码器重要性表明季节性特征周和月对我们模型的重要性最高其次是IsHoliday和Markdown5。plt.rcParams[figure.figsize](10,5)plt.barh(dataexplainer._encoder_importance.melt().sort_values(byvalue).tail(10),yvariable,widthvalue)plt.xlabel(Importance)plt.ylabel(Feature)plt.title(Encoder Importance)plt.show()https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/6f1202e65f3cf41f3dd7609d3799a312.png图 12编码器重要性由作者制作解码器重要性表明季节性特征周和月对我们模型的重要性最高*。plt.rcParams[figure.figsize](10,5)plt.barh(dataexplainer._decoder_importance.melt().sort_values(byvalue).tail(10),yvariable,widthvalue)plt.xlabel(Importance)plt.ylabel(Feature)plt.title(Decoder Importance)plt.show()https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/91aa2cfe88a11057c5653af6db8f745f.png图 13解码器重要性由作者制作静态协变量重要性表明我们基于商店大小创建的特征是最重要的静态协变量。plt.rcParams[figure.figsize](10,5)plt.barh(dataexplainer._static_covariates_importance.melt().sort_values(byvalue).tail(10),yvariable,widthvalue)plt.xlabel(Importance)plt.ylabel(Feature)plt.title(Static Cov Importance)plt.show()https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/357e787e0202c67b760b9bde0996d9fd.png图 14静态协变量重要性由作者制作时间多头注意力层此图显示了历史数据在预测时间范围内每个时间步的重要性并且正如预期的那样我们离截止日期越近过去值的重要性就越高。explainer.plot_attention(explainability_result,plot_typeall,show_index_astime)https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/eb4dcce46fd3bd2532477f015e0fee16.png图 15历史数据重要性由作者制作TFT性能对于Store2 和Dept2我们的模型在测试集中有 3.58%的 MAPE 和 3220.08 的 RMSE 性能。它成功地正确预测了大多数的下降和峰值正如你在图 16 中可以看到的只有 2 个实际值超出了分位数范围。fromdarts.metricsimportmape,rmsedefeval_model(val_series,pred_series):# plot actual seriesplt.figure(figsize(9,6))val_series[:pred_series.end_time()].plot(labelactual)# plot prediction with quantile rangespred_series.plot(low_quantile0.25,high_quantile0.75,labelf{int(0.25*100)}-{int(0.75*100)}th percentiles)plt.title(fMAPE:{round(mape(val_series,pred_series),2)}% | RMSE:{round(rmse(val_series,pred_series),2)})plt.legend()eval_model(test_darts[1],pred[1])https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/dd1caabcdaabee7af91c47091bb47898.png图 16Store 2 Dept 2 的 TFT 性能由作者制作结论随着时间的推移最先进模型的复杂性一直在增加这使得对于没有 AI 背景的观众来说很难解释它们是如何工作的。无论你在组织中部署哪种类型的模型无论是简单的分类器还是复杂的 LLM你的利益相关者最终都会问你“为什么模型会做出这样的预测”。因此当研究一个模型来解决业务问题时不仅是一个准确性的问题也是一个可解释性的问题。在本文中我们探索了一种时间序列 Transformer 模型该模型能够提供关于影响预测的因素以及如何解释它们的见解。保持联系LinkedInMedium参考文献[1] Bryan Lim, Sercan O. Arik, Nicolas Loeff, Tomas Pfister. 时间融合变换器用于可解释的多时间范围时间序列预测。arXiv:1912.093632020。[2] Djork-Arné Clevert, Thomas Unterthiner, Sepp Hochreiter. 通过指数线性单元ELUs实现快速准确的深度网络学习。arXiv:1511.072892016。[3] Yann N. Dauphin, Angela Fan, Michael Auli, David Grangier. 使用门控卷积网络进行语言建模。arXiv:1612.08083, 2017.

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

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

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

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…