简单卷积网络实战:从卷积、池化到图像分类
把几个卷积层简单地拼在一起真的就能让程序认出猫和狗吗这是我在后台收到最多的问题之一。前两篇笔记把卷积核、padding、stride、特征图这些零件讲了一遍很多人反而更懵了零件我都认识但它们是怎么组装成一个完整网络的这篇作为卷积基础知识的第三篇专门聊简单卷积网络——不追求多深多复杂而是把卷积、激活、池化、全连接这几个模块串起来让一个极小的网络真正学会一个图像分类任务。我会沿着结构设计、参数量计算、训练调参、翻车排查这条线完整走一遍。适合刚搞懂卷积运算、想动手搭第一个分类模型的读者也适合那些已经跑通demo、却不太清楚每一步为什么这么选的初学者。1. 从单层卷积到网络为什么必须把卷积层堆起来1.1 单层卷积只能做局部查字典单个卷积层的本质是拿一组固定大小的模板去原图上滑动匹配。每个输出位置的值只说明原图这个局部patch和某个模板像不像。一个3×3的卷积核看过的最多就是9个像素拼出的小块纹理它根本不可能理解耳朵轮子眼睛这种抽象概念。就像你只认识一个汉字的偏旁部首不可能读懂整个句子。更关键的是单层卷积是一次性匹配。它输出的特征图虽然有多通道但每个通道之间是独立的没有相互组合的机制。要让横线竖线小弧线组合出一个圆角或者让圆形长条组合出汽车这种语义必须靠多层结构逐级整合。所以简单卷积网络的第一步就是接受一个反直觉的结论网络变深不是因为炫技而是因为抽象特征必须由浅层局部特征层层组合而来。1.2 卷积-激活-池化一个可复用的特征提取单元一个最简单的卷积网络几乎都是下面这个节奏的重复卷积 → 激活函数 → 池化 → 卷积 → 激活函数 → 池化 → 全连接 → 输出每个环节都有明确分工。卷积负责提取局部模式激活函数负责引入非线性否则不管堆多少层线性卷积整体数学上仍然等价于一个线性变换表达能力大打折扣池化负责降低分辨率把位置精确的响应变成区域内最强的响应从而带来轻微的平移容忍度。这个卷积-激活-池化三元组你可以想象成一个信息压缩器。卷积从原始像素里提取线索激活函数裁掉不重要的负响应池化把一个小邻域内最有代表性的信号保留下来。反复使用这个压缩器特征图的空间尺寸越来越小通道数越来越多信息从哪里有什么逐渐变成这里像什么。1.3 为什么不能直接用全连接网络有人会问我把32×32的图像直接展平成1024个像素喂给全连接网络不是一样能做分类吗能做但代价完全不一样。全连接层里每个输出神经元都和所有输入相连换到简单卷积网络里的两个卷积层第一个卷积层的参数是8×1×3×3再加8个偏置总共80个第二个是16×8×3×3再加16个偏置总共1168个。两层加起来才1248个参数就已经完成了对整张图的特征提取。而一个1024→128的全连接层参数是1024×128加128个偏置也就是131200个。差了整整两个数量级效果和泛化能力却通常更好。原因就是卷积的两个内置特性局部连接和参数共享。每个卷积核只在局部窗口内操作而且同一套权重滑遍全图——这等于告诉网络某个特征在图像任何位置出现都是有意义的。这个先验知识对图像任务太重要了也是卷积网络在图像领域全面取代全连接结构的根本原因。2. 一个能跑通的最小卷积网络从零搭起2.1 结构选型的每一步在想什么我不喜欢直接丢一个结构让读者照抄。我们来模拟一下实际设计过程。假设输入是单通道的32×32灰度图任务是一个10类分类问题。第一层卷积我选了8个3×3卷积核padding设为1。为什么是3×3而不是5×5小核参数少而且两层3×3卷积叠加感受野等效于一个5×5卷积非线性表达却更强。为什么padding1因为3×3卷积stride1、padding1时输出尺寸不变仍是32×32。这样堆叠卷积不会让图像快速缩水信息丢失是温和可控的。卷积之后接ReLU然后接一个2×2、stride2的最大池化。这个池化会把特征图从32×32降到16×16这是第一个压缩节拍。第二层卷积换成16个3×3卷积核同样padding1再接ReLU和2×2池化此时特征图变成16×8×8。通道数从8翻倍到16空间尺寸从32缩到8信息总量没有暴跌但抽象层次翻了。最后展平得到1024维向量接一个128个神经元的全连接层再接10个神经元的输出层用softmax得到10个类别的概率。这个空间减半、通道翻倍的节奏不是拍脑袋。分辨率下降意味着位置信息在牺牲通道增加意味着特征类型在丰富。两者保持一种平衡网络信息容量才不会快速坍缩。2.2 输出尺寸与参数量的手算过程很多同学搭网络报错都是因为不手算尺寸。我们把这个网络每一层的输出尺寸和参数量完整过一遍。层输出尺寸本层参数量说明输入1×32×320单通道灰度图Conv1 8核3×3 pad18×32×328×1×3×3 8 80输入1通道输出8通道ReLU MaxPool 2×28×16×160尺寸降一半Conv2 16核3×3 pad116×16×1616×8×3×3 16 1168输入8通道输出16通道ReLU MaxPool 2×216×8×80尺寸降一半Flatten1024016×8×8展平FC1 1281281024×128 128 131200全连接是参数大户FC2 1010128×10 10 1290输出类别概率整个网络参数总量是80 1168 131200 1290 133738约13万个参数。你会发现绝大部分参数落在第一个全连接层上。卷积部分只贡献了不到1%的参数却承担了主要特征提取工作。这也是简单卷积网络最值得体会的地方用极少的参数做特征提取把分类判断交给后续的密集层。2.3 落地代码结构怎么写都不报错下面是一个接口示意我用通用的层名来写。不同框架的API名称有差异但结构对应关系是一致的——Conv对应卷积层MaxPool对应池化层Dense对应全连接层。# 伪代码示意请按实际框架替换对应API from nn_framework import Sequential, Conv2d, MaxPool2d, Flatten, Dense def build_simple_net(): model Sequential([ Conv2d(in_channels1, out_channels8, kernel_size3, padding1), ReLU(), MaxPool2d(kernel_size2, stride2), Conv2d(in_channels8, out_channels16, kernel_size3, padding1), ReLU(), MaxPool2d(kernel_size2, stride2), Flatten(), Dense(in_features1024, out_features128), ReLU(), Dense(in_features128, out_features10) ]) return model写代码时有两个地方容易翻车。一是Flatten之后的维度一定要和第一个Dense的in_features一致。比如这个网络里池化后是16个通道、8×8分辨率展平是1024你写成别的数构造网络时就报维度错误。二是注意框架的通道排布习惯。有的框架输入是(batch, channel, height, width)有的框架是(batch, height, width, channel)。这个顺序混了往往不是报错而是训练loss完全不动极其隐蔽。我自己的习惯是拿到一个批次数据后先打印一个batch的shape确认再进训练循环。3. 感受野与信息流动简单卷积网络到底看到了什么3.1 感受野用手算一次就懂了感受野是理解卷积网络绕不开的概念也是初学者最容易听过名词但不会算的东西。简单说特征图上一个像素点对应回原始输入图像能影响它的区域有多大。有个从前往后的递推算法写出来特别直观。初始时输入图像上一个像素的感受野就是1×1。经过第一个3×3卷积后感受野变成3×3。经过第一个2×2池化感受野本身不变仍然是3×3但输出位置的采样步长变成了2也就是说下一层卷积在空间上的中心间距被拉大了。再经过第二个3×3卷积时用公式算是3 (3-1)×2 7即输出特征图上的每个点至少对应原图一个7×7的区域。第二个池化之后采样步长进一步累加到4实际覆盖范围会更宽大概能覆盖原图十几×十几的像素范围。这个手算结果说明了一件事即便只有两层卷积加两次池化网络最后一层特征图上的每个点看的已经是原图一个相当有规模的区域了。不需要很深很大的网络简单的结构也能获得足够大的视野。而整张8×8特征图堆叠起来信息已经覆盖到了整幅输入图像。3.2 把中间特征图画出来看看训练完一个简单网络我强烈建议你把中间层的特征图输出可视化。做法很简单把一张测试图片喂进去分别取第一个卷积层和第二个卷积层输出的特征图画成小格子拼图。你会看到很有意思的规律。第一个卷积层的通道大多在响应横线、竖线、边缘、色块边界这类非常底层的模式很像传统图像处理里的算子。第二个卷积层的通道响应的是更复杂的局部组合可能有弧形、角点、某种纹理斑块。到了全连接层你几乎没法直观解释某个神经元到底在响应什么了。我第一次看到这个可视化时很有冲击感因为网络从头到尾没有任何人告诉它应该先检测边缘再组合成图案但训练完之后它自己就长成了这种分层结构。这是数据驱动出来的规律不是人工设计的。所以当你怀疑我的网络到底学到东西没有可视化特征图比盯着loss曲线可靠得多。3.3 平移不变性是怎么来的简单卷积网络对目标位置的敏感度比全连接网络低这几乎是公认的但很多人说不清原因。两个机制在起作用。第一个机制是参数共享。一个卷积核滑遍全图意味着同一个特征无论在图像的左上角还是右下角出现都会触发相同的响应值只是响应位置不同。第二个机制是池化。最大池化取邻域内最大值目标在局部范围内移动几个像素池化输出几乎不变。两者叠加网络获得了一定程度的平移容忍度。不过要提醒一句简单网络的平移容忍度非常有限。目标大幅移动、缩放、旋转它依然会翻车。数据增强随机裁剪、翻转、平移不是可有可无的操作它是用训练数据把网络最后的移位敏感强行掰回来。所以别迷信卷积自带平移不变性这句话该做增强还是要做。4. 训练一个简单卷积网络从准备数据到读懂曲线4.1 数据准备的顺序不能省很多人在模型结构上花了很多心思却在数据上偷懒然后遇到各种奇怪问题。数据准备有个固定顺序每个坑我都踩过。第一步确认输入shape。拿到数据先打印形状。如果是单通道图确认高和宽的维度位置。不同框架对(batch, channel, height, width)和(batch, height, width, channel)的约定不同选一种并坚持把它喂对。第二步归一化。图像原始像素值在0到255之间如果不缩放到0-1或者标准化网络初始的梯度容易被大数值主导收敛极慢。第三步确认标签范围。分类问题如果你的标签是0到9的整数注意交叉熵函数期望的输入到底是整数索引还是one-hot向量。第四步打乱数据并切分训练集和验证集。不打乱数据会让相同类别的样本连续出现训练曲线会周期性抖动。弄完之后不要急着训练先打印一批数据的形状和标签范围随机抽几张画出来人工确认图像和标签是对应的。这一步看着笨但能挡掉一半的玄学bug。4.2 超参数先按稳妥配置跑通简单卷积网络在入门任务上超参数不需要多精妙先选稳妥值跑通再考虑调优。学习率选0.001到0.01之间。自适应优化器在这个区间内表现通常不错。批大小选64到128。说话更直白一点批大小过小比如4、8梯度噪声大loss曲线会非常毛糙批大小过大比如512训练相对不稳定而且显存占用高。迭代轮数先定10到20个回合。跑完看一眼趋势再决定加不加。需要强调一个原则跑通比刷精度重要。第一轮实验的目标是看到loss稳定下降哪怕最后精度只是勉强能用也是巨大成功。如果一上来就调学习率、换优化器、加正则出问题时你根本不知道是哪一步引入的。控制变量是训练网络的基本素养。4.3 loss曲线的正常与异常训练中最需要盯的就是loss曲线但不要只看训练集loss。训练集loss持续下降、验证集loss也在下降说明模型还在学习可以继续训练。训练集loss降得很低、验证集loss反而回升这是过拟合的典型信号。验证集loss从头到尾纹丝不动不要急着加模型复杂度先回到数据准备环节排查然后再检查是不是lr过大导致loss震荡到无法收敛。还有一个非常实用的技巧过拟合实验。你拿很少量的训练样本比如500张训练足够的轮次如果网络无法把训练集loss压到很低说明网络结构或代码有严重问题。能过拟合说明网络有表达能力后面再讨论泛化问题。这个技巧我几乎每次开新网络都会用它把模型坏了和数据难这两个情况快速区分开。5. 简单卷积网络最常见的几个翻车现场5.1 输出尺寸算错导致维度不一致这类报错可能是初学者遇到最多的。根因只有一个没手算特征图尺寸。比如输入32×323×3卷积不加padding输出是30×30再来一次变成28×28两个池化之后可能就不是我们设想的整数尺寸了。调试方法非常简单。在构建网络之后用一个随机输入张量跑一次前向把每层输出的shape打印出来。如果第二个全连接层的输入维度和Flatten后的维度对不上你会立刻看到哪里出了问题。更保险的做法是在构造每个卷积层之前先用输出尺寸公式手算一遍输出尺寸 (输入尺寸 2×padding - 卷积核大小) / stride 1为了避免这类问题对于stride1的3×3卷积我几乎固定用padding1因为这样尺寸不变对于stride2的池化输入尺寸必须能被2整除否则就会出现小数尺寸或不对称裁剪。5.2 损失居高不下准确率像随机猜loss一直在初始值附近徘徊准确率稳定在类别比例的基准线上这说明网络根本没学会。不要怀疑网络太浅绝大多数情况下是数据或代码有问题。按这个顺序排查。先检查数据打乱和标签绑定我曾经因为打乱操作同时独立打乱了图像和标签导致训练了很久loss都没动静。再检查归一化像素值如果是0到255的大数值配合不当初始化梯度很容易被推得太远。最后检查损失函数输入确认传给交叉熵的是未经过softmax的原始logits而不是已经softmax的概率。这个细节在不同框架里行为不同错了loss数值也会异常。训练这个环节有一个可以快速定位的手段。取一小批数据比如128张图片训练十几个回合如果loss几乎不下降那说明代码链路有问题。如果loss能降到极低说明代码没问题再去检查泛化。放心是个人都经历过loss卡死好几天的情况这种问题几乎都是最基础的地方出错。5.3 训练集精度高、验证集精度低这种情况在初学者手里出现得最频繁。数据量少、模型参数多网络把训练样本的噪声细节都背了下来。简单网络虽然不大但很小的数据集依然能让它过拟合。我的处理习惯按优先级排首先加数据增强随机水平翻转、随机平移这是成本最低、收益最高的一招。其次在第一个全连接层前加一个Dropout层训练时随机丢弃部分神经元强制网络不要把赌注压在少数几个神经元上。最后考虑减小模型容量把通道数降到一半甚至更少。处理这个问题的核心观念是通过观察训练集和验证集精度的差距判断模型处于欠拟合还是过拟合状态再对症下药。不要一上来就把所有正则手段全加上。加一个看一个你才能真正积累手感。症状最可能原因优先处理办法loss完全不降数据/代码问题过拟合实验定位loss下降极慢学习率过小或归一化缺失检查预处理和lr训练好、验证差过拟合数据增强/Dropout/减容量训练差、验证也差欠拟合增加特征提取能力/lr调整6. 让简单网络变得更实用三个不用绕弯的方向6.1 通道数和层数的配合关系当你已经跑通一个最小网络第一个自然想法是加通道数让每一层提取更多特征。这个想法没错但要注意节奏。输入32×32这种小图第一层卷积的通道数从8涨到16、32通常是有帮助的涨到128甚至256收益会迅速衰减计算量却翻几倍。通道数应该和输入分辨率、数据复杂程度匹配不是越大越好。层数同理。简单网络加一层卷积感受野变大、非线性变强效果往往有可见提升。但再往下加梯度传播会逐渐困难训练开始变慢。这时候就该考虑归一化层和更现代的结构了。简单网络的价值在于建立这些判断的基准线你知道基线是多少加东西后才有参照。6.2 给网络加一个稳定器训练简单网络时最常见的糟心体验是学习率稍微调大一点loss就起飞了。这时你可以考虑加一个归一化层。它的作用是在每次前向传播时把特征分布拉回均值为0、方差为1附近让梯度传播更平稳。加了之后学习率可以适当放宽网络对初始化和超参数的敏感度也会下降很多。正则化方面Dropout值得加在卷积层之后、全连接层之前。原理说直白一点训练时随机让一部分神经元不参与计算这样网络不会过度依赖某几个神经元的独门记忆被迫把信息分散到更多连接上。要注意Dropout在推理阶段必须关闭框架通常自动处理但如果你想手动部署模型这个细节非常容易踩坑。6.3 什么时候该放弃从零搭简单网络一个诚实的建议是如果你只是想在真实场景完成图像分类任务不要自己从零训练一个简单卷积网络。现在有很多成熟的预训练模型直接拿来微调效果会好得多。自己从零搭网络更适合做学习和小规模验证。但作为学习路径简单网络是绝对绕不过去的。因为后续所有高级结构本质上都在这套卷积-激活-池化的骨架上做文章。跳跃连接解决的是深层梯度流动问题多分支结构解决的是不同尺度特征的并行提取问题注意力机制解决的是特征通道的重要性重标定问题。你如果连简单网络的参数量、感受野、loss曲线都看不明白后面这些高级玩法很难真正落地。我自己做实验的习惯是遇到一个新的任务类型永远先用最简单的手工特征或浅层网络铺一条基线确保问题本身可解再上复杂方案。这条习惯帮我避开了很多拿着高级模型折腾到最后才发现数据本身有问题的尴尬局面。把简单卷积网络玩透你收获的不仅是一个能跑的分类器更是对网络到底在做什么这件事的切身感知。

相关新闻

SpringBoot + Vue 社区待就业人员信息管理系统开发实战解析

SpringBoot + Vue 社区待就业人员信息管理系统开发实战解析

我见过不少同学拿到“SpringBoot Vue 社区待就业人员信息管理系统”这种毕设题目以后,第一反应就是找一套现成源码改个标题交了。这种做法不是不行,但如果你真的想把这套系统讲明白、应付得了答辩,而不是被评委问两句就卡壳,那就…

2026/10/18 11:45:09 阅读更多 →
MT4自动交易系统EA源码解析:从策略骨架到二次开发

MT4自动交易系统EA源码解析:从策略骨架到二次开发

简介:面向MT4平台的外汇自动交易学习与应用,这套资源整合了多个自动交易系统(EA)及其配套文档,适合希望借助程序化策略提升交易效率、降低情绪干扰的初学到进阶交易者。压缩包共151个文件,包含53个mq4策略源…

2026/10/18 11:45:09 阅读更多 →
dnSpy实战:DLL反编译、调试与程序集修改全解析

dnSpy实战:DLL反编译、调试与程序集修改全解析

简介:dnSpy 是面向 .NET/C# 开发者与逆向工程爱好者的开源反编译调试工具,可直接将 DLL、EXE 等托管程序集还原为可读的 C# 源码,并支持断点调试、内存查看和程序集修改,适合用于代码学习、问题定位、安全分析及补丁修复。资源压缩…

2026/10/18 11:45:09 阅读更多 →

最新新闻

OpenCV SIFT特征提取与图像拼接实战:从原理到代码实现

OpenCV SIFT特征提取与图像拼接实战:从原理到代码实现

OpenCV 的 SIFT 特征提取在图像拼接里有多好用,做视觉相关开发的朋友应该都有体会。这篇教程会从 SIFT 的原理讲起,一步步带你实现两张图的无缝拼接,代码我会逐段解释,还会分享我实际调试中踩过的坑,保证你是零基础也能…

2026/10/18 12:48:37 阅读更多 →
AI招聘落地指南:从简历解析到留任预测的风险与对策

AI招聘落地指南:从简历解析到留任预测的风险与对策

AI 招聘不是把简历扔给大模型就完事。我见过太多团队,买了一套号称“智能筛选”的系统,结果上线第一天就把公司里最能干的销售全过滤掉了,因为系统觉得“频繁跳槽”是负面信号,完全没看候选人每一段都是被挖走的。也见过 HR 为了省…

2026/10/18 12:48:37 阅读更多 →
Qt C++塔防游戏源码拆解:信号槽、多线程与事件循环实战

Qt C++塔防游戏源码拆解:信号槽、多线程与事件循环实战

简介:一份基于Qt/C框架编写的简易植物大战僵尸游戏源码包,适合正在学习Qt图形界面编程与C面向对象设计的开发者参考。压缩包共36个文件,包含17个cpp实现文件、16个h头文件以及pro工程文件、qrc资源文件等,核心代码涉及植物卡片、子…

2026/10/18 12:48:36 阅读更多 →
PHP对接劳动仲裁查询API,构建智能背调与风控预警系统

PHP对接劳动仲裁查询API,构建智能背调与风控预警系统

劳动仲裁记录这几年在招聘和业务风控里的分量越来越重。以前背调主要看学历、工作经历、是否有犯罪记录,但实践下来会发现,劳动仲裁信息往往是判断候选人职业稳定性、企业用工合规风险的重要信号。一个人跟老东家频繁打仲裁,背后可能是公司管…

2026/10/18 12:48:36 阅读更多 →
水下传感器网络仿真代码包:MAC与路由协议完整实现

水下传感器网络仿真代码包:MAC与路由协议完整实现

简介:这份资源面向水下传感器网络(UWSNs)方向的研究生、科研人员与授课教师,提供一套可直接运行的仿真代码与配套资料,用于验证声波通信、路由协议、能量管理与数据融合等关键算法。压缩包共131个文件,约22…

2026/10/18 12:48:36 阅读更多 →
用户友好提示词设计指南:从原理到实战的完整方法论

用户友好提示词设计指南:从原理到实战的完整方法论

我做了两年多的提示词设计工作,中间帮不少团队搭建过面向终端用户的大模型应用,也和很多工程师争论过“提示词到底算不算代码”。我个人的结论是:提示词确实不算传统意义上的代码,但它一定是需要结构化设计的工程产物。一个用户友…

2026/10/18 12:47:36 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/18 12:16:16 阅读更多 →