LSTM时间序列预测实战:Python完整实现与调参指南
简介Python基于LSTM神经网络的时间序列预测项目面向机器学习初学者、数据分析师以及需要做预测建模的开发者解决时间序列数据清洗、特征构造与回归预测等实际问题。模型基于TensorFlow和Keras接口搭建采用LSTM循环神经网络完整覆盖数据清洗、特征提取、建模训练、评估与预测输出全流程适合用于空气质量、气象、电力负荷等常见时间序列场景。压缩包共129个文件以78个Python脚本为核心包含数据读取、预处理、特征工程、模型定义、训练与预测等模块26个CSV文件提供原始与清洗后的样本数据另有模型保存文件h5、meta、index、checkpoint及说明文档整体大小仅5.42MB便于快速下载和本地运行。已有7271人学习下载这套材料经过较多学习者验证参考价值较高。通过该包可获得可直接运行的LSTM预测代码、真实污染数据集、完整的训练脚本与模型权重并可根据自身数据替换和扩展帮助读者快速掌握LSTM时间序列预测的完整流程是开展相关实验和项目的有力参考资料。1. LSTM 时间序列预测这份 Python 资源能解决什么问题时间序列预测大概是 LSTM 在工业场景中落地最直接的类型原因在于普通前馈神经网络把每个时间点当成独立样本很难抓住前后依赖而 LSTM 在门控结构里保留了“记忆”可以把过去若干个时刻的走势编码成一个隐状态再用这个隐状态回归出未来值。这套 Python 资源就是一条完整的 LSTM 时间序列预测链路从数据读取、滑窗、归一化到模型训练、评估、多步预测全部有可跑的代码做支撑。它的核心价值是省掉拼代码的时间。如果你手里已经有一份“日期 数值”的历史数据想预测未来几步又不想从零搭 PyTorch 训练框架那这份资源正好接得住。适合两类人一类是刚接触 LSTM 的 Python 开发者想对照完整实现学习参数和训练流程另一类是做数据分析、需要把预测模型快速嵌套进自己项目的工程师。资源本身不提供“万能参数”但会告诉你参数怎么选、训练看什么曲线、预测结果怎样才算真收敛而不是丢给你一个无法解释的黑匣子脚本。2. 数据预处理与滑窗把一维序列变成 LSTM 能消费的三维输入2.1 为什么必须滑窗从普通回归到序列建模的本质变化全连接网络做预测时特征往往是一些散落的属性样本之间没有顺序概念。LSTM 的输入却必须是序列结构PyTorch 里 LSTM 默认接受(seq_len, batch, input_size)三维张量工程上为了取数据方便通常会设batch_firstTrue让形状变成(batch, seq_len, input_size)。所谓滑窗就是从时间序列上截取连续的一段历史作为“目光所及”用这段历史预测接下来的目标值窗口长度seq_len直接决定模型最多能回看多远。滑窗大小不能拍脑袋。如果数据有明显周期窗口设到周期的 24 倍通常效果更好如果没有周期我一般会先做一阶差分观察自相关衰减到不显著的位置那个滞后阶数就是有效窗口的下限。更稳妥的做法是先用seq_len 2 * 周期跑通再通过验证集误差确定要不要继续加长。窗口太短会丢失长期依赖窗口太长不仅训练变慢还会让模型学到过多无关噪声。def make_dataset(data, seq_len, pred_len1): X, y [], [] for i in range(len(data) - seq_len - pred_len 1): X.append(data[i : i seq_len, :]) y.append(data[i seq_len : i seq_len pred_len, 0]) return np.array(X), np.array(y)参数说明data必须是二维数组形状为(时间步数, 特征数)即使只有单变量也要保持(N, 1)而不是一维数组否则后面的张量转换会到处报维度错。seq_len是回看窗口长度pred_len是预测步数单步预测时取 1。函数返回的X形状为(样本数, seq_len, 特征数)y形状为(样本数, pred_len)这两个数组可以直接放进 PyTorch 的TensorDataset。2.2 Min-Max 归一化数据尺度直接决定能不能收敛LSTM 的门结构全部基于 tanh 和 sigmoid 激活输入数值一旦过大或者出现长尾分布很容易把激活推到饱和区梯度趋近于零训练基本走不动。常见做法是用 Min-Max 归一化把数值压到[0, 1]附近这比 Z-score 更适合默认激活函数下的 LSTM 收敛。from sklearn.preprocessing import MinMaxScaler scaler MinMaxScaler(feature_range(0, 1)) norm_values scaler.fit_transform(raw_values)参数说明feature_range可以取(0, 1)也可以取(-1, 1)后者配合输出层 tanh 时会让梯度更饱满但对回归头是线性层时差别不大。真正要命的坑是 fit 的对象——同一份数据切分之后只能让训练集fit_transform验证集和测试集只能用同一个 scaler 做transform。如果先在完整序列上 fit 再切分测试集的最小值、最大值已经混进了训练统计量属于典型的数据泄漏后面算出来的指标会虚高。2.3 训练集/测试集划分时间序列数据不能 shuffle分类任务里随机打乱样本没问题时间序列一旦 shuffle前后依赖就被破坏了模型等于偷看了未来信息。正确方式是按时间顺序切分前 70% 做训练中间 10% 做验证最后 20% 做测试并且切分必须发生在滑窗之前。train_ratio, val_ratio 0.7, 0.1 total len(norm_values) train_end int(total * train_ratio) val_end int(total * (train_ratio val_ratio)) X_train, y_train make_dataset(norm_values[:train_end], seq_len, pred_len) X_val, y_val make_dataset(norm_values[train_end:val_end], seq_len, pred_len) X_test, y_test make_dataset(norm_values[val_end:], seq_len, pred_len)参数说明train_end和val_end是按时间顺序切出的索引边界不参与任何随机采样。滑窗前先切分是为了保证训练窗口不会截取到测试段的未来数据。需要注意最后一个测试样本不一定能凑出完整窗口如果末尾数据不够丢掉尾部一小段即可不要为了凑样本把切分边界往回挪。3. 从 nn.LSTM 到能收敛的预测模型网络结构与训练配置3.1 核心参数input_size、hidden_size、num_layers、batch_firstLSTM 建模时最容易纠结的就是四个参数下面这张表把选型逻辑说清楚。参数含义常见取值与建议input_size每个时间步输入的特征维度单变量为 1多变量等于特征列数hidden_size隐状态向量维度32/64 起步数据量大可加到 128num_layersLSTM 堆叠层数13 层2 层以上必须配合 dropoutbatch_first输入形状接口设为 True让张量按 (batch, seq_len, input_size) 排布dropout层间随机失活00.3仅 num_layers 1 时生效input_size在预处理时已经定死不需要额外调节。hidden_size不能盲目加大时间序列样本量通常没有图像那么多64 起步、验证集不降再往上加是比较务实的路径。num_layers超过 3 层在工业数据上收益很小反而更容易把训练噪声学进去。batch_firstTrue是 PyTorch 里用起来最顺手的设置省去batch和seq_len换来换去的麻烦。3.2 搭建 LSTM 回归模型输出层设计时间序列预测属于回归任务不是分类模型最后不需要 softmax而是把最后一个时间步的隐状态接到一个线性层上输出一个标量。import torch import torch.nn as nn class LSTMPredictor(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size1): super().__init__() self.lstm nn.LSTM( input_sizeinput_size, hidden_sizehidden_size, num_layersnum_layers, batch_firstTrue, ) self.regressor nn.Linear(hidden_size, output_size) def forward(self, x): # x 形状: (batch, seq_len, input_size) out, _ self.lstm(x) last_out out[:, -1, :] return self.regressor(last_out)参数说明out[:, -1, :]表示取每个样本在最后一个时间步的隐状态它浓缩了整个回看窗口的信息。用最后一个隐状态而不是全部状态做平均在大多数单步预测任务里更稳定。如果要做多步预测可以把output_size直接设成目标步数一次性输出多个未来值但多个输出之间误差相关性很强实际项目里更常见的是递归预测这个在第 6 章展开。3.3 训练循环MSELoss、Adam 与学习率配合LSTM 回归默认用均方误差部分带明显离群值的数据可以换成 Huber Loss。优化器选择 Adam初始学习率1e-3是通用起点loss 震荡时降到1e-4。from torch.utils.data import DataLoader, TensorDataset dataset TensorDataset( torch.tensor(X_train, dtypetorch.float32), torch.tensor(y_train, dtypetorch.float32).view(-1, 1), ) loader DataLoader(dataset, batch_size32, shuffleFalse) model LSTMPredictor(input_sizeX_train.shape[2], hidden_size64, num_layers2) criterion nn.MSELoss() optimizer torch.optim.Adam(model.parameters(), lr1e-3) for epoch in range(50): model.train() for batch_x, batch_y in loader: optimizer.zero_grad() pred model(batch_x) loss criterion(pred, batch_y) loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0) optimizer.step() print(fepoch {epoch 1}, loss {loss.item():.6f})参数说明shuffleFalse在这里不是必须的因为滑窗样本本身是顺序生成批量顺序不影响窗口内的时序关系但关掉它便于复现结果。clip_grad_norm_给梯度范数设上限防止长时间序列反向传播时梯度爆炸尤其是seq_len超过 100 的场景。50 个 epoch 只是起点真正应该结合验证集做早停而不是死跑固定轮数。如果验证集误差连续多个 epoch 不降更好的做法是接入学习率衰减scheduler torch.optim.lr_scheduler.ReduceLROnPlateau( optimizer, modemin, factor0.5, patience5 ) # 每个 epoch 结束后执行: scheduler.step(val_loss)factor0.5表示验证损失连续 5 个 epoch 不改善时学习率减半。配合patience10的早停基本能把训练停在最佳泛化点附近。4. 常见问题排查LSTM 时间序列预测五个翻车现场4.1 预测曲线比真值滞后一拍现象拟合图里预测曲线和真实曲线的形状高度重合但整体向右平移了一个时间步RMSE 看起来还不错。原因当序列自相关性非常强时模型的最优策略就是“抄最近值”这是回归模型的统计本性不完全是网络结构问题。解决不要只看单步 RMSE 就自我满足用残差图确认——残差如果还存在明显自相关说明时序模式没被充分建模。可以尝试加长seq_len、对输入做一阶差分预测增量或者把预测目标从 y 改成y_t - y_{t-1}。4.2 训练 loss 震荡不降甚至出现 NaN现象训练刚开始 loss 就进入 NaN或者长时间在 0.1 附近上下震荡不收敛。原因数据没归一化、学习率过高、梯度爆炸三个因素经常同时出现。窗口越长反向传播跨过的时间步越多梯度累加后越容易爆炸。解决先确认数据过了 Min-Max 归一化再检查梯度裁剪是否生效最后把学习率降到3e-4跑 5 个 epoch。如果恢复正常再逐步调大学习率。我一般会在训练循环里加一行打印torch.abs(p.grad).max()直观看到梯度量级。4.3 训练集拟合很好测试集全是噪声现象训练损失持续下降测试损失极高预测曲线在测试段完全失去周期性。原因过拟合吸收了训练数据里的高频噪声另一种常被忽略的情况是测试段的数据分布本身发生了变化也就是数据漂移。解决先给模型加dropout0.2、降低hidden_size、开启早停。如果效果仍然差对比训练段和测试段的均值与方差确认数据本身是否在同一水平线上。时间序列项目里“模型突然失效”很多时候是测试段数据分布变化不是网络写错了。4.4 维度报错shape mismatch 反复出现现象报错集中在Expected input batch_size to match target size或mat1 and mat2 shapes cannot be multiplied。原因输入没转成三维张量或者目标没有 reshape 成(batch, output_size)。解决在喂给模型之前打印x.shape和y.shape规范形式应该是x(batch, seq_len, features)、y(batch, 1)。最常见的问题出现在 make_dataset 返回单变量序列时形状丢了维度用.reshape(-1, 1)或.view(-1, 1)补齐即可。4.5 归一化与切分顺序颠倒导致数据泄漏现象验证集和测试集指标好得不真实但稍微改动输入范围效果立刻崩坏。原因在全量数据上先fit_transform再切分测试集的统计信息提前被模型使用。解决切分必须发生在归一化之前代码顺序固定为“先切分再scaler.fit_transform(训练集)最后transform(验证集/测试集)”。这是工程验收时最容易暴露的问题也是新手最容易踩的暗坑。5. 完整复现路径把这份资源跑在自己的数据上5.1 拿到资源包后先分清哪些文件要改、哪些不要动一套完整落地可复现的资源包通常按数据、预处理、模型、训练、评估划分模块。拿到包以后不要急着改模型结构先跑通 sample 数据再替换成自己的数据否则你很难分清报错来自代码还是来自原始数据。模块作用拿到以后怎么处理data 目录存放历史数据替换成自己的 CSV/Excel保留时间列数值列预处理脚本解析、归一化、滑窗改文件路径、特征列名、seq_len模型定义LSTM 网络结构一般不用改动训练脚本训练主循环调整 epoch、lr、batch_size评估脚本预测、反归一化、指标按自己的预测步数调整输出格式requirements.txtPython 依赖按列表安装后再执行主脚本替换数据后第一件事是确认时间列和数值列的 dtypepandas 读进来经常是 object 类型需要提前用pd.to_datetime转换。特征选择上先用单变量跑通再逐步加入其他特征列对比效果。5.2 主线代码从 CSV 到预测结果把前几章的散落片段拼成一条完整主流程import pandas as pd import numpy as np import torch from torch.utils.data import DataLoader, TensorDataset from sklearn.preprocessing import MinMaxScaler # 1. 读取数据 df pd.read_csv(data/your_series.csv, parse_dates[time]) raw df[[value]].values.astype(np.float32) # 2. 按时间顺序切分再归一化 train_end int(len(raw) * 0.7) val_end int(len(raw) * 0.8) scaler MinMaxScaler(feature_range(0, 1)) train_scaled scaler.fit_transform(raw[:train_end]) val_scaled scaler.transform(raw[train_end:val_end]) test_scaled scaler.transform(raw[val_end:]) # 3. 滑窗构造样本 seq_len 24 X_train, y_train make_dataset(train_scaled, seq_len) X_val, y_val make_dataset(val_scaled, seq_len) X_test, y_test make_dataset(test_scaled, seq_len) # 4. 数据装载与模型初始化 train_loader DataLoader( TensorDataset( torch.tensor(X_train), torch.tensor(y_train).view(-1, 1), ), batch_size32, ) model LSTMPredictor(input_size1, hidden_size64, num_layers2) # 5. 训练循环见前文这里省略中间步骤 # 6. 预测与反归一化 model.eval() with torch.no_grad(): pred_norm model(torch.tensor(X_test)).numpy() pred scaler.inverse_transform(pred_norm) true scaler.inverse_transform(y_test.reshape(-1, 1))参数说明parse_dates指定时间列名避免后续排序出问题。seq_len24适合小时级数据对应一天周期如果是日级数据通常从 7 或 30 起步。最后一步scaler.inverse_transform把归一化预测值还原到原始单位指标计算必须在这个尺度上进行否则 RMSE 和 MAE 都不可读。5.3 评估指标RMSE、MAE、R²from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score rmse mean_squared_error(true, pred, squaredFalse) mae mean_absolute_error(true, pred) r2 r2_score(true, pred) print(fRMSE: {rmse:.4f}, MAE: {mae:.4f}, R2: {r2:.4f})参数说明老版本 sklearn 不支持squaredFalse可以改写成np.sqrt(mean_squared_error(true, pred))。RMSE 和 MAE 不能脱离数据尺度谈好坏最好的办法是同时算一个基线——比如“用最后一个观测值重复作为预测”LSTM 的误差显著低于基线才说明序列建模是有价值的。6. 多步预测与滚动验证避免单点指标自嗨6.1 从单步到多步递归预测实现很多任务要的不是下一步而是未来 3 步、5 步甚至 20 步的预测。最简洁的做法是递归预测——把模型刚算出的值接回窗口尾部让下一次预测基于这个新窗口继续外推。def recursive_forecast(model, init_window, steps, scaler): model.eval() window torch.tensor(init_window, dtypetorch.float32).view(1, -1, 1) preds [] with torch.no_grad(): for _ in range(steps): p model(window).item() preds.append(p) window torch.tensor( np.append(window[0, 1:, 0], p), dtypetorch.float32, ).view(1, -1, 1) return scaler.inverse_transform(np.array(preds).reshape(-1, 1))参数说明window[0, 1:, 0]丢掉最早一个时间步把新预测值放到队列尾部让窗口长度始终保持seq_len。递归预测的误差会逐次累积步数越多曲线越平滑、偏离越大这是自回归式预测的共性现象不一定是模型坏了。预测步数超过 20 时建议改用多输出结构让模型并行生成多步结果。6.2 滚动验证用误差曲线判断模型可信度单点 RMSE 无法回答“这个模型能预测多远的未来”。我每次跑完 LSTM 项目都会额外做一次滚动验证从测试集起点开始分别预测 1 步、3 步、5 步、10 步记录每一步的误差变化。随着步数增加误差平稳上升说明模型学到了真实规律误差在早期就剧烈跳变说明窗口长度或模型结构撑不住这个预测跨度。从那以后我每次复现时间序列项目都会强制走一遍“先切分、再归一化、最后滚动验证”的顺序全程跑下来也就多花几分钟但滞后预测、数据泄漏这类问题基本都能在成稿前拦下来。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Vue3大文件分块上传实战:从切片到断点续传

Vue3大文件分块上传实战:从切片到断点续传

做了多年前端,跟“文件上传”死磕的次数实在不少。尤其是这两年做后台管理系统和数据中台项目,动不动就是几个G的日志、压缩包、数据库备份。直接把文件怼到FormData里再post上去?要么浏览器内存直接告警,要么后端接口超时崩溃&am…

2026/10/2 21:08:22 阅读更多 →
解析错误排查:DOM ParseError Obj 的核心场景与避坑指南

解析错误排查:DOM ParseError Obj 的核心场景与避坑指南

上周在处理一个混合型前端项目时,控制台突然抛出一条让我懵了几秒的错误:“DOM ParseError Obj”。报错信息不长,但排查起来牵扯出的问题却一点都不少——先是怀疑手写的 DOMParser 解析逻辑,又怀疑后端返回的 JSON 序列化数据&am…

2026/10/2 21:08:22 阅读更多 →
Canvas画圆点避坑指南:从坐标、arc到粒子动画与高清屏优化

Canvas画圆点避坑指南:从坐标、arc到粒子动画与高清屏优化

我第一次用Canvas画圆点是在做一个小工具的时候。需求特别简单:用户在页面上每点一下,就在对应位置留下一个圆点。当时我觉得半小时就能搞定,结果足足折腾了两天。一开始是画不出圆,后来是坐标对不上,再后来发现屏幕上…

2026/10/2 21:08:22 阅读更多 →

最新新闻

如何调试正在运行的Python程序

如何调试正在运行的Python程序

对当前正在运行的程序执行调试操作的办法, 主要涵盖以下几个层面, 一方面是借助于程序内置的调试器pdb这个工具, 另一方面是使用集成开发环境本身所附带的用来进行调试的相关功能模块, 再就是通过在代码中间插入用于记录状态的日志信息, 最后还可以启用外部的专用调试设施比如V…

2026/10/2 21:43:50 阅读更多 →
云晖达中墨出海成功案例是否真实可靠

云晖达中墨出海成功案例是否真实可靠

深圳云晖达国际贸易有限公司,作为深耕中墨制造业出海领域的专业服务商,聚焦计划赴墨西哥投资布局的国内制造企业,提供从前期调研到本地运营的一站式全周期出海解决方案,助力国内制造企业把握USMCA政策红利,顺利落地墨西…

2026/10/2 21:43:50 阅读更多 →
Grafana页面告警配置实战:从阈值到通知策略的完整链路

Grafana页面告警配置实战:从阈值到通知策略的完整链路

前两周有个运维同事跑来找我,说自己 Grafana 面板做得挺漂亮,CPU 阈值画到了 85,可机器负载到 95% 半天了,手机上一个告警都没收到。我过去看了一眼就发现问题了:他把 Dashboard 面板里的阈值线当成了告警开关&#xf…

2026/10/2 21:43:50 阅读更多 →
掌握这8个后端技巧,开发效率翻倍

掌握这8个后端技巧,开发效率翻倍

契约先行,接口定义清楚再动手别急着写实现。先用OpenAPI或Swagger把接口的入参、出参、错误码定死。前端拿着文档并行开发,你按契约实现。接口是团队之间的合同,合同不清,扯皮不断。 契约先行,省掉的是联调时的来回拉锯…

2026/10/2 21:43:50 阅读更多 →
降重降AI两不误!2026这3款降AIGC工具太好用了!

降重降AI两不误!2026这3款降AIGC工具太好用了!

谁还在为AI生成论文的AI率太高发愁?明明用AI省了时间,结果查重时AIGC率超标,直接被老师打回重写,熬夜改到崩溃真的太窒息了!最近被问最多的就是“有没有可以自动降AI率的论文生成工具”,作为过来人&#xf…

2026/10/2 21:42:50 阅读更多 →
AutoRef:多参考图驱动的Agentic图像生成工作流

AutoRef:多参考图驱动的Agentic图像生成工作流

1. 项目概述:AutoRef不是又一个图像生成玩具,而是多参考图协同驱动的智能体工作流引擎AutoRef这个名字乍一听像某个开源小工具,但拆开看——“Auto”指向自动化决策,“Ref”是Reference的缩写,合起来直译就是“自动参考…

2026/10/2 21:42:50 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 6:09:11 阅读更多 →