时间卷积网络TCN时序预测实战:从零用PyTorch跑通并避坑
简介这份资源面向初级及以上水平的数据科学家、机器学习爱好者以及希望深入掌握时间序列预测落地方法的从业者核心是用Python与TensorFlow搭建时间卷积神经网络TCN解决未来数值走向预测问题尤其适合外汇等金融市场趋势的长期数据分析场景。资源以单个docx文档交付压缩包约31KB内容涵盖TCN原理讲解、环境准备、数据预处理、模型构建与训练、预测结果可视化等完整流程并给出TCN与RNN两种网络预测效果的直接对比图便于理解因果卷积与膨胀卷积在捕捉长程依赖上的优势。读者可据此获得一套可复现的项目实例包括模拟外汇数据生成、归一化与时间步切分、TCN与LSTM模型代码及执行结果截图既能对照调整参数提升精度也能迁移到其他序列预测任务。目前已有171人学习。1. 时间卷积网络做时序预测为什么它比 LSTM 更值得你花一个下午跑通如果你手头有一批带时间戳的传感器数据、销量数据或者流量数据想预测未来一段时间的走势大概率第一反应是上 LSTM 或者 Transformer。但真正跑过几轮的人会发现LSTM 训练慢、调参玄学、长序列还容易遗忘Transformer 虽然强但数据量不够时容易过拟合推理成本也不低。时间卷积神经网络Temporal Convolutional NetworkTCN就是在这个夹缝里被反复验证过的一条路它用一维因果卷积加膨胀卷积堆叠配合残差连接在多个公开时序预测任务上做到和 LSTM 持平甚至更好同时训练更稳、并行度更高。这篇文章不讲空泛概念而是带你从零用 Python 把 TCN 跑起来包含完整的模型定义、数据构造、训练循环和预测评估。适合已经会写 PyTorch 基础代码、想找一个能直接复现的时序预测方案的工程师。读完你能拿到一份可运行的代码骨架知道每个参数为什么这么设以及哪些坑我踩过。2. TCN 的核心机制与选型理由因果卷积、膨胀卷积和残差块到底在干什么2.1 为什么时序预测需要因果卷积而不是普通一维卷积普通一维卷积在计算输出位置 t 时会同时看到 t 之前和 t 之后的信息。放到时序预测里这等于让模型偷看未来训练指标很好看上线就崩。因果卷积Causal Convolution的做法很简单在卷积核左侧补零右侧不补保证输出位置 t 只依赖输入位置 t 及之前的值。用 PyTorch 实现时关键就是padding (kernel_size - 1) * dilation只加在左边。常见做法是用nn.Conv1d配合手动左侧 padding或者用paddingsame再裁掉右侧多余部分。我一般直接写一个Chomp1d层把右侧多出来的时间步切掉逻辑清晰且不容易出错。import torch import torch.nn as nn class Chomp1d(nn.Module): 裁掉卷积右侧多出来的时间步保证因果性 def __init__(self, chomp_size): super().__init__() self.chomp_size chomp_size def forward(self, x): # x shape: (batch, channels, time) if self.chomp_size 0: return x return x[:, :, :-self.chomp_size].contiguous()这段代码的作用是当卷积核大小大于 1 时nn.Conv1d会在两侧都补零右侧补出来的部分对应的是“未来”信息必须切掉。chomp_size等于(kernel_size - 1) * dilation这个值在每一层膨胀卷积里都不一样所以要在构造时算好传进去。2.2 膨胀卷积如何在不增加参数量的前提下扩大感受野如果只用普通因果卷积要覆盖 100 个时间步的历史要么堆 100 层要么用很大的卷积核参数量和计算量都爆炸。膨胀卷积Dilated Convolution的思路是在卷积核元素之间插入空洞让同样的卷积核覆盖更宽的时间范围。膨胀系数按 1、2、4、8 这样指数增长几层之后感受野就能覆盖几百个时间步。举个例子卷积核大小 3膨胀系数依次为 1、2、4、8四层之后感受野是 1 2*(3-1)*(1248) 61 个时间步。如果继续加到 16感受野就超过 120。这意味着你不需要很深的网络就能看到足够长的历史。参数设置上我一般会先根据序列长度反推需要的层数。公式是感受野 1 2*(kernel_size-1)sum(dilations)。假设你的输入序列长度是 168比如一周的小时级数据那感受野至少要覆盖 168取 kernel_size3dilations[1,2,4,8,16,32]感受野 1 22*(12481632) 253足够覆盖。层数就是 6 层不算深训练也快。2.3 残差块为什么是 TCN 能堆深的关键TCN 的每个残差块包含两层膨胀因果卷积、权重归一化、ReLU 和 Dropout最后把输入通过一个 1x1 卷积如果通道数不一致加到输出上。这个设计让梯度能直接回传到浅层避免深层网络退化。我见过有人把残差连接去掉结果堆到 8 层以上训练 loss 就不降了。加上残差之后同样深度收敛稳定很多。另外Dropout 放在每个残差块内部而不是只在最后加一层对时序数据的正则化效果更明显。一般 Dropout 设 0.1 到 0.2数据量小就取 0.2数据量大可以降到 0.05。class TemporalBlock(nn.Module): TCN 残差块两层膨胀因果卷积 残差连接 def __init__(self, n_inputs, n_outputs, kernel_size, stride, dilation, padding, dropout0.2): super().__init__() self.conv1 nn.Conv1d(n_inputs, n_outputs, kernel_size, stridestride, paddingpadding, dilationdilation) self.chomp1 Chomp1d(padding) self.relu1 nn.ReLU() self.dropout1 nn.Dropout(dropout) self.conv2 nn.Conv1d(n_outputs, n_outputs, kernel_size, stridestride, paddingpadding, dilationdilation) self.chomp2 Chomp1d(padding) self.relu2 nn.ReLU() self.dropout2 nn.Dropout(dropout) self.net nn.Sequential( self.conv1, self.chomp1, self.relu1, self.dropout1, self.conv2, self.chomp2, self.relu2, self.dropout2 ) # 1x1 卷积调整通道数保证残差相加时维度一致 self.downsample nn.Conv1d(n_inputs, n_outputs, 1) if n_inputs ! n_outputs else None self.relu nn.ReLU() self.init_weights() def init_weights(self): self.conv1.weight.data.normal_(0, 0.01) self.conv2.weight.data.normal_(0, 0.01) if self.downsample is not None: self.downsample.weight.data.normal_(0, 0.01) def forward(self, x): out self.net(x) res x if self.downsample is None else self.downsample(x) return self.relu(out res)这段代码里padding参数等于(kernel_size - 1) * dilation保证卷积后时间步长度不变再通过Chomp1d切掉右侧多余部分。downsample只在输入输出通道不一致时启用用 1x1 卷积把残差分支的通道数对齐。权重初始化用正态分布小方差是 TCN 原论文里的做法实测比默认初始化收敛更稳。3. 用 PyTorch 搭一个可训练的 TCN从数据构造到模型定义的完整步骤3.1 构造滑动窗口数据集输入长度和预测长度怎么定时序预测的数据集构造核心是把一条长序列切成多个 (输入窗口, 目标窗口) 对。假设原始序列是单变量长度 10000输入长度 168预测长度 24那每个样本的输入是 168 个连续点目标是紧接着的 24 个点。步长一般取 1这样样本数最多如果数据量太大可以取步长等于预测长度来降采样。import numpy as np import torch from torch.utils.data import Dataset, DataLoader class TimeSeriesDataset(Dataset): def __init__(self, series, input_len168, pred_len24, stride1): series: 一维 numpy 数组已归一化 input_len: 输入窗口长度 pred_len: 预测窗口长度 stride: 滑动步长 self.series torch.tensor(series, dtypetorch.float32) self.input_len input_len self.pred_len pred_len self.stride stride self.indices list(range(0, len(series) - input_len - pred_len 1, stride)) def __len__(self): return len(self.indices) def __getitem__(self, idx): start self.indices[idx] x self.series[start : start self.input_len] y self.series[start self.input_len : start self.input_len self.pred_len] # 增加通道维度Conv1d 要求 (channels, time) return x.unsqueeze(0), y这里input_len和pred_len是最关键的两个参数。输入长度至少要覆盖一个完整周期比如日周期数据取 24 的倍数周周期取 168。预测长度取决于业务需求但不要超过输入长度的一半否则模型没有足够历史信息支撑。我一般会先画一下自相关图ACF看序列在哪个滞后阶数之后相关性明显下降输入长度取那个阶数的 2 到 3 倍。3.2 定义 TCN 主体层数、通道数和卷积核大小的搭配有了残差块整个 TCN 就是把多个块按膨胀系数递增堆起来。通道数一般取 32 或 64层数根据感受野需求定。下面是一个完整的 TCN 类class TCN(nn.Module): def __init__(self, input_size1, output_size1, num_channels[32, 32, 32, 32], kernel_size3, dropout0.2): super().__init__() layers [] num_levels len(num_channels) for i in range(num_levels): dilation_size 2 ** i in_channels input_size if i 0 else num_channels[i-1] out_channels num_channels[i] padding (kernel_size - 1) * dilation_size layers.append(TemporalBlock(in_channels, out_channels, kernel_size, stride1, dilationdilation_size, paddingpadding, dropoutdropout)) self.network nn.Sequential(*layers) # 最后用 1x1 卷积把通道数映射到预测输出维度 self.fc nn.Conv1d(num_channels[-1], output_size, 1) def forward(self, x): # x shape: (batch, input_size, input_len) out self.network(x) # 取最后一个时间步的输出作为预测起点 out out[:, :, -1:] # (batch, channels, 1) out self.fc(out) # (batch, output_size, 1) return out.squeeze(-1) # (batch, output_size)注意这里我用了“取最后一个时间步再映射”的方式适合预测长度较短比如 1 到 24的场景。如果预测长度很长可以把output_size直接设成pred_len让fc输出整个预测窗口。num_channels列表长度就是层数每层通道数可以相同也可以递增。我一般先用[32, 32, 32, 32]跑 baseline如果欠拟合再加到 64 或增加层数。3.3 训练循环与损失函数MSE 之外什么时候该换 MAE时序预测默认用 MSE均方误差它对大误差惩罚重适合你更在意峰值预测的场景。但如果数据里异常值多MSE 会被少数极端点带偏这时候换 MAE平均绝对误差更稳。我一般先跑 MSE看验证集 loss 曲线如果波动很大且和训练 loss 差距大就换 MAE 或者 Huber Loss。def train_model(model, train_loader, val_loader, epochs50, lr1e-3, devicecpu): model model.to(device) optimizer torch.optim.Adam(model.parameters(), lrlr) scheduler torch.optim.lr_scheduler.StepLR(optimizer, step_size20, gamma0.5) criterion nn.MSELoss() for epoch in range(epochs): model.train() train_loss 0.0 for x, y in train_loader: x, y x.to(device), y.to(device) optimizer.zero_grad() pred model(x) loss criterion(pred, y) loss.backward() # 梯度裁剪防止膨胀卷积堆深后梯度爆炸 torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0) optimizer.step() train_loss loss.item() * x.size(0) scheduler.step() model.eval() val_loss 0.0 with torch.no_grad(): for x, y in val_loader: x, y x.to(device), y.to(device) pred model(x) val_loss criterion(pred, y).item() * x.size(0) train_loss / len(train_loader.dataset) val_loss / len(val_loader.dataset) if (epoch 1) % 10 0: print(fEpoch {epoch1:3d} | train_loss {train_loss:.6f} | val_loss {val_loss:.6f}) return model几个关键点学习率用 1e-3 起步配合 StepLR 每 20 轮降一半梯度裁剪max_norm1.0对 TCN 很重要因为膨胀卷积层数多了之后梯度容易变大验证集 loss 如果连续多轮不降就可以提前停。另外输入数据一定要做归一化我一般用训练集的均值和标准差验证集和测试集复用同样的统计量避免数据泄漏。4. 避坑与排查TCN 时序预测里最容易翻车的 5 个地方4.1 现象训练 loss 正常下降但预测结果整体偏移一个常数原因归一化时用了全局均值和方差或者反归一化时统计量对不上。常见于先把整个数据集归一化再切分训练测试集导致测试集信息泄漏到训练阶段。解决严格按时间顺序切分先切训练集用训练集的均值和标准差归一化再把同样的统计量应用到验证集和测试集。反归一化时用同一个均值方差。代码里把scaler对象保存下来预测时复用。4.2 现象验证集 loss 震荡剧烈每次训练结果差异很大原因批次大小太小或者学习率太高。TCN 对批次大小比 LSTM 更敏感因为膨胀卷积的感受野大小批次梯度噪声会被放大。解决批次大小至少 32数据量允许就上 64 或 128。学习率从 1e-3 开始如果震荡就降到 5e-4。另外检查 Dropout 是不是设得太大0.2 以上在小数据集上容易导致训练不稳定。4.3 现象模型在训练集上表现很好测试集一塌糊涂原因过拟合或者输入长度设得太短模型只能记住局部模式。TCN 参数量虽然比 LSTM 少但通道数给大了照样过拟合。解决先降通道数从 64 降到 32 甚至 16增大 Dropout 到 0.3加权重衰减weight_decay1e-4。如果还不行检查输入长度是不是小于一个完整周期比如日周期数据输入长度至少 48。4.4 现象预测长序列时后面几个点明显变差原因模型只用了最后一个时间步的输出做映射预测长度超过 24 之后信息衰减严重。解决把output_size直接设成预测长度让最后一层 1x1 卷积输出整个预测窗口而不是只取最后一个时间步。同时检查感受野是否覆盖了输入长度感受野不够就加层或增大膨胀系数。4.5 现象GPU 利用率低训练速度比预期慢很多原因数据加载是瓶颈或者模型太小导致 GPU 等 CPU。TCN 本身并行度高但如果DataLoader的num_workers设成 0数据预处理会拖慢整体速度。解决num_workers设成 4 或 8pin_memoryTrue。如果模型确实小可以把批次大小加大到 256 甚至 512让 GPU 吃满。另外输入数据提前转成float32张量保存避免每个 epoch 重复转换。5. 进阶技巧用多变量输入和滚动预测把 TCN 用到真实场景5.1 多变量输入把多个特征堆成通道维度真实场景里往往不只有目标序列还有温度、湿度、节假日标记等辅助特征。TCN 的input_size可以直接设成特征数量每个时间步的多个特征作为不同通道输入。比如你有 3 个特征input_size3输入张量形状是(batch, 3, input_len)。注意所有特征都要做归一化并且训练集验证集切分要按时间对齐。# 假设 data 形状是 (总长度, 特征数) # 构造多变量数据集时x 的形状变成 (特征数, input_len) class MultiVarDataset(Dataset): def __init__(self, data, input_len168, pred_len24): self.data torch.tensor(data, dtypetorch.float32) self.input_len input_len self.pred_len pred_len def __len__(self): return len(self.data) - self.input_len - self.pred_len 1 def __getitem__(self, idx): x self.data[idx : idx self.input_len, :].T # (特征数, input_len) y self.data[idx self.input_len : idx self.input_len self.pred_len, 0] # 只预测第一个特征 return x, y这里y只取第一个特征作为预测目标其他特征作为辅助输入。如果你的目标是预测所有特征把y改成self.data[idxinput_len:..., :]同时output_size设成特征数。5.2 滚动预测一步预测加自回归还是直接多步输出滚动预测有两种做法。第一种是模型只预测下一步然后把预测值拼回输入窗口继续预测下一步循环pred_len次。这种做法误差会累积但适合预测长度很长的场景。第二种是模型直接输出pred_len个值一次前向搞定误差不累积但预测长度受限于训练时的设定。我一般先用第二种把output_size设成pred_len训练时目标就是整个预测窗口。如果业务要求预测未来 100 步以上再考虑第一种但要在训练时加入 scheduled sampling让模型逐步适应自己产生的输入。5.3 验证方法别只看 MSE画图看相位和峰值MSE 低不代表预测有用。我习惯在测试集上画三张图真实值 vs 预测值的整体对比、局部放大图、误差分布直方图。重点看两个东西峰值有没有被削平相位有没有偏移。TCN 因为因果卷积的特性相位一般不会偏但峰值容易被平滑掉。如果峰值预测偏低可以把损失函数换成对峰值加权的 MSE或者在对数变换后的数据上训练。import matplotlib.pyplot as plt def plot_prediction(y_true, y_pred, save_pathpred.png): plt.figure(figsize(12, 4)) plt.plot(y_true, labelground truth, linewidth1.5) plt.plot(y_pred, labelprediction, linewidth1.5, linestyle--) plt.legend() plt.title(TCN Time Series Prediction) plt.tight_layout() plt.savefig(save_path, dpi150) plt.close()这张图能帮你快速判断模型是“看起来还行”还是“真的能用”。如果预测曲线明显滞后于真实曲线检查因果卷积的 padding 是不是加错了边如果峰值被削平考虑换损失函数或者增加通道数。我自己的习惯是每次调完参数先跑 5 个 epoch 看验证 loss 趋势趋势不对就停下来改数据或模型不浪费时间跑满 50 轮。TCN 这个结构本身不复杂坑大多在数据构造和归一化上把这两块做扎实后面调参就是体力活。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

递归下降分析实战:从文法改造到语法树构建与表达式求值

递归下降分析实战:从文法改造到语法树构建与表达式求值

简介:这份编译原理实验资料面向计算机专业学生及编译器初学者,聚焦自上而下语法分析中的递归下降分析法,帮助读者掌握从文法改造到程序实现的完整流程。资源包内含1个doc文档,约80KB,以实验报告形式呈现,涵…

2026/10/13 11:46:22 阅读更多 →
OpenCV手势识别实战:肤色检测与手指最高点定位

OpenCV手势识别实战:肤色检测与手指最高点定位

1. 从"找最高点"说起:这个需求到底在解决什么问题很多人第一次接触手势交互,脑子里想的都是"识别手势""判断几根手指""做隔空操作"这类大目标,结果一上手就卡在最基础的一步——连手指在画面里的位置…

2026/10/13 11:46:22 阅读更多 →
Vue 3深度解析:从响应式原理到工程实战的价值演进

Vue 3深度解析:从响应式原理到工程实战的价值演进

1. 石器时代&#xff1a;没有框架的日子&#xff0c;前端到底有多痛1.1 原生 JavaScript 的“原始生活”早年间做前端&#xff0c;哪儿有什么框架概念。HTML 里随手塞几个<script>标签&#xff0c;拿原生 JavaScript 操作 DOM&#xff0c;改个文案都得小心翼翼 getElemen…

2026/10/13 11:46:22 阅读更多 →

最新新闻

HFSS Help.pdf怎么用?从检索字典到仿真检查手册的进阶指南

HFSS Help.pdf怎么用?从检索字典到仿真检查手册的进阶指南

简介&#xff1a;ANSYS HFSS 2020 R1 官方帮助文档《HFSS Help》是一份面向射频/微波工程师、天线设计人员及高校研究者的权威参考资料&#xff0c;用于系统学习高频电磁仿真软件HFSS的完整功能与操作流程。文档以单个PDF文件收录&#xff0c;大小约105.29MB&#xff0c;内容按…

2026/10/13 12:29:30 阅读更多 →
Hoppscotch:免费开源的 API 测试工具,从单条请求到团队协作

Hoppscotch:免费开源的 API 测试工具,从单条请求到团队协作

Hoppscotch&#xff1a;免费开源的 API 测试工具&#xff0c;从单条请求到团队协作 【免费下载链接】hoppscotch Open-Source API Development Ecosystem • https://hoppscotch.io • Offline, On-Prem & Cloud • Web, Desktop & CLI • Open-Source Alternative to …

2026/10/13 12:29:30 阅读更多 →
AI辅助编码实战:工具选型、提示词工程与代码审查全流程

AI辅助编码实战:工具选型、提示词工程与代码审查全流程

1. 从“玩具”到“搭档”&#xff1a;我的AI编码工具选型心路 1.1 为什么我不再迷信“全能型”AI 刚接触AI辅助编码那会儿&#xff0c;我跟很多人一样&#xff0c;恨不得找一个能包打天下的工具&#xff0c;从需求分析到部署上线全交给它。折腾了小半年&#xff0c;踩了一堆坑…

2026/10/13 12:29:30 阅读更多 →
多语言多领域机器翻译系统搭建:术语一致性与领域适配全解析

多语言多领域机器翻译系统搭建:术语一致性与领域适配全解析

说起多语言多领域机器翻译系统的搭建&#xff0c;我先讲一个让我印象深刻的场景&#xff1a;某电商平台把中文商品描述直接丢给通用翻译引擎&#xff0c;出来的是“医用一次性防护服”被翻成“医疗用一次性的保护性衣服”&#xff0c;而平台方坚持要术语表里的标准译法。这个场…

2026/10/13 12:29:30 阅读更多 →
Flink Redis Sink性能调优与Exactly-Once实战指南

Flink Redis Sink性能调优与Exactly-Once实战指南

1. 为什么Flink写Redis不能只靠“addSink(new RedisSink(...))”就完事&#xff1f;在某次跨部门数据同步项目中&#xff0c;我接手了一个已上线两周的实时用户行为分析链路。上游Kafka每秒涌入8万条点击事件&#xff0c;Flink作业用一个看似标准的addSink(new RedisSink(...))…

2026/10/13 12:29:30 阅读更多 →
MES工位执行状态持久化:状态模型与Redis协同设计

MES工位执行状态持久化:状态模型与Redis协同设计

做MES和智能工厂这块时间久了&#xff0c;会发现一个很诡异的现象&#xff1a;大家前期讨论方案时&#xff0c;最关注的都是排产算法、物料拉动、质量管理这些大模块&#xff0c;真正上线跑起来之后&#xff0c;台账上线了&#xff0c;工单也派下去了&#xff0c;反而是L3层工位…

2026/10/13 12:28:29 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目&#xff0c;我最大的感受是&#xff0c;大部分坑不是出在技术前沿&#xff0c;而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节&#xff0c;最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了&#xff0c;很难不碰到舵机控制这道坎。做智能小车要转方向&#xff0c;做机械臂要抬关节&#xff0c;做云台要偏航俯仰&#xff0c;背后都是同一个东西在干活&#xff1a;舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”&#xff1f;——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台&#xff1f;或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜&#xff1f;又或者&#xff0c;在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →