Leaf 框架演进全解:从 CHANGELOG 到源码的版本脉络与技术要点
机器学习深度学习【免费下载链接】leafOpen Machine Intelligence Framework for Hackers. (GPU/CPU)项目地址https://gitcode.com/gh_mirrors/le/leaf点击查看免费下载本文以 LeafRust 编写的开源机器学习框架仓库中的 CHANGELOG.md 为主线逐版本梳理从 0.0.1 到 0.2.1 的功能演进、Bug 修复与性能优化并结合仓库源码层容器、SGD 求解器、序列化、后端特性开关等展开实现细节帮助读者理解 Leaf 的网络构建、训练求解与跨设备运行机制并掌握依据版本历史判断框架能力边界的方法。一、版本总览六个版本勾勒框架雏形Leaf 是一个用 Rust 编写的开放机器学习框架口号是 Machine Learning Framework for Hackers支持 GPU/CPU 混合计算。其 CHANGELOG 记录了从 2015 年 11 月的 0.0.1 到 2016 年 4 月的 0.2.1 的完整演进版本发布日期定位0.0.12015-11-02首个版本网络前向与 CI 搭建0.1.02015-11-10引入 collenchyma 后端、反向传播、SGD 求解器0.1.1 / 0.1.22015-11-30 / 2015-12-19依赖约束收紧与测试修复0.2.02016-03-04Sequential 容器、in-place 计算、双许可证等大批改动0.2.12016-04-21序列化/反序列化、TanH 层、feature flags 语义调整、GPU 权重更新这三个月的演进脉络非常清晰先打通网络前向与梯度计算再引入统一后端抽象最后补齐序列化、新激活函数与容器能力。下面按主题深入解读。二、架构地基切换到 collenchyma 后端抽象2.1 0.1.0 的核心转折统一后端0.1.0 最重大的特性是backend: switch to collenchyma and update blobbackpropagation: implemented backpropagationsolver: implement solver and sgdnetwork: network forwarding and helpersLeaf 从这一版开始把底层计算交给Collenchyma——一个可移植的高性能计算框架提供IBackend、SharedTensor等统一接口。在 src/lib.rs 的文档中明确说明Leaf 网络可以运行在 CUDA、OpenCL 以及原生 host CPU 上没有 GPU 时自动回退到 native CPU。这一设计的核心价值在于Layer 与 Solver 都只依赖后端 trait如LayerOps、SolverOps而非具体硬件。例如 src/solvers/sgd/mod.rs 中的宏impl_isolver_sgd!为任意满足SolverOpsf32的后端生成ISolver实现使同一套求解逻辑能在 CPU 与 GPU 上复用。2.2 版本约束的反复收紧CHANGELOG 中 0.1.1、0.1.2、0.2.0 三处都出现了同一项修复dependency: make collenchyma version constraint stricter这是 crates.io 发布流程的常见教训框架与底层计算库必须锁定足够严格的版本范围否则上游 API 变更会破坏构建。0.1.0 还记录了dependencies: locked dependencies more tightly as required by crates.io。到 0.2.1 时Cargo.toml 中的约束已经明确为collenchyma 0.0.8、collenchyma-blas 0.2.0、collenchyma-nn 0.3.2。2.3 Feature flags后端能力的显式开关0.2.1 有一条语义重要的特性features: change meaning of framework features并配套solvers: remove CUDA build flag。结合 FEATURE-FLAGS.md 可以还原其设计意图Leaf 的 feature flags 并非纯增量开关而是会钝化某些后端以保证模型跨后端可移植。例如Convolution层只在纯 CUDAcuda且非native时可用因为 native 后端不提供卷积所需 trait[dependencies] leaf { version 0.2.1, default-features false } [features] default [native] native [leaf/native] cuda [leaf/cuda] opencl [leaf/opencl]构建时# 同时启用 native 与 CUDAnative 为默认cuda 显式追加 cargo build --features cuda # 只启用 CUDA释放其完整能力 cargo build --no-default-features --features cuda这一机制同样体现在源码的cfg分支中。以 src/layers/activation/tanh.rs 为例CUDA 后端提供TanhPointwise能力因此在cuda且非native时可做 pointwise原地tanhnative 后端只有tanh_plain前向必须显式提供输入张量。类似的src/layers/common/convolution.rs 与Convolution的导出也带cfg(all(featurecuda, not(featurenative)))条件见 src/layers/mod.rs。三、网络构建Sequential 容器层的诞生与演化3.1 0.2.0引入 Sequential 层0.2.0 引入了layer: add Sequential layer0.2.1 将其移动到 container 目录container: put sequential layer into container dirBreaking Change在 Leaf 中容器层Container Layer本身就是一种 Layer因此可以嵌套组合出更大的网络参见 src/lib.rs 对架构的描述。src/layers/container/sequential.rs 中的SequentialConfig是核心配置结构layers: VecLayerConfig——容器内按顺序执行的层inputs: Vec(String, Vecusize)——以名字 形状声明网络输入张量force_backward: bool——默认false为true时强制所有层执行反向传播否则由网络结构与学习率自动判断。测试文件 tests/layer_specs.rs 展示了 Sequential 的用法let mut net_cfg SequentialConfig::default(); net_cfg.add_input(data, vec![1, 1, 28, 28]); net_cfg.add_layer(LayerConfig::new(linear, LayerType::Linear(LinearConfig { output_size: 10 }))); let cfg LayerConfig::new(network, net_cfg); let layer Layer::from_config(native_backend(), cfg);3.2 层间连接的自动接线Sequential::init_layerssrc/layers/container/sequential.rs的核心逻辑是自动连接相邻层的输入输出把容器声明的输入名字挂到第一个层上相邻两层之间若已显式指定输出/输入且一致则沿用否则调用find_in_place_output判断能否复用前层输出做 in-place不能则生成SEQUENTIAL_{i}匿名张量作为中间结果最后一层的输出直接作为容器输出。3.3 Sequential 中的 in-place 优化0.2.0 的sequential: enable in-place inside Sequential containers让容器内的层可以原地计算。find_in_place_outputsrc/layers/container/sequential.rs会从当前层往前回溯找到第一个不做 in-place 的层的输出作为可复用张量若没有前置层则复用网络输入。只有supports_in_place()的层如 ReLU、TanH、Reshape才会触发该优化。3.4 反向传播的自动裁剪init_layers末尾还执行了反向传播必要性分析从网络尾部反向遍历收集对 loss 有贡献的 blobblobs_under_loss以及因propagate_down配置可跳过反向的 blobblobs_skip_backp据此跳过不需要反向计算的层。这一设计避免了无关 blob 的冗余梯度计算。四、训练求解SGD 求解器与 Momentum4.1 求解器体系结构0.1.0 引入 solver/sgd0.2.0 重新引入solvers: reintroduce solvers for Layers。整体结构分为三层src/solver/mod.rs定义Solver负责训练循环与SolverConfig超参数配置src/solvers/mod.rs定义SGDSolvertrait梯度裁剪、归一化、正则化src/solvers/sgd/mod.rs 与 src/solvers/sgd/momentum.rs具体实现。Solver::train_minibatchsrc/solver/mod.rs展示了一次 mini-batch 训练的完整调用链net.forward([mb_data])——网络前向objective.forward([network_out, mb_target])——损失层计算 lossobjective.backward([])net.backward(classifier_gradient[0..1])——梯度反向传播worker.compute_update(config, mut net, iter)——求解器计算权重更新net.update_weights(backend)——应用更新并iter 1。4.2 SolverConfig 关键超参数参数默认值说明minibatch_size1梯度累积的样本数lr_policyFixed学习率策略Fixed、Step、Expbase_lr0.01基础学习率gamma0.1学习率衰减系数stepsize10Step/Sigmoid 策略的步长clip_gradientsNone梯度 L2 范数裁剪阈值None表示不裁剪weight_decayNone全局权重衰减L2 正则化None表示不做正则momentum0Momentum 系数应在 0 到 1 之间学习率计算在SolverConfig::get_learning_ratesrc/solver/mod.rs中实现Fixed始终返回base_lrStepbase_lr * gamma^(floor(iter / stepsize))Expbase_lr * gamma^iter。测试 tests/solver_specs.rs 对这三种策略做了数值断言例如Step策略在base_lr5, gamma0.5, stepsize10时第 10 次迭代学习率为 2.5第 20 次为 1.25。4.3 0.2.1 的 SGD 修复与 GPU 加速0.2.1 对 SGD 的两处改动直接对应源码①sgd: initialize weight gradient history with zeroes。impl_isolver_sgd!宏中的initsrc/solvers/sgd/mod.rs为每个可学习权重梯度分配历史张量并用FillerType::Constant { value: 0f32 }填充为零。历史上传/历史动量算法必须保证第一轮迭代的上一轮更新为零。②sgd: use GPU for computation of weight updates。Momentum::compute_update_valuesrc/solvers/sgd/momentum.rs把学习率与动量系数分别填充为 1 元素SharedTensor然后调用 BLAS 的Axpby::axpby_plain在求解器后端上执行history lr * grad momentum * history最后copy_plain回写梯度。由于SharedTensor支持跨设备同步这一计算可完整地在 GPU 上完成。③solver: dont zero fill weight gradients0.2.1 Performance。compute_updatesrc/solvers/sgd/mod.rs对每个权重执行clip_gradients→normalize→compute_update_value不再做全量清零填充避免无谓的显存写入。4.4 梯度裁剪与归一化SGDSolvertraitsrc/solvers/mod.rs实现了两项关键预处理clip_gradients当所有权重的 L2 范数平方和开根号后超过clip_gradients阈值时按scale_factor clip_threshold / l2norm_diff等比缩放全部梯度注意是重缩放而非截断这在 RNN 等场景可防止梯度爆炸normalize当minibatch_size 1时按1/minibatch_size缩放梯度抵消多样本梯度累积带来的量级放大。五、激活层TanH 的加入与 in-place 能力5.1 0.2.1 新增 TanH0.2.1 的layers: add tanh layer使激活层补齐为 ReLU、Sigmoid、TanH 三件套见 src/layers/mod.rs 的导出。src/layers/activation/tanh.rs 的文档给出选型建议相比 TanHReLU 更不易产生梯度消失、更容易形成稀疏表示、计算更快是当时2016 年DNN 中最流行的激活函数。5.2 In-place 激活0.2.0 引入activations: add in-place activations。TanH 与 ReLU 都实现了compute_in_place() - true输出张量直接复用输入张量省去一次显存分配与拷贝。在 CUDA 上还可走 pointwise 路径TanhPointwise/ReluPointwise进一步原地更新数据。六、序列化模型保存与加载0.2.1 的serialization: add serialization与serialization: add deserialization使模型可持久化。实现基于Capn Protoschema 见 capnp/leaf.capnp其中Layer结构包含name、config、weightsData列表。src/capnp_util.rs 定义了CapnpWrite/CapnpReadtrait各层的 Config如SequentialConfig、ReshapeConfig分别实现write_capnp/read_capnp。测试 tests/layer_specs.rs 中的save_and_load_layer验证了完整流程layer.save(target/testnetwork)写出再Layer::load读回断言输入 blob 名字与权重数据完全一致。七、常用层的配置细节7.1 卷积层仅 CUDAsrc/layers/common/convolution.rs 说明输入须为 4D NCHW 格式配置项为num_output、filter_shape、stride、padding对应 capnp 的ConvolutionConfig。两个相关的 0.2.0 修复值得注意convolution: add missing weight initialization——补齐缺失的权重初始化convolution: add shared workspace for convolution layer——在容器内共享工作区resize_shared_workspace会在 Sequential 初始化时把上一个层的 workspace 传给下一层见 src/layers/container/sequential.rs避免为每个层重复分配临时缓冲。7.2 线性层全连接src/layers/common/linear.rs 实现y a * x bbias 当时尚未实现。输入支持 1D 或 2D2D 时第一维视为 batch sizeN。配置只需output_size权重形状由输入形状自动推导为[output_size, input_size]。7.3 负对数似然损失层0.2.0 的nll: add NLLConfig to specify number of classes使 src/layers/loss/negative_log_likelihood.rs 具备num_classes配置。其compute_output按 batch 平均 loss对每个标签取对应概率的负值求和再除以 batch size。该层只支持 1D/2D 输入且sync_native() - true结果需要同步回 native 内存计算。7.4 Reshape 与 Flatten0.2.0 的reshape: fix reshaping of network input blobs修复了网络输入 blob 的重塑问题reshape: added in-place functionality to reshape layer则使其支持原地操作。src/layers/utility/reshape.rs 的文档说明ReshapeConfig.shape指定目标形状前导维度视为独立输入。它通常作为 in-place 层使用输入输出指向同一张量因为很多层如卷积会从张量形状中解读 NCHW 语义。八、工程化与合规CI、许可证与发布CI0.0.1/0.1.0 的ci: Added travis for CI and doc building建立了持续集成与文档构建流水线build: added lib blas to travis dependency说明 BLAS 是编译期硬依赖。许可证0.2.0 的license: change license to dual MIT/Apache-2.0将协议改为双许可仓库内保留 LICENSE-APACHE 与 LICENSE-MIT。发布README 说明 CHANGELOG 由 Rust 工具 Clog 自动生成各版本条目按 Bug Fixes / Features / Performance / Breaking Changes 分类。九、给使用者的版本选择建议从 CHANGELOG 可以提炼出实际使用时的判断依据需要模型持久化选择 0.2.1因为序列化/反序列化在该版本才完整落地需要卷积网络务必注意Convolution层只在cuda且非native的 feature 组合下编译FEATURE-FLAGS.mdnative-only 环境请改用 Linear 手动特征工程需要 TanH 激活或 GPU 上的权重更新0.2.1 是具备这两项能力的版本升级注意0.2.1 将Sequential移入 container 目录是 Breaking Change依赖其路径的代码需要相应调整。十、总结通过 CHANGELOG 与源码对照可以看出Leaf 在 0.x 阶段的每一次发版都遵循特性先行、工程跟进的节奏0.1.x 打通前向/反向与后端抽象0.2.0 引入容器与 in-place 优化0.2.1 补齐序列化与新激活函数。对于想深入阅读该仓库的开发者推荐按以下路径展开网络构建src/layers/container/sequential.rs、tests/layer_specs.rs训练求解src/solver/mod.rs、src/solvers/sgd/momentum.rs、tests/solver_specs.rs后端开关FEATURE-FLAGS.md、Cargo.toml序列化capnp/leaf.capnp、src/capnp_util.rs。这份版本记录既是 Leaf 的发展史也是一份如何在硬件抽象层之上构建可移植深度学习框架的工程参考。赞分享机器学习深度学习【免费下载链接】leafOpen Machine Intelligence Framework for Hackers. (GPU/CPU)项目地址https://gitcode.com/gh_mirrors/le/leaf点击查看免费下载相关推荐Lightning Fabric 版本演进全景解读从 1.8 到 2.6 的 CHANGELOG 与技术脉络Lightning Fabric 版本演进全景解读从 1.8 到 2.6 的 CHANGELOG 与技术脉络 本文以仓库 src/lightning/fabr人工智能深度学习机器学习预训练分布式训练微调Voilà 版本演进全解从 CHANGELOG 读懂 Jupyter Notebook 应用化框架的技术脉络与升级指南Voilà 版本演进全解从 CHANGELOG 读懂 Jupyter Notebook 应用化框架的技术脉络与升级指南 Voilà 是一个将 Jupyter后端数据可视化三步让 RAGFlow 的 PDF 解析交给 MinerU本地 Docker 部署实战指南三步让 RAGFlow 的 PDF 解析交给 MinerU本地 Docker 部署实战指南 PDF 摄取进知识库后文字错乱、表格全糊、检索问答质量差问题多半人工智能大模型OCR计算机视觉上一篇OpenAI Translator Bob Plugin自定义提示词终极指南解锁高级翻译与润色功能下一篇kcat故障恢复机制网络中断、代理宕机等异常情况处理终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

OCI Image Format 规范深度解析:镜像格式标准的构成、运行工作流与在 Swarm Classic 中的落地实践

OCI Image Format 规范深度解析:镜像格式标准的构成、运行工作流与在 Swarm Classic 中的落地实践

云原生后端微服务 【免费下载链接】classicswarm Swarm Classic: a container clustering system. Not to be confused with Docker Swarm which is at https://github.com/docker/swarmkit 项目地址: https://gitcode.com/gh_mirrors/cl/classicswarm 点击查看 免费…

2026/10/12 1:30:49 阅读更多 →
openJiuwen DeepSearch 新增任务处理(new_task)全解析:章节级增量研究与报告扩展实战指南

openJiuwen DeepSearch 新增任务处理(new_task)全解析:章节级增量研究与报告扩展实战指南

人工智能大模型AI AgentRAG深度研究搜索引擎后端代码智能体 【免费下载链接】deepsearch openJiuwen DeepSearch是一款知识增强的深度搜索与研究框架,有业界领先的片段级引用和溯源推理能力,提供精准Agentic搜索与研究能力 项目地址: https:/…

2026/10/12 1:30:49 阅读更多 →
一条命令接入本地逆向工程:5 分钟跑通 REA 的第一次应用分析

一条命令接入本地逆向工程:5 分钟跑通 REA 的第一次应用分析

一条命令接入本地逆向工程:5 分钟跑通 REA 的第一次应用分析 【免费下载链接】rea Reverse engineer anything with agents, from app behavior down to native binaries. 项目地址: https://gitcode.com/GitHub_Trending/rea2/rea REA(Reverse E…

2026/10/12 1:30:49 阅读更多 →

最新新闻

PLC基本指令详解:从位逻辑到定时计数,掌握梯形图编程核心

PLC基本指令详解:从位逻辑到定时计数,掌握梯形图编程核心

/* 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 3:19:56 阅读更多 →
柔性上料盘如何替代振动盘:从换型瓶颈到视觉引导的产线升级指南

柔性上料盘如何替代振动盘:从换型瓶颈到视觉引导的产线升级指南

简介:《全球与中国柔性上料盘市场现状及未来发展趋势(2024版)》是一份QYResearch出品的专业市场研究报告,面向柔性上料与自动化产线设备从业者、工业机器人厂商、市场分析师及投资研究人员。报告以2019至2023年为历史期、2024至20…

2026/10/12 3:19:56 阅读更多 →
WiFi分析工具设计实战:从数据采集到信道优化与故障排查

WiFi分析工具设计实战:从数据采集到信道优化与故障排查

1. 从一个标题说起:这个工具到底在解决什么问题第一次看到“Jev powered WiFi analysis tool”这个标题,我的直觉是:这大概率是一个把无线网络分析能力封装成轻量级工具的项目,名字里的“Jev”可能是作者自定的代号、模块名或者某…

2026/10/12 3:19:56 阅读更多 →
SpringBoot+Vue美食网站系统:前后端分离全栈项目架构与部署详解

SpringBoot+Vue美食网站系统:前后端分离全栈项目架构与部署详解

做个人项目这些年,前后端分离的练手项目做了不少,但每次有人让我推荐一个既能完整跑起来、又能覆盖主流开发流程的学习项目,我第一反应往往是这套美食网站系统。为什么?因为它的技术选型非常贴近当下中小型项目的真实组合&#xf…

2026/10/12 3:19:56 阅读更多 →
高斯赛德尔迭代法:大规模稀疏线性方程组的工程解法与实战技巧

高斯赛德尔迭代法:大规模稀疏线性方程组的工程解法与实战技巧

线性方程组这东西,刚接触数值计算的时候,总觉得不是事——高斯消元一把梭,n100也就是眨眨眼的事。可等你真在工程里碰到几十万未知量、矩阵非零元稀稀落落排成带状或块状的时候,直接法的“快”就变成了一种幻觉:要么内…

2026/10/12 3:19:56 阅读更多 →
attrs 比较机制完全指南:默认相等性、排序生成与自定义比较(Comparison)

attrs 比较机制完全指南:默认相等性、排序生成与自定义比较(Comparison)

后端 【免费下载链接】attrs Python Classes Without Boilerplate 项目地址: https://gitcode.com/gh_mirrors/at/attrs 点击查看 免费下载 本文围绕 attrs 官方文档 docs/comparison.md 展开,系统讲解 attrs 类实例的相等性(equality&#…

2026/10/12 3:18:56 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器: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 阅读更多 →