从零手写卷积神经网络:2019经典作业实战笔记与避坑指南
1. 为什么值得花时间啃这份经典作业如果你正在入门计算机视觉或者想系统理解卷积神经网络到底是怎么跑起来的那这份2019版的课程作业大概率是你绕不开的一站。它不像市面上很多“调包式”教程那样给你一个现成模型跑跑就完事而是逼着你从最底层的矩阵运算开始一行一行把前向传播、反向传播、卷积、池化、批归一化这些核心组件亲手写出来。做完之后你对深度学习框架里那些nn.Conv2d、nn.BatchNorm2d到底在背后干了什么会有一种“原来如此”的通透感。这份笔记适合谁看如果你刚学完Python和NumPy基础对神经网络只有模糊概念那它非常适合作为你的第一份系统性实战材料。如果你已经用过PyTorch或TensorFlow搭过模型但总觉得心里没底那它也能帮你把那些“黑盒”拆开看个明白。整份作业分为几个大块基础部分要求你纯用NumPy实现线性分类器、两层神经网络和多层神经网络进阶部分则涉及卷积网络、批归一化、Dropout、以及框架层面的API使用。我个人的建议是不要跳着做尤其是反向传播那几节跳过了后面会非常痛苦。我当初做这份作业的时候最大的感受是它把“理解”和“实现”之间的鸿沟填得非常好。很多课程讲反向传播就是推一遍链式法则然后让你用框架。但这份作业要求你手写affine_backward、relu_backward、conv_backward写完之后你才会真正明白为什么梯度会消失、为什么初始化那么重要、为什么批归一化能加速训练。这些经验在后面调参和排错时价值极高。2. 整体结构拆解与学习路线规划2.1 作业模块的层次关系2019版的作业大致可以分成三条主线。第一条是基础网络组件包括knn、linear_svm、softmax、two_layer_net、fully_connected_net这部分主要让你理解分类器和反向传播。第二条是卷积网络专题包括convolutional_networks、batch_normalization、dropout这部分是计算机视觉的核心。第三条是框架与工程实践包括pytorch相关的内容让你从手写过渡到实际框架。这三条线不是孤立的。基础部分写好的affine_forward和affine_backward在卷积网络里会以im2col的形式再次出现基础部分理解的softmax损失在卷积网络里依然是分类头的核心。所以我的建议是按顺序做不要觉得基础部分“太简单”就跳过。我见过不少人直接冲卷积结果在反向传播的维度变换上卡了好几天。2.2 每份作业的通用解题流程不管做哪一份作业我总结了一个比较稳的流程。第一步先读README和.ipynb文件里的说明搞清楚输入输出是什么、要填哪些函数。第二步把forward写出来用小的随机数据测试维度是否正确。第三步写backward这时候一定要用数值梯度检验grad_check不要凭感觉。第四步跑完整的训练循环观察损失下降曲线。第五步调超参数记录实验结果。这个流程看起来简单但每一步都有坑。比如数值梯度检验很多人只检验一次就过了但实际上你应该在写每个backward之后都检验一遍。因为一旦某个中间步骤的梯度算错了后面整个网络都会学不动而损失曲线可能只是“下降得慢”不会直接报错排查起来非常费时间。2.3 环境准备与工具选择这份作业对环境的依赖不算复杂但版本问题经常让人头疼。我建议用Python 3.7或3.8NumPy版本不要太高1.19左右比较稳。如果你用Anaconda可以单独建一个虚拟环境避免和系统里的其他包冲突。Jupyter Notebook是必须的因为作业文件都是.ipynb格式里面嵌了测试代码和可视化。关于是否需要GPU基础部分完全不需要CPU跑就够了。卷积部分如果数据量不大CPU也能跑但如果你想把CIFAR-10完整训练到比较好的精度有个GPU会快很多。不过我的建议是即使有GPU也先用小数据集比如cifar10的一个子集把代码调通再上全量数据。这样调试周期短不容易因为一个维度错误等半天才报错。提示不要一上来就装最新版的PyTorch或TensorFlow作业里的某些API可能和新版本不兼容。如果你只是做手写部分其实只需要NumPy和Matplotlib。3. 核心模块的详细解析与实操要点3.1 线性分类器从得分函数到损失函数线性分类器是整份作业的起点。它的核心思想很简单把图像拉成一个长向量然后乘以一个权重矩阵得到每个类别的得分。公式是scores X W b。这里的关键是理解W的形状。假设输入是N个样本每个样本D维类别数是C那么X是N x DW是D x Cb是C维输出scores是N x C。svm损失和softmax损失是两种常见的分类损失。svm损失要求正确类别的得分比错误类别高出至少一个边界值delta否则就产生损失。softmax损失则是把得分转成概率然后取正确类别概率的负对数。这两个损失的梯度推导是作业的重点。我当初在推导softmax梯度时卡在了一个地方当i y_i时梯度是(p_i - 1)否则是p_i。这个结论看起来简单但如果你不自己推一遍很容易在实现时把符号搞反。实操时我建议先用一个极小的数据集比如X是3 x 4W是4 x 3手动算一遍前向和反向然后用数值梯度检验。grad_check函数会帮你比较解析梯度和数值梯度的差异如果相对误差在1e-7以下基本就对了。注意数值梯度检验时要把正则化项也考虑进去否则会有微小偏差。3.2 两层神经网络反向传播的第一次实战两层神经网络的结构是affine - relu - affine - softmax。这里的affine就是线性变换relu是激活函数。前向传播很直观但反向传播是很多人第一次真正感受到链式法则的威力。你需要从损失函数开始一层一层往回传梯度。具体来说softmax损失对得分的梯度是(probs - one_hot)然后除以N。这个梯度传给第二个affine层计算出对W2、b2的梯度以及对隐藏层输出的梯度。隐藏层梯度经过relu的反向小于零的位置梯度置零然后传给第一个affine层计算出对W1、b1的梯度。整个过程就是不断做矩阵乘法和转置。我踩过的一个坑是在计算dW时忘记除以N。因为损失函数里有一个1/N的归一化所以梯度也要相应缩放。如果不除梯度会大N倍导致训练时损失爆炸。另一个坑是relu的反向如果前向时保存的是relu的输出那么反向时直接用(x 0)作为掩码如果保存的是输入也是一样的。但如果你不小心用了 0在零点处的梯度会有一点差异虽然影响不大但严格来说应该用 0。3.3 卷积与池化计算机视觉的核心操作卷积层是这份作业里最复杂的部分。它的前向传播可以用循环实现也可以用im2col加速。循环版本容易理解但速度慢im2col版本把局部感受野展开成矩阵然后用矩阵乘法一次性计算速度快很多。我建议先写循环版本确保理解每个位置的计算然后再写im2col版本对比两者的输出是否一致。池化层相对简单最大池化就是取局部区域的最大值反向传播时把梯度传给最大值所在的位置。平均池化则是取平均值反向传播时把梯度平均分配。这里要注意的是池化层的反向传播需要记录前向传播时的最大值位置所以前向时要保存一个掩码。批归一化是另一个重点。它的前向传播是对每个特征维度计算均值和方差然后归一化再乘以gamma加上beta。反向传播稍微复杂因为均值和方差也依赖于输入。我当初推导时用了计算图的方式把每个中间变量都画出来然后一步步回传。如果你觉得推导太难可以先记住结论但一定要用数值梯度检验。注意卷积和池化的反向传播维度变换非常容易出错。建议每写一个函数就用一个小的输入比如1 x 1 x 4 x 4测试打印出输入输出形状确认无误后再继续。3.4 训练技巧初始化、更新规则与超参数初始化对训练的影响很大。如果权重初始化为全零所有神经元的输出都一样反向传播时梯度也一样网络学不到东西。如果初始化太大激活值会饱和梯度消失。常用的方法是Xavier初始化和He初始化。Xavier适合tanh激活He适合relu激活。作业里会让你比较不同初始化的效果我实测下来He初始化在relu网络里收敛最快。更新规则方面SGD是最基础的但收敛慢。SGD Momentum能加速收敛减少震荡。RMSProp和Adam是自适应学习率方法通常效果更好但需要调的超参数更多。我建议先用SGD Momentum把网络跑通然后再试Adam。学习率是最重要的超参数一般从1e-3或1e-4开始试如果损失下降太慢就调大如果损失震荡或爆炸就调小。正则化方面L2正则化能防止过拟合Dropout也能。Dropout在训练时随机置零一部分神经元测试时用全部神经元但输出要乘以保留概率。我当初实现Dropout时忘记在测试时缩放导致测试精度比训练精度低很多。后来才明白训练时的期望输出和测试时的输出要一致所以要么训练时除以保留概率要么测试时乘以保留概率。4. 完整实操流程与关键环节实现4.1 从零实现一个两层网络假设我们要在CIFAR-10上训练一个两层网络。第一步加载数据把图像拉平成N x 3072的矩阵然后减去均值除以标准差。第二步初始化权重W1为3072 x Hb1为HW2为H x 10b2为10。H是隐藏层大小一般取100到500之间。第三步写前向传播h relu(X W1 b1)scores h W2 b2。第四步计算softmax损失和梯度。第五步反向传播计算dW1、db1、dW2、db2。第六步用SGD更新参数。这个过程听起来简单但实际写的时候维度很容易搞混。我建议把每个变量的形状都写在注释里比如# X: (N, D)# W1: (D, H)# h: (N, H)。这样在调试时一眼就能看出哪里不对。另外训练循环里要记录损失和准确率每100次迭代打印一次观察趋势。如果损失不下降先检查学习率是不是太小再检查梯度是不是算错了。4.2 卷积网络的搭建与调试卷积网络的搭建比全连接网络复杂得多。一个典型的卷积网络结构是conv - relu - pool - conv - relu - pool - affine - relu - affine - softmax。每一层的输出形状都要仔细计算。比如输入是N x 3 x 32 x 32卷积核是16 x 3 x 3 x 3步长1填充1那么输出是N x 16 x 32 x 32。池化层2 x 2步长2输出是N x 16 x 16 x 16。调试卷积网络时我建议先用一个极小的数据集比如10张图片让网络过拟合。如果网络能在这个小数据集上达到100%准确率说明前向和反向传播基本正确。如果不行那一定是某个地方的梯度算错了。过拟合小数据集是检验网络实现是否正确的一个非常有效的方法。另一个关键是im2col的实现。它的核心思想是把每个局部感受野展开成一列然后所有列拼成一个矩阵。这样卷积就变成了矩阵乘法。im2col的输入是N x C x H x W输出是N * out_H * out_W x C * filter_H * filter_W。反向传播时需要把梯度从col格式还原回图像格式这个过程叫col2im。我当初写col2im时用了循环累加因为同一个像素可能被多个感受野覆盖梯度要累加。4.3 批归一化的实现与验证批归一化的前向传播分训练和测试两种模式。训练时用当前批次的均值和方差测试时用训练过程中累积的均值和方差。作业里会让你实现这两种模式。我建议先实现训练模式用数值梯度检验反向传播然后再实现测试模式。反向传播的推导比较繁琐但如果你把计算图拆开其实不难。设输入为x均值为mu方差为var归一化后的值为x_hat (x - mu) / sqrt(var eps)输出为y gamma * x_hat beta。反向传播时dgamma sum(dy * x_hat)dbeta sum(dy)然后dx_hat dy * gamma再往回传。这里的关键是dx的计算因为mu和var都依赖于x所以dx有三部分直接路径、均值路径、方差路径。我当初推导时用了1/N的因子因为均值和方差都是对N个样本求的。提示批归一化的数值稳定性很重要。eps一般取1e-5不要太小否则方差接近零时会出现除零错误。4.4 超参数调优与实验结果记录超参数调优是作业里最耗时的部分。我建议用网格搜索但不要一开始就搜很大的范围。先固定其他参数只调学习率找到损失下降最快的值。然后调正则化强度观察验证集准确率。最后调隐藏层大小和Dropout概率。每次实验都要记录配置和结果可以用一个简单的表格。实验编号学习率正则化强度隐藏层大小训练准确率验证准确率11e-31e-41000.450.4221e-21e-41000.520.4831e-31e-22000.500.47从表里可以看出学习率从1e-3调到1e-2验证准确率提升了说明原来的学习率偏小。正则化强度从1e-4调到1e-2验证准确率反而下降了说明正则化太强模型欠拟合。这些观察能帮你快速缩小搜索范围。5. 常见问题与排查技巧实录5.1 梯度检验不通过怎么办梯度检验不通过是最常见的问题。首先检查你的数值梯度计算是否正确。数值梯度的公式是(f(x h) - f(x - h)) / (2h)h一般取1e-5。如果h太大近似误差大如果h太小浮点误差大。其次检查解析梯度的维度是否和数值梯度一致。有时候你算出来的梯度形状不对但广播机制让它看起来能跑实际上已经错了。最后检查是否有随机性。比如Dropout在训练时会随机置零这会导致数值梯度不稳定。检验时要把Dropout关掉或者固定随机种子。我遇到过一个很隐蔽的问题在softmax损失里我用了log(sum(exp(x)))但没有减去最大值导致数值溢出。虽然梯度检验时因为数值小没暴露但训练时损失变成了nan。后来改成log(sum(exp(x - max_x))) max_x问题就解决了。这个技巧叫“log-sum-exp trick”在实现softmax时非常有用。5.2 损失不下降或下降太慢损失不下降首先看学习率。如果学习率太小损失下降会非常慢如果太大损失会震荡甚至爆炸。你可以打印每次迭代的损失如果损失在某个值附近波动说明学习率太大如果损失几乎不变说明学习率太小。其次检查数据预处理。如果输入没有归一化梯度会很大训练不稳定。我建议把输入减去均值除以标准差这样梯度尺度更一致。另一个常见原因是初始化。如果权重初始化太小激活值接近零梯度也会很小网络学不动。如果初始化太大激活值饱和梯度消失。用He初始化通常能解决这个问题。还有如果你用了ReLU确保没有“死神经元”。如果某个神经元的输出总是零它的梯度也是零永远不会更新。可以用Leaky ReLU缓解。5.3 过拟合与欠拟合的判断与处理过拟合的表现是训练准确率很高但验证准确率低。处理方法有增加正则化强度、增加Dropout、减少网络容量、增加数据增强。欠拟合的表现是训练准确率和验证准确率都低。处理方法有增加网络容量、减少正则化、训练更久、调大学习率。我当初在CIFAR-10上训练时训练准确率到了90%但验证准确率只有40%明显过拟合。后来加了Dropout和L2正则化验证准确率提升到了55%。再后来用了数据增强随机翻转、随机裁剪验证准确率到了65%。所以过拟合不一定是坏事说明你的网络有足够容量只是需要正则化。5.4 常见错误速查表错误现象可能原因解决方法损失为nan学习率太大、数值溢出减小学习率、用log-sum-exp梯度检验不通过梯度公式错误、维度不匹配检查公式、打印形状训练准确率高但验证低过拟合增加正则化、Dropout训练和验证都低欠拟合增加容量、减小正则化损失下降太慢学习率太小、初始化不好调大学习率、换初始化卷积输出形状不对填充或步长计算错误重新计算输出尺寸注意这份速查表是我自己踩坑总结的不一定覆盖所有情况但能解决大部分常见问题。6. 从手写实现到框架使用的过渡6.1 为什么要学框架手写实现能帮你理解原理但实际工作中不可能什么都手写。框架提供了高效的卷积、池化、批归一化等操作还能自动求导大大提高了开发效率。作业里的PyTorch部分就是让你把之前手写的组件用框架重新实现一遍对比两者的差异。我当初做这部分时最大的感受是框架把很多细节隐藏了但如果你不理解背后的原理遇到问题就无从下手。比如PyTorch的nn.Conv2d你知道它做了卷积但如果你不知道im2col你就不知道为什么改变padding会影响输出形状。所以手写部分不是白做的它是你理解框架的基础。6.2 框架实现的关键差异用PyTorch实现两层网络你只需要定义nn.Linear和nn.ReLU然后用nn.CrossEntropyLoss。训练循环里optimizer.zero_grad()清空梯度loss.backward()自动求导optimizer.step()更新参数。整个过程比手写简洁得多但你要注意几个点第一PyTorch的CrossEntropyLoss已经包含了softmax所以你的网络输出应该是原始得分不要加softmax。第二PyTorch的Dropout在训练和测试时的行为不同要用model.train()和model.eval()切换。第三PyTorch的BatchNorm也有训练和测试模式测试时用的是累积的均值和方差。我建议你在用框架实现后和手写版本对比一下准确率。如果差异很大说明某个地方理解错了。比如我当初用PyTorch时忘记在测试时切换eval()模式导致Dropout还在随机置零验证准确率很低。后来加上model.eval()问题就解决了。6.3 从作业到实际项目的迁移这份作业的知识点在实际项目中非常有用。比如你在做图像分类时需要选择网络结构、初始化方法、优化器、学习率、正则化策略。这些决策都依赖于你对底层原理的理解。如果你知道He初始化适合ReLU你就不会用Xavier如果你知道Adam对学习率不敏感你就可以先用Adam快速跑一个基线再用SGD微调。另外作业里的调试技巧比如梯度检验、小数据集过拟合、可视化损失曲线在实际项目中也是通用的。我现在的习惯是每写一个新模型先用小数据跑通再用全量数据训练。这样能快速发现实现错误避免浪费计算资源。7. 我个人的一些经验与建议做这份作业最大的收获不是学会了某个具体的算法而是养成了一种“从底层理解”的习惯。现在我看到一个网络结构会下意识地想它的前向传播是什么反向传播怎么算梯度会不会消失这种思维方式比会调包重要得多。如果你正在做这份作业我建议你第一不要怕慢基础部分多花时间后面会越来越顺。第二多动手不要只看答案自己写一遍比看十遍都管用。第三遇到问题先自己排查用数值梯度、打印形状、可视化中间结果这些技能比答案本身更有价值。第四记录你的实验哪怕只是简单的表格也能帮你理清思路。最后分享一个小技巧如果你在某个地方卡了很久不妨先跳过做后面的部分过几天再回来看往往会有新的思路。我当初在批归一化的反向传播上卡了两天后来先做了Dropout再回来时突然就想通了。学习就是这样有时候需要一点距离。

相关新闻

ARFoundation集成SenseAR:桥接方案解决AR平面检测稳定性实践

ARFoundation集成SenseAR:桥接方案解决AR平面检测稳定性实践

ARFoundation集成SenseAR这件事,最早是我们组里的一次“被迫尝试”。当时手头有一套AR试鞋应用,一直跑在ARFoundation上,跨平台抽象确实省心,iOS端和Android端一套代码就能出包。但问题出在部分中低端安卓机型上:地面平…

2026/10/15 9:04:33 阅读更多 →
生产级HTML注册页:语义化结构、渐进验证与无障碍实现

生产级HTML注册页:语义化结构、渐进验证与无障碍实现

1. 这不是“抄个代码就能用”的页面,而是一套经得起真实用户考验的注册流程设计“HTML用户注册页面设置源码”——光看这个标题,很多人第一反应是:找段现成代码,改改ID、换换文字,扔进浏览器就能跑。但我在某高校数字教…

2026/10/15 9:04:33 阅读更多 →
编程中的循环结构:原理、实现与优化

编程中的循环结构:原理、实现与优化

1. 循环结构的基本概念在编程中,循环结构是控制程序流程的重要方式之一。它允许我们重复执行某段代码,直到满足特定条件为止。循环结构的存在大大提高了代码的复用性和效率,避免了重复编写相似代码的繁琐。1.1 循环的分类常见的循环结构主要分…

2026/10/15 9:04:33 阅读更多 →

最新新闻

【ESP32笔记】SmartConfig一键配网

【ESP32笔记】SmartConfig一键配网

本节目标:搞懂"手机 App 如何把 WiFi 密码告诉一台还没联网的设备",并会用按键长按触发 SmartConfig,把拿到的 SSID/密码存进 NVS一、本节要解决的问题 上一节把 SSID 和密码写死在代码里,这只是学习阶段的权宜之计。真…

2026/10/15 9:44:40 阅读更多 →
2026中国高职院校排名解析:三强院校的办学特色

2026中国高职院校排名解析:三强院校的办学特色

1. 高职院校排名解读:为什么这三所院校能登顶?最近看到2026年中国高职院校排名出炉,江西应用技术职业学院、合肥职业技术学院和浙江金融职业学院并列第一,这个结果挺有意思的。作为一个长期关注职业教育发展的从业者,我…

2026/10/15 9:44:40 阅读更多 →
AI专著写作工具实战指南:从大纲推演到全书一致性终检

AI专著写作工具实战指南:从大纲推演到全书一致性终检

做学术的人多半都有过这种体验:论文写了不少,一提专著就头疼。篇幅动辄二三十万字,结构要环环相扣,术语要全书统一,文献要追溯几十年,中间还免不了反复推翻重来。我身边有几位做社科的朋友,课题…

2026/10/15 9:44:40 阅读更多 →
caveman调试法:最朴素的print日志+二分法,快速定位线上问题

caveman调试法:最朴素的print日志+二分法,快速定位线上问题

调试大概是最能拉开程序员差距的环节了。同样的一个bug,有人五分钟定位根因,有人折腾一下午还停在"玄学问题"的状态。这几年我发现自己越来越"返祖":身边同事都在研究分布式链路追踪、全链路监控、APM采样的时候&#xf…

2026/10/15 9:44:40 阅读更多 →
HarmonyOS考试组件库开发实战与优化技巧

HarmonyOS考试组件库开发实战与优化技巧

1. HarmonyOS考试组件库核心功能解析在HarmonyOS应用开发中,考试类组件库是专门为在线考试、练习测评等场景设计的高复用性UI控件集合。这类组件通常包含题库管理、试卷生成、答题卡、计时器、自动批改等核心模块,能够帮助开发者快速构建标准化考试系统。…

2026/10/15 9:44:40 阅读更多 →
离散数学及其应用第八版电子版:学习路径、检索技巧与代码实践

离散数学及其应用第八版电子版:学习路径、检索技巧与代码实践

简介:离散数学及其应用电子版对应 Kenneth H. Rosen《离散数学及其应用》第八版原版教材,面向计算机科学与信息科学专业的学生、考研备考者及从业人员,用于系统学习离散结构、逻辑推理与算法分析所需的数学基础。压缩包内共1个PDF文件&#x…

2026/10/15 9:43:39 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战: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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →