LSTM原理与PyTorch实现:从梯度消失到门控记忆的工程实践
我用循环网络做序列预测的头几次几乎都是被同一个问题砸晕模型在短序列上表现得很听话序列一拉长训练就像“失忆”一样前面几步的信息消失了。我当时反复怀疑是数据清洗不够彻底或者学习率没调好后来才确认问题出在结构本身。长短期记忆网络LSTM就是冲着这种“记不住”的毛病来的它把普通循环单元换成一个带门控的存储结构让信息可以按需保留、丢弃或更新。这篇文章我打算把LSTM从原理、公式到代码实现以及我在工程里踩过的坑按我自己当年绕弯路的方式讲一遍希望能帮你少走同样的路。1. 普通RNN为什么记不牢把梯度消失这件事算清楚1.1 一个普通RNN单元到底在做什么要理解LSTM的动机必须先看它要替代的对象普通RNN单元。它做的事情其实相当直接h_t tanh(W_x * x_t W_h * h_{t-1} b)也就是说每个时间步它把“当前输入 x_t”和“上一个隐藏状态 h_{t-1}”一起做一次线性变换再用 tanh 压缩到一个固定维度的向量里。这个 h_t 被当作当前步的输出也会作为下一步输入的一部分继续往前传。整条序列的处理过程就是不断重复这个公式权重 W_x、W_h 在所有时间步上是共享的。这种方式在序列不长时没有问题。比如文本里相邻几个词之间关系很紧密RNN可以很快学会“老师”后面跟“讲课”这种局部搭配。但真正的问题是它试图把“过去所有信息”都压进这一个固定大小的隐藏向量里而且每走一步新的输入都用同样的权重去覆盖和改写旧状态。你固然可以在架构上把 hidden_size 调大给模型更多记忆容量但容量大并不等于它能稳定地把信息传送到很远的位置。我当时测试过一段长度为 30 到 50 个字符的文本生成任务普通RNN撑到十几步就开始胡言乱语可它并不是没能力拟合训练数据而是训练过程根本学不动那些长距离依赖。问题的根源不在表达容量而在梯度传播。1.2 梯度消失不是玄学链式法则下的指数衰减神经网络靠反向传播更新参数本质是用损失函数对每个参数求偏导。在RNN里参数被所有时间步共享所以要算出 w_h 的梯度必须沿着时间方向往回展开。假设序列有 T 步那么损失对最早时刻 h_1 的梯度中间会夹着一个很长连乘∂h_T / ∂h_1 ≈ ∏_{k1}^{T-1} ( tanh(…) * W_h )这里的问题在于 tanh 的导数最大只有 1而且只有在输入接近 0 时才接近 1多数情况下都小于 1。再乘上 W_h 的数值只要它的谱半径小于 1连乘次数一多梯度就会以指数速度衰减。你可以拿笔算一个简单例子假设 W_h 0.5tanh 的导数取一个保守值 0.25那么每往回传一步梯度大约变成原来的 0.125 倍。传到第 20 步时就只剩下 0.125 的 20 次方这个数比 10^-18 还小根本不足以驱动参数更新。反过来如果 W_h 大于 1又会出现指数爆炸导致梯度变成 NaN。所以普通RNN不是“不想”记住长距离信息而是它在数学结构上就没给梯度留出一条稳定回传的高速公路。距离稍长误差信号就衰减得无影无踪模型自然学不到“几十步之前的某个词影响了现在的输出”这种关系。LSTM的出现本质上是给这条高速公路铺了一层缓冲带让信息可以不用被逐层压缩也能继续流动。2. LSTM的内部工厂细胞状态和三道门的分工2.1 细胞状态贯穿所有时间步的那条“传送带”LSTM的核心设计其实可以浓缩成一句话在外面的隐藏状态之外多保留了一条内部状态 c_t通常叫细胞状态cell state。c_t 的作用很像工厂里一条横穿车间、不停向前运转的传送带。皮带上可以放各种货物也就是信息。普通RNN每走一步都要把旧箱子拆开、重新打包成新的隐藏向量LSTM则允许一部分信息原封不动地放在传送带上既不参与矩阵乘法也不被非线性激活压缩。每个时间步门控结构决定“这箱货物要不要卸下来扔掉”“要不要往上再加点新货”“走到车间出口时要对外展出多少”。关键点在于c_t 在时间步之间传递时默认只是做逐元素相乘和相加没有必须经过 tanh 压缩的那一步。所以哪怕序列走了一百步某个早期信息只要一直没被遗忘门关掉它就能以接近原样的方式不断往后传。这就是论文里常说的“常数误差传送带CEC”的核心思想。它在反向传播时也意味着梯度可以通过 c_t 这条路径原样流回较早的时刻不再需要反复乘以一个小于 1 的 Jacobian 矩阵。2.2 三道门的职责边界与sigmoid的选择逻辑为了让传送带可控LSTM 设置了三个门遗忘门、输入门和输出门。每个门本质都是一个带 sigmoid 激活的全连接层输出值在 0 到 1 之间表示“允许通过的比例”。sigmooid 在这里不是用来提取特征而是模拟一个比例开关接近 0 就近乎完全关闭接近 1 则几乎全开。三个门的分工可以整理成下面这张表门常见符号控制对象直观含义遗忘门f_t旧细胞状态 c_{t-1}那些旧记忆还要不要不要就丢弃输入门i_t新候选状态 c̃_t当前输入和上一隐藏状态产生的新信息要不要写入记忆输出门o_t最终隐藏状态 h_t当前记忆状态中多少内容要对外输出给模型下一层用遗忘门和输入门一起完成细胞状态的更新输出门则决定对外暴露什么。你可能会好奇为什么不用 tanh 当门因为 tanh 输出范围是 -1 到 1负值会被当成“反向开门”这在控制信息流上不够直观。sigmoid 天然就是一个可微的 0/1 软开关乘到信息上即可实现“保留多少”。2.3 一个时间步内的完整数据流把这三个门串起来LSTM 在单个时间步里的处理顺序大致是基于当前输入 x_t 和上一隐藏状态 h_{t-1}分别算出遗忘门、输入门、候选状态和输出门的原始分值。用 sigmoid 把遗忘门、输入门、输出门映射到 0~1 区间候选状态则用 tanh 压缩到 -1~1。更新细胞状态旧状态乘以遗忘门加上输入门乘候选状态。计算新隐藏状态先把新细胞状态过一遍 tanh再乘以输出门。整个过程由四个独立的全连接层完成但它们共享同一个输入拼接向量 [h_{t-1}, x_t]。如果你把四个门的输出拼在一起看相当于一次算出四个不同的“投影”再各取所需。这也是 LSTM 实现里参数为什么总是以“4 倍”形式出现的原因。3. 手算一次LSTM更新符号、形状和具体数值3.1 先厘清三个轴batch、seq_len、input_size代码里最容易引起困惑的往往不是原理而是张量形状。一个序列批次通常有三个轴batch几条独立样本、seq_len每条样本的时间步数、input_size每个时间步的输入特征数。以 PyTorch 为例nn.LSTM里有个batch_first参数。默认是False输入形状是(seq_len, batch, input_size)设为True后才是更符合直觉的(batch, seq_len, input_size)。我建议训练代码里统一加上batch_firstTrue否则输出形状反着来很容易在拼接特征或做分类头的时候报维度错误。隐藏状态 h 的形状是(num_layers, batch, hidden_size)细胞状态 c 的形状和它完全一致。需要特别注意的是num_layers这个维度在最前面不是 batch。写代码时很多人会用h torch.zeros(1, batch, hidden)初始化单层 LSTM 的状态这个形状会跟输出h_n对上。3.2 把权重矩阵拆开看为什么是两个“W”而不是一个大矩阵公式里经常写 [h_{t-1}, x_t]看起来是把两个向量拼接后乘一个大矩阵。但在 PyTorch 的文档里你会发现 LSTM 的权重被明确分成了W_ih和W_hh两组。这不是两种不同的做法而是拆开了同一个拼接矩阵。拼接矩阵可以看成左右两块左边负责乘 x_t右边负责乘 h_{t-1}。PyTorch 直接把它们存成两个独立矩阵方便做矩阵乘法和梯度计算。其中W_ih形状是(4 * hidden_size, input_size)W_hh形状是(4 * hidden_size, hidden_size)对应的偏差b_ih和b_hh形状都是(4 * hidden_size,)4 倍来自四个门遗忘门、输入门、候选状态、输出门。每行向量和输入做运算后分别进入对应的激活函数。3.3 一组数字算给您看为了避免符号绕晕我用一个隐藏单元数为 1 的迷你例子走一遍。假设上一时刻的细胞状态 c_{t-1} 1.2上一隐藏状态 h_{t-1} 0.3当前输入 x_t 0.4。经过若干层计算后得到遗忘门 f 0.7表示要保留 70% 的旧记忆输入门 i 0.4表示新信息只写入 40%候选状态 c̃ 0.8输出门 o 0.9先更新细胞状态c_t f * c_{t-1} i * c̃ 0.7 * 1.2 0.4 * 0.8 0.84 0.32 1.16再计算隐藏状态h_t o * tanh(c_t) 0.9 * tanh(1.16)≈ 0.9 * 0.82≈ 0.738你会发现旧记忆 1.2 没有被完全抹掉也没有被新信息彻底冲走而是按比例混到了新的细胞状态里。如果遗忘门接近 1哪怕经过很多步旧信息依然能占大头如果遗忘门被学到接近 0那旧记忆就会迅速清空。门是模型根据任务自己学出来的这正是 LSTM 灵活的地方。3.4 梯度为什么能流得更远LSTM 关于细胞状态的更新式是 c_t f_t * c_{t-1} i_t * c̃_t。把它对 c_{t-1} 求导会得到∂c_t / ∂c_{t-1} f_t再附加上一些小项。这里的 f_t 不是固定的小于 1 的矩阵而是一个由 sigmoid 生成、随时可被训练调整的数值。模型学会在需要跨长距离传递信息时把遗忘门调到接近 1梯度就能沿着细胞状态一路往回传而不做指数衰减。别把 LSTM 想象成“绝对不梯度消失”它只是给梯度多开了一条“直通车道”。如果遗忘门被学成接近 0或者权重初始化不当梯度照样可能衰减或爆炸。这也是为什么工程上仍然需要梯度裁剪。4. PyTorch封装背后参数数量、隐藏状态和工程陷阱4.1 最小可用的 nn.LSTM 应用PyTorch 已经把 LSTM 封装得很干净几行代码就能跑起来import torch import torch.nn as nn model nn.LSTM( input_size10, hidden_size64, num_layers2, batch_firstTrue, dropout0.2, ) x torch.randn(32, 25, 10) # batch32, seq_len25, feature10 out, (h_n, c_n) model(x) print(out.shape) # [32, 25, 64] print(h_n.shape) # [2, 32, 64] print(c_n.shape) # [2, 32, 64]这里的out是最后一层在每一个时间步的输出形状是(batch, seq_len, hidden_size)h_n和c_n是各层最终时刻的状态。如果你要用每个时间步的输出取out就行如果只想用整条序列最终的状态取h_n[-1]。不带初始状态直接调用时PyTorch 会默认用全 0 初始化。但如果你在一个循环里连续喂很多批序列而且它们在语义上是独立的手动清空状态很重要否则上一批的结尾会被当成这一批的开头形成信息泄漏。4.2 一个隐藏层到底有多少参数很多人调参时不清楚model.parameters()里的数字是怎么来的。其实可以手动算。单个 LSTM 层的参数包括四组权重和两组偏差。以第一层为例输入维度是 input_size隐藏维度是 hidden_size输入到隐藏的权重4 * hidden_size * input_size隐藏到隐藏的权重4 * hidden_size * hidden_size两组偏差4 * hidden_size再加 4 * hidden_size所以单层参数总量是4 * hidden_size * (input_size hidden_size 2)如果 input_size10hidden_size64那第一层就是4 * 64 * (10 64 2) 19456第二层的输入不是 10 而是上一层的 64所以第二层是4 * 64 * (64 64 2) 33280两层加起来约 52736 个参数。这个数字不算大但 LSTM 的参数是共享权重的训练时反向传播会沿时间展开实际的计算量远大于参数数量。这也是为什么 LSTM 训练慢、对 GPU 显存占用高。4.3 工程里最容易翻车的三个细节第一个是batch_first不一致。如果某个团队代码里有的层写batch_firstTrue有的不写张量维度就会在 batch 和 seq_len 之间来回跳报错信息往往让你怀疑人生。我的习惯是全局统一使用batch_firstTrue在数据加载进模型前就把维度整理好。第二个是隐藏状态没有正确重置。假设你训练的是很多条独立对话每条长度不同你按批次循环训练时如果不把(h, c)置零模型就会把上一批的对话结尾当成下一批对话的开头。这不是玄学是状态泄漏。除非你明确在做在线流式预测或想保留跨批次状态否则每个 batch 开始前都要初始化。第三个是 dropout 的用法。PyTorch 里的nn.LSTM只在多层之间加 dropout不会在时间步之间加。而且num_layers1时设 dropout 会直接给警告因为它根本没有层间可以插入。如果想让 LSTM 有更强的正则效果又不想堆太多层可以在 LSTM 层后面再接一个nn.Dropout。4.4 处理变长序列pack_padded_sequence 的套路真实任务里的序列往往有长有短比如评论长度从几个字到几百个字不等。最简单的做法是把所有序列 pad 到一样长但这样会产生大量无效计算而且如果 pad 值选不好还会干扰模型判断。PyTorch 提供了pack_padded_sequence和pad_packed_sequence来压缩训练过程。基本用法是先把长度按降序排序或者直接设置enforce_sortedFalse让接口帮你处理from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence lengths torch.tensor([15, 12, 8, 3]) x_packed pack_padded_sequence( x, lengths, batch_firstTrue, enforce_sortedFalse ) packed_out, (h_n, c_n) model(x_packed) out, _ pad_packed_sequence(packed_out, batch_firstTrue)这样 LSTM 会跳过那些完全由 pad 组成的无用位置只在有效长度内做循环。注意使用 pack 后out经过pad_packed_sequence恢复成(batch, max_len, hidden_size)但被 pad 的位置输出通常是 0做后续计算时要用 mask 把它们排除掉否则会拉低指标。4.5 梯度裁剪为什么依然需要它我提到过LSTM 只是把梯度消失的问题缓解了并没有完全消除梯度爆炸。尤其在长序列、深层堆叠的模型中如果 f_t 学得接近 1梯度就能长期积累放大之后一口气冲垮权重训练直接变成 NaN。处理办法很朴素每次反向传播之后更新参数之前把梯度的范数裁到一个上限。PyTorch 里一句话torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0)这个上限我通常取 1.0 到 5.0 之间。等于给训练过程加了一个安全阀让最坏情况不会把整个模型冲飞。推荐每个 LSTM 训练循环里都默认加一行别等 NaN 出现了再去排查成本高得多。5. GRU、双向LSTM和Transformer别把LSTM当万能药5.1 GRU门更少但表现不小GRU门控循环单元可以理解为 LSTM 的简化版。它把细胞状态和隐藏状态合并成了一个状态把三个门压缩成两个更新门和重置门。参数比 LSTM 少了约四分之一在不少中短序列任务里效果却和 LSTM 差不多。选择 GRU 的一个很实际理由是小数据集上 LSTM 更容易过拟合而 GRU 结构简单、需要调整的超参数少。从复现实验的角度看我会先跑一个 GRU 基线如果明显欠拟合再升级到 LSTM而不是一上来就堆最重的模型。5.2 双向LSTM把这句话倒着再读一遍双向 LSTM 的基本思路是同时跑两个方向一个按时间正序读一个按时间逆序读。最后把两个方向的隐藏状态拼接起来作为输出。这样每个位置都能同时看到“之前”和“之后”的上下文在文本分类、命名实体识别这类整句可用的任务上往往有不错的提升。代价是模型参数翻倍而且它要求整个序列在推理时全部可见。如果你做的是实时语音识别或逐 token 预测只能用单向结构。判断依据很简单未来信息能不能在预测时提前拿到。拿不到双向就只是空想。5.3 Transformer时代LSTM还有哪些地盘Transformer 流行之后很多人开始质疑 LSTM 是不是过时了。其实两者解决的问题不完全重叠。Transformer 的注意力机制能直接建立序列任意两个位置之间的联系理论上长距离依赖建模能力很强。但它对序列长度的计算复杂度是平方级序列一长显存消耗会非常夸张。LSTM 是线性的时间和空间消耗随序列长度线性增长而且天然适合逐步增量推理。做流式处理、边接收边预测的场景LSTM 这种循序渐进结构仍然有不可替代的位置。我的个人经验是研究大段文本语义时优先试 Transformer在工业落地的时序监控、短文本流、在线触发类任务里LSTM 和 GRU 依然是很稳的基线。别因为它出现得早就看不上它。5.4 我给新人的选型建议不少初学者问我要不要无脑上 LSTM。我的回答是先想你手里有多少数据、序列有多长、推理是否需要在线。序列在几百步以内、数据量中等的情况下LSTM 往往已经够用而且调试成本比 Transformer 低很多。如果换成 Transformer同样数据量下很容易出现“跑得慢还学不稳”的局面。另外调 LSTM 时别一上来就调隐藏层大小或层数先确认输入输出形状、状态初始化、mask 处理这些基础没错。我踩过最多次的坑不是原理不懂而是维度悄悄错位让模型训练了一个小时再用验证集一问指标全是负的。先把基础链路的形状全部打印出来核对一遍再去追求模型复杂度的提升这是最省时间的方式。

相关新闻

别墅卖家把握政策新方向,商业拍卖成关键通道

别墅卖家把握政策新方向,商业拍卖成关键通道

别墅卖家如何把握政策窗口期:商业拍卖成存量资产价值重估关键通道2026年,随着《扩大消费“十五五”规划》《城市更新“十五五”规划》及8月28日多部委楼市新政相继落地,房地产政策逻辑已从“防风险为主”转向“防风险与促消费并重”。在这一背…

2026/10/17 12:15:44 阅读更多 →
四个开源项目:自动架构图、Agent技能库、本地语音与极简LLM训练

四个开源项目:自动架构图、Agent技能库、本地语音与极简LLM训练

这周的GitHub榜单一圈逛下来,我有四个很值得聊的方向:Archify把代码仓库自动变成架构图、科研Agent技能库在给Agent补“工具箱”、VoiceStudio把本地语音合成和识别串成了一条完整链路,还有MiniMind这样一个极简项目,只用6400万参…

2026/10/17 12:15:44 阅读更多 →
AI 编程工作台搭建指南:编辑器、模型与基础配置全解析

AI 编程工作台搭建指南:编辑器、模型与基础配置全解析

我一直觉得,现在做开发,特别是独立做小项目、写脚本、搞自动化的时候,一个顺手好用的 AI 编程工作台,比单纯会背 API 重要得多。这两年 AI 编程工具、模型更新快得吓人,但大多数人其实还停在“装个插件、复制报错贴进去…

2026/10/17 12:15:44 阅读更多 →

最新新闻

Python Flask+MySQL学生成绩管理系统:数据库设计与触发器实践

Python Flask+MySQL学生成绩管理系统:数据库设计与触发器实践

简介:围绕 MySQL 学生成绩管理系统展开的数据库课程设计文档,完整覆盖系统总体设计、需求分析、概要设计、系统实现与测试总结全流程,适合计算机专业学生用于数据库课设、毕业设计或 FlaskMySQL 入门实践。文档以华东交通大学课程设计报告为原…

2026/10/17 21:38:42 阅读更多 →
北京市东城区海尔热水器维修电话

北京市东城区海尔热水器维修电话

【北京市东城区海尔热水器维修电话|欧米到家东城区海尔热水器维修】欧米到家覆盖东城区全境,2 个网点就近安排,海尔热水器维修拨 400-996-9791,原厂配件质保 365 天。【东城区海尔热水器维修 快速信息】 📍 服务区域&…

2026/10/17 21:38:42 阅读更多 →
深度学习在智能网联汽车中的落地关键:从感知融合到数据闭环

深度学习在智能网联汽车中的落地关键:从感知融合到数据闭环

直接切入正题。我猜你点进来看这篇文章,大概率是已经看过上一篇,或者是正在做自动驾驶相关的东西,想在深度学习这块挖得更深一点。上一篇聊了智能网联汽车的基础架构和深度学习在感知层的入门应用,这一篇我把重心放在“从模型到实…

2026/10/17 21:38:42 阅读更多 →
MySQL主键id实现分布式锁的三种姿势与避坑指南

MySQL主键id实现分布式锁的三种姿势与避坑指南

做过几年后端的人,基本都会被分布式锁折腾一遍。服务从一个节点扩展到两三个节点之后,像“同一时间只能有一个任务在跑”这种约束,单机上的 synchronized、ReentrantLock 全都失效,必须要有一个所有节点都能访问的第三方来协调。最…

2026/10/17 21:38:42 阅读更多 →
2026毕节软件检测第三方公司排行榜TOP5:软件检测+功能性能测试+信息安全测评+软件验收报告 机构地址及联系方式推荐

2026毕节软件检测第三方公司排行榜TOP5:软件检测+功能性能测试+信息安全测评+软件验收报告 机构地址及联系方式推荐

毕节市软件检测机构林立如云,门庭若市者众,而持证规范、流程严谨、报告权威者却如凤毛麟角。为助本地开发者、政务单位及中小企客户避开资质存疑、流程模糊、报告难用的检测陷阱,小编历时三周实地踏访七星关区、金海湖新区及大方县产业园区内…

2026/10/17 21:38:42 阅读更多 →
医用具身机器人:标本识别校验与合规留痕的临床实践

医用具身机器人:标本识别校验与合规留痕的临床实践

1. 项目概述:当机器人不再只是“移动货架”,而是科室里的合规守门人医用具身机器人走进科室,这个标题里藏着三个被长期低估的真相:第一,“具身”不是噱头,它意味着机器人必须像人一样拥有感知、决策与执行的…

2026/10/17 21:37:42 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04: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/16 21:54:38 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →