简介一份面向金融时序建模与深度学习初学者的长短期记忆网络外汇预测项目包系统展示从历史汇率数据到预测结果的全流程。项目围绕外汇预测任务详细实践了缺失值与异常值清洗、数据标准化、训练集验证集测试集划分等预处理步骤并完整呈现了长短期记忆网络的多层结构搭建、门控机制原理、均方误差损失函数、Adam优化器选取以及批次大小和迭代次数等参数调优过程。压缩包共包含二十七个文件主要类型包括Jupyter Notebook交互式代码、Python脚本、CSV历史行情数据、训练好的模型权重文件和Markdown说明文档整体大小约13.41MB。目前已有一百一十九人学习浏览。借助该资源读者能够基于美元兑日元、英镑兑美元等货币对数据直接复现实验加载预训练权重观察预测效果也可尝试调整网络层数、隐藏单元数量或引入经济指标等外部特征来进一步提升精度适合作为课程设计、量化交易入门及个人研究的起点。1. 基于LSTM网络的外汇预测模型包先想清楚它能不能用再谈怎么跑你拿到一个「基于LSTM网络的外汇预测模型.zip」解压、装依赖、跑训练脚本三分钟之后看到的往往是两种结果loss掉得漂亮一测未来数据就翻车或者loss压根不降模型吃掉了每一轮训练却没有学会任何东西。外汇行情的低信噪比和随机游走特性让LSTM的序列记忆优势很难发挥出来。这篇文章想把解压后一定会遇到的数据处理、网络结构、训练参数和验证方法按我实际跑过的顺序讲清楚并给出一份能直接改着用的PyTorch代码骨架。适合想复现模型、做毕设或量化入门的人不适合期待“装上就盈利”的人先把预期降到一个真正诚实的回测结果上。2. 把行情数据变成LSTM能吃的样本时间帧、滑窗与标签设计2.1 原始数据长什么样外汇的OHLCV与时间对齐外汇数据和股票数据有个明显区别它是24小时连续交易的分散市场没有统一的成交量和交易所时间戳。你从MT4导出的CSV通常是“Date, Time, Open, High, Low, Close, Volume”这样的结构其中的Volume字段大多是tick成交量只能当参考。常见做法是只用OHLCClose作为主特征其余列去重后参与计算衍生指标。如果你拿到的zip里只有几百根D1数据那就要先接受一个现实数据量不够LSTM再强也白搭。这里第一个新手坑是时间对齐。MT4默认导出的是服务器时间通常是GMT2或GMT3而且会随夏令时切换。如果你把两个不同来源的数据拼在一起不统一时区LSTM看到的K线顺序就会错位。我一般会把时间戳全部转成UTC再按时间升序排列遇到周末停盘产生的缺失K线不填充直接保留时间序列的原生空隙。不要把缺失的K线用前向填充补出来那等于造出一段模型永远见不到的假价格平台预测时会引入系统性偏差。时间帧选择上M1数据噪音太大D1样本量太小H1和H4是多数外汇预测场景的折中。做LSTM时间序列预测python项目时H1大概一天24根K线两年数据约有12000根足够支撑一个seq_len在200以上的滑窗模型。选好时间帧后下一步就是把连续K线切成监督学习的样本。2.2 用PyTorch Dataset把K线切成滑窗样本把K线序列变成样本的核心手段是滑窗用过去N根K线作为输入用未来M根K线的某个量作为标签。这里我一般用一个PyTorch Dataset来封装原因是可以和DataLoader无缝配合也方便在训练循环里统一处理。下面这段代码是常见做法几乎可以直接抄进你的项目里import numpy as np import torch from torch.utils.data import Dataset class FXWindowDataset(Dataset): def __init__(self, data, feature_idx, target_idx0, seq_len240, horizon1): # data: 按时间升序排列的二维numpy数组 # feature_idx: 模型输入用到的特征列索引列表 # target_idx: 预测目标的列索引默认第0列是收益率 self.data torch.from_numpy(data.astype(np.float32)) self.feature_idx feature_idx self.target_idx target_idx self.seq_len seq_len self.horizon horizon def __len__(self): return len(self.data) - self.seq_len - self.horizon 1 def __getitem__(self, idx): x self.data[idx: idx self.seq_len, self.feature_idx] y self.data[idx self.seq_len: idx self.seq_len self.horizon, self.target_idx] return x, y代码逻辑说明data的第一维是时间第二维是特征列。__len__返回的是能切出的窗口数减掉seq_len和horizon是为了保证最后一个窗口也有完整的预测目标。__getitem__返回两个张量x是过去seq_len根K线在feature_idx列上的取值形状是(seq_len, len(feature_idx))y是未来horizon根K线在target_idx列上的取值形状是(horizon,)。每个样本的输入和标签在时间上严格分开不存在未来信息提前进入输入的问题。参数说明seq_len240在H1时间帧下约等于10个交易日能覆盖短中期走势horizon1表示只预测下一根K线想预测未来5根就改成5。target_idx指收益率列默认第0列放收益率。feature_idx可以包含0也就是把历史收益率也作为特征输入这没问题问题在于不要把未归一化的Close价格同时塞进多个派生特征里那会造成信息冗余。DataLoader构造时验证集和测试集千万不要shuffleTrue保持时间顺序的连续性。2.3 为什么预测收益率而不是预测价格如果你直接把Close价格塞给LSTM做回归训练loss会很快降下去但预测曲线和真实价格几乎错开一根K线呈现明显的“滞后跟随”。原因是价格序列近似随机游走模型学会的最简单策略就是“预测值约等于上一个时刻的价格”这样MSE已经很小但方向预测毫无意义。解决这个问题的常用办法是把原始价格转换成对数收益率或百分比收益率让序列变得平稳。数据构造时把Close列做一阶差分并转成收益率放在data的第0列target_idx就设为0。收益率标签不需要再做标准化它是平稳序列标准化反而让预测结果失去可解释性。特征列里可以放技术指标比如RSI、ATR、布林带位置也可以放时间周期性特征例如“小时”和“星期”的sin/cos编码。所有特征必须在同一个数组里按相同的时间对齐顺序不能乱。最后说切分原则。时间序列切分永远按顺序前70%训练中间15%验证最后15%测试。注意不要把切出来的滑窗样本整体随机shuffle后再划分训练和验证这等于把未来段行情混进了训练窗口测试结果虚高属于最典型的数据泄漏。如果你担心相邻窗口重叠度太高模型反复看到同一段数据可以把滑窗步长从1改成5或者在训练集里使用dropout来缓解这都比破坏时间顺序更安全。3. 搭建LSTM神经网络预测模型从输入输出到训练循环3.1 nn.LSTM的输入输出别搞混PyTorch源码级的理解LSTM神经网络的核心是nn.LSTM模块PyTorch里的用法很固定这里把输入输出关系先说透能省掉后面一大半调参时间。初始化时常用的参数是input_size、hidden_size、num_layers、batch_first和dropout。batch_firstTrue的情况下输入张量形状是(batch, seq_len, input_size)绝大多数人习惯这个维度顺序建议保持默认。前向传播返回两个东西output和(h_n, c_n)。output形状是(batch, seq_len, hidden_size * num_directions)保存了每个时间步最后一层LSTM的输出h_n是最后一层最后一个时间步的隐状态形状是(num_layers * num_directions, batch, hidden_size)。单层单向LSTM里output[:, -1, :]和h_n[-1]取出来的值是一样的多层LSTM要取h_n[-1]才是最后一层。还有一个常见误用是把h_n[0]当作输出那是第一层的隐状态不是最终预测应该用的。普通外汇预测我不建议开bidirectionalTrue因为双向LSTM在最后一个时间步会看到序列右侧的信息这在时间序列预测里等价于“偷看未来”训练和测试时模型拿到的信息完全不对等。如果要做“序列标注”类任务另说但做预测老老实实单向就够了。模型定义我一般这样写也算一份能直接跑通的LSTM模型代码import torch.nn as nn class FXPricePredictor(nn.Module): def __init__(self, input_size, hidden_size64, num_layers2, dropout0.2, horizon1): super().__init__() self.lstm nn.LSTM( input_sizeinput_size, hidden_sizehidden_size, num_layersnum_layers, batch_firstTrue, dropoutdropout if num_layers 1 else 0.0, ) self.regressor nn.Sequential( nn.Linear(hidden_size, 32), nn.ReLU(), nn.Linear(32, horizon), ) def forward(self, x): out, _ self.lstm(x) # out: (batch, seq_len, hidden_size) last out[:, -1, :] # 取最后一个时间步的隐状态 return self.regressor(last) # (batch, horizon)逻辑说明LSTM处理完整个滑窗后取最后一个时间步的输出喂给一个两层全连接网络做回归。input_size就是2.2节里feature_idx的长度hidden_size64对于外汇这种低信噪比数据足够再大容易过拟合。num_layers设2注意dropout在num_layers1时会被PyTorch忽略这是文档里写了但很多人不看的地方。最后的Linear直接输出horizon个预测值没有额外激活函数因为回归任务不需要限制输出范围。3.2 训练循环从零写一个不花哨的LSTM训练器有了模型接下来是训练循环。我不建议新手直接上PyTorch Lightning这类框架先把原生训练循环搞明白后面换任何框架都顺手。代码里最关键的三件事是梯度裁剪、Huber损失、保存最佳权重。import torch import torch.optim as optim from torch.utils.data import DataLoader device cuda if torch.cuda.is_available() else cpu model FXPricePredictor(input_sizelen(feature_idx)).to(device) optimizer optim.Adam(model.parameters(), lr1e-3) loss_fn nn.HuberLoss(delta1.0) train_loader DataLoader(train_ds, batch_size128, shuffleFalse) for epoch in range(50): model.train() epoch_loss 0.0 for x, y in train_loader: x x.to(device) y y.to(device) pred model(x).squeeze(-1) loss loss_fn(pred, y) optimizer.zero_grad() loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0) optimizer.step() epoch_loss loss.item() * x.size(0) print(fepoch {epoch1}, train loss {epoch_loss / len(train_loader.dataset):.6f})逻辑说明pred形状是(batch, horizon)squeeze(-1)在horizon1时会变成(batch,)和y形状对齐。梯度裁剪固定在max_norm1.0外汇数据里经常出现极端点一轮剧烈行情就能让LSTM梯度爆炸这个参数能兜底。HuberLoss在delta1.0以内是MSE超过delta退化成MAE极端行情不会像MSE那样单点拉扯整个模型这是外汇这种尾部噪声大的序列里很实用的选择。训练时用shuffleFalse的原因前面说过相邻滑窗高度重叠打乱顺序并不会让样本真正独立反而让模型在验证时失去时间语境的连续性。如果你想提一点收敛速度可以在训练集里开shuffleTrue但验证集必须保持False并且要清楚这会引入少量重叠偏差。每个epoch打印的应该是“平均到每个样本”的损失而不是累加值否则epoch变长时loss数字会跟着虚高不好判断收敛。3.3 训练和评估用不同指标方向准确率才是外汇关心的训练阶段用回归损失但评估阶段我强烈建议把方向准确率单独列出来因为你的目标不是让预测曲线贴着真实曲线走而是让预测收益率的正负符合真实收益率。以下是常用指标表阶段指标用途与说明训练MSE / HuberLoss让模型在数值上逼近收益率早停验证集HuberLoss衡量泛化防止过拟合评估MAE / RMSE分析误差分布看是否被极端行情带偏交易方向准确率、盈亏比决定这套预测能否覆盖交易成本方向准确率的计算很简单预测收益率大于0记做多真实收益率大于0也记做多一致就是对的。这个指标在训练时每几个epoch顺手统计一次如果训练了3个epoch还在50%上下打转说明模型学到的基本是噪声。外汇单边趋势少、震荡多方向准确率能做到52%以上并配合盈亏比才算能用低于这个数值就要回头查数据或者改标签。4. 训练参数怎么设学习率、seq_len与早停的实战经验4.1 一套不算玄学的默认参数调参这件事在LSTM时间序列预测领域很容易变成玄学但我还是愿意给一套默认值让新手不用从零开始猜。下面这组参数是我在H1时间帧上常用的起点配合后面的早停机制大部分项目第一天都能跑起来参数默认值调整依据seq_len240H1约10个交易日足够覆盖短中期波动horizon1先从单步预测起步多步预测后面再试hidden_size64约为特征数的4倍过深易过拟合num_layers21层太浅3层以上训练慢且更容易过拟合batch_size128太小导致梯度震荡太大吃内存且收敛慢lr1e-3Adam默认推荐值跑5个epoch后观察lossdropout0.2H1数据上过拟合不严重时取0.1~0.3epochs50配合早停实际训练会在20~30个epoch结束这里的核心调整顺序是先固定seq_len和hidden_size把lr调出合理区间再回头动seq_len和dropout。不要一开始就同时改四个参数LSTM模型对参数组合的敏感度很高同时调整出了问题很难定位。我见过有人把hidden_size从32调到512loss确实降了但验证集在10个epoch后开始暴走这就是典型的容量过大加数据不足。这套参数默认只适合H1和H4如果换到M1seq_len240只代表4小时模型根本看不到足够的走势形态换到D1240根K线又接近一年的时间跨度数据量要求完全不同。4.2 学习率调度与早停给训练过程留一颗后悔药训练到第10个epoch后loss下降速度会肉眼可见地变慢。不要盲目拉高epochs正确做法是给学习率一个自适应的下降机制并用早停给模型喊停。下面这段是常见的训练与调参骨架from torch.optim.lr_scheduler import ReduceLROnPlateau import copy best_val float(inf) best_state copy.deepcopy(model.state_dict()) no_improve 0 patience 10 scheduler ReduceLROnPlateau(optimizer, modemin, factor0.5, patience5, min_lr1e-5) for epoch in range(50): train_one_epoch(model, train_loader, optimizer, loss_fn, device) val_loss evaluate(model, val_loader, loss_fn, device) scheduler.step(val_loss) if val_loss best_val: best_val val_loss best_state copy.deepcopy(model.state_dict()) no_improve 0 else: no_improve 1 if no_improve patience: print(fearly stop at epoch {epoch1}) break model.load_state_dict(best_state) torch.save(best_state, best_lstm_fx.pt)代码说明train_one_epoch和evaluate就是上一节循环的封装这里不重复展开。ReduceLROnPlateau监控验证集loss连续5个epoch不下降就把学习率减半学习率降到1e-5后不再递减防止在最后阶段扰动已经收敛的权重。早停的patience我一般取10~15比scheduler的patience大给学习率下降后的模型一点缓冲时间不会因为一次波动被误杀。保存的best_state是验证集loss最小的那组权重不是最后一个epoch的权重这点很重要。很多人训练结束直接用最后一个epoch的参数过拟合已经发生回测自然难看。这里还有个容易被忽略的细节loss下降不代表模型在变好训练前期验证集loss下降方向准确率可能反而在下降。早停只认验证集loss但打印信息里要把方向准确率一起带出来方便人工判断要不要提前断开。4.3 归一化的正确姿势只允许训练集提供统计量外汇特征列的数值范围差异很大Close价格和ATR差好几个数量级不归一化的话LSTM很难收敛。归一化用什么方法常见做法是StandardScaler每个特征减去训练集均值、除以训练集标准差。但这有个必须服从的纪律只能对训练集调用fit_transform验证集和测试集只能调用transform不能fit。from sklearn.preprocessing import StandardScaler scaler StandardScaler() train_features scaler.fit_transform(train_df[feature_cols]) val_features scaler.transform(val_df[feature_cols]) test_features scaler.transform(test_df[feature_cols])逻辑说明fit_transform在训练集上算出了均值和方差之后验证集和测试集都用同一套参数变换。如果你不区分直接在全部数据上fit就等于让模型在训练时偷看了测试数据的统计信息测试结果会偏乐观。这在做LSTM时间序列预测python项目时是最常被忽略的数据泄漏来源之一。注意两个例外收益率标签不要做标准化它已经是平稳序列标准化反而让预测结果失去可解释性sin/cos编码的周期性特征也不建议标准化它们的值域本来就在-1到1之间。特征列的标准化要在滑窗切分之前完成然后才构造2.2节的Dataset顺序反了会出现同一个窗口里混入不同scale的特征模型学起来非常痛苦。5. 常见问题与避坑外汇LSTM模型跑不通的五个翻车点5.1 现象训练loss降得很漂亮一测新数据就崩原因几乎都是数据泄漏最常见三种一是归一化时fit了全量数据二是验证集和训练集没有严格按时间切分用了随机分割三是在特征里混入了未来信息比如用t时刻的真实数据计算出tk时刻的指标再预测tk的标签。泄漏会让训练和验证指标全线虚高回测曲线漂亮得就像艺术品但实盘就是另一回事。解决办法是给数据管道加一道检查把测试集留到模型完全训练好之后再碰。我习惯把切分、标准化、滑窗封装成一个固定的数据类训练任何模型都走同一个入口最大程度避免人为把未来数据带进训练集。如果你发现自己“不小心”让某些逻辑同时用到了训练和测试数据不要犹豫立刻停下重写那段管道。5.2 现象loss完全不降或者剧烈震荡先排查网络输入shape。PyTorch报错常见的是(batch, seq_len, features)和(batch, features)的维度错配检查Dataset返回的x是不是(seq_len, len(feature_idx))。其次看学习率1e-3太大会让loss在前几个iteration剧烈震荡降到3e-4再看如果降到1e-5才稳住说明特征scale有问题回过去查归一化。第三个原因是梯度爆炸。H1数据偶尔会有一根巨大波动K线单一样本的loss能冲乱整个模型权重此时loss会突然跳到上一个数量级。解决就是3.2节里的clip_grad_norm_我把它当成LSTM外汇训练的必要项不是可选项。遇到loss不降时先打印几行x和y的统计值确认特征里没有NaN或inf再谈调参。5.3 现象预测曲线滞后真实曲线一期这是最典型、也最好认的翻车现场。当预测值和真实值画在同一张图上预测曲线就像真实曲线向右平移了一根K线意味着模型实际上在重复上一根K线的值这就是用价格做标签的必然结果。价格随机游走时最好的“预测”就是维持原价不变MSE已经最优方向准确率约等于掷硬币。解决办法就是2.3节说的改用收益率标签。如果已经用了收益率还是滞后检查是不是在恢复价格时出了问题或者损失函数被某个极端样本主导换HuberLoss再试。还有一个容易忽视的点如果你在滑窗里用了归一化后的价格做特征同时用价格做标签即使标签是差分后的收益率特征里的价格漂移也可能让模型走上“记忆昨天价格”的捷径所以特征里尽量少放原始价格。5.4 现象回归loss在降方向准确率一直卡在50%这说明模型在数值上逼近均值但没有捕捉到可交易的方向信号。外汇市场大部分时间在震荡价格走势接近随机游走50%的方向准确率其实是个常态基准不要因此怀疑代码有bug。你要做的不是加大模型而是先确认数据里到底有没有可预测性。常见做法是做一个朴素基准对比直接把上一个时刻的收益率当成预测值算出它的MAE和方向准确率作为底线。如果LSTM连这个底线都打不过问题在数据或特征不在网络。还可以把回归任务改成分类任务用CrossEntropyLoss预测“涨/跌/平”三分类很多情况下分类比回归更容易让模型抓住方向因为分类对数值精度不敏感更贴近交易决策本身。5.5 现象每次运行结果差很多复现不了外汇数据量小模型初始化、数据Loader的顺序、甚至CPU和GPU上的浮点误差都会导致训练结果不同。解决方法是固定随机种子包括python random、numpy和torch各自的seed并在PyTorch里关掉cudnn的自动benchmark。更稳妥的做法是保存每次训练的完整配置包括特征列表、seq_len、学习率、归一化参数这样即使复现失败也能定位是哪一步变了。严格固定seed并不能保证100%一致GPU本身的非确定性计算是客观存在的。所以我更推荐在项目里记录“指标范围”而不是“单次指标”比如同一个配置跑三次取方向准确率的均值作为判断依据比纠缠单次复现要实际得多。数据增强在这个场景里几乎没有意义别为了凑复现去微调随机种子那等于自欺欺人。6. walk-forward验证与交易成本模拟模型能不能真用6.1 walk-forward滚动验证的参考实现一次性把测试集跑完得到的指标往往偏乐观因为模型在训练中见过的市场环境可能和测试期高度相似。更接近实盘的做法是walk-forward用一段历史训练预测下一小段然后把这段真实数据并入训练集继续向前滚动。这样每次预测使用的都是过去的信息且市场环境不断更新。下面是一个参考实现def walk_forward(data, train_size, step, build_model, predict): total len(data) results [] start train_size while start step 1 total: train_data data.iloc[:start] test_data data.iloc[start: start step] model build_model(train_data) pred predict(model, test_data) results.append(evaluate_direction(pred, test_data)) start step return results参数说明train_size是第一次训练用到的样本数step是每次滚动验证的K线根数常见做法是step取seq_len的1~2倍比如seq_len240时step取500根H1。build_model接收训练数据并返回训练好的模型predict返回预测序列evaluate_direction直接比较预测收益率和真实收益率的符号返回方向准确率。walk-forward的缺点是训练次数多、耗时大好处是结果接近实盘不容易自欺欺人。做完预测验证还要过交易成本这一关。外汇常见的点差成本是1~2个pip如果模型预测的平均收益连成本都覆盖不了再高的方向准确率也白搭。每笔扣掉点差成本后再看累计收益、最大回撤和盈亏比三个值。方向准确率52%、盈亏比1.2、回撤控制在20%以内我才会觉得这个模型有继续迭代的价值如果只有方向准确率好看而扣成本后是负的那就该回去调整特征或者换预测周期了。把上面几步连起来你会得到一套相对诚实的工作流先定数据和标签再定模型和参数最后用walk-forward和成本核算验证。这个流程没有银弹LSTM做外汇预测本来就是从高噪声里找微弱信号能稳定跑通并知道自己每一步在做什么已经比大多数只会对着训练曲线嗨的人走得更远。我自己的习惯是保留一个baseline模型目录每次实验先跑朴素基准再跑LSTM只要LSTM打不过baseline就当这次实验失败这个习惯帮我避开了不少自我感动。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
RobustVideoMatting 完整训练指南:四阶段流水线、数据集构建与评测复现 人工智能深度学习计算机视觉视频处理 【免费下载链接】RobustVideoMatting Robust Video Matting in PyTorch, TensorFlow, TensorFlow.js, ONNX, CoreML! 项目地址: https://gitcode.com/gh_mirrors/ro/RobustVideoMatting 点击查看 免费下载 本文以 RobustVideoM… · 2026/9/25 1:50:14
Cursor Add Model 配置 TaoToken:settings.json 骨架与连通性验证 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:50:08
MP3的VBR编码如何判断?逐字节解析MPEG帧头与Xing Header完全指南 MP3的VBR编码如何判断?逐字节解析MPEG帧头与Xing Header完全指南 【免费下载链接】mp3tag4cj 一个用于读取、创建和修改MP3标签信息的库 项目地址: https://gitcode.com/Cangjie-TPC/mp3tag4cj
mp3tag4cj 是一个用仓颉语言编写的 MP3 标签处理库,… · 2026/9/25 1:50:08
TFLearn 快速上手:从高层 API 构建网络到扩展 TensorFlow 的完整实战指南 深度学习机器学习 【免费下载链接】tflearn Deep learning library featuring a higher-level API for TensorFlow. 项目地址: https://gitcode.com/gh_mirrors/tf/tflearn 点击查看 免费下载 本文是一份面向 TensorFlow 开发者的 TFLearn 快速上手指南。TFLearn 是… · 2026/9/25 2:22:30
命令注入漏洞实战指南:从原理探测到绕过与修复 翻了一下实验记录,上周在内网做授权测试时卡在一个输入框上:页面功能叫“网络连通性检测”,我随手把参数改成127.0.0.1|whoami,结果服务器直接把用户列表给我打回来了。这种操作在靶场里常见,但真实项目里遇到时还是会… · 2026/9/25 2:22:30
msModelSlim常见问题20问:FAQ终极汇总帮你避开量化路上的所有坑 msModelSlim常见问题20问:FAQ终极汇总帮你避开量化路上的所有坑 【免费下载链接】MindStudio-ModelSlim MindStudio-ModelSlim(msModelSlim)是MindStudio全流程工具链推出的模型量化压缩工具。 项目地址: https://gitcode.com/Ascend/msmod… · 2026/9/25 2:22:24
PaddleSpeech 中 ERNIE-SAT 跨语言语音合成与语音编辑实战:基于 VCTK 数据集的完整训练、合成与编辑指南 人工智能语音音频 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword… · 2026/9/25 2:22:24
Humanizer FluentDate 指南:使用 InDate.Six 编写 6 天/周/月/年后日期计算 开发工具 【免费下载链接】Humanizer Humanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities 项目地址: https://gitcode.com/gh_mirrors/hu/Humanizer 点击查看 免费下载 本篇技… · 2026/9/25 2:22:24
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37