PyTorch cumsum维度详解:从原理到实战,避免张量累积求和常见错误
1. 从一次张量求和错误说起为什么需要理解cumsum的维度最近在调试一个序列预测模型的损失函数时遇到了一个让我排查了半天的“诡异”问题。我的目标是计算一个批次batch中每个样本sample在时间步timestep上的累积损失。直觉上我写下了类似torch.cumsum(loss_per_timestep, dim1)的代码心想这应该沿着时间维度累加。然而最终得到的张量形状和数值完全不符合预期导致后续的梯度计算和模型更新出现了难以察觉的偏差。问题的根源恰恰在于我对torch.cumsum累积求和函数中dim参数的理解不够透彻。在PyTorch、NumPy等张量计算库中cumsum是一个看似简单但维度逻辑极易混淆的操作。它不像sum(dim1)那样在指定维度上求和后该维度就消失了降维而是会保留原维度但该维度上的每个元素都变成了从起始位置到当前位置的累积和。这个“保留原维度”的特性加上PyTorch张量可能拥有的批量batch、通道channel、高度height、宽度width等多维结构使得dim参数的选择变得至关重要。选错维度不仅会得到错误的数值结果更可怕的是有时形状shape可能看起来“合理”但数据的内在逻辑已经全乱这种静默的错误在深度学习训练中极具破坏性。因此今天我们就来彻底剖析torch.cumsum把它的维度逻辑掰开揉碎讲清楚。无论你是刚接触PyTorch的新手还是想巩固基础的老手理解了这个函数你就能避免很多因维度误解导致的坑。2.torch.cumsum的核心机制在保留中累积在深入维度之前我们必须先建立对torch.cumsum操作本质的清晰认知。它与普通的sum有根本性的区别。torch.sum(tensor, dimd) 这是一个归约操作。它在指定的维度d上将所有元素相加最终得到一个单一的值。这个操作会消除消除维度d。例如一个形状为[2, 3, 4]的张量在dim1上求和后形状变为[2, 4]中间的维度3消失了。torch.cumsum(tensor, dimd) 这是一个扫描操作。它同样沿着指定的维度d进行计算但不是一次性归约而是进行前缀和扫描。对于维度d上的第i个位置其值被替换为从该维度第0个位置到第i个位置所有元素的累加和。关键点在于输出张量的形状与输入张量完全一致维度d被保留了下来只是其上的数据变成了累积值。让我们用一个极其简单的例子来可视化这个过程。假设我们有一个一维张量import torch a torch.tensor([1, 2, 3, 4])torch.cumsum(a, dim0)的计算过程如下输出位置0a[0] 1输出位置1a[0] a[1] 1 2 3输出位置2a[0] a[1] a[2] 1 2 3 6输出位置3a[0] a[1] a[2] a[3] 1 2 3 4 10所以结果是tensor([1, 3, 6, 10])。可以看到形状依然是(4,)但每个位置的值都包含了之前所有位置的信息。注意dim参数在PyTorch中决定了计算发生的“轴”。对于一维张量dim只能是0这很直观。困惑主要始于二维及更高维张量。3. 二维与高维张量的维度详解dim如何决定累加方向当张量维度升高时dim参数就像是指挥官告诉cumsum“请沿着这个方向一行一行或一列一列地进行累积扫描”。理解这一点最好的方式就是看例子。3.1 二维张量矩阵的经典场景假设我们有一个3行4列的矩阵可以把它想象成一个迷你数据集有3个样本每个样本有4个特征。B torch.tensor([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) print(‘B.shape:‘, B.shape) # torch.Size([3, 4])情况一dim0沿行累加即跨样本累积cumsum_dim0 torch.cumsum(B, dim0) print(cumsum_dim0) # tensor([[ 1, 2, 3, 4], # 第一行不变 # [ 6, 8, 10, 12], # 第二行 第一行 第二行 # [15, 18, 21, 24]]) # 第三行 第一行 第二行 第三行操作解读dim0表示沿着“行”的方向第0维。你可以想象一列一列地看。以第一列[1, 5, 9]为例输出行0列01输出行1列01 5 6输出行2列01 5 9 15结果形状依然是[3, 4]。每一列都独立地完成了从上到下的累积。这在某些场景下可以理解为随着样本索引的增加特征的累积效应。情况二dim1沿列累加即在样本内部跨特征累积cumsum_dim1 torch.cumsum(B, dim1) print(cumsum_dim1) # tensor([[ 1, 3, 6, 10], # 第一行1, 12, 123, 1234 # [ 5, 11, 18, 26], # 第二行5, 56, 567, 5678 # [ 9, 19, 30, 42]]) # 第三行9, 910, 91011, 9101112操作解读dim1表示沿着“列”的方向第1维。你可以想象一行一行地看。以第一行[1, 2, 3, 4]为例输出行0列01输出行0列11 2 3输出行0列21 2 3 6输出行0列31 2 3 4 10结果形状依然是[3, 4]。每一行都独立地完成了从左到右的累积。这是更常见的用法例如计算一个序列时间步的累积概率、累积损失或前缀和。实操心得对于二维矩阵一个快速的记忆方法是——dim的值指定了累积发生的方向而另一个维度则保持独立。dim0是“竖着累”dim1是“横着累”。在深度学习里数据通常组织为[batch_size, sequence_len, features]如果你想要计算每个样本内部时间步上的累积和那么dim通常应对应sequence_len所在的维度很可能是1。3.2 三维张量的实战推演三维张量在深度学习中无处不在例如批量的图像[B, C, H, W]或批量的序列数据[B, T, D]。这里我们以序列数据为例构造一个张量2个样本每个样本有3个时间步每个时间步有4个特征。C torch.tensor([[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], [[13,14,15,16], [17,18,19,20], [21,22,23,24]]]) print(‘C.shape:‘, C.shape) # torch.Size([2, 3, 4]) # 可以理解为C[0] 是第一个样本的3x4矩阵C[1]是第二个样本的3x4矩阵。现在我们分别沿着三个维度进行累积求和。情况一dim0沿批次维度累积cs_dim0 torch.cumsum(C, dim0) print(cs_dim0.shape) # torch.Size([2, 3, 4]) print(cs_dim0) # 第一个样本索引0: 和原始C[0]一样 # tensor([[ 1, 2, 3, 4], # [ 5, 6, 7, 8], # [ 9, 10, 11, 12]]) # 第二个样本索引1: 变成了 C[0] C[1] # tensor([[ 113, 214, 315, 416], # [ 517, 618, 719, 820], # [ 921, 1022, 1123, 1224]]) # 即 # tensor([[14, 16, 18, 20], # [22, 24, 26, 28], # [30, 32, 34, 36]])解读dim0是批次维度。输出张量的第一个“切片”cs_dim0[0]就是输入的第一个样本C[0]。输出的第二个“切片”cs_dim0[1]是第一个样本和第二个样本的逐元素和。这相当于跨样本的累积在大多数训练场景下不常用但在某些特殊的在线学习或累积统计场景可能有用。情况二dim1沿时间步维度累积cs_dim1 torch.cumsum(C, dim1) print(cs_dim1.shape) # torch.Size([2, 3, 4]) print(‘第一个样本的累积和:‘) print(cs_dim1[0]) # 对于C[0] [[1,2,3,4], [5,6,7,8], [9,10,11,12]] # 沿dim1第二个维度即行/时间步累积 # 时间步0: [1,2,3,4] # 时间步1: [15, 26, 37, 48] [6, 8, 10, 12] # 时间步2: [159, 2610, 3711, 4812] [15, 18, 21, 24] # 所以 cs_dim1[0] 是 # tensor([[ 1, 2, 3, 4], # [ 6, 8, 10, 12], # [15, 18, 21, 24]])解读这是序列建模中最常用的模式dim1对应的是序列长度/时间步维度。操作在每个样本内部独立进行。对于每个样本它计算每个特征在所有时间步上的累积和。输出张量在dim1上的每个位置t都包含了从时间步0到t的所有信息。这对于计算累积注意力权重、累积损失、或实现像CUMSUM这样的递归层至关重要。情况三dim2沿特征维度累积cs_dim2 torch.cumsum(C, dim2) print(cs_dim2.shape) # torch.Size([2, 3, 4]) print(‘第一个样本第一个时间步的累积和:‘) print(cs_dim2[0, 0]) # 对应 C[0,0] [1,2,3,4] # 输出tensor([ 1, 3, 6, 10]) # 1, 12, 123, 1234解读dim2对应特征维度。它在每个样本的每个时间步内部对特征进行累积。这在某些特定场景下有用例如当你有一组按特定顺序排列的特征如分位数并且你想计算它们的累积分布时。为了更清晰地对比我们可以用下表总结三维张量[B, T, D]上不同dim的含义dim参数累加方向解读输出形状典型应用场景dim0跨样本累积。output[b, t, d] sum_{i0}^{b} input[i, t, d][B, T, D]较少使用或在在线学习中对历史批次数据进行累积统计。dim1样本内跨时间累积。output[b, t, d] sum_{j0}^{t} input[b, j, d][B, T, D]最常用。序列模型中的累积注意力、累积损失、前缀和计算、单调对齐等。dim2时间步内跨特征累积。output[b, t, d] sum_{k0}^{d} input[b, t, k][B, T, D]特定特征工程如计算累积分布函数CDF、特征重要性累积等。4. 反向累积与cumsum的高级参数dim与dtypetorch.cumsum的功能不止于此它还有一些有用的参数可以帮助我们应对更复杂的情况。4.1 反向累积torch.cumsum(..., dimd).flip(dimd)标准的cumsum是从维度的起始位置索引0开始向前累积。但有时我们需要从末尾开始反向累积。PyTorch没有直接的cumsum_reverse函数但可以通过组合操作实现。需求对于序列[1, 2, 3, 4]想要得到[10, 9, 7, 4]即[1234, 234, 34, 4]。实现技巧x torch.tensor([1, 2, 3, 4]) # 方法先翻转再正向累积然后再翻转回来 reverse_cumsum torch.cumsum(x.flip(dims(0,)), dim0).flip(dims(0,)) print(reverse_cumsum) # tensor([10, 9, 7, 4])x.flip(dims(0,))将张量翻转得到[4, 3, 2, 1]。torch.cumsum(..., dim0)正向累积得到[4, 7, 9, 10]。.flip(dims(0,))再次翻转得到最终结果[10, 9, 7, 4]。对于高维张量只需在flip函数中指定要翻转的维度即可。这个技巧在计算双向RNN的隐藏状态或某些需要“未来信息”累积的场景中非常实用。4.2 数据类型控制dtype参数累积求和可能导致数值溢出尤其是使用int32或float16类型时。torch.cumsum允许你指定输出张量的数据类型。x_int torch.tensor([100, 200, 300], dtypetorch.int16) # 直接累积可能溢出int16范围-32768 ~ 32767 # print(torch.cumsum(x_int, dim0)) # 可能得到错误结果 # 指定输出为更高精度的类型 result torch.cumsum(x_int, dim0, dtypetorch.int32) print(result) # tensor([100, 300, 600], dtypetorch.int32) # 或者直接转换为浮点数 result_float torch.cumsum(x_int.float(), dim0) print(result_float) # tensor([100., 300., 600.])注意事项在处理大数或长序列累积时主动使用dtypetorch.float64双精度或至少torch.float32单精度是避免数值精度问题的好习惯。特别是在损失累积或概率累积时使用float32是标准做法。5. 实战场景深度解析cumsum在深度学习中的应用与避坑指南理解了原理我们来看看cumsum在真实项目中的用武之地以及那些容易踩进去的坑。5.1 场景一序列标注任务中的累积损失计算假设我们有一个批次的中文分词或命名实体识别任务每个样本的序列长度不同我们使用了掩码mask来忽略填充部分padding。损失loss_per_timestep的形状是[batch_size, max_seq_len]其中被mask的位置损失为0。错误做法# 假设我们想计算每个样本的真实损失各时间步损失之和 total_loss_per_sample torch.cumsum(loss_per_timestep, dim1)[:, -1] # 错误这里dim1是在序列长度上累积取最后一个位置得到的是整个序列的累积和这看起来没错。但是如果序列长度不同max_seq_len位置之后全是padding其损失为0所以[:, -1]取到的确实是所有有效时间步的损失和。然而问题在于cumsum保留了中间结果如果后续操作错误地使用了整个cumsum张量而不仅仅是最后一个值就会引入错误。更清晰且安全的做法# 方法1直接使用 sum语义更清晰 total_loss_per_sample torch.sum(loss_per_timestep, dim1) # 方法2如果确实需要中间累积结果例如用于动态规划再使用 cumsum cumulative_loss torch.cumsum(loss_per_timestep, dim1) # 使用时明确知道 cumulative_loss[b, t] 代表样本b到时间t为止的损失和5.2 场景二注意力机制中的单调对齐Monotonic Alignment在语音合成或序列到序列模型中单调对齐是一种常见约束要求对齐路径随时间单调前进。cumsum可以用来将二元的“是否前进”决策0/1转换为累积的“已经前进的步数”。# decision: [batch_size, output_seq_len] 值为0停留或1前进 decision torch.bernoulli(torch.ones(2, 5) * 0.7) # 随机生成0/1 print(decision) # tensor([[1., 1., 0., 1., 0.], # [1., 0., 1., 1., 1.]]) # 累积前进的步数 alignment_pos torch.cumsum(decision, dim1) print(alignment_pos) # tensor([[1., 2., 2., 3., 3.], # 第3步决策为0所以位置停留在2 # [1., 1., 2., 3., 4.]])这里dim1沿着输出序列维度累积。alignment_pos的每个位置指示了到当前输出步为止已经消耗了多少个输入步。这是实现单调注意力Monotonic Attention等机制的关键一步。5.3 场景三计算前缀和Prefix Sum以进行高效采样在强化学习或自然语言生成中我们经常需要根据一个概率分布进行采样。如果我们需要从一系列动作或单词的累积概率中进行采样cumsum就派上用场了。probs torch.tensor([0.1, 0.4, 0.2, 0.3]) # 动作概率和为1 cum_probs torch.cumsum(probs, dim0) print(cum_probs) # tensor([0.1000, 0.5000, 0.7000, 1.0000]) # 生成一个随机数用于采样 rand torch.rand(1) # 找到第一个累积概率大于随机数的索引 selected_action torch.searchsorted(cum_probs, rand).item() print(f“随机数 {rand.item():.3f}, 选择动作 {selected_action}“)这里cum_probs将概率转换成了区间[0, 1]上的分段界限torch.searchsorted可以高效地找到随机数落入的区间从而完成采样。这在处理大批量、多类别的采样时非常高效。5.4 常见踩坑点与排查清单维度混淆导致计算错误这是最普遍的问题。务必在操作前打印张量的shape并明确你希望累积发生在哪个物理意义上跨样本、跨时间、跨特征。黄金法则对形状为[B, T, D]的张量做cumsum(dim1)你得到的是每个样本内、每个特征维度上、随时间步的累积。误用cumsum代替sum如果你只需要最终的总和请使用torch.sum。cumsum会保留所有中间结果消耗更多内存且可能让后续代码逻辑变复杂。忽略掩码Mask在序列任务中如果序列长度不一致通常会有填充和掩码。对包含填充位置的数据进行cumsum填充位置通常为0也会被累积进去这可能会影响有效位置的值。一种做法是先将填充位置设为0再进行累积。更严谨的做法是使用torch.where或构造一个与掩码相关的偏移量来修正累积结果。数值溢出与精度对整数或低精度浮点数进行长序列累积很容易溢出。如前所述考虑使用dtype参数提升计算精度。梯度传播cumsum操作是完全可微分的可以无缝融入神经网络的反向传播中。每个输出位置的梯度都会流回所有参与该位置累积计算的输入位置。这在构建自定义的可微分层时非常有用。6. 从cumsum到cumprod与logcumsumexp扩展你的累积操作工具箱理解了cumsum它的两个“亲戚”操作就很容易掌握了。torch.cumprod累积乘积与cumsum逻辑完全一致只是将加法换成乘法。常用于计算连乘例如计算一系列条件概率的累积乘积。a torch.tensor([1, 2, 3, 4]) print(torch.cumprod(a, dim0)) # tensor([1, 2, 6, 24]) (1, 1*2, 1*2*3, 1*2*3*4)torch.logcumsumexp数值稳定的对数空间累积求和这是深度学习中一个极其重要但容易被忽视的函数。当我们需要计算log(sum(exp(x)))的累积版本时直接计算exp很容易导致数值溢出exp(100)就是一个巨大的数。logcumsumexp使用了数值稳定的算法。x torch.tensor([100., 101., 102.]) # 直接计算 log(sum(exp(x))) 会溢出 # logcumsumexp 可以稳定计算 result torch.logcumsumexp(x, dim0) print(result) # tensor([100.0000, 101.3133, 102.4076]) # 等价于 log(exp(100)exp(101)), log(exp(100)exp(101)exp(102))但过程稳定。它在计算注意力权重、归一化流Normalizing Flows或任何涉及对数概率求和累积的场景中都是必备工具。7. 性能考量与替代方案何时该用cumsumtorch.cumsum在GPU上由高度优化的CUDA内核实现对于大多数应用来说性能足够好。然而如果你在处理超长序列比如数万甚至更长并且只需要最终的累积和那么使用torch.sum会更快因为它避免了计算和存储所有中间结果。在自定义CUDA内核或使用 Triton 等工具进行极致优化时你可能需要考虑更复杂的并行扫描算法如 Blelloch 扫描来优化cumsum的性能。但对于99%的PyTorch应用内置的torch.cumsum就是最佳选择。最后分享一个我个人的调试习惯每当我在代码中写下cumsum时我都会立刻写一个简单的小例子用肉眼可验证的数据就像本文开头的例子快速跑一下确认dim参数的效果是否符合我的物理直觉。这个习惯帮我省下了无数小时的调试时间。维度操作是张量编程的核心而cumsum又是其中微妙而强大的一个花时间彻底理解它绝对是一笔高回报的投资。

相关新闻

PyTorch reshape操作详解:从张量变形原理到深度学习实战应用

PyTorch reshape操作详解:从张量变形原理到深度学习实战应用

1. 从“形状”说起:为什么我们需要reshape在深度学习的日常开发中,我们打交道最多的就是张量(Tensor)。你可以把它想象成一块可以任意塑形的“橡皮泥”。数据加载、模型计算、结果输出,每一步都伴随着张量的流动和变形…

2026/10/13 9:15:55 阅读更多 →
AI隐形文本水印:原理、实现与对开发者的影响

AI隐形文本水印:原理、实现与对开发者的影响

1. 先搞清楚“隐形文本水印”到底意味着什么如果你最近在关注 Claude 这类大语言模型,可能已经看到“新模型将嵌入隐形文本水印”的消息。这听起来有点神秘,但核心要解决的问题其实很直接:如何判断一段文本是不是由特定 AI 模型生成的。这不是…

2026/10/9 11:32:01 阅读更多 →
VTJ平台:基于Vue3与TypeScript的低代码开发实践与深度解析

VTJ平台:基于Vue3与TypeScript的低代码开发实践与深度解析

1. VTJ平台:一个Vue3驱动的低代码开发新选择最近在技术社区里,VTJ这个名字开始被频繁提及。作为一个长期混迹于前端和全栈开发领域的老兵,我对各种声称能“提升效率”的工具和平台总是抱着审慎又好奇的态度。VTJ,全称可能是“Vue …

2026/10/2 7:05:01 阅读更多 →

最新新闻

Tkinter Text控件深度解析:索引、Tag、滚动条与性能优化实战

Tkinter Text控件深度解析:索引、Tag、滚动条与性能优化实战

1. 从Entry到Text:为什么多行输入是GUI开发的一道分水岭做Python桌面工具的人,几乎都绕不开Tkinter。它随Python标准库分发,不需要额外装依赖,写个几十行就能跑出一个能用的窗口。但很多人学到输入控件这一块,会卡在一…

2026/10/14 21:48:52 阅读更多 →
计算机系统级实践:从汇编栈帧到内存布局的可验证实验

计算机系统级实践:从汇编栈帧到内存布局的可验证实验

简介:本资源是湖南大学《计算机系统基础》课程配套的大作业实践包,面向计算机专业本科生及系统级编程初学者,聚焦x86-32平台下的汇编与C混合编程、内存管理、指令执行与系统调用等核心能力训练。压缩包共634个文件,主体为186个.c源…

2026/10/14 21:48:52 阅读更多 →
深入解析Sentinel滑动窗口LeapArray源码与参数调优实践

深入解析Sentinel滑动窗口LeapArray源码与参数调优实践

如果不是因为线上一次离奇的限流误伤,我可能到现在都不会去翻 Sentinel 底层的 LeapArray 源码。那次事故的表现很典型:规则明明设置了每秒 100 QPS,流量平稳时一点问题没有,但只要一出现突发小高峰,就会有大量本不该被…

2026/10/14 21:48:52 阅读更多 →
微服务架构故障下的技术取舍:从限流降级到根因修复的决策之路

微服务架构故障下的技术取舍:从限流降级到根因修复的决策之路

凌晨两点十七分,监控大屏上的红色告警已经持续跳动了快四十分钟。我坐在工位上,面前的笔记本上画着两条完全不同的方案路径。旁边放着一杯已经彻底凉透的咖啡,那是晚上十点续的第二杯。整个办公区只剩我这一片还亮着灯,运维同事在…

2026/10/14 21:48:52 阅读更多 →
inSSIDer 2.0 无线勘察实战:从 802.11 管理帧到信道规划与干扰排查

inSSIDer 2.0 无线勘察实战:从 802.11 管理帧到信道规划与干扰排查

简介:inSSIDer2.0是一款面向Windows平台的免费Wi-Fi分析工具,适合家庭用户、网络运维人员及无线网络爱好者排查信号弱、网速慢、信道拥堵等问题。它可实时监测周边无线网络的信号强度,分析同频段信道占用情况并推荐更空闲的频道,同…

2026/10/14 21:48:52 阅读更多 →
音乐创作中的默契合作与技术创新

音乐创作中的默契合作与技术创新

1. 音乐合作背后的故事解析《赴一场前世的约定》这首作品最打动人的地方在于它延续了徐子崴与罗姣之间独特的音乐默契。作为长期合作的"歌坛知音",两人的配合已经达到了心有灵犀的程度。徐子崴擅长用音乐讲故事,而罗姣的嗓音则像一把打开情感之…

2026/10/14 21:47:51 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →