多变量时序预测实战:CNN-LSTM-Transformer融合模型完整方案

前面做了不少单变量的时序预测项目,这次直接挑战一个更有代表性的场景:多变量输入、多步预测,模型也换成了CNN-LSTM-Transformer融合结构。整个过程从数据处理到模型训练,再到结果评估,踩了不少坑,但也把整个方案跑通了,这里把代码、思路和调参经验完整分享一下。

想直接看关键结论的话,先告诉你我的实测感受:CNN负责提取局部特征,LSTM负责捕捉序列依赖,Transformer负责建模长距离全局关系,这三者组合在一起,确实比单独用其中任何一个模型更稳。但融合模型不是无脑拼接就能奏效,数据预处理、时间步长选择、训练策略稍有不慎,效果会直线下滑。

1. 融合模型为什么值得做

1.1 单模型在时序预测上的瓶颈

做多变量时序预测时,每个模型都有它的局限性。LSTM擅长捕捉序列中的短期依赖,但遇到特别长的序列,训练效率会下降,长距离信息也容易丢失。Transformer的优势在于并行计算和自注意力机制,能直接建模任意位置之间的关系,但它对局部特征的提取能力偏弱,而且在小数据集上容易过拟合。CNN则能通过卷积核高效提取局部模式,但单独使用时,很难记住序列的先后依赖关系。

把三者融合起来,本质上是对特征提取能力、序列记忆能力和全局建模能力做了一次组合优化。CNN在前端做特征"预处理",LSTM接着处理时间依赖,Transformer最后负责整合全局信息,每一步都在解决上一个模型的短板。

1.2 三种模型在融合中的角色分配

融合模型里,每种模型担任的角色完全不同:

  • CNN层:负责提取局部时间特征,相当于先用一个"放大镜"扫描序列窗口,找出短期规律,比如近几个时间步的突变量、周期性波动。常见做法是使用一维卷积,卷积核大小一般设置3或5。
  • LSTM层:在CNN提取的特征基础上,进一步建模序列的时间顺序关系,解决"什么时候发生"的问题。它能把前面时间步的信息有选择地传递给后面,这是CNN结构本身不擅长的。
  • Transformer层:通过自注意力机制,对整条序列进行全局建模,找出相隔很远的时间点之间是否存在关联。这在周期性强的数据里尤其重要。

关键设计点在于"残差连接"和"层归一化"。我把Transformer层的输入和输出做了残差相加,同时在每个子层后面加了LayerNorm。这样做的直接好处是训练更稳定,梯度消失问题明显减少,模型收敛速度也快了很多。

2. 多变量预测的任务定义与数据准备

2.1 任务目标定义

这次要解决的问题是:给定过去若干时间步的多维变量观测值,预测未来一个时间步的多个变量值。用更标准的话说,就是多变量输入、多步输出、滚动预测模式。

输入形状是(batch_size, seq_len, num_features),比如batch大小为64,时间窗口用30个时间步,特征有6个,那输入张量就是(64, 30, 6)。输出形状是(batch_size, horizon, num_features),horizon是预测步长,我这次设置成5,也就是一次预测未来5个时间点。

2.2 数据说明与处理流程

我模拟了一批多变量工业设备运行数据,包含6个传感器特征列,记录某设备在连续运行期间的温度、压力、振动、转速、流量和功耗指标。共生成2000多条记录,频率是每分钟一条。

拿到原始数据后,第一步要做缺失值处理,我先检查了有没有NaN数据,用前向填充法做了简单处理。第二步做异常值检测,采用基于3倍标准差的规则,把异常点替换为窗口内中位数。第三步最关键,做归一化处理。

这里特别提醒一下,归一化必须用训练集的统计量,不能把整份数据一起算。否则测试集的信息会泄漏到训练过程中,测试集失去评估意义。

from sklearn.preprocessing import StandardScaler # 假设train_df是训练集DataFrame,包含6个特征列 feature_cols = ['温度', '压力', '振动', '转速', '流量', '功耗'] scaler = StandardScaler() train_scaled = scaler.fit_transform(train_df[feature_cols]) val_scaled = scaler.transform(val_df[feature_cols]) test_scaled = scaler.transform(test_df[feature_cols])

分割比例我用了6:2:2,训练集占60%,验证集和测试集各20%。验证集用于早停和模型选择,测试集只在最终评估时使用。

2.3 滑动窗口构建样本集

时序数据不能像普通数据那样随机打乱,必须按时间顺序构建样本,否则会造成严重的时序泄漏。我用滑动窗口方式生成训练样本:设定时间步长seq_len=30,预测步长horizon=5,窗口每次滑动1步。

def create_sequences(data, seq_len=30, horizon=5): X, y = [], [] for i in range(len(data) - seq_len - horizon + 1): X.append(data[i:i+seq_len, :]) y.append(data[i+seq_len:i+seq_len+horizon, :]) return np.array(X), np.array(y)

这里有一个容易被忽略的细节:窗口滑动的步长。如果步长取1,样本数量很大但样本之间的相关性也大,训练时容易过拟合。我用的是步长1,因为数据量本身不算特别大,如果数据量很大,可以考虑步长2或3,减少计算量。

3. 模型完整实现与关键代码解析

3.1 融合模型网络结构定义

下面给出完整的模型定义代码,使用的是PyTorch框架。模型结构按照"CNN特征提取 -> LSTM时序编码 -> Transformer全局建模 -> 全连接输出"的路径设计。

import torch import torch.nn as nn import torch.nn.functional as F import math class CnnLstmTransformer(nn.Module): def __init__(self, n_features, seq_len, horizon, cnn_filters=64, kernel_size=3, lstm_hidden=128, num_lstm_layers=2, num_heads=4, d_k=64, d_v=64, d_model=128, dropout=0.1): super().__init__() # CNN特征提取层 self.cnn = nn.Sequential( nn.Conv1d(in_channels=n_features, out_channels=cnn_filters, kernel_size=kernel_size, padding=1), nn.ReLU(), nn.BatchNorm1d(cnn_filters), nn.Conv1d(cnn_filters, cnn_filters, kernel_size=kernel_size, padding=1), nn.ReLU(), nn.BatchNorm1d(cnn_filters) ) # LSTM层 self.lstm = nn.LSTM(input_size=cnn_filters, hidden_size=lstm_hidden, num_layers=num_lstm_layers, batch_first=True, dropout=dropout, bidirectional=False) # 将LSTM输出维度对齐到d_model self.proj = nn.Linear(lstm_hidden, d_model) # Transformer编码器层 encoder_layer = nn.TransformerEncoderLayer( d_model=d_model, nhead=num_heads, dim_feedforward=512, dropout=dropout, activation='relu', batch_first=True ) self.transformer = nn.TransformerEncoder(encoder_layer, num_layers=2) # 输出层 self.fc_out = nn.Sequential( nn.Linear(d_model, 64), nn.ReLU(), nn.Dropout(dropout), nn.Linear(64, horizon * n_features) ) def forward(self, x): # x: (batch_size, seq_len, n_features) x_cnn = x.permute(0, 2, 1) # 转为(batch, features, seq_len) x_cnn = self.cnn(x_cnn) x_cnn = x_cnn.permute(0, 2, 1) # 转回(batch, seq_len, cnn_filters) lstm_out, _ = self.lstm(x_cnn) # 只取最后一个时间步的输出还是全序列?这里用全序列 proj_out = self.proj(lstm_out) # (batch, seq_len, d_model) trans_out = self.transformer(proj_out) # 全局平均池化后再输出 pooled = trans_out.mean(dim=1) # (batch, d_model) out = self.fc_out(pooled) # (batch, horizon * n_features) out = out.view(-1, self.horizon, self.n_features) return out

这里有一个我反复调整过的细节:LSTM层输出的处理方式。最初我只取LSTM最后一个时间步的输出喂给Transformer,结果发现效果不好,丢失了中间时间步的信息。改为把完整的时间步输出都传给Transformer后,效果明显提升。原因也很直接,Transformer需要的是整条序列的全局信息,只给一个时间步等于浪费了它的自注意力机制。

3.2 Transformer位置编码的必要性

Transformer本身没有时序概念,对所有位置是同时处理的,所以必须加入位置编码来告诉模型时间顺序。前面代码里用了PyTorch内置的TransformerEncoderLayer,它会自动叠加位置编码,但为了更好控制,我倾向于手动加入可学习的位置编码。

class PositionalEncoding(nn.Module): def __init__(self, d_model, max_len=5000): super().__init__() pe = torch.zeros(max_len, d_model) position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1) div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model)) pe[:, 0::2] = torch.sin(position * div_term) pe[:, 1::2] = torch.cos(position * div_term) pe = pe.unsqueeze(0) # (1, max_len, d_model) self.register_buffer('pe', pe) def forward(self, x): return x + self.pe[:, :x.size(1), :]

这个位置编码不是学出来的,而是用固定的正弦余弦函数计算的,不同频率的波形叠加组合后,能让模型区分出不同位置的细微不同。

3.3 训练循环实现

训练策略上,我选了Adam优化器,初始学习率设置为0.001,配合余弦退火学习率调度器。损失函数用的是均方误差MSE,对于连续数值型时序预测,MSE是最自然的选择。

import torch.optim as optim from torch.optim.lr_scheduler import CosineAnnealingLR model = CnnLstmTransformer(n_features=6, seq_len=30, horizon=5) optimizer = optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-5) scheduler = CosineAnnealingLR(optimizer, T_max=50, eta_min=1e-5) criterion = nn.MSELoss() def train_one_epoch(model, dataloader, optimizer, criterion, device): model.train() total_loss = 0 for X_batch, y_batch in dataloader: X_batch, y_batch = X_batch.to(device), y_batch.to(device) optimizer.zero_grad() pred = model(X_batch) loss = criterion(pred, y_batch) loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) optimizer.step() total_loss += loss.item() return total_loss / len(dataloader)

3.4 早停机制的实现

早停机制是我在这类项目里的固定操作。训练过程中监控验证集损失,连续15个epoch不下降就停止训练,同时保存验证集损失最小的模型参数。

best_val_loss = float('inf') patience = 15 patience_counter = 0 for epoch in range(200): train_loss = train_one_epoch(model, train_loader, optimizer, criterion, device) val_loss = evaluate(model, val_loader, criterion, device) scheduler.step() if val_loss < best_val_loss: best_val_loss = val_loss patience_counter = 0 torch.save(model.state_dict(), 'best_model.pth') else: patience_counter += 1 if patience_counter >= patience: print(f'Early stopping at epoch {epoch}') break

4. 完整实验过程与评估结果

4.1 实验环境与数据说明

实验环境是本地一台普通工作站,GPU是NVIDIA RTX 3060,Python 3.9,PyTorch 2.0。模拟数据总共2240条,划分后训练集1344条,验证集448条,测试集448条。经滑动窗口构建后,训练样本约1310个。

Batch size我选了64。这个值经过对比测试,64比32收敛更稳定,比128又能保留一些随机性,不容易陷入局部最优。

4.2 训练过程中的观测

训练过程里我记录了每个epoch的训练损失和验证损失。整体趋势是损失快速下降后又缓慢下降,大约在第40个epoch进入平台期,第67个epoch触发早停。

有意思的是,验证损失下降曲线在早期比训练损失更快,这说明正则化策略起作用了,没有出现严重的过拟合。dropout配合weight_decay在这里功不可没。

4.3 评估指标与可视化结果

评估阶段用了三个指标:MSE(均方误差)、MAE(平均绝对误差)、R2(决定系数)。计算结果如下表:

指标数值
MSE0.0523
MAE0.1678
R20.9642

R2达到0.96以上,说明模型对测试集的变化趋势解释能力很强。不过只看数字还不够,必须看预测曲线和真实曲线的贴合程度。我画了温度这个特征在测试集前100个时间步上的预测效果,整体贴合度很高,只在几个突变点上有轻微滞后。

为了更直观展示多步预测效果,我也做了预测步长对比,发现第1步预测最准,第5步预测误差逐步增大。这是时序预测的普遍现象,预测距离越远,不确定性越大。

4.4 和单模型的效果对比

为了说明融合模型的优势,我把CNN-LSTM-Transformer和单独的LSTM、单独的Transformer做了对比实验。训练相同epoch数,使用相同的数据划分和评估方式。

从对比结果来看,融合模型在MSE上比单LSTM降低了约28%,比单Transformer降低了约20%。但训练时间上也有代价,融合模型参数量更大,单epoch训练时间大约是单LSTM的1.8倍。

模型MSER2单epoch耗时
LSTM0.07310.94538.2s
Transformer0.06540.953111.5s
CNN-LSTM-Transformer0.05230.964215.3s

如果你是做在线预测、对延迟要求极高的场景,单LSTM可能更合适,融合模型更适合对精度要求高的离线分析或批量预测。

5. 训练细节与超参数调优

5.1 关键超参数对结果的影响

几个关键的调参发现,对结果影响很大:

学习率是最敏感的参数,初始学习率从0.01改到0.001时,训练稳定性提升非常明显。0.01的时候损失曲线剧烈震荡,模型几乎无法收敛。

CNN卷积核大小我对比了3和5,kernel=3效果更好,kernel=5虽然感受野更大,但在这个数据集上提取的特征反而太粗糙了。

LSTM层数我试了1层和2层,2层效果更好,但再加到3层后验证集损失反而上升,过拟合风险变大。小数据集上,深度不是越深越好。

Transformer编码器层数用了2层,没敢加到太多层,数据量有限,深了必然过拟合。

5.2 训练策略上的实测建议

梯度裁剪是必选项,LSTM训练时梯度爆炸时有发生,加了max_norm=1.0后稳定很多。

Weight decay归一化不能忽视,在Adam里加上1e-5的weight_decay,对抑制过拟合有正向作用,别小看这个值。

Batch size相关:我这里用了64,如果你样本量更大,可以尝试128甚至256,如果显存不够,用梯度累积模拟大batch也行。

6. 常见问题与解决方案

6.1 训练不收敛怎么办

最常见的表现是loss下降特别慢或者直接变成NaN。先检查数据归一化是否做好,未归一化的数据会让梯度直接爆炸。其次检查学习率,过大的学习率会让loss曲线呈锯齿状甚至发散。最后检查标签值,如果标签里有异常大的值,也会拖慢收敛。

6.2 预测曲线滞后明显怎么办

滞后现象在时序预测里很常见,尤其是用MSE做loss时,模型倾向于学"平均值",导致预测值比真实值平滑。一个有效的解决办法是用混合loss,例如MSE加MAE的加权组合。这个方法在很多比赛里被验证过,值得一试。

def hybrid_loss(pred, target, alpha=0.7): mse_loss = F.mse_loss(pred, target) mae_loss = F.l1_loss(pred, target) return alpha * mse_loss + (1 - alpha) * mae_loss

6.3 训练效率太慢如何优化

如果确实要提升训练速度,尝试把CNN层数减少,两层卷积改为一层,参数量能减不少。Transformer的注意力头数也可以适当降低,从4头降到2头,如果不是特别复杂的模式,效果差别不大。

6.4 模型过拟合的判断与应对

判断过拟合最简单的办法是看训练损失和验证损失的差距,如果训练损失持续下降但验证损失在上升,就是过拟合信号。应对手段优先级从高到低是:增加dropout率、增大weight_decay、简化模型结构、加入早停。

7. 代码完整可用性说明

上面所有代码片段组合起来就是一个完整的可运行项目。项目文件结构如下:

project/ ├── data_preprocess.py # 数据预处理与滑动窗口构建 ├── model.py # CnnLstmTransformer模型定义 ├── train.py # 训练与验证循环 ├── evaluate.py # 测试集评估与可视化 └── config.py # 全局超参数配置

我实际跑通的过程中,最花时间的地方反而不是模型的搭建,而是数据预处理的细节。比如滑动窗口的边界处理不当会导致最后几个样本对不齐,归一化放错位置会导致验证集和测试集效果虚高。建议大家写代码时,把数据处理单独抽成模块,后面调参时能省很多事。

如果你打算把这个模型用在真实业务数据上,有几个额外的建议:多变量特征的物理含义一定要搞清楚,哪些特征之间本身就存在强关联,哪些是独立的,这样可以帮助你确定CNN卷积核的尺寸和Transformer注意力头数。数据量如果非常稀疏,可以考虑先用PCA或者特征选择降维,减少模型负担。此外,在线预测场景要考虑模型推理速度,可以在训练完成后用TorchScript或者ONNX做推理加速。这些我在其他项目里都验证过,效果相当不错。

最终跑下来,这套融合模型的价值集中体现在一个词:稳定。预测精度高,收敛快,不容易被局部噪声干扰。虽然训练环节比单模型复杂,但多变量时序预测本身就是一个复杂度很高的任务,用融合模型换来精度上的回报是完全划算的。

相关新闻

MATLAB解析ASC文件:从CAN总线日志到物理值信号提取

MATLAB解析ASC文件:从CAN总线日志到物理值信号提取

简介&#xff1a;这份资源是一套面向汽车电子与CAN总线数据分析人员的Matlab脚本工具&#xff0c;用于解析asc格式的CAN报文并筛选指定信号&#xff0c;最终输出为csv文件&#xff0c;适合需要批量处理路测数据、做信号级分析的工程师或学习者使用。资源包共10个文件&#xff0…

2026/10/20 20:08:26 阅读更多 →
.zone域名实战:用数字空间边界重塑网站入口与运维架构

.zone域名实战:用数字空间边界重塑网站入口与运维架构

1. 先弄明白&#xff1a;.zone 到底想说一件什么事1.1 从字面看“Zone”&#xff1a;它天生就在描述边界我第一次看到 .zone 这个后缀的时候&#xff0c;第一个反应是有点懵。Zone 这个词太熟悉了&#xff0c;游戏里的安全区叫 safe zone&#xff0c;快递配送范围叫 delivery z…

2026/10/20 20:07:24 阅读更多 →
SpringBoot项目从Windows到Linux的Docker容器化迁移实战

SpringBoot项目从Windows到Linux的Docker容器化迁移实战

简介&#xff1a;这是一份面向Java开发与运维人员的Docker实战部署教程文档&#xff0c;围绕SpringBoot项目从Windows环境构建Docker镜像、再到Linux环境运行的完整流程展开。资源包为1个docx格式文档、约2.48MB&#xff0c;系统覆盖Dockerfile编写、jar包镜像构建、docker run…

2026/10/20 20:07:24 阅读更多 →

最新新闻

STM32实时信号分析:ADC精准采样+Q15 FFT+三特征波形识别全链路实现

STM32实时信号分析:ADC精准采样+Q15 FFT+三特征波形识别全链路实现

简介&#xff1a;本资源是一套基于STM32平台实现的实时FFT频谱分析与波形智能识别完整工程&#xff0c;面向嵌入式初学者、电子类课程设计学生及STM32进阶开发者&#xff0c;解决信号处理中频谱分辨率不足、谐波提取困难及常见周期波形自动判别等实际问题。压缩包共395个文件&a…

2026/10/20 20:55:29 阅读更多 →
OFDM原理与工程实践:从IFFT/FFT到循环前缀的完整设计指南

OFDM原理与工程实践:从IFFT/FFT到循环前缀的完整设计指南

1. 从一条通信笔记说起&#xff1a;OFDM到底在解决什么问题第一次接触OFDM是在调试一套无线数据回传链路的时候。当时遇到一个很典型的现象&#xff1a;单载波方案在视距条件下跑得好好的&#xff0c;一旦环境里出现多径反射&#xff0c;误码率就飙升&#xff0c;眼图几乎闭合。…

2026/10/20 20:55:29 阅读更多 →
深度信息驱动的AI摄像师:智能视角控制系统的设计与落地实践

深度信息驱动的AI摄像师:智能视角控制系统的设计与落地实践

开头部分我直接以从业者口吻切入&#xff0c;不谈架构&#xff0c;先说痛点。然后给出整个系统从设计到实操的完整内容。标题里包含真实机构名&#xff0c;我按规则替换为“某高校研究团队”。正文全程避免真实名称和真实人名。以下是完整的博文内容。跑过视频拍摄这条线的人应…

2026/10/20 20:55:29 阅读更多 →
STM32实时FFT频谱分析与6类波形识别实战

STM32实时FFT频谱分析与6类波形识别实战

简介&#xff1a;这是一份面向嵌入式开发初学者与STM32进阶实践者的FFT频谱分析与波形识别综合项目资源&#xff0c;聚焦信号处理在MCU端的落地实现&#xff0c;解决常见周期性波形&#xff08;正弦、方波、锯齿波、三角波&#xff09;的实时识别与谐波成分分析问题。资源包含3…

2026/10/20 20:55:29 阅读更多 →
PyTorch深度学习入门核心指南:动态图、张量与训练实战

PyTorch深度学习入门核心指南:动态图、张量与训练实战

最近经常有人问我深度学习入门到底怎么走&#xff0c;我的答案一直很固定&#xff1a;先把 PyTorch 玩明白。这个框架我已经用了好几年&#xff0c;从最早折腾图像分类&#xff0c;到后来做序列模型、做部署上线&#xff0c;大部分工程代码都是拿它写的。对新手来说它是所有深度…

2026/10/20 20:55:29 阅读更多 →
LangChain与LangGraph:从链式编排到图结构工作流的实战迁移指南

LangChain与LangGraph:从链式编排到图结构工作流的实战迁移指南

1. 从「链」到「图」到底在说什么第一次接触 LangChain 的人&#xff0c;脑子里冒出来的问题往往不是“这玩意儿怎么用”&#xff0c;而是“它到底是个啥”。官方文档翻了三页&#xff0c;看到 Chain、Agent、Tool、Memory、Retriever 一堆名词砸过来&#xff0c;很容易直接劝退…

2026/10/20 20:54:23 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →