AI-For-Beginners 神经网络框架实战:TensorFlow 与 PyTorch 双层 API 体系及过拟合深度指南
教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本文是 AI-For-Beginners 课程第 3 单元第 5 课《神经网络框架》芬兰语版文档的中文技术指南围绕「高效训练神经网络需要什么」这一核心问题展开为什么需要框架、TensorFlow 与 PyTorch 的低层/高层 API 如何分工协作以及贯穿机器学习始终的过拟合Overfitting问题的成因、检测与预防。读完本文你将掌握 TensorFlow/Keras 与 PyTorch 两套体系的选型思路、自动微分与计算图原理、用高层 API 一行式训练模型的完整实操路径并能独立判断模型何时开始过拟合、如何应对。为什么训练神经网络离不开框架课程反复强调一个事实要高效地训练神经网络必须同时做到两件事对张量Tensor做运算——例如乘法、加法以及 sigmoid、softmax 等函数计算计算所有表达式的梯度——以便执行梯度下降Gradient Descent优化。numpy库可以胜任第一部分但梯度计算没有现成机制。在上一课我们自己实现的迷你框架中我们不得不在执行反向传播的backward方法里手动编写每一个导数函数既繁琐又易错。理想的框架应当允许我们对任意可以定义的表达式自动求梯度。除自动微分之外另一个关键诉求是把计算放到 GPU 或其他专用计算单元如 TPU上执行。深度网络训练的计算量极其庞大而 GPU 恰恰擅长并行化这类矩阵运算——所谓并行化就是把计算分散到多个设备上同时进行。这正是通用框架存在的根本价值张量运算、自动求导、硬件加速三件事一站式解决。TensorFlow 与 PyTorch双层 API 体系全景目前最主流的两个神经网络框架分别是TensorFlowGoogle 出品和PyTorchMeta/Facebook 出品。两者都提供在 CPU 与 GPU 上操作张量的低层 API在低层 API 之上又分别生长出高层 API——TensorFlow 对应KerasPyTorch 对应PyTorch Lightning。课程用一张清晰的对照表总结了这套体系层次TensorFlow 生态PyTorch 生态低层 APITensorFlowPyTorch高层 APIKerasPyTorch Lightning低层 API可微分的计算图低层 API的核心能力是构建所谓的计算图Computational Graph。这张图定义了在给定输入参数的前提下如何计算出输出通常是损失函数并且可以把整张图推送到可用的 GPU 上执行。更重要的是框架提供对计算图求导的函数能自动算出梯度进而用于优化模型参数。正因为梯度是图的一部分反向传播不再需要手工推导公式——这正是上一节自研框架的痛点所在。从本课 PyTorch 入门 notebook 的历史梳理中可以看到框架演进的关键分水岭TensorFlow 1.x首个被广泛使用的框架允许定义静态计算图、推送到 GPU、再显式求值PyTorch快速崛起、广受欢迎的框架采用动态图模式Keras构建在 TensorFlow/PyTorch 之上的高层 API目标是统一并简化神经网络的使用作者 François CholletTensorFlow 2.x Keras将 Keras 内建进新版 TensorFlow支持动态计算图张量操作与 numpy以及 PyTorch的写法高度相似。高层 API把网络视为层序列高层 API基本把神经网络当作**一系列层sequence of layers**来看待这让搭建大多数网络变得异常简单训练模型通常只需要准备好数据然后调用一个fit函数即可完成全部工作。两种 API 的定位互补高层 API让你极快地搭建典型网络无需操心大量底层细节低层 API对训练过程提供远多于此的控制权因此在探索全新网络架构的科研场景中被大量使用。课程特别强调两层 API 完全可以混用。你可以用低层 API 开发自定义的网络层再把它嵌进一个由高层 API 构建并训练的大网络反过来也可以用高层 API 把网络定义为层序列然后用自己的低层训练循环完成优化。两套 API 基于同样的底层概念设计天生就是协同工作的。课程学习路径与框架选型建议本课的所有内容都同时提供 PyTorch 与 TensorFlow 两套 notebook学习路径刻意设计为由低到高IntroPyTorch.ipynbPyTorch 低层 API张量与自动微分入门IntroKerasTF.ipynbTensorFlow Keras 低层 API张量、变量、梯度、线性回归、分类、计算图与 GPU 计算IntroKeras.ipynb纯高层 API用 Keras 快速搭建网络。你可以按偏好二选一如果拿不定主意可以先去了解网上关于PyTorch vs. TensorFlow的讨论或干脆两套都过一遍加深理解。课程策略是在可能的情况下优先使用高层 API 以保持简洁但同时认为从零理解网络内部机制至关重要因此开头仍会从低层 API 和张量入手。想快速上手的读者可以跳过细节直接进入高层 API 的 notebook。环境准备安装 PyTorch以 PyTorch 为例确保安装较新版本即可最简单的两条命令详见 IntroPyTorch.ipynbpip install torch torchvision或使用 condaconda install pytorch -c pytorch本课 notebook 记录的环境版本为torch 1.11.0cu113CUDA 11.3 构建。仓库根目录的 requirements.txt 与 binder/requirements.txt 也维护了配套依赖清单可用于复现运行环境。源码级原理剖析PyTorch 自动微分与计算图低层 API 的自动求梯度不是魔法而是计算图机制。以下内容来自本课 IntroPyTorch.ipynb 的完整实验。张量基础张量Tensor是多维数组非常适合表示各类数据400x400黑白图片400x400x3彩色图片16x400x400x3含 16 张彩色图片的 mini-batch25x400x400x31 秒的 25fps 视频8x25x400x400x38 段各 1 秒视频的 mini-batch张量可以从列表或 numpy 数组直接创建也可随机生成且支持 numpy 风格的逐元素算术运算必要时自动广播维度用.numpy()取回 numpy 数组import torch a torch.tensor([[1,2],[3,4]]) a torch.randn(size(10,3)) # 标准正态分布随机张量 print(a - a[0]) # 逐元素减法 广播 print(torch.exp(a)[0].numpy()) # 逐元素指数并转回 numpy需要注意就地in-place与就地外out-of-place操作的区别/add这类操作会返回新张量而以_结尾的操作如add_会直接修改原张量u torch.tensor(5) print(Result when adding out-of-place:, u.add(torch.tensor(3))) # 返回新值u 不变 u.add_(torch.tensor(3)) print(Result after adding in-place:, u) # u 已被修改为 8自动微分三件套requires_grad / backward / grad对于反向传播需要计算梯度。把任意张量的requires_grad属性设为True之后所有与该张量相关的运算都会被跟踪用于梯度计算调用backward()后梯度通过grad属性读出a torch.randn(size(2, 2), requires_gradTrue) b torch.randn(size(2, 2)) c torch.mean(torch.sqrt(torch.square(a) torch.square(b))) # 用 a 做点运算 c.backward() # 调用 backward() 计算所有梯度 print(a.grad) # c 对 a 的梯度梯度是累积的若在backward()中指定retain_graphTrue计算图会被保留新的梯度会累加到grad字段上要从零重新计算需要显式调用zero_()把梯度清零c torch.mean(torch.sqrt(torch.square(a) torch.square(b))) c.backward(retain_graphTrue) c.backward(retain_graphTrue) # 梯度累积 print(a.grad) a.grad.zero_() # 手动清零 c.backward() print(a.grad)grad_fn 与链式法则为计算梯度PyTorch 会创建并维护一张计算图。对每个requires_gradTrue的张量PyTorch 维护一个特殊函数grad_fn它按链式微分法则计算该表达式的导数。例如c由mean计算而来打印c时就能看到grad_fnMeanBackward0说明图中挂着对应的反向函数。多数场景下我们要的是标量损失对参数的梯度但若想求张量对张量的梯度PyTorch 实际计算的是雅可比矩阵与向量的乘积vᵀ·J——只需把向量v尺寸与原张量一致作为参数传给backwardc torch.sqrt(torch.square(a) torch.square(b)) c.backward(torch.eye(2)) # eye(2) 即 2x2 单位矩阵 print(a.grad)实战演示纯梯度下降求函数最小值理解机制后notebook 给出一个最纯粹的用例——用自动微分求二元函数f(x₁,x₂)(x₁-3)²(x₂2)²的最小值令张量x保存当前点坐标从起点x⁽⁰⁾(0,0)出发反复套用梯度下降更新公式迭代即可收敛到理论最小值(3,-2)。这个例子把梯度计算与参数优化两个环节彻底打通也是后续所有训练循环的最小原型。TensorFlow 低层 APIVariable 与梯度计算TensorFlow 一侧的低层概念与 PyTorch 遥相呼应见 IntroKerasTF.ipynbTensor基础多维数组行为接近 numpyVariable可训练的变量用于保存模型参数并在训练中更新梯度计算通过GradientTape之类的机制记录前向运算并回放求导线性回归与分类notebook 先后给出线性回归Example 1与分类Example 2两个完整例子涵盖数据打乱shuffle、数据归一化Normalizing Data以及单层感知机的训练计算图与 GPU 计算专门一节讲解计算图如何被推送执行、如何利用 GPU 加速数据管道用tf.data.Dataset对象轻松实现批量batched迭代优化器支持直接调用 TensorFlow/Keras 内置优化器Optimizers完成参数更新。Keras 高层 API 实操从 Sequential 到 fit若只想快速把网络跑起来IntroKeras.ipynb 展示了高层 API 的完整工作流。多数情况下网络就是一系列层用Sequential模型逐层定义即可model keras.models.Sequential() model.add(keras.Input(shape(2,))) model.add(keras.layers.Dense(1)) model.add(keras.layers.Activation(keras.activations.sigmoid)) model.summary()各层职责分明Input层严格说不是真正的层声明网络输入尺寸Dense层是真正的感知机内含可训练权重Activation层用 sigmoid 把输出压到 0–1 区间使其成为概率。为简洁起见输入尺寸和激活函数也可以直接写进Dense层model keras.models.Sequential() model.add(keras.layers.Dense(1, input_shape(2,), activationsigmoid)) model.summary()训练前需要先compile本质是声明三件事损失函数loss二分类问题用binary_crossentropy优化器optimizer最简选择sgd随机梯度下降也可用更高级的adam评估指标metrics分类任务常用Accuracy简写acc。loss/optimizer/metrics 既可以用字符串也可以传 Keras 对象。需要微调学习率时必须显式传入优化器对象model.compile(optimizerkeras.optimizers.SGD(learning_rate0.2), lossbinary_crossentropy, metrics[acc])compile 之后真正训练靠fit完成关键参数包括x、y训练数据的特征与标签validation_data特征与标签构成的元组让每个 epoch 都做一次验证epochs训练轮数batch_sizemini-batch 大小也可以先手动分批再把批数据交给x/y/validation_data此时无需batch_size。model.fit(x_train, y_train, epochs..., batch_size..., validation_data(x_val, y_val))这正是课程所说的高层 API 把训练抽象成一个fit调用。此外 notebook 还覆盖了数据归一化、训练曲线绘制、多分类含Sparse Categorical Cross-Entropy损失、多标签分类并在结尾对各类分类损失函数做了汇总。过拟合机器学习中最重要的问题之一框架只是工具能否训出好模型还取决于对**过拟合Overfitting**的理解——课程明确将其列为必须掌握的核心概念。先看一个经典问题用模型去近似图中 5 个点图中以x标记线性模型2 个参数非线性模型7 个参数训练误差 5.3训练误差 0验证误差 5.1验证误差 20左侧一条很好的直线近似。参数数量恰当模型正确抓住了点分布背后的规律右侧模型过于强大。只有 5 个点却有 7 个参数它可以弯曲到穿过所有点把训练误差压到 0但这反而阻碍了模型理解数据背后的真实模式于是验证误差飙到 20。结论非常关键必须在模型复杂度参数数量与训练样本数量之间取得恰当平衡。为什么过拟合会发生三个典型诱因训练数据不足模型过于强大参数过多输入数据噪声过多。如何检测过拟合如上面的对比图所示过拟合可以通过训练误差极低 验证误差很高的组合被识别。正常情况下训练过程中训练误差与验证误差都会同步下降到某个时刻验证误差可能停止下降并开始回升——这就是过拟合的信号提示我们应该在此处停止训练至少给模型做一次快照存档如何预防过拟合一旦发现过拟合可以从三个方向下手增加训练数据量降低模型复杂度引入正则化技术Regularization例如课程后续 训练技巧章节 中会详细讨论的Dropout见 TrainingTricks.md 的 Dropout 小节。过拟合与偏差-方差权衡Bias-Variance Tradeoff过拟合其实是统计学中更普适问题——偏差-方差权衡Bias-Variance Tradeoff——的一个特例。审视模型误差的来源可以区分两类偏差误差Bias error算法没能正确捕捉训练数据间的关系通常源于模型不够强大即欠拟合Underfitting方差误差Variance error模型把输入数据里的噪声也当成有意义的关系去近似即过拟合。训练过程中偏差误差随模型学会近似数据而下降方差误差则不断上升。因此必须在适当时机停止训练——要么手动检测到过拟合时要么自动通过引入正则化——以遏制过拟合。配套实验Iris 与 MNIST 分类实战学完框架后即可投入实战。本课的 实验说明 要求使用 PyTorch 或 TensorFlow分别用单层与多层全连接网络解决两个分类问题并尝试不同网络架构以追求最佳精度Iris 鸢尾花分类表格型输入数据的经典问题依据 4 个数值特征把鸢尾花分为 3 类传统机器学习即可胜任MNIST 手写数字分类前几课反复出现过的经典数据集。实验起点是 LabFrameworks.ipynbnotebook 末尾附带的任务tasks即为本课挑战题完成两个 notebook 中的任务即可巩固全部所学。小结与自测本课覆盖两大主线其一TensorFlow 与 PyTorch 这两大主流 AI 框架各自低层/高层 API 的差异与协作方式其二机器学习中极为重要的过拟合问题。学完本章可以用下面两个问题自测掌握程度TensorFlow 与 PyTorch 的区别是什么过拟合与欠拟合的区别是什么复习时建议围绕 TensorFlow、PyTorch、Overfitting 三个主题做延伸检索并结合仓库内配套 notebook 亲手跑通从张量、自动微分到高层fit训练、再到诊断过拟合的完整链路。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐AI-For-Beginners 神经网络框架实战指南TensorFlow、PyTorch 与 Keras 的双层 API 体系及过拟合防治AI For Beginners 神经网络框架实战指南TensorFlow、PyTorch 与 Keras 的双层 API 体系及过拟合防治 本文是微软 AI教程人工智能机器学习深度学习AI-For-Beginners 神经网络框架实战指南PyTorch 与 TensorFlow 的双层 API 体系与过拟合防控AI For Beginners 神经网络框架实战指南PyTorch 与 TensorFlow 的双层 API 体系与过拟合防控 本篇指南以 AI For B教程人工智能机器学习深度学习generative-ai-for-beginners 神经网络框架实战TensorFlow 与 PyTorch 双层 API 解析及过拟合防控generative ai for beginners 神经网络框架实战TensorFlow 与 PyTorch 双层 API 解析及过拟合防控 本文以《ge教程人工智能大模型上一篇5分钟跑通Dify工作流登录Demo导入DSL、配模型、验证登录态的完整指南下一篇MistmacOS系统安装与固件管理终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

PowerBuilder Windows底层调试工具VDN使用指南

PowerBuilder Windows底层调试工具VDN使用指南

简介:本资源是基于PowerBuilder开发的Windows桌面应用——VDN系统测试版(4月版),面向PowerBuilder中级开发者及企业级Windows应用维护人员,聚焦消息推送、微信API集成、数据加解密与二维码生成等实战功能模块&#xff…

2026/10/9 1:43:10 阅读更多 →
不用开发板学STM32:Proteus仿真DS18B20与OLED温度采集

不用开发板学STM32:Proteus仿真DS18B20与OLED温度采集

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

2026/10/9 1:43:10 阅读更多 →
HFSS端口激励设置:Wave Port与Lumped Port物理本质解析

HFSS端口激励设置:Wave Port与Lumped Port物理本质解析

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

2026/10/9 1:43:10 阅读更多 →

最新新闻

DeepSeek-R1学习笔记:从GRPO到蒸馏的推理模型实战拆解

DeepSeek-R1学习笔记:从GRPO到蒸馏的推理模型实战拆解

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

2026/10/9 4:55:07 阅读更多 →
题解:洛谷 AT_abc470_d [ABC470D] Inverse and Swap

题解:洛谷 AT_abc470_d [ABC470D] Inverse and Swap

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大家订阅我的专栏:算法…

2026/10/9 4:55:07 阅读更多 →
Windows搭建局域网NTP服务器:注册表配置与交换机同步避坑指南

Windows搭建局域网NTP服务器:注册表配置与交换机同步避坑指南

简介:这份PDF文档面向需要在Windows环境下搭建局域网NTP服务器的网络运维人员与系统管理员,针对网络设备无法同步时间、始终显示unsynchronized等常见问题提供可落地的注册表配置思路。内容围绕启用NTPServer服务、关闭NTP Client、强制主机使用内置CMOS…

2026/10/9 4:55:07 阅读更多 →
Day50图论part2复盘:最短路径、最小生成树与拓扑排序

Day50图论part2复盘:最短路径、最小生成树与拓扑排序

今天是第50天,我的算法训练打卡正式走到了图论part2。说实话,走到这里的人已经不多了——前49天里,数组、链表、哈希、二叉树、回溯、贪心、动态规划全都过了一遍,刷题群里和我同期出发的人大概只剩下三分之一。图论这个专题特别有…

2026/10/9 4:55:07 阅读更多 →
Windows批处理关机脚本实战:从基础命令到企业级定时自动关机

Windows批处理关机脚本实战:从基础命令到企业级定时自动关机

1. 项目概述:一个看似简单却暗藏门道的关机脚本“用bat实现的自动关机的代码”——这行标题在Windows系统管理、IT支持甚至学生实验场景里,出现频率高得有点出人意料。它不像Python写个爬虫或JavaScript做个轮播图那样有技术纵深感,但恰恰是这…

2026/10/9 4:55:07 阅读更多 →
AlgoNote 算法通关手册:0503. 下一个更大元素 II——单调栈与循环数组的经典解法剖析

AlgoNote 算法通关手册:0503. 下一个更大元素 II——单调栈与循环数组的经典解法剖析

教程文档知识库 【免费下载链接】AlgoNote ⛽️「算法通关手册」:从零开始的「算法与数据结构」学习教程,200 道「算法面试热门题目」,1000 道「LeetCode 题目解析」,持续更新中! 项目地址: https://gitcod…

2026/10/9 4:54:06 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/7 13:34:55 阅读更多 →