神经网络实现Fashion-MNIST图像分类:完整代码与调试指南
简介这一压缩包面向机器学习初学者、深度学习入门者以及需要动手实践图像分类任务的学生围绕Fashion-MNIST时装数据集提供一整套可运行的神经网络分类实现。包内文件共2个包含Python源文件和Word说明文档整体大小仅559KB代码精炼而完整地覆盖了图像归一化、标签one-hot编码、模型构建、损失函数与优化器设定、训练迭代、测试集准确率评估以及超参数调整等关键环节。配套文档对网络结构设计思路、Conv2D卷积层与MaxPooling2D池化层的作用、全连接层分类逻辑以及训练中的常见问题做了补充梳理。读者结合代码与文档可以快速掌握TensorFlow或PyTorch框架下的图像分类流程并基于此扩展自己的实验从而降低上手门槛、减少踩坑成本。目前已有297人学习下载适合课程作业、期末设计或神经网络入门实践时作为参考模板。1. 神经网络实现fashion数据分类一份能直接跑通的作业代码拿到这份「神经网络实现fashion数据分类代码.zip」我的第一反应是这不像网上那些动不动几百行的教学项目解压出来就三样东西——homework6目录、main.py、一份doc文档典型的课程作业结构。核心任务非常明确用神经网络对Fashion-MNIST的10类服装图片做分类从数据预处理、模型搭建、训练到评估main.py一条链路全部串起来。适合两类人。一类是正在做类似作业、想要一份能对照复现的代码的学生另一类是已经写过几个分类模型、想快速搭一个图像分类基线再改结构的从业者。Fashion-MNIST比手写数字MNIST更贴近真实场景因为类别间相似度高跑出来的准确率数字更有说服力。这篇笔记把这套代码从数据到训练拆开讲顺带把容易翻车的几个点都指出来。2. 先摸清数据集Fashion-MNIST的分布、加载与预处理2.1 数据集的真实构成10个类别每类6000训练1000测试Fashion-MNIST由Zalando公司发布设计初衷就是替代MNIST做更难的图像分类基线。MNIST是手写数字Fashion-MNIST换成10类服装图片T恤/上衣、裤子、套头衫、连衣裙、外套、凉鞋、衬衫、运动鞋、包、短靴。每个类别6000张训练图和1000张测试图总共70000张全部是28x28的灰度图。类别编号顺序有讲究0到9的编码固定输出层神经元的顺序和它完全对应标签类别标签类别0T恤/上衣5凉鞋1裤子6衬衫2套头衫7运动鞋3连衣裙8包4外套9短靴注意6号衬衫和0号T恤/上衣、5号凉鞋和7号运动鞋图片上长得非常像。这是Fashion-MNIST比MNIST难的核心原因——类别之间的类间距离小模型必须学到更细的纹理特征才能区分开。28x28尺寸在今天看来很小但轮廓、条纹、领口形态都是有效信息一点都不简单。2.2 加载与归一化4行代码决定后面省不省心常见做法是用Keras自带的数据集接口加载第一次运行会自动下载数据。下面是完整可跑的预处理代码import tensorflow as tf from tensorflow.keras import datasets # 加载Fashion-MNIST接口自动切好训练/测试集 (x_train, y_train), (x_test, y_test) datasets.fashion_mnist.load_data() # 关键一步归一化到0-1区间转float32节省显存/内存 x_train x_train.astype(float32) / 255.0 x_test x_test.astype(float32) / 255.0 # 灰度图补通道维28x28x1满足Conv2D输入要求 x_train x_train[..., None] x_test x_test[..., None] print(训练集:, x_train.shape, y_train.shape) # (60000, 28, 28, 1) (60000,) print(测试集:, x_test.shape, y_test.shape) # (10000, 28, 28, 1) (10000,)这4行代码是整个流程里最容易出问题的部分。astype(float32)把整数像素转成浮点类型/255.0把0到255的原始范围压到0到1之间。有人直接把原始像素值丢进网络训练能跑但loss下降明显变慢最终精度少1到2个点属于典型的能跑但不对。x_train[..., None]是给28x28的二维矩阵补一个维度变成28x28x1因为卷积层要求输入是四维张量batch, height, width, channels漏了这一步Conv2D会直接报维度错误。2.3 标签要不要转one-hot取决于损失函数很多教程第一步先把标签转成one-hot向量其实这步可有可无。你只需要保证标签格式和损失函数匹配即可from tensorflow.keras.utils import to_categorical # 方案A标签保持整数配合SparseCategoricalCrossentropy推荐少一步转换 # 方案B转one-hot配合CategoricalCrossentropy y_train_onehot to_categorical(y_train, num_classes10) y_test_onehot to_categorical(y_test, num_classes10)方案A的标签是0到9的整数比如一张裤子的标签就是1方案B的标签变成长度为10的向量比如[0, 1, 0, ..., 0]。两者在最终效果上完全等价区别只在损失函数的写法。我一般选方案A因为少一次转换、代码更短而且打印预测结果时整数标签可以直接映射类别名省一步argmax。不管选哪种输出层神经元数必须是10这是模型和数据的对齐约定。2.4 从训练集切验证集测试集从头到尾不碰训练过程中需要一个验证集来观察模型在未见数据上的表现但测试集是留给最后评估用的。常规做法是从60000张训练图里留出5000张做验证# 留出最后5000张作验证集前55000张作实际训练集 x_val x_train[-5000:] y_val y_train[-5000:] x_train x_train[:-5000] y_train y_train[:-5000]这段代码看起来简单作业里翻车的人却不少。常见错误是把x_test当验证集反复调参最后报告的测试准确率严重虚高——因为模型已经在这些样本上见过最优解了。更稳妥的做法是一开始就把x_test封存起来调参全程只用x_val全部定稿后再取出x_test做最终评估。3. 模型怎么选前馈全连接基线还是卷积神经网络3.1 先跑全连接验证链路最快的方式Fashion-MNIST上有一个常用策略先用前馈神经网络全连接网络搭一个快速基线确认数据加载、训练、评估的链路通畅再换成卷积网络提精度。全连接网络把每张28x28的图拉平成784维向量经过若干Dense层逐层变换最后softmax输出10个类别的概率。from tensorflow.keras import layers, models def build_mlp_model(): model models.Sequential([ layers.Flatten(input_shape(28, 28, 1)), layers.Dense(128, activationrelu), layers.Dense(64, activationrelu), layers.Dense(10, activationsoftmax) ]) return modelFlatten把三维输入拉平成784维向量两个隐藏层分别128和64个神经元relu激活最后一层softmax做10分类。这套结构在Fashion-MNIST上跑12到15个epoch测试准确率大约88%到90%。好处是参数少、训练快非常适合先确认全链路没有低级错误再换CNN。如果你没有GPU这个模型在CPU上跑一个epoch也就几十秒对硬件非常友好。3.2 CNN结构两层卷积就能到92%想拿更高分换成卷积神经网络。卷积核对局部纹理敏感Fashion-MNIST这种以轮廓、条纹区分类别的数据卷积有明显优势。典型可跑的结构长这样from tensorflow.keras import layers, models def build_cnn_model(): model models.Sequential([ layers.Conv2D(32, (3, 3), activationrelu, input_shape(28, 28, 1)), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, (3, 3), activationrelu), layers.MaxPooling2D((2, 2)), layers.Flatten(), layers.Dense(128, activationrelu), layers.Dropout(0.3), layers.Dense(10, activationsoftmax) ]) return model第一层Conv2D的32表示卷积核数量每个卷积核提取一类局部特征比如横向条纹、领口弧线、鞋底轮廓(3,3)是卷积核尺寸表示每次扫描周围3x3的区域。MaxPooling2D把特征图尺寸减半保留强特征的同时降低计算量。两层卷积分别提取低层和高层特征Flatten拉平后接入128维全连接层最后softmax输出。这个结构在Fashion-MNIST上通常能到92%到94%。这里加了一个Dropout(0.3)是全连接之后的正则化层训练时随机丢弃30%的神经元连接防止模型把训练集背下来。有它在val loss不容易反弹是一个性价比很高的改动。如果你前面忘了补通道维这里会报expected ndim4, found ndim3之类的错误看到别慌回去检查预处理那行[..., None]。3.3 激活函数、参数对比与参数量计算中间层默认选relu整流线性单元计算便宜、收敛快是当前图像分类的主流选择输出层必须用softmax因为多分类需要输出每个类别的概率且概率之和为1。一个容易踩坑的细节SparseCategoricalCrossentropy与softmax搭配时要在compile里设from_logitsFalse如果输出层不加softmax这里就要设为True。维度全连接基线卷积网络输入处理拉平成784维保留28x28x1空间结构参数量级约6万约3万训练耗时快略慢典型准确率88%~90%92%~94%适用场景链路验证、作业保底正式实验、提精度全连接网络的问题在于参数多但特征利用率低——每个像素都要和下一层全部神经元连接忽略了像素间的空间位置关系所以它跑得动但天花板低。CNN通过卷积核共享参数用远少于全连接的参数量达到更高精度。Dense层的参数量等于输入维度乘神经元数加偏置数比如784维输入接64个神经元就是784×6464约5万个参数而一个3x3卷积核只有3×3×1×3232等于320个参数这就是CNN占用资源更少的底层原因。4. 训练与评估交叉熵、Adam与准确率验证4.1 损失函数与优化器怎么选多分类任务的标配是交叉熵损失。模型输出的是一个10维概率分布交叉熵衡量这个分布和真实标签之间的差距值越小说明分布越接近真实情况。优化器用Adam起步自适应调整每个参数的学习率基本不用手动调度。compile的写法如下from tensorflow.keras.losses import SparseCategoricalCrossentropy from tensorflow.keras.optimizers import Adam model.compile( optimizerAdam(learning_rate0.001), lossSparseCategoricalCrossentropy(from_logitsFalse), metrics[accuracy] )learning_rate0.001是Adam的常用默认值在Fashion-MNIST上够用。调大到0.01loss会在较高水平震荡不降调小到0.0001收敛会慢几倍。如果你不想手动调可以加ReduceLROnPlateau回调让它在验证loss不降时自动减半。4.2 训练循环batch_size和epochs怎么定compile之后调用fitmain.py里的写法大体如下history model.fit( x_train, y_train, batch_size128, epochs15, validation_data(x_val, y_val) )batch_size是每次迭代喂给网络的样本数。128是折中值显存紧张降到64或32效果差别不大。epochs设为15CNN在这个数据集上基本到平台期。history对象里存了每个epoch的训练loss、训练accuracy、验证loss、验证accuracy后面画曲线就靠它。也可以不手动切验证集直接用validation_split0.1从训练数据尾部自动切10%效果等价但可控制的粒度不如手动切。一个值得养成的习惯不要一上来就epochs50。先跑5个epoch看loss走势确认在下降且验证loss没爆再把epochs放大。很多人的第一版模型都是因为超参没调通白等几个小时。4.3 用测试集做一次性评估训练完成后用测试集做最终评估test_loss, test_acc model.evaluate(x_test, y_test) print(fTest accuracy: {test_acc:.4f})evaluate把x_test整体过一遍前向传播比对标签输出准确率第二个返回值就是分类正确的样本占比。这里的潜在陷阱是数据预处理一致性训练时做的归一化和补通道维测试时必须原样执行。很多作业翻车就翻在这里——训练集95%测试集掉到80%一查测试分支忘了除以255。4.4 画loss曲线别把训练过程当黑匣子训练完顺手画一下损失曲线import matplotlib.pyplot as plt plt.plot(history.history[loss], labeltrain_loss) plt.plot(history.history[val_loss], labelval_loss) plt.legend() plt.grid(True) plt.show()正常训练时train_loss和val_loss同步下降、差距不大如果train_loss一路下行而val_loss在某个epoch后反弹说明过拟合去加dropout或减小模型容量如果两条线都在高位下不去说明学习率偏大或模型容量不够。只看最终accuracy不看曲线相当于蒙着眼睛开车曲线是这个黑匣子里最有价值的信号。训练完成记得model.save(fashion_model.h5)下次直接load省去重新训练的时间。5. 避坑指南跑通Fashion分类最常见的五个翻车点这一章写的全是我在实际跑类似项目时遇到过的坑。每个坑都是现象、原因、解决三段式照着排查能省下不少调试时间。5.1 没归一化准确率卡在80%上不去现象训练多轮loss下降缓慢最终准确率止步在80%左右换更复杂的网络也没用。原因像素值范围0到255数值跨度大梯度更新不稳定尤其全连接网络的权重更新被大数值输入放大细节特征完全学不到。解决加载后立刻除以255.0。排查方法打印x_train.min()和x_train.max()确认值域在0到1之间。这是新手翻车率最高的位置没有之一。5.2 label格式与损失函数不匹配现象compile不报错训练到第一个epoch结束loss变成nan准确率一直为0。原因用了CategoricalCrossentropy却喂整数标签或者用了SparseCategoricalCrossentropy却喂one-hot向量输入格式和损失函数的前提条件不匹配。解决整数标签配SparseCategoricalCrossentropyone-hot标签配CategoricalCrossentropy一一对应。用方案A整数标签可以少记一条规则也少写一行转换代码。这类问题最容易在从网上抄代码混用两套方案时出现。5.3 训练和测试的预处理不一致现象训练集准确率95%测试集只有80%不到差距大到不正常。原因训练时做了归一化、补通道维测试时漏做了其中某一步或者测试分支用了原始整数像素。解决把预处理封装成一个函数训练和测试调同一个函数。我见过最隐蔽的一次是训练分支做了x_train[..., None]测试分支忘了结果model.evaluate直接报维度错误排查了十分钟才发现。5.4 epochs太少误判模型上限现象跑5个epoch看到88%准确率以为这个网络结构就到头了开始怀疑模型设计。原因CNN在Fashion-MNIST上一般10到15个epoch才进入平台期5个epoch还在上升通道中段结论下早了。解决先跑15个epoch观察val_loss是否还在降还在降就继续加直到val_loss平稳或反弹为止。判断模型上限之前先把epochs喂够。5.5 过拟合被忽视现象训练loss降到0.2val_loss却反弹到0.8测试准确率仍然90%以上于是选择忽略。原因模型背住了训练集样本特征泛化能力没有同步提升这个隐患换到真实数据集上会立刻暴露。解决在全连接层后加Dropout(0.3)或增大batch_size。前者随机丢弃连接做正则后者让每轮梯度更新更稳定。两条路都有效我一般两个一起上。提示上面任何一条踩坑排错的第一步都是打印张量形状和值域。shape和min/max都没问题再往模型结构上找原因。6. 进阶从92%到94%的调参思路与验证习惯6.1 先跑一个batch过拟合测试再跑全量我在校验一份新的训练代码时会先取8张图跑一个batchloss能快速下降说明链路是通的再放开全量训练。这个习惯帮我挡掉过不少低级错误比如shape写错、label顺序错位。# 取8张图跑50轮模型必然能把这批图片背下来 sample_x x_train[:8] sample_y y_train[:8] model.fit(sample_x, sample_y, epochs50, verbose0) acc model.evaluate(sample_x, sample_y, verbose0)[1] assert acc 0.9, f链路有问题准确率只有{acc}8张图跑50轮准确率上不了90%说明代码链路里有毛病。确认没问题再上全量训练省时间也省心情。6.2 数据增强是双刃剑简单平移、随机翻转能让模型更鲁棒但Fashion-MNIST里有语义方向问题——帽子倒过来还是帽子鞋子就不一定。旋转范围控制在10度以内翻转只用水平翻转垂直翻转会让模型学到错误的方向特征。数据增强只在训练时做验证和测试保持原图。6.3 学习率衰减比手动调参更省心Adam的默认学习率0.001在前期够用后期loss会在平台期抖动。用ReduceLROnPlateau回调验证loss连续两个epoch不降就把学习率减半最后几轮往往能把准确率再顶上去0.5到1个点而且是全自动的。从那以后我每次跑这种图像分类任务都强制走一遍固定流程先跑8张图的过拟合测试确认链路再全量训练并盯着loss曲线最后才碰调参。这几个习惯帮我省下的调试时间比任何模型结构上的骚操作都多。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

K8s面试128题这样学:拆解、验证、复盘三步法

K8s面试128题这样学:拆解、验证、复盘三步法

简介:面向云原生与容器技术相关岗位的求职者,这套面试题集锦共整理一百二十八道高频考题,覆盖分布式键值数据库的特性与适用场景、集群管理核心概念、常见部署方式、主节点与工作节点的职责、最小调度单元与标签机制等基础原理,也…

2026/10/12 12:27:43 阅读更多 →
全屋定制AI智能体:解决改图与拆单难题的架构设计与落地实践

全屋定制AI智能体:解决改图与拆单难题的架构设计与落地实践

1. 全屋定制行业的老大难:改图与拆单,到底卡在哪先说一个我经常在行业交流群里看到的场景。某定制品牌的项目群里,设计师发了一张柜体结构图,接着是一句:“客户刚打电话说,客厅电视柜的深度从350改成420&am…

2026/10/12 12:27:43 阅读更多 →
彻底告别OpenClaw使用焦虑:我给他装上了“透视眼”和“批量克隆模组”

彻底告别OpenClaw使用焦虑:我给他装上了“透视眼”和“批量克隆模组”

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 12:26:42 阅读更多 →

最新新闻

Scrapy日志系统实战:配置、优化与常见问题排查

Scrapy日志系统实战:配置、优化与常见问题排查

1. 为什么日志系统是爬虫项目的生命线做爬虫的朋友大概都有过这种经历:脚本跑了一整夜,早上起来一看,数据没入库,控制台一片空白,或者满屏都是红色的报错信息,但你根本不知道是哪一步出了问题。更让人头疼的…

2026/10/12 13:19:27 阅读更多 →
Ubuntu离线中文语音识别实战:从环境搭建到效果调优

Ubuntu离线中文语音识别实战:从环境搭建到效果调优

1. 为什么要在 Ubuntu 上折腾离线中文语音识别把语音转文字这件事放到本地来做,最直接的驱动力就三个字:可控性。在线接口用起来确实省事,但一旦网络抖动、服务限流、或者你处理的音频本身就不适合往外传,整条链路立刻卡死。我最早…

2026/10/12 13:19:26 阅读更多 →
Jaspersoft Studio 7.0.6 环境配置全指南:JDK8、JDBC驱动与中文字体嵌入

Jaspersoft Studio 7.0.6 环境配置全指南:JDK8、JDBC驱动与中文字体嵌入

简介:Jaspersoft Studio 7.0.6 是面向企业级报表开发者的专业BI报表设计IDE,专为高效构建、调试与部署JasperReports报表而优化,适用于Java开发者、BI工程师及需要深度定制报表逻辑的中高级技术用户。资源包共1346个文件,含413个j…

2026/10/12 13:19:26 阅读更多 →
开源代码评审工具实战:从流程标准化到自动化检查的完整落地指南

开源代码评审工具实战:从流程标准化到自动化检查的完整落地指南

1. 为什么团队需要一套开源代码评审方案先说一个我在多个项目里反复撞见的场景:代码评审完全靠口头沟通,开发同事在群里喊一句"帮我看看这个分支",然后几个人围在屏幕前你一言我一语,当场改完就提交合并。整个过程没有记…

2026/10/12 13:19:26 阅读更多 →
蓝桥杯四平方和:从O(N²)暴力到O(N)哈希与数组优化

蓝桥杯四平方和:从O(N²)暴力到O(N)哈希与数组优化

1. 从一道竞赛题看算法优化的本质四平方和定理是数论里一个很经典的结论:任何一个正整数都能表示成四个整数的平方和。这个结论早在几百年前就被拉格朗日证明过了,但把它搬进编程竞赛里,就变成了另一回事——不是让你证明存在性,而…

2026/10/12 13:19:26 阅读更多 →
不得不看!OpenClaw 爆火背后的三个真相与 TaoToken 统一 Key 接入实践

不得不看!OpenClaw 爆火背后的三个真相与 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/12 13:18:25 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →