2D卷积与3D卷积全解析:原理、应用与PyTorch实操
1. 直观理解2D卷积与3D卷积的本质差别先给还没接触过3D卷积的朋友一个最简单的画面2D卷积处理的是“一张图”3D卷积处理的是“一叠图”。很多新手把3D卷积理解成“对视频里每一帧分别做2D卷积”这其实完全跑偏了。3D卷积不是逐帧处理的拼接而是把时间维度或者深度维度直接当作一个额外的空间维度用三维的卷积核在“立体数据”里滑着走。我最初带项目时组里同学拿3D卷积做视频分类第一版代码直接套了2D卷积的网络结构只是把输入从[B, C, H, W]改成了[B, C, D, H, W]结果维度报错报了一整天。这件事给我的教训是先搞懂维度语义再去碰代码。1.1 从生活类比看维度差异想象你有一张棋盘2D卷积就是用一个印章在棋盘平面上滑着盖印每次盖住一小块棋盘格子然后算出一个数字。这个印章只能在这个平面上移动不能往天空方向移动。现在假设你有一叠棋盘比如一本厚厚的棋谱3D卷积的印章就变成了一个立体的“方印”它同时盖住好几张棋盘上的对应区域。这个方印不仅能在横向和纵向上滑动还能在“层数”方向滑动。这个多出来的方向在视频里就是时间方向在医学影像里就是切片深度方向。用这个类比想明白一件事2D卷积的卷积核只有宽和高两个维度比如3x33D卷积的卷积核有三个维度比如3x3x3。这就是最底层的区别。1.2 数学表达与滑动窗口逻辑从数学上看2D卷积对输入特征图 (X \in \mathbb{R}^{C_{in} \times H \times W})使用卷积核 (W \in \mathbb{R}^{C_{in} \times k_h \times k_w})在空间维度滑动输出特征图的每个位置计算的是[ y_{out}(i,j) \sum_{c0}^{C_{in}-1} \sum_{p0}^{k_h-1} \sum_{q0}^{k_w-1} W(c,p,q) \cdot X(c, ip, jq) b ]而3D卷积对输入 (X \in \mathbb{R}^{C_{in} \times D \times H \times W})使用卷积核 (W \in \mathbb{R}^{C_{in} \times k_d \times k_h \times k_w})输出位置的计算是[ y_{out}(t,i,j) \sum_{c0}^{C_{in}-1} \sum_{r0}^{k_d-1} \sum_{p0}^{k_h-1} \sum_{q0}^{k_w-1} W(c,r,p,q) \cdot X(c, tr, ip, jq) b ]注意公式里的求和符号数量2D卷积有三个求和的量通道、高、宽3D卷积有四个通道、深度、高、宽。这里的“通道”是特征通道比如RGB三通道“深度”是数据本身多出来的那个维度。很多教程会把通道也当作一个维度解释容易把人绕晕。我的建议是通道是每个空间位置上都有的属性集合它不参与空间滑动。3D卷积真正多出来的是“深度”这个可滑动的维度。1.3 通道维度 vs 深度维度关键区别这是最容易混的一个点。拿一张彩色图片来说它的形状是(3, H, W)其中3是通道。你用2D卷积处理它时卷积核实际上也是3通道的比如(3, 3, 3)但滑动只在H和W上进行。所以2D卷积输出的还是一个二维平面每输出通道对应一个平面。3D卷积里如果你输入一个彩色视频形状是(3, T, H, W)这里的T是帧数3是通道。卷积核的形状是(3, k_t, k_h, k_w)滑动在T、H、W三个方向上进行输出的是三维特征张量每个输出通道对应一个三维立体特征。通道维度在两种卷积里都是“完全跨通道求和”的而深度维度是“局部滑动、局部聚合”的。这就是为什么3D卷积能建模帧与帧之间的运动信息而2D卷积做不到——除非你手动把多帧堆到通道里但那样就丢失了帧之间的空间连续性。提示如果把视频的每一帧当成通道堆给2D卷积通道间是“全连接”的没有任何的平移等变性而3D卷积把帧间关系建模成局部滑动保留时间顺序和局部相关性。这是原理层面不可调和的差异。2. 使用场景与效果对比什么时候选哪个选2D还是3D卷积核心看你的数据有没有除了空间之外、需要局部滑动的维度。这句话听起来简单但落地时很多人会拍脑袋。2.1 2D卷积的典型应用2D卷积是图像处理的基本盘。图像分类如猫狗识别、目标检测如用边界框框出物体、图像分割如像素级标注、超分辨率重建这些都是2D卷积的主场。你只要把数据组织成(C, H, W)2D卷积就能工作。2D卷积的优势是参数少、训练快、成熟方案多。同为3x3卷积2D版本比3D版本少了整整一个维度的乘累加计算显存占用也小。所以在单张图片任务上不需要纠结直接用2D卷积就对了。2.2 3D卷积的典型应用3D卷积的典型场景是视频理解、医学影像分割和点云体素化等任务。视频动作识别输入是一段连续帧比如16帧的片段形状(3, 16, 224, 224)。3D卷积能在时间方向上提取运动特征识别“跑步”“挥手”这类依赖时序变化的动作。这是2D卷积无法直接做到的。医学影像CT或MRI是三维数据体比如(1, 128, 256, 256)分别对应深度、高、宽。3D卷积可以直接在立体数据上分割器官或病灶避免把三维数据切成一张张切片后丢失上下文。点云处理把点云量化到三维体素网格后3D卷积可以学习空间结构特征。在选择时我的经验是如果数据本身是三维采样的且相邻层之间存在局部相关那么3D卷积是自然的选择。如果能用2D时序模型如LSTM、Transformer替代也可以但效果通常不如3D卷积来得直接。2.3 参数量的计算对比参数量直接决定了模型大小和过拟合风险。我们以输入为(C, T, H, W)的数据为例假设用2D卷积逐帧处理再比较用3D卷积一次处理。2D卷积的参数量是[ (C_{out} \times C_{in} \times k_h \times k_w) C_{out} ]3D卷积的参数量是[ (C_{out} \times C_{in} \times k_d \times k_h \times k_w) C_{out} ]如果k_d k_h k_w 3那么3D卷积的参数量大约是2D卷积的3倍。如果你有256个输入通道、256个输出通道一个3x3的2D卷积参数约59万个而3x3x3的3D卷积参数约177万个。参数量的暴涨会带来两个直接后果一是训练更容易过拟合二是显存压力大。很多视频模型的batch size只能设很小就是因为3D卷积把中间特征图的尺寸也变成了三维。注意3D卷积的输出特征图尺寸在深度方向也会缩小取决于padding和stride这意味着后续层的输入张量体积更大计算量增长是三维的。设计网络时一定要先算清楚每一层的形状不要等报错。3. PyTorch 实现从零动手搭一个实验理论说完了直接进入代码环节。我用PyTorch从一个最原始的手写实现开始再到官方高层API一步步拆解。这样你能彻底看清3D卷积到底多做了什么事。3.1 环境准备与数据说明本实验不需要GPUCPU就能跑通。建议Python 3.8PyTorch 1.10。老版本在nn.Conv3d上行为一致影响不大。为了便于演示我们构造一个模拟数据假设有一段视频3通道8帧每帧分辨率64x64。用下面的代码生成随机数据import torch import torch.nn as nn # 模拟一个视频输入: 3通道, 8帧, 64x64 video torch.randn(1, 3, 8, 64, 64) # (B, C, D, H, W) print(输入形状:, video.shape)你会看到输出是torch.Size([1, 3, 8, 64, 64])。注意维度顺序batch、channel、depth、height、width这是PyTorch中3D数据约定俗成的顺序千万别写成(B, D, C, H, W)。3.2 手写2D卷积实现为了理解底层逻辑我们先不用nn.Conv2d而是用最基本的张量操作实现一个单通道的2D卷积。这里忽略batch和通道只对一张单通道图做3x3卷积def conv2d_manual(x, kernel, stride1, padding0): x: (H, W) kernel: (kh, kw) H, W x.shape kh, kw kernel.shape if padding 0: x torch.nn.functional.pad(x, (padding, padding, padding, padding)) H 2 * padding W 2 * padding out_h (H - kh) // stride 1 out_w (W - kw) // stride 1 output torch.zeros(out_h, out_w) for i in range(out_h): for j in range(out_w): region x[i*stride : i*stride kh, j*stride : j*stride kw] output[i, j] (region * kernel).sum() return output # 测试 x torch.randn(6, 6) kernel torch.randn(3, 3) out conv2d_manual(x, kernel, stride1, padding0) print(手动2D卷积输出:, out.shape)这个函数里的双重循环就是卷积的定义每次取一个局部窗口与卷积核做逐元素相乘再求和。虽然用循环很慢但概念上准确无误。3.3 手写3D卷积实现现在把上面的函数扩展到3D。核心改动是增加一个深度方向的循环。单通道、单卷积核的3D卷积如下def conv3d_manual(x, kernel, stride1, padding0): x: (D, H, W) kernel: (kd, kh, kw) D, H, W x.shape kd, kh, kw kernel.shape if padding 0: x torch.nn.functional.pad(x, (padding, padding, padding, padding, padding, padding)) D 2 * padding H 2 * padding W 2 * padding out_d (D - kd) // stride 1 out_h (H - kh) // stride 1 out_w (W - kw) // stride 1 output torch.zeros(out_d, out_h, out_w) for t in range(out_d): for i in range(out_h): for j in range(out_w): region x[t*stride : t*stride kd, i*stride : i*stride kh, j*stride : j*stride kw] output[t, i, j] (region * kernel).sum() return output # 测试 x3d torch.randn(4, 6, 6) kernel3d torch.randn(3, 3, 3) out3d conv3d_manual(x3d, kernel3d, stride1, padding0) print(手动3D卷积输出:, out3d.shape)输出形状是(2, 4, 4)。你可以观察到一个现象深度方向从4变成了2空间维度从6变成了4每一层都因为卷积核大小和步长而缩小了。这个手写实现的循环层数比2D多了一层所以计算量呈立方级增长。实际训练中千万不要用这种方式跑它的唯一价值是帮助你理解维度运算。3.4 使用 nn.Conv2d 与 nn.Conv3d 的官方实现工程中肯定用官方API。先看2D卷积conv2d nn.Conv2d(in_channels3, out_channels16, kernel_size3, stride1, padding1) video_2d_input torch.randn(1, 3, 8, 64, 64) # 假装8帧是batch的另一种形态 # 注意Conv2d 期望输入是 (B, C, H, W) # 所以如果直接传5D张量会报错。通常需要把深度维合并到batch或者用3D卷积。这里有个特常见的坑你想用2D卷积处理视频必须做维度变换。最常见的有两种操作把每一帧当作独立样本reshape成(B*T, C, H, W)卷积后再恢复成(B, T, C, H, W)。把时间维合并到通道维变成(B, C*T, H, W)但这样会破坏时间结构。正规操作是第一种配合nn.Conv2d使用B, C, T, H, W video_2d_input.shape video_reshaped video_2d_input.permute(0, 2, 1, 3, 4).reshape(B * T, C, H, W) out_2d conv2d(video_reshaped) print(2D卷积输出:, out_2d.shape) # (B*T, out_c, H, W)而3D卷积一次就能直接处理5D输入conv3d nn.Conv3d(in_channels3, out_channels16, kernel_size(3, 3, 3), stride(1, 1, 1), padding(1, 1, 1)) out_3d conv3d(video_2d_input) print(3D卷积输出:, out_3d.shape) # (1, 16, 8, 64, 64)看到没3D卷积的输出在时间、高度、宽度三个方向都保持了尺寸因为padding1而2D卷积需要你手动处理帧维度还无法建模帧间关系。这就是选型上的直观差异。4. 实操过程完整训练一个小型实验只跑单层卷积说明不了问题。我带你搭建一个完整的小实验同一个视频分类任务分别用2D卷积网络和3D卷积网络对比两者的参数量、训练动态和最终精度。数据用随机生成的模拟动作虽然不真实但足以验证原理。4.1 构建模拟数据我们生成一个“伪视频分类”数据集给每个样本分配一个类别比如0或1然后用不同的频率生成正弦波噪声作为视频内容让类别和时域频率相关import torch from torch.utils.data import Dataset, DataLoader class FakeVideoDataset(Dataset): def __init__(self, num_samples1000, seq_len8, size32): self.num_samples num_samples self.seq_len seq_len self.size size def __len__(self): return self.num_samples def __getitem__(self, idx): # 类别与频率挂钩 label idx % 2 if label 0: freq 1.0 else: freq 4.0 # 生成 (3, seq_len, size, size) 的视频 t torch.linspace(0, 1, self.seq_len) base torch.sin(2 * 3.14159 * freq * t).reshape(1, -1, 1, 1) noise torch.randn(3, self.seq_len, self.size, self.size) * 0.2 video base.expand(3, self.seq_len, self.size, self.size) * 0.8 noise return video, label这里的逻辑是类别0的视频变化慢类别1的视频变化快网络必须读取时间维度的信息才能区分所以2D卷积会遇到困难。4.2 定义模型我们定义一个极简的2D卷积网络和一个极简的3D卷积网络二者参数量尽量接近class Simple2DNet(nn.Module): def __init__(self, num_classes2): super().__init__() self.conv nn.Sequential( nn.Conv2d(3, 8, kernel_size3, padding1), nn.ReLU(), nn.AdaptiveAvgPool2d(1) ) self.fc nn.Linear(8, num_classes) def forward(self, x): # x: (B, C, T, H, W) B, C, T, H, W x.shape # 把T合并到B x x.permute(0, 2, 1, 3, 4).reshape(B * T, C, H, W) x self.conv(x) x x.reshape(B, T, -1).mean(dim1) # 在时间上平均 return self.fc(x) class Simple3DNet(nn.Module): def __init__(self, num_classes2): super().__init__() self.conv nn.Sequential( nn.Conv3d(3, 8, kernel_size(3, 3, 3), padding1), nn.ReLU(), nn.AdaptiveAvgPool3d(1) ) self.fc nn.Linear(8, num_classes) def forward(self, x): # x: (B, C, T, H, W) x self.conv(x) x x.flatten(1) return self.fc(x)注意2D网络的技巧把时间维度拆到batch独立卷积后做时间平均。这种“2D卷积时序池化”的baseline在实际研究中也常出现它虽然不建模帧间局部运动但能捕捉频率相关统计量。4.3 训练与对比训练代码是标准的设定损失函数为交叉熵优化器用Adam训练10个epochdef train(model, loader, lr1e-3, epochs10): optimizer torch.optim.Adam(model.parameters(), lrlr) criterion nn.CrossEntropyLoss() model.train() for epoch in range(epochs): total_loss 0.0 correct 0 total 0 for video, label in loader: optimizer.zero_grad() output model(video) loss criterion(output, label) loss.backward() optimizer.step() total_loss loss.item() correct (output.argmax(1) label).sum().item() total label.size(0) print(fEpoch {epoch1}: loss{total_loss/len(loader):.4f}, acc{correct/total:.4f}) # 准备数据 dataset FakeVideoDataset(num_samples500, seq_len8, size32) loader DataLoader(dataset, batch_size16, shuffleTrue) # 实例化模型打印参数量 model2d Simple2DNet() model3d Simple3DNet() params2d sum(p.numel() for p in model2d.parameters()) params3d sum(p.numel() for p in model3d.parameters()) print(2D参数量:, params2d) print(3D参数量:, params3d)一般你会看到3D的参数量大约是2D的3倍左右因为卷积核多了一个维度。为了公平对比你可以调节3D网络的通道数让两者参数量接近。实际训练中3D网络通常更快收敛因为它的归纳偏置更匹配数据特性。4.4 结果解读在数据类别依赖时间频率的情况下2D网络虽然通道数少、参数量也少准确率往往偏低可能徘徊在50%~70%因为它只能看到单帧的静态内容时间平均无法分辨频率差异。3D网络则能轻松达到90%以上因为它的卷积核会在帧之间滑动直接计算出局部时间变化率。我在实际跑这类实验时发现一个很有意思的细节2D网络如果把输入改为“三帧之间的差分图”准确率也能大幅提升。这证明3D卷积的核心价值就是自动学习时间差分特征而不是必须使用3D结构不可。实操心得当你在自己的项目里对比2D和3D时建议先跑一个“2D卷积光流/差分特征”的baseline再上3D卷积。如果baseline已经接近3D效果那就不值得付出3倍的显存和参数量代价。这个对比步骤能帮你做出理性的架构选型。5. 常见问题与排查技巧实录这里整理我自己踩过和带人踩过的坑每一条都对应一段真实的调试经历。5.1 维度对不上怎么办最常见的报错就是RuntimeError: Expected 4D input for nn.Conv2d, got 5D input。出现原因几乎都是把5D数据直接传给了2D卷积。解决方案是先确认你的数据语义。如果确实是视频/立体数据且你想用2D卷积就把D维合并到B维# 假设 x: (B, C, D, H, W) B, C, D, H, W x.shape x_2d x.permute(0, 2, 1, 3, 4).reshape(B * D, C, H, W) out conv2d(x_2d) # 处理完再恢复成5D B_D, C_out, H_out, W_out out.shape out out.reshape(B, D, C_out, H_out, W_out).permute(0, 2, 1, 3, 4)另一个办法是直接用3D卷积。最终选哪个要看你对时序/深度信息的需求。5.2 3D卷积显存爆炸怎么办3D卷积的中间特征图比2D大得多。假设输入是(1, 3, 16, 112, 112)经过一层输出通道为32的3D卷积后特征图是(1, 32, 16, 112, 112)光这一个张量就占约 32×16×112×112×4字节 ≈ 256MB。如果网络深一点批量大一点显存很快打满。我的经验性建议缩小输入的空间分辨率。视频任务不必用224x224很多实验用112x112甚至56x56就够了。减少时序长度。8帧起步不要一上来就32帧。使用3D卷积的分离版本。比如(3, 1, 3)和(1, 3, 3)分解卷积可以大幅减少参数量。这相当于把3D卷积拆成“时间卷积空间卷积”。开启混合精度训练。PyTorch的torch.cuda.amp能把显存砍半。5.3 感受野和参数量的常见误区很多人以为3D卷积的感受野是“时间空间”的简单叠加其实并不是。感受野是一个线性公式在深度方向上如果连续两层卷积核大小都是3那么感受野是 1 2 3第一层再扩展为 1 2×2 5第二层。3D卷积的感受野在三个方向上是独立增长的但参数量的增长是立方级的。另一个误区是“通道数越多越好”。3D卷积的通道数翻倍参数量增长是2倍但计算量增长是2倍乘以特征图体积的额外开销。许多3D网络的通道数设置在64或128就足够了加太多只会让训练变慢。5.4 性能优化技巧如果确定要用3D卷积这里有几个提升训练效率的实用技巧使用预训练2D权重初始化3D网络。比如把ResNet的2D卷积核复制到3D卷积核的中间平面其他平面用零初始化。很多视频识别模型是这样做的收敛速度明显加快。时序下采样。在网络的早期阶段用步长大于1的3D卷积快速压缩时序维度减少后续计算。使用torch.utils.checkpoint在反向传播时丢弃中间激活需要时重新计算用时间换显存。注意torch.utils.checkpoint对3D卷积非常有效因为中间张量太大。但会显著增加训练时间通常显存实在不够时再用。6. 从实际项目中学到的取舍经验做深度学习项目最忌讳“别人用什么我就用什么”。2D卷积和3D卷积的区别本质上不是代码层的区别而是你对数据维度语义的理解。我在一个医学影像分割项目中一开始直接用了3D U-Net训练时间以天计。后来分析数据才发现相邻切片之间的分辨率差异很小运动伪影也不大其实完全可以用2D U-Net逐层分割再用后处理平滑。换成2D方案后训练时间缩短了80%精度几乎不变。这说明3D卷积不是万能的它的优势只在“深度维度确实存在局部空间相关性”时才成立。反过来在一个视频动作识别任务里我尝试过用2D卷积逐帧提取特征再拼接送入Transformer。效果比3D卷积好但模型体积和调参难度也更大。3D卷积的优势是简单直接一个Conv3d就完成了时空特征提取适合快速验证。最后分享一个小技巧在开发调试阶段先在极小尺寸数据上跑通网络比如(2, 3, 4, 16, 16)确认形状无误后再上真实数据。这样能省掉大量因为维度错误而浪费的GPU时间。2D和3D卷积的代码结构非常相似只要想清楚你数据的物理含义选型就不会错。

相关新闻

多级反馈队列调度器:原理、边界与调参实战

多级反馈队列调度器:原理、边界与调参实战

1. 我为什么把调度器从“单队列”改成“多级反馈队列”1.1 先来先服务和时间片轮转的账都算不平多级反馈队列这名字听起来像操作系统教材里一个遥远的概念,但真到自己动手写调度器的时候,你会发现它其实是“妥协”两个字最典型的代表。我最早维护的一个教…

2026/10/14 13:04:04 阅读更多 →
Java常用类编程实践与性能优化指南

Java常用类编程实践与性能优化指南

1. 项目概述作为一名Java开发者,我经常需要处理各种基础但重要的编程任务。最近在整理教学资料时,发现学生们对Java常用类的掌握程度参差不齐,特别是从第8题到第15题这些编程练习,涉及了String、Math、Date等多个核心类的使用。这…

2026/10/14 13:04:04 阅读更多 →
Excel夹:鸿蒙上原生读写xlsx表格工具

Excel夹:鸿蒙上原生读写xlsx表格工具

需要在鸿蒙手机上改Excel表?Excel夹原生支持xlsx读写,公式函数图表全支持,还能导出PDF。文件本地处理不上云,目前免费。#鸿蒙 #纯血鸿蒙 #鸿蒙next #Excel #办公

2026/10/14 13:04:04 阅读更多 →

最新新闻

ponytail:一个轻量原生JS前端插件,轻松搞定H5底部导航与运营浮层

ponytail:一个轻量原生JS前端插件,轻松搞定H5底部导航与运营浮层

ponytail 这个名字,好多人第一次听到都以为是来聊发型的。其实它是我很早就为了处理移动端 H5 底部导航和运营浮层写的一个微型前端插件,核心干的事情就一件:在页面任意指定位置追加一块内容,同时把动画、状态记忆、批量挂载这些看…

2026/10/14 13:47:56 阅读更多 →
多行文本溢出如何优雅截断?轻量级插件ponytail实战解析

多行文本溢出如何优雅截断?轻量级插件ponytail实战解析

前两天我在改一个资讯站的列表页,后台录入的标题越来越长,最后UI撂下一句话:“最多两行,超出显示省略号”。单行截断用text-overflow: ellipsis早就习以为常,可多行截断硬是折腾了我一整天,从-webkit-line-…

2026/10/14 13:47:56 阅读更多 →
低空数字底座规划实战:四层架构、数据治理与落地避坑

低空数字底座规划实战:四层架构、数据治理与落地避坑

简介:这份PPT是2025年低空数字底座技术架构及应用场景规划方案,面向低空经济产业规划者、技术架构师及相关政企决策者,用于支撑低空数字化转型、空域动态管理和规模化应用场景落地。资源包共1个pptx文件,整体大小7.83MB&#xff0…

2026/10/14 13:47:56 阅读更多 →
什么是 AI API 中转站?它到底帮你解决了哪些问题?

什么是 AI API 中转站?它到底帮你解决了哪些问题?

大家好呀,我是 Lazy熊。 刚接触 AI 编程时,很多人会听到一个词:API 中转站。 听起来很技术,但用人话说,它更像是模型和工具之间的一个接入服务。 你用 Codex、Claude Code 这类工具时,需要模型、接口地址…

2026/10/14 13:47:56 阅读更多 →
SpringBoot教培管理系统:智能排课与高效运营实践

SpringBoot教培管理系统:智能排课与高效运营实践

1. 项目背景与核心价值这个SpringBoot中小学课外培训管理系统,本质上解决的是教培机构在数字化转型过程中的核心痛点。我在实际接触过十几家中小型培训机构后发现,他们普遍面临几个棘手问题:学员信息散落在Excel表格里、课程安排靠微信群通知…

2026/10/14 13:47:56 阅读更多 →
clusterdata生产集群数据全解析:数据解读、调度实验与避坑指南

clusterdata生产集群数据全解析:数据解读、调度实验与避坑指南

简介:阿里生产集群采集的集群数据,面向集群管理、资源调度与数据中心工作负载分析的研究者和学生,可用于理解真实IDC中在线服务与批处理混部的特征。资源共32个文件,压缩包16.22MB,以Markdown说明文档、CSV/schema数据…

2026/10/14 13:46:55 阅读更多 →

日新闻

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/13 16:22:04 阅读更多 →
影刀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 阅读更多 →