尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

MATLAB实现Transformer时间序列预测模型完整指南

MATLAB实现Transformer时间序列预测模型完整指南 简介本资源是一套基于MATLAB实现的Transformer系列预测模型代码库面向计算机、电子信息工程及数学等专业的本科生与研究生适用于课程设计、期末大作业及毕业设计等实践场景解决时序预测、文本分类、掩码词预测、摘要生成等典型AI建模任务。压缩包共97个文件主体为92个功能完备的MATLAB脚本.m涵盖BERT、FinBERT、GPT-2、T5等主流Transformer变体的加载、微调、推理与评估模块另含3个Markdown说明文档、1个YAML配置文件及1个LICENSE文本结构清晰、模块化程度高。目前已有274人学习下载。读者可直接运行附赠案例数据快速复现情感分析、文本摘要、掩码预测等任务所有模型均采用参数化编程设计关键超参与路径配置集中可调注释详尽便于理解Transformer底层机制与MATLAB工程化实现逻辑。 手头这份matlab transformer预测模型.rar是我整理完的一个时间序列预测项目。里面对应的是一套完整的 MATLAB 实现 Transformer 并用于预测任务的代码、数据和说明文档。如果你正想用 MATLAB 做预测建模又不想一上来就碰 Python 那套深度学习框架这个项目应该能给你一个很顺手的起点。它能解决的核心问题很简单用 Transformer 网络对时间序列比如股票价格、温度、电力负荷等做单步或多步预测并且提供了从数据预处理、网络搭建到训练评估的完整链路。我会把这套东西拆开揉碎讲清楚包括 Transformer 在 MATLAB 里到底怎么搭、数据该处理成什么格式、训练时有哪些参数不能乱调、预测时常见的坑怎么躲以及我自己跑完整个项目后的一些真实体会。无论你是刚接触 Transformer 还是已经懂点深度学习原理、只是想换 MATLAB 实现一下这篇文章都能给你省不少弯路。1. 项目整体设计与需求拆解很多人在网上搜索 Transformer 预测模型出来的几乎全是 Python PyTorch 的教程。我自己也一开始就用的 Python后来因为要跟团队现有的 MATLAB 信号处理流程对接才把整套模型迁到了 MATLAB 里。这个项目其实就是那段时间的产物用 MATLAB 原生深度学习工具箱实现一个可训练的 Transformer 预测模型并封装成可直接调用的流程。1.1 项目要解决的真实问题先用大白话说清楚这个项目到底在做什么。传统的时间序列预测大家最熟的是 LSTM长短期记忆网络。LSTM 确实能抓住时间上的依赖但它的天然弱点是序列一长前面的信息就容易丢而且训练是逐步进行的很慢。Transformer 不一样它通过自注意力机制能让序列中任意两个位置直接发生“对话”不管隔多远。这就是它能在自然语言处理领域火起来然后又被大量迁移到时间序列预测上的根本原因。这个项目要解决的就是这样的实际问题给定一段时间序列的历史数据可以为单变量也可以包含多个特征维度模型取最近的一段窗口比如60个时间步预测未来若干个时间步的取值。比如你有过去一周每分钟的温度记录现在想预测接下来10分钟的温度走势——这就是这个项目的典型应用场景。1.2 为什么选 Transformer 而不是 LSTM 或 CNN我在做这个项目前其实先用 LSTM 跑过同一份数据。效果不能说差但有几个痛点很明显训练时间太长LSTM 按时间步展开计算反向传播路径深GPU 利用率上不去。长期依赖仍然瓶颈把窗口拉长到 100 步以上时LSTM 对早期的模式记忆变得模糊预测曲线明显滞后。调参敏感LSTM 对学习率、梯度裁剪的敏感度很高稍有不慎就梯度爆炸。换成 Transformer 后这几个问题都有明显改善。自注意力机制不依赖逐步递归所以计算可以高度并行训练速度反而快注意力权重能让模型直接关注到窗口里最关键的几个时间点长期依赖不再是短板。当然 Transformer 也有自己的代价比如参数量更大、对数据量要求更高、更容易过拟合但作为预测模型它的上限更高。1.3 MATLAB 平台的优势与门槛这个项目选择 MATLAB 实现其实不是退而求其次反而在某些场景下是更优解。MATLAB 的 Deep Learning Toolbox 从 R2023a 开始官方支持了transformerLayer也就是说不需要自己手写多头注意力的反向传播直接搭积木一样把网络搭起来就行。相比从头用 PyTorch 实现整个工程周期至少缩短一半。另一个优势是调试方便。MATLAB 的变量监视器、绘图工具、表格数据处理生态对于做数据分析出身的人来说非常顺手。你可以一眼看到每个层的输出尺寸数据格式不对时错误信息也比深度学习框架友好得多。当然门槛也确实存在。最大的一个门槛是版本——必须 R2023a 及以上不然根本没有transformerLayer。另外虽然 MATLAB 对 GPU 有支持但很多人的机器上没配置好并行计算工具箱纯 CPU 训练时如果网络建得太大训练时间会有点煎熬。所以项目里的默认参数我是按“CPU 能跑、GPU 更快”的思路来设置的。2. Transformer 预测模型的核心概念与 MATLAB 对应实现在动手跑代码之前有必要先把 Transformer 的几个核心概念理清楚。我当时在没理解透彻的情况下直接抄了一个网络结构结果训练出来的模型完全不可用——Loss 降不下去预测出来是一条水平直线。后来回去把注意力机制和位置编码补了课才明白问题出在哪。2.1 自注意力机制到底在算什么自注意力机制最直观的理解是给序列中每个位置打分分数表示它跟其他位置的相关性有多强然后把这些位置的信息按权重融合起来。举个实际的例子假设你要预测明天股票是涨是跌历史序列中有几天的走势形态很有参考价值自注意力就能自动学会在预测时重点参考那几天而忽略一些噪声日子。在 MATLAB 中transformerLayer把整个多头自注意力过程封装好了。你不需要关心 Query、Key、Value 矩阵是怎么计算的但要明白一个关键参数NumHeads注意力头数。多头机制就像是找多组“评判官”每组从不同视角判断序列内部的相关性最后把各组观点拼接起来。经验上预测任务用 4 或 8 个头是比较常见的起调没必要一上来就 16 个头。2.2 位置编码打破“顺序无关”的诅咒Transformer 的自注意力有个特点它本身是无序的。你把序列的顺序打乱注意力计算的结果其实是一样的如果去掉位置信息。但时间序列的顺序恰恰是最重要的信息所以必须额外加一个东西告诉模型“这是第几个时间步”。这个就是位置编码Positional Encoding。MATLAB 的transformerLayer里内置了位置编码的功能你不需要像 PyTorch 那样手动构造正弦余弦位置向量。但你需要理解它的意义有了位置编码模型才能区分“今天是昨天涨、今天跌”和“今天是跌、昨天涨”这种顺序差异。如果做预测时发现模型对顺序完全不敏感先检查是不是手写网络时自己把序列顺序搞乱了。2.3 预测形式sequence-to-one 和 sequence-to-sequenceTransformer 用在预测上和用在机器翻译上有一个很大的区别翻译是 sequence-to-sequence输入一串词输出一串词而时间序列预测通常有两种形式。第一种是sequence-to-one就是给模型看过去 60 个时间步让它预测未来 第1个 时间步的值。这种形式最简单也是我项目里默认的模式。如果想预测未来 10 步常用的做法有两种一是把输出层改成fullyConnectedLayer(10)一次直接输出 10 个未来值二是训练一个单步模型然后递归地把预测值接回输入端跑 10 次得到 10 个未来值。前者叫直接多步预测后者叫递归多步预测。项目里我两种都实现了默认用的是直接多步预测因为递归预测的误差会逐步累积预测步数一长后面基本没法看。第二种是sequence-to-sequence对应 MATLAB 里是transformerLayer输出整个序列配合regressionLayer等做序列到序列的映射。这个在需要预测整个窗口走势的场景更合适但实现和调参复杂一点对新手不够友好所以我把它作为扩展方案写在了文档里没有放在主流程中。3. 数据准备与预处理实操说实话这个项目里花时间最多的不是搭模型而是处理数据。Transformer 对输入格式的要求比 LSTM 更严格你输入的维度、顺序、归一化方式稍有不对模型性能就会大打折扣。下面我把每一步的具体操作和参数选择逻辑都讲一遍。3.1 数据加载与目标变量定义项目提供了一份示例数据是一个单变量的时间序列——某设备过去一段时间的运行温度记录采样间隔是 1 分钟。当然你完全可以用自己的数据替换比如股票但注意股票数据噪声极大模型泛化很难、交通流量、电力负荷等。加载数据建议用标准方式data readtable(data.csv); values data{:, 2}; % 假设第二列是我们要预测的变量 t data{:, 1}; % 第一列是时间戳这里有个小细节如果时间戳不是等间隔的建议先做重采样或插值否则模型学到的时间步长关系是不均匀的预测效果会受影响。我当时就栽在这个坑里原始数据中间缺了一段直接喂进去训练出来的模型在缺失段附近预测值莫名其妙地跳变。后来用retime做了等间隔重采样才解决。3.2 数据划分不能随便随机打乱训练集、验证集、测试集的划分在时间序列预测里有一个铁律不能随机打乱。因为时间序列有先后依赖如果用未来的数据去训练过去的数据就会造成数据泄露验证出来指标很好看一到真实预测就“翻车”。我采用的划分方式是按时间顺序切分比如前 70% 做训练中间 15% 做验证最后 15% 做测试。这种做法保证测试集是真正没见过的时间片段。很多深度学习教程喜欢用随机划分那是对图像等独立样本而言的时间序列千万别这么干。3.3 归一化一个值都没法省Transformer 对输入的尺度其实比 LSTM 更敏感。因为自注意力中的点积计算本质上是算向量之间的余弦相似度加缩放如果输入特征的尺度差异很大大数值特征会主导注意力权重模型等于只看一个特征别的全瞎了。项目里我用的是mapminmax或normalize把每个特征归一化到 [0,1] 区间minVal min(trainData); maxVal max(trainData); trainNorm (trainData - minVal) ./ (maxVal - minVal);这个最小值和最大值只从训练集里算验证集和测试集都用同一组minVal、maxVal来做变换不能单独算自己的。这个和“不能用未来数据”是同一个逻辑——你在实际预测时是不知道未来的最大最小值的。记住这一点能少踩 80% 的数据预处理坑。预测完拿到结果还需要反归一化还原成真实尺度predReal predNorm .* (maxVal - minVal) minVal;3.4 滑窗法构建训练样本Transformer 不是把整条时间序列一次性塞进去的而是按固定窗口切成一个个样本。窗口长度是一个需要调的超参数。窗口太短信息不足窗口太长计算量上去了而且如果序列本身没有这么长的依赖反而可能引入噪声。我项目的默认窗口是 60 个时间步预测未来 5 步。构建样本的核心代码如下function [X, Y] createSlidingWindow(data, windowSize, horizon) numSamples length(data) - windowSize - horizon 1; X zeros(windowSize, 1, numSamples); Y zeros(horizon, numSamples); for i 1:numSamples X(:, 1, i) data(i : i windowSize - 1); Y(:, i) data(i windowSize : i windowSize horizon - 1); end end注意这里的 X 是[windowSize, 1, numSamples]的格式其中第二个维度是特征数。如果数据是多变量的比如同时有温度、湿度、压强这个维度就放特征数。4. 网络架构设计与训练参数调试这一部分是整个项目的核心也是最容易让人头疼的地方。我先把最终能稳定收敛的网络结构完整放出来再解释每个参数为什么这么设。4.1 MATLAb 中 Transformer 层的基本用法transformerLayer是 R2023a 引入的层基本调用格式如下layer transformerLayer(ModelDimension64, NumHeads4, NumBlocks2);这里的三个参数值得你花时间理解ModelDimension模型内部的向量维度也叫 embedding 维度。它决定了模型对序列信息的表达容量。太小学不到复杂模式太大容易过拟合且训练慢。项目里默认 64数据量不大时是个稳妥的起点。NumHeads多头注意力头数默认 4。一个经验法则是ModelDimension要能被NumHeads整除否则维度拆分会有问题。NumBlocksTransformer 编码器块的堆叠数量。每个块包含自注意力、前馈网络和层归一化。2 到 4 个块对时间序列预测通常够用再往上加收益递减且训练时间成倍增长。4.2 完整网络结构从输入到输出我项目中用的完整网络结构大概是这样的layers [ sequenceInputLayer(numFeatures, MinLengthwindowSize) transformerLayer(ModelDimension64, NumHeads4, NumBlocks2) fullyConnectedLayer(32) reluLayer fullyConnectedLayer(horizon) regressionLayer ];第一层是sequenceInputLayerMinLength最好设置为窗口长度这样能提前检查数据格式避免后面维度不匹配的报错。然后直接接transformerLayer——注意这里不需要像处理图像那样先接卷积层sequenceInputLayer的输出格式刚好就是transformerLayer想要的序列格式。中间加了一个fullyConnectedLayer(32)和reluLayer作用是让模型在输出之前有一个“转换空间”。直接让 Transformer 的输出映射到预测值很多情况下会欠拟合。加一层带非线性激活的全连接层预测曲线会平滑不少。最后一层fullyConnectedLayer(horizon)输出未来horizon个步长的预测值交给regressionLayer计算损失。注意transformerLayer的输出是一个序列而我们做的是 sequence-to-one 的预测需要的是最后一个时间步的输出。MATLAB 的transformerLayer和后续全连接层的默认行为在某些版本里需要自己处理“取最后时间步”的问题。我的经验是直接用fullyConnectedLayer接在transformerLayer后面时如果维度报错可以在中间补一个flattenLayer或globalAveragePooling1dLayer来把序列维度压缩掉。这块需要结合你的 MATLAB 版本做微调不要死搬代码。4.3 训练选项的设置与调参心得网络搭好后训练选项直接决定了模型能不能收敛。我项目里用的典型配置是options trainingOptions(adam, ... MaxEpochs300, ... InitialLearnRate0.001, ... MiniBatchSize64, ... GradientThreshold10, ... ValidationData{XValid, YValid}, ... ValidationFrequency20, ... Shufflenever, ... Plotstraining-progress);这里面有几个参数是我反复试验后确定的关键项学习率 0.001 是默认值但不一定适合你的数据。Transformer 对学习率非常敏感偏大一点就容易在训练初期 Loss 直接变成 NaN。我遇到过最典型的一次是学习率调到 0.01前 10 轮 Loss 掉得飞快第 12 轮直接 NaN整轮训练报废。后来用了学习率衰减策略或者InitialLearnRate0.0005才稳定下来。如果训练 Loss 曲线震荡得像锯齿先把学习率降到原来的十分之一。GradientThreshold设为 10是为了防止梯度爆炸。Transformer 的层数虽然不多但自注意力里的矩阵乘法很容易让梯度的范数变得很大。梯度裁剪相当于给梯度设了一个“安全帽”让它在反向传播时不至于冲爆网络参数。Shufflenever对时间序列预测来说很重要。虽然批内样本已经是窗口化后的相对独立样本但如果每个 epoch 都打乱顺序模型可能会捕捉到训练集中的时间顺序特征影响泛化。这个问题在学术界有争议但我实测下来时间序列预测用Shufflenever通常更稳。MiniBatchSize的选择和你的数据量、GPU 显存有关。数据量小比如几千条的时候32 到 64 都是常见的数据量大可以往上提。不要一味调大 batch sizeTransformer 对 batch size 的敏感性比 CNN 更高太大容易收敛到次优解。4.4 从零训练还是微调这个项目里没有采用预训练模型而是从零开始训练。原因很简单时间序列预测的预训练模型不像 NLP 那样有通用的公开权重每个数据集的特征差异太大。从零训练反而是最可控的。如果你后续想在更多数据上提升性能可以考虑先把模型在大规模数据上预训练再在目标数据上微调——但这属于进阶玩法项目主体不涉及。5. 模型训练、预测与评估全流程整个项目的主流程我现在完整过一遍你按这个顺序走大概率不会出大问题。5.1 训练阶段看曲线而不是只看 Loss训练开始后不要只盯着终端打印的 Loss 值要重点观察训练曲线和验证曲线的走势。我之前做过一个记录表统计了常见曲线形态对应的状态曲线表现可能原因处理方式训练 Loss 降验证 Loss 升过拟合增加训练数据、降低模型维度、加早停两者都不降学习率太小或数据没归一化调大学习率或检查预处理训练初期出现 NaN学习率太大或梯度爆炸减小学习率、调低 GradientThreshold验证 Loss 震荡剧烈Batch size 太小或验证集太少增大 batch size、重新切分验证集Loss 迅速降到很小但预测很差数据泄露检查划分是否按时间顺序训练完成后用trainednet trainNetwork(XTrain, YTrain, layers, options)得到返回的网络对象然后保存save(transformer_model.mat, trainednet, minVal, maxVal);minVal和maxVal一定也要存下来后面做推理时要用。5.2 预测阶段单步预测与多步递归用训练好的模型做预测非常简单predNorm predict(trainednet, XTest); predReal predNorm .* (maxVal - minVal) minVal;这里XTest的格式必须和训练时一样是[windowSize, numFeatures, numSamples]。很多人在这一步报错多半是直接拿一个行向量去 predict 了维度对不上。如果你需要递归多步预测代码稍微绕一点currentInput XTest(:, :, i); % 取一个测试样本 futurePred zeros(horizon, 1); for step 1:horizon nextValue predict(trainednet, currentInput); futurePred(step) nextValue(end); currentInput [currentInput(2:end); nextValue(end)]; end每预测一步就把得到的值接在序列末尾同时丢掉序列开头的值保持窗口长度不变。这个思路很直觉但一定要注意误差会累积预测步数越多后续结果越不可靠。所以递归预测一般只适合短步长默认 5 步以内还好超过 10 步就要考虑直接多步输出的方式。5.3 评估指标别只看一个数字项目里我计算了三个指标rmse sqrt(mean((yTrue - yPred).^2)); mae mean(abs(yTrue - yPred)); mape mean(abs((yTrue - yPred) ./ yTrue)) * 100;RMSE均方根误差和 MAE平均绝对误差是常用的回归指标MAPE平均绝对百分比误差在量纲不统一时更好用。但我要提一个看结果时的坑只看整个预测区间的平均指标是远远不够的。一定要把预测值和真实值叠加画在同一张图上直观观察预测曲线是不是跟真实值长得像。因为平均指标好不代表曲线拟合得好有可能模型只是在整体趋势上对了但波峰波谷全部错位这种结果在实际应用中就是废的。画图用最简单的方式figure; plot(tTest, yTrue, b-, LineWidth, 1.5); hold on; plot(tTest, yPred, r--, LineWidth, 1.5); legend(真实值, 预测值); xlabel(时间); ylabel(数值); grid on;如果两条线基本贴合峰值和谷值位置也对得上这个模型才算真正可用。6. 我在实际运行中遇到的高频问题与排查技巧这一部分是我最想分享的。项目里踩过的坑每一个都对应一个真实的报错或一个离谱的结果。我把它们列成一个速查表你遇到了直接对照处理就行。6.1 维度不匹配最常犯的错报错信息通常是Layer input size is incompatible或者类似的维度相关错误。排查方向就三个输入数据维度是否和sequenceInputLayer设置一致特别是特征数单变量是 1多变量是真实特征个数。窗口大小是否小于数据总长度。如果窗口大于序列长度样本数为 0训练根本跑不了这个要仔细检查createSlidingWindow函数返回的numSamples。transformerLayer和fullyConnectedLayer之间的维度匹配如果报错优先考虑不改变原来的层结构而是通过调整ModelDimension来适配维度。我第一次用 128 维的ModelDimension结果和后续层维度不匹配前前后后折腾了很久。6.2 训练 Loss 为 NaN这个问题的根源基本就是梯度爆炸或者学习率过大。我遇到最隐蔽的一个情况是数据里有缺失值NaN当时没仔细检查模型训练到一半 Loss 直接变成 NaN还以为是参数问题排查了整整一天。所以第一步先用sum(isnan(data))确认数据里没有缺失值再做任何调参。如果数据没问题就按顺序试这三招降低学习率到 0.0001、调低GradientThreshold到 1 或 5、减小ModelDimension。6.3 预测值是一条水平直线这个问题很有迷惑性。Loss 已经收敛了RMSE 也不算大但画出图来预测值就是一条接近均值的直线完全没有形态变化。我分析过自己有几次这种情况的原因数据归一化后目标变量方差太小模型学到的只是均值回归。模型容量不足ModelDimension或NumBlocks太小学不动复杂模式。滑窗窗口太短序列的内部规律根本没有完整地包含在窗口里。其中最常见的是第一种。解决办法是画一下归一化后数据的分布如果方差确实太小就要考虑是不是数据本身就不适合做预测或者需要做差分、去趋势等预处理。6.4 过拟合严重Transformer 参数量大在小数据集上非常容易过拟合。表现就是训练 Loss 降到很低验证 Loss 反而升高。我的处理思路按优先级排列加早停。在trainingOptions里并没有直接的早停参数但可以通过OutputFcn回调实现。这是最省事的办法验证 Loss 连续 N 轮不降就停止训练。减小模型尺寸。把ModelDimension从 64 降到 32NumBlocks从 2 降到 1往往能立竿见影。加 Dropout 层。在 Transformer 层后加一个dropoutLayer(0.2)可以有效缓解过拟合。注意 Dropout 只在训练时生效预测时不会影响输出。增加数据量或做数据增强。对时间序列来说可以在窗口滑动的步长上做文章比如步长为 1 的时候相当于所有可能的窗口都用来训练了数据量已经最大化了这时就只能靠外部补充数据。6.5 预测趋势滞后一拍这是所有时间序列模型都绕不过去的问题。预测曲线比真实曲线晚了那么一步看起来就像是把真实值延迟了几个时间步。产生的原因是模型学到了“保持不变”的捷径因为大多数时间序列每一步的变化幅度不大直接复刻上一个时间步的值就能把 Loss 压得比较低模型自然倾向于“偷懒”。缓解方案有两个在训练时加入差分特征把目标变量从原始值变成相邻时刻的变化量。比如用diff(data)作为训练目标模型学习的是变化趋势而不是绝对数值能在一定程度上减轻滞后。增大预测步长。如果当前是预测未来的第 1 步改成直接预测未来第 3 步或第 5 步模型的“偷懒”收益会降低。不过要说实话滞后问题很难完全消除它的物理根源在于数据本身的自相关性。只要预测的 RMSE 主要来自幅度偏差而不是相位错位这个模型就可以接受。7. 一些不成体系但很实用的经验项目做到后面我逐渐总结出几条属于“做了才知道”的心得写在这里供你参考。第一不要一开始就追求复杂的模型结构。我最初的版本加了残差连接、多层堆叠、学习率热启动效果反而不如简洁的结构。先用最小可用的 Transformer 跑通一个基线再逐步增加复杂度每一步都有对照这是最稳妥的做法。这也是一个工程习惯先把管线打通再优化模型。第二关注预测时长和计算资源的平衡。Transformer 的计算复杂度是 O(n²)n 是序列长度。窗口从 60 变成 120训练时间不是翻倍而是大约 4 倍。如果你的序列本身没有这么长的依赖这个性价比就很低了。我在项目里测试过窗口 60 和窗口 120 的效果差距不到 5%训练时间差了一倍多。第三把数据预处理的函数做成独立模块。项目里我把createSlidingWindow、归一化、反归一化都单独写成函数放在项目根目录的utils文件夹里。这样换数据集时只需要改数据加载的部分后面的流程完全复用。你要是打算长期在这个方向深耕这套代码组织方式能帮你省下大把时间。第四保存模型时一定要连带保存预处理参数。这个问题我犯了不止一次。只保存了trainednet结果换一台机器加载模型后发现忘了保存minVal和maxVal新来的数据没法反归一化等于模型白训练了。所以一个 .mat 文件里网络、归一化参数、训练配置、数据说明能放的全放进去这是良好工程习惯不是可有可无的事情。第五MATLAB 的版本兼容性要提前确认。transformerLayer在不同小版本里的行为可能有微妙差异。如果你的 MATLAB 是 R2023a 之前的版本连这个函数都用不了那就只能考虑手动实现多头注意力层或者改用 Python 实现。项目文档里我专门写了一段版本兼容性说明就是为了避免用户拿着旧版本苦等一个不存在的函数。回到这个项目的出发点用 MATLAB 实现 Transformer 预测模型本质上是用一个熟悉的平台去落地一个前沿的模型结构。换汤不换药原理是一样的只是实现方式不同。我在实际跑完整个项目后的体会是MATLAB 的封装确实把很多工程细节省掉了但对模型原理的理解不能省。你知道注意力机制在算什么知道位置编码在起什么作用知道 Loss 曲线为什么这样走才能真正用好这个模型——不管是在 MATLAB 里还是换回 Python这些底层的东西是一致的。遇到问题的时候不要盲目改参数先想清楚模型的表现跟你对原理的理解是否自洽通常答案就不远了。本文还有配套的精品资源点击获取
返回列表