一个专家混合块,装进你已有的模型¶
PyTorch、TensorFlow、Jax、Flax、Keras 各有原生实现,写法随各家习惯;Ultralytics YOLO 一个调用接进去。路由的平衡项真正进入反向传播,不是配置里的一个数。
- 装进任意模型通道在首次前向推断,
nn.Sequential里直接放得下;也可以按子模块名插进现成的模型,不碰它的源码。 - 一个调用接进 YOLO
equip把块接进配置、重编号层引用、接好损失;YOLOv5 至 YOLO26 七代官方主干与 YOLO-Master 分支都能用。 - 五个框架,一套参数
kernels定专家与感受野,top_k定几选几;五处实现读参数的是同一段代码,换框架不用改写法。
在 Colab 里打开快速上手:安装、接入、训练,在日志里看到 esmoe_aux 列,全程在免费 GPU 上完成。
安装¶
uv add esmoe # 块本身,只依赖 torch
uv add esmoe[yolo] # 再加 Ultralytics 集成
esmoe[ultralytics] 是同一个 extra 的另一个名字;esmoe[tensorflow]、esmoe[jax]、esmoe[flax]、esmoe[keras] 各带一个后端。分发名、导入名与命令行名都是 esmoe。
使用¶
import esmoe
from torch import nn
net = nn.Sequential(nn.Conv2d(3, 64, 3, 2, 1), esmoe.ESMoE(kernels=[3, 5, 7], top_k=1))
接进 YOLO:
model = esmoe.equip("yolo11n.yaml", weight=0.01) # 注册 + 嫁接 + 构建 + 接损失
model.train(data="coco8.yaml", epochs=10)
分步调用、命令行与手写配置见在 YOLO 里,纯 torch 的用法见在 torch 模型里。
兼容性¶
| 主干 | 构建与前向 | 嫁接进配置 | 训练中的辅助损失 | 满协议运行 |
|---|---|---|---|---|
| YOLOv5 | 是 | 是 | 是 | 是 |
| YOLOv8 | 是 | 是 | 是 | 是 |
| YOLOv9 | 是 | 是 | 是 | 是 |
| YOLOv10 | 是 | 是 | 是 | 是 |
| YOLO11 | 是 | 是 | 是 | 是 |
| YOLO12 | 是 | 是 | 是 | 是 |
| YOLO26 | 是 | 是 | 是 | 是 |
| YOLO-Master(分支) | 是 | 是 | 是 | 否 |
由 tests/test_ultralytics.py 在 ultralytics 8.4.101 与最新发布版上验证(CI 矩阵),两者的 loss items 形态不同,均已处理。训练一列由四代主干上真实的 1-epoch VisDrone 训练与七代主干上 120 epoch 的协议运行共同支撑,日志里 train/esmoe_aux 均非零;每一行的嫁接与前向都在 CI 里跑。YOLO-Master 一行跑在该分支自带的 ultralytics 上:scripts/fork_smoke.py 嫁接进它的 yolo-master-n.yaml、真实训练一轮且 esmoe_aux 非零,它自己的 ES_MOE 配置与本块共存。分支上的同配置对照训练的是上游自己的块,本包的块在官方 ultralytics 上训练 yolo-master-n,所以最后一列为否。
默认配置¶
ESMoE(num_experts=4, top_k=2) 配 attach_aux_loss(weight=0.01)。在 25% 训练集、640 像素、20 epoch 的统一预算下,它胜过 2 专家、8 专家、top-1 与关掉辅助损失的变体;在全量 VisDrone 上以同样的 20 epoch、640 像素、三个 seed 确认:配对 3/3 胜,mAP50 +0.0021,YOLOv8n 上参数增加 10.4%。协议预算(800 像素、120 epoch)下,YOLOv8n 默认接法为 +0.0025、2/3。论证见选型。