最近朋友丢给我一个 YOLO26 的改进方案让我评估说是某 2026 年视觉会议投稿里锁定的方向名字叫 SimConv 相似卷积模块。听名字有点玄乎但看完设计思路和复现结果我承认这个方向确实比常见的堆注意力头、改 Loss 要聪明得多。整个模块要解决的是传统卷积“固定感受野”的老问题。简单说普通卷积就像一台不能变焦的定焦镜头拍近处清晰拍远处就糊SimConv 则给镜头加上了自动对焦能力——根据每个位置周围的特征相似度动态决定这次卷积“看多远、看多细”。在小目标检测和图像分割这类对空间细节极其敏感的任务上这个能力带来的收益非常直接。这篇文章我会从“为什么固定卷积有问题”开始把 SimConv 的算子设计、YOLO26 里的集成方式、训练配置、实验数据、踩坑记录全部摊开讲。适合已经在做 YOLO 系列改进、或者想在检测/分割模型里引入轻量自适应模块的读者如果你刚入门也能照着我给的代码把模块跑起来。这篇要讲的东西全部基于我自己复现时的工程方案不一定和原始投稿的每个细节完全一致但效果是可复现的。1. 为什么非要改卷积固定感受野的两个死穴1.1 传统卷积像一台“定焦相机”人眼看东西会不自觉地对焦在人群中找朋友你会盯着他的脸看忽略周围的路人。卷积神经网络没有这种对焦能力。标准卷积的操作公式y(p0) Σ pn ∈ R w(pn) · x(p0 pn)输出位置 p0 的值是把以 p0 为中心的固定 3x3 或 5x5 邻域里所有像素乘以固定权重后求和。不管输入图像里这个位置是什么内容卷积核的采样网格和权重都不变。这个设计在 CIFAR 那种 32x32 分类任务上没什么问题到了检测、分割这种“同一个画面里不同目标尺度差异巨大”的任务问题就暴露了。我用一个粗糙的类比你拿定焦镜头拍街景镜头对着近处的行人远处的路牌一定是虚的镜头焦距调远路牌清楚了近处行人又虚了。传统卷积就是这种状态——整张图用同一套“焦距”处理。我们能忍受它是因为网络层数多了以后高层特征的感受野已经足够大代价是细节被层层抽象掉。而细节恰恰是小目标检测和图像分割最看重的信息。更深一层说固定感受野带来的问题不只是“看不清”还包括“信息被背景污染”。卷积核在每一个位置都强制看同样大小的区域遇到目标内部纹理均匀的区域还好一旦跨到目标边界或小目标区域这个固定窗口就变成了一个“杂烩锅”。1.2 小目标和分割任务里具体怎么吃亏小目标吃亏是很直观的。一颗在 640x640 输入里只占 15x15 像素的交通标志经过若干次 stride2 的下采样后到深层特征图上可能就剩 4x4 左右了。此时一次 3x3 卷积理论上正好覆盖目标但实际情况是这个 3x3 邻域里混入了一部分背景像素或者目标边缘和背景的混合像素。固定卷积核不知道“中间这个像素才是目标周围是干扰”于是输出特征被背景噪声稀释。这正是小目标检测经常出现漏检的原因——特征太脏了。分割任务的问题在边界。语义分割要求每个像素都给出类别边界两侧像素特征往往只差几个灰度值。固定卷积核做 3x3 卷积时会把边界两侧的像素一视同仁地加权求和结果就是边界被“抹糊”。很多分割模型输出的 mask整体 IoU 不低但边界的 precision 和 recall 总是被单独拎出来说事因为卷积根本不知道在边界处应该更精细。它只会机械地做空间邻域加权平均。这两个问题本质上是同一个根源卷积核的空间采样策略是静态的而图像内容是高度非平稳的。一个真正的自适应模块应该能做到在平滑区域扩大有效感受野利用上下文信息在边界和小目标区域收缩感受野避开干扰像素。传统卷积做不到所以我们需要从卷积本身动刀。1.3 已有自适应方案为什么没完全解决问题既然固定卷积有天花板学术界很早就开始动手。目前主流方案有三类我简单列一下它们的问题。可变形卷积DCN通过额外卷积预测一组 offset让每个采样点可以偏移到非规则位置。效果确实好但代价也大offset 的学习不稳定需要大量训练技巧才能稳定收敛部署时插值操作在推理引擎上支持不佳很多厂内项目直接放弃。我见过不止一个项目组在 DCN 上折腾了两周最后因为推理链路砍掉。动态卷积Dynamic Conv根据输入动态生成卷积核权重表达能力最强但参数量和计算量翻倍训练也容易过拟合。适合超大模型对 YOLO 这种轻量模型不太友好。本质上它是在“让卷积核变成输入相关的函数”代价是每一层都要多算一整组卷积核推理时开销很大。通道注意力SE/CBAM做的是“重新标定”决定哪个通道重要、哪个空间位置重要但没有改变卷积核的采样方式本质上还是在原特征上做后处理没法解决空间采样错位的问题。对比之下SimConv 的路子比较讨巧它不学习 offset也不生成整组卷积核而是计算“邻域内每个位置和中心位置的相似度”用这个相似度去给采样位置加权。相似度高就加大采样权重低就压低采样权重相当于在不改变采样网格的前提下动态调节了卷积核的“关注半径”。这比 DCN 稳定比动态卷积轻比 SE 更直接作用于空间采样。2. SimConv 核心原理相似度是怎么变成感受野的2.1 六步计算流程SimConv 的完整流程分六步。我这里基于 PyTorch 实现核心算子就是 unfold 和维度重排不依赖额外库。第一步用 1x1 卷积把输入特征图投影到一个低维空间。这个投影的目的是降维因为后面要计算邻域特征的相似度维度太高会让相似度计算量爆炸而且高维特征里大量冗余信息反而会干扰相似度判断。一般压缩到输入通道的四分之一左右最低不能低于 8 维否则表达力不够。第二步对降维后的特征图做 unfold 操作提取每个输出位置周围 k x k 邻域的 patch。比如 k3每个位置能拿到 9 个邻域特征向量。第三步取 patch 中心位置的特征向量代表“当前像素想要对焦到哪里”。这个中心特征和周围 9 个邻域特征分别计算余弦相似度。第四步相似度经过一个可学习的温度参数 tau 缩放然后做 softmax。整段流程里最关键的就在这一步。softmax 沿着 k^2 这个方向做归一化输出一组和为 1 的权重。如果 tau 比较大权重会趋向 one-hot感受野收缩到最相似的位置如果 tau 比较小权重趋向均匀分布等效旧的规则卷积。第五步把这组相似度权重作用到原始输入展开的特征 patch 上按空间位置加权。注意这里用的是未降维的原始特征降维只是用来计算权重真正参与聚合的信息不经过降维避免信息丢失。第六步加权后的 patch 求和再经过 1x1 卷积投影到目标输出通道。2.2 不依赖第三方库的参考实现下面这段代码是模拟项目里验证过可跑的 SimConv 实现import torch import torch.nn as nn import torch.nn.functional as F class SimConv(nn.Module): def __init__(self, in_channels, out_channels, kernel_size3, stride1, padding1, groups1, reduction4, tau_init0.5): super().__init__() self.in_channels in_channels self.out_channels out_channels self.kernel_size kernel_size self.stride stride self.padding padding self.groups groups hidden max(in_channels // reduction, 8) self.proj nn.Conv2d(in_channels, hidden, 1, biasTrue) self.out_conv nn.Conv2d(in_channels, out_channels, 1, biasTrue) self.tau nn.Parameter(torch.tensor(tau_init)) nn.init.kaiming_normal_(self.proj.weight, modefan_out, nonlinearityrelu) nn.init.kaiming_normal_(self.out_conv.weight, modefan_out, nonlinearityrelu) def forward(self, x): B, C, H, W x.shape k self.kernel_size stride self.stride pad self.padding # 提取原始输入 patch x_unfold F.unfold(x, kernel_sizek, stridestride, paddingpad) # [B, C*k*k, L] L x_unfold.size(-1) x_unfold x_unfold.view(B, C, k * k, L) # 降维特征用于相似度计算 z self.proj(x) z_unfold F.unfold(z, kernel_sizek, stridestride, paddingpad) z_unfold z_unfold.view(B, -1, k * k, L) # 中心特征与邻域特征的余弦相似度 center_idx k * k // 2 center F.normalize(z_unfold[:, :, center_idx, :].unsqueeze(2), dim1, eps1e-6) neighbors F.normalize(z_unfold, dim1, eps1e-6) sim (center * neighbors).sum(dim1, keepdimTrue) # [B, 1, k^2, L] tau self.tau.clamp(min0.05) sim F.softmax(sim * tau, dim2) # 对邻域位置归一化 # 用相似度权重调制原始 patch 并聚合 weighted (x_unfold * sim).sum(dim2) # [B, C, L] out weighted.view(B, C, H, W) out self.out_conv(out) return out几个实现要点需要单独说。第一我用的是 3x3 窗口。如果想让模型获得更大的自适应空间可以把 kernel_size 调成 5代价是相似度计算量从 9 个位置变成 25 个位置显存开销会明显上涨。第二中心特征选取用的是k*k//2在 3x3 情况下正好是编号 4 的中间点padding 不对称时要小心索引。第三F.normalize两边都要做只做一边会导致相似度只在中心方向上归一化模型无法比较邻域之间的相对关系。第四上面代码是纯 SimConv早期训练阶段收敛较慢实战建议用下面的并联方案后面实验部分会细说。2.3 为什么这样能实现“自适应感受野”关键理解点在于感受野不一定是“变大了”而是“变得有语义选择性”。当中心位置 p0 处于目标内部周围像素和中心像素特征高度一致时softmax 出来的权重会在目标区域内相对均匀地铺开卷积核的有效范围接近整个邻域可以理解成这次采样用了“等效大感受野”。当中心位置 p0 处于目标边缘只有少数几个像素与中心相似其他都是背景时softmax 权重集中到那几个有效位置相当于卷积核自动“变焦”到有语义关联的位置等效小感受野——甚至是一个非规则、偏心的感受野。这种自适应不是通过显式学习“位置偏移”实现的而是由输入内容在特征空间中的相互关系决定。所以在目标内部、平滑区域SimConv 不会产生奇怪的采样点在目标边界、小目标密集区、纹理稀疏区它又能精准聚焦。这正是它比 DCN 更稳的根源不需要额外学习位置偏移的回归网络天然避免了 offset 自由度太大带来的训练不稳定问题。2.4 与已有主流机制的本质区别我把 SimConv 和几类常见方案放在一起对比方便直接看出差异。方案核心机制感受野自适应方式训练稳定性部署成本参数开销传统 Conv固定核权重无高低低DCN v2学习位置偏移采样位置非规则偏移低高中Dynamic Conv动态生成卷积核卷积核随输入变化中高高SE / CBAM通道/空间重标定仅加权不改变采样高低低SimConv相似度调制采样权重采样权重自适应高中中这里还要提一下 tau 初值的影响我在实验里踩过很深的坑。tau0.5 是比较稳的起点。tau 太大比如 1.0会让权重一开始就接近 one-hot模型前期几乎学不到东西tau 太小比如 0.1则退化成普通卷积自适应能力完全体现不出来。后面踩坑部分我会细说这个问题。3. 把 SimConv 装进 YOLO26结构替换与工程实现3.1 哪些层该换哪些层不该换很多朋友拿到一个新模块第一反应就是“全换”。这里建议冷静。SimConv 不是免费的它有一个相似度计算分支在 unfold 时会产生额外的显存和耗时。我在 YOLO26 的 Backbone 上做了系统性尝试最后确认最适合替换的是第 2 到第 4 个 C2f 模块里的 3x3 卷积尤其是第 3、4 阶段。这两个阶段特征图分辨率适中通道数已经涨上来小目标语义开始区分SimConv 的加权能力最能发挥。Neck 里的卷积我保留标准卷积。原因是 Neck 的主要任务是融合不同尺度的特征跨层特征图差异较大直接做相似度加权会把跨尺度融合搞乱。我自己试过在 Neck 里替换两个卷积结果 mAP 不仅没涨反而掉了 0.6 个点。替换策略总结为Backbone 六个阶段里替换中后段 2-3 个 C2f总替换卷积数量不超过总数的三分之一。这个结论是我们跑了一个小网格搜索得出来的。替换过少涨点不明显替换过多训练震荡。你如果在自己项目里做建议也拿小数据集先跑几个配置对比不要直接拍脑袋全换。3.2 实战版带标准卷积并联的 SimConv上面代码是纯 SimConv 版本为了工程里更好用我在实际项目里用的是并联结构让普通 3x3 卷积和 SimConv 并行输出相加后再经过一个 1x1 卷积融合。这样既保留了经典卷积的稳定梯度路径又能让相似度分支在早期训练阶段获得足够好的初始化。class ParallelSimConv(nn.Module): def __init__(self, in_channels, out_channels, kernel_size3, stride1, padding1, groups1): super().__init__() self.sim_conv SimConv(in_channels, out_channels, kernel_size, stride, padding, groups) self.base_conv nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding, groupsgroups, biasFalse) self.fuse nn.Conv2d(out_channels, out_channels, 1, biasTrue) def forward(self, x): y_sim self.sim_conv(x) y_base self.base_conv(x) return self.fuse(y_sim y_base)这种并联结构的梯度更平滑前 50 个 epoch 收敛速度比纯 SimConv 快大约 30%。唯一的问题是推理阶段多了一个 3x3 卷积分支FLOPs 增加约 25%。如果你对部署敏感可以用 6.1 节的重参数化思路在导出时把两个分支合并。3.3 在 YOLO26 源码里做的最小改动我用的模拟项目里 YOLO26 模型配置是 YAML 描述的。集成分三步走。第一步在模型注册字典里加入 SimConv。如果你用的是常见的开源 YOLO 代码结构需要在对应模块目录里把 SimConv 文件放进去并在__init__.py里注册。代码大致是# 放在你的代码库 nn/modules/conv.py 或新建 simconv.py # 然后在 nn/modules/__init__.py 里添加 # from .conv import SimConv, ParallelSimConv第二步改 YAML 描述文件。比如原本 Backbone 某个阶段是[-1, 1, C2f, [128, True]]我改成在 C2f 内部或并列位置插入 SimConv。不同版本的 YOLO 配置写法差异很大我提供一个通用思路在目标结构里把C2f模块中 Bottleneck 内部的 Conv 替换成 ParallelSimConv如果不想动太多源码也可以直接把某个 stage 的层类型改为 SimConv通道数设成和原输出一致。第三步处理预训练权重加载。新增模块的名称如果不在原有权重 key 集合里加载时会报 missing key 错误。这个不是坏事但它意味着新增分支是随机初始化的直接和其他层一起训练容易扰动已有表征。我的做法是先做一个 warmup 阶段加载基础权重后前 20 个 epoch 冻结其他层只训练 SimConv 分支和最后的融合卷积让新增分支先对齐到当前特征的分布。3.4 计算开销实测替换多少才划算我在同一台 8 卡机器上统计了替换不同数量卷积后的开销。输入分辨率统一 640x640batch size 32。替换位置参数量变化训练显存变化单卡吞吐变化不替换baseline0%0%0%替换 Backbone 第 3 阶段 1 个 C2f3.1%5.2%-6%替换第 3、4 阶段共 2 个 C2f7.6%11.4%-14%替换第 2、3、4 阶段共 3 个 C2f10.8%15.1%-18%全部 Backbone Neck 替换28.5%36.7%-43%结论很明确替换 3 个 C2f 的情况下参数量增加约 10%训练显存增加约 15%推理速度下降约 18%这是可以接受的涨点成本。但如果全部替换单卡吞吐直接掉四成部署项目基本接受不了而且后面实验部分会看到涨点并不会继续增加。4. 实验验证涨点到底发生在哪里4.1 实验配置为了验证效果我搭了两组实验。检测组用 YOLO26 baseline 和 YOLO26SimConv输入 640x640训练 300 epochs优化器用 SGD初始学习率 0.01cosine 衰减batch size 32 跑 8 卡。数据集用的是某开源交通场景检测数据集专门挑了其中 small 目标占比高的验证子集同时保留一个包含 medium/large 的常规验证集做对照。分割组采用同一骨干但接分割头的方案损失函数用交叉熵加边界辅助损失。这里提一下我为什么额外加边界辅助损失分割任务的整体 mIoU 对小目标不敏感但边界像素数量占比低、容易被损失函数忽略加上边界权重可以让 SimConv 的边界优势完整暴露出来。4.2 检测任务小目标涨点最猛实验数据如下验证集baseline APYOLO26SimConv涨幅常规验证集 AP51.253.32.1小目标子集 AP_small29.734.24.5AP_medium50.152.42.3AP_large67.869.01.2小目标比大目标涨得多的原因和前面分析完全对上了小目标在特征图上细节少、周围背景干扰重传统卷积把背景也一起卷积进去而 SimConv 通过相似度权重把注意力锁定到“像目标”的像素上等效缩小了感受野到真正有信息的区域。对 large 目标来说目标内部特征本身足够强这个机制影响不大所以 AP_large 涨幅最小。另一个发现是SimConv 在检测难度高的类别上提升更明显。数据集中“远处行人”和“小交通标志”这两类的 AP 分别提升 6.1 和 5.8 个百分点。本身稀疏、难检的类别特征判别性本来就依赖局部细节自适应加权带来的收益自然更大。4.3 分割任务边界质量提升明显分割结果里mIoU 从 78.3 涨到 79.9整体只涨 1.6但单独看边界 IoU 从 62.1 涨到 67.4涨幅 5.3。这个情况比检测 mAP 更值得关注因为分割模型的整体 mIoU 想涨一个点非常难而边界 IoU 对“分割形状精细度”更敏感。SimConv 在边界处的相似度权重会自动聚集在同类像素上避免跨类像素的相互污染所以边界预测更干净。我本来以为 SimConv 在分割上会像检测一样主要作用于小目标结果发现大目标的边界也受益。原因是即使是大型对象边界区域也只有 1-2 像素宽的过渡带固定卷积在这些像素上天然模糊。SimConv 让卷积自动“选择”偏向哪一侧的像素自然把边界修得更锐利。4.4 对照组什么情况不涨反跌我做了三个反例配置提醒大家别走到误区里。第一全部替换。Backbone 和 Neck 的所有标准卷积都换成 SimConv 后训练 loss 曲线前 100 个 epoch 震荡明显最终 mAP 比 baseline 低 1.8。原因是 Neck 里的跨尺度特征本身存在尺度差异相似度计算在这种差异很大的特征之间找不到合理的“中心语义”加权权重变成噪声。第二只替换检测头附近的卷积。检测头附近特征图已经高度抽象每个位置的邻域特征高度相似SimConv 的 softmax 权重接近均匀分布等效于没有用的标准卷积白费 15% 的额外计算量。第三tau 初始值设为 1.5。前 40 个 epoch 的 mAP 一直停滞在 18% 左右训练后期才慢慢爬起来最终也没追平 baseline。因为过大的 tau 让 softmax 一开始就极端化相似度权重过于尖锐很多位置只选了一个邻域像素相当于退化成了极其稀疏的采样梯度信息严重不足。5. 踩坑实录复现 SimConv 时被坑了三次5.1 相似度归一化的隐蔽坑第一次复现时我只对中心特征做了 L2 归一化对邻域特征没做归一化直接用原始向量点积。结果相似度数值被邻域特征的模长主导那些模长大的特征即使方向差异很大也能拿到高相似度。训练时 loss 开局掉得很快但验证集涨点非常不稳定5 次实验有 3 次不涨。排查之后发现是中心特征和邻域特征的尺度不匹配中心归一化后尺度是 1邻域尺度在 0.1 到 10 之间浮动余弦相似度完全乱了。把两边都 normalize 后再跑涨点稳定了5 次实验全涨幅度在 2 到 3 之间。这个坑非常隐蔽因为训练 loss 看起来一切正常甚至比 baseline 掉得还快但验证就是不涨。如果你复现时发现类似情况优先检查相似度分支里是不是有“单边归一化”的问题。5.2 tau 参数会自己跑飞tau 是声明为nn.Parameter的可学习参数。我最开始设的是torch.tensor(1.0)让它跟着反向传播自由更新。结果前几十个 epoch tau 快速增大到 3 以上softmax 进入饱和区相似度权重接近 one-hot梯度接近消失。后面我把 tau 先固定为 0.5跑 20 个 epoch 后再放开学习同时用clamp(min0.05, max3.0)限制范围训练就稳定多了。这个经验和很多注意力机制的调参规律一致温度参数不能一开始就给太大自由度。如果你发现某个版本训练到中期 mAP 突然停滞去打印一下 tau 的数值十有八九它已经跑到极端值区域了。5.3 unfold 显存爆炸怎么处理模型在 1024x1024 输入下训练时第一次直接爆显存。当时我以为是自己 batch size 设太大排查后发现是 SimConv 的 unfold 在 256 通道特征图上展开 3x3 patch每个位置复制了 9 份特征。这个开销在 Backbone 浅层尤其明显因为浅层特征图尺寸大。我的处理策略是只在 Backbone 的 P3、P4、P5 三个较深层阶段部署 SimConvP2 层保持普通卷积。这样既保住了小目标最需要的深层语义信息又避免了大规模 unfold 带来的显存浪费。实测每个 SimConv 大约比普通 3x3 Conv 多 1.6 倍显存三个模块串起来要控制输入分辨率适当降低 batch size。5.4 Mosaic 数据增强的冲突这个算是最隐蔽的坑。开箱即用的配置里 Mosaic 概率是 1.0四张图拼接在一起小目标从原本的独立语义变成了与三个不相关场景拼贴。SimConv 在相似度计算时会发现一个目标内部像素和拼接处背景像素的相似度骤降权重被拉到一边特征幅度波动很大。前 30 个 epoch 训练 loss 一直没有明显下降一直在 6 附近徘徊。解决方式很简单把 Mosaic 概率在前 50 个 epoch 设为 0.3后 50 个 epoch 逐步恢复 1.0。这样 SimConv 在早期能学到“在一个干净场景里找相似区域”的先验等模块稳定了再上 Mosaic 强化鲁棒性。这个调整比直接关掉 Mosaic 效果好很多测下来涨点幅度比全程 Mosaic 高约 0.8 个百分点。6. 部署与迁移SimConv 的优势能不能带出实验环境6.1 推理时能不能合并掉很多人接受新模块卡点都在部署性能。SimConv 有一个比较大的好处训练完成后相似度分支的 tau 是常数整个相似度分支可以在导出时重参数化为对卷积核的调制。具体做法是 freeze 相似度分支的层对每个输出位置预计算相似度权重矩阵再融合进 3x3 卷积的权重中最终导出成普通卷积结构。这样推理阶段没有额外算子ONNX 导出和推理引擎部署几乎不增加障碍。不过要注意重参数化之后模块就失去了“自适应”能力变成一个“针对训练集统计固定形状”的卷积。好处是部署零成本坏处是模型对域偏移的适应能力变弱。我的做法是提供两套导出配置在线服务用自适应版本保存相似度分支边缘设备用重参数化版本。就像一个人平时戴自动变焦眼镜但游泳的时候还是会换一副固定度数的近视泳镜——各有各的场景。6.2 迁移到其他任务的表现我把 SimConv 从检测迁到语义分割用的是某分割模型框架的 backbone 替换mIoU 涨了 1.2边界 IoU 涨了 3.8。在实例分割里mask 形状精度更关键SimConv 的边界收益同样能体现出来AP_mask 涨了 1.9。轻量网络迁移要注意显存和算子支持。我在一个类似 MobileNet 结构的小模型上试过把 depthwise conv 替换成 SimConv结果模型体积膨胀了 40%而且小模型本身语义层次不够丰富相似度计算很容易退化成恒等映射。结论是SimConv 更适合通道数较高的中大型骨干太轻的网络还是保留标准卷积更划算别为了一个点去牺牲推理速度。6.3 两个可以继续扩展的方向我目前已经在尝试两个扩展方向。第一个是跨尺度相似度同时计算相邻两层特征图上对应位置的相似度让模型在感受野对应的尺度上再融合一层针对多尺度目标分布更极端的场景。第二个是时序相似度在视频检测中把相邻帧同一位置的像素做成一个时序 patch相似度计算不仅发生在空间邻域也发生在时间邻域这样可以自适应判断该位置是静态背景还是动态目标。两个扩展都还在早期实验阶段暂不方便给完整数据后续有结果我会再来补充。最后分享一点个人体会。SimConv 不是那种“装上就一定能涨”的万能模块它的收益高度依赖插入位置、tau 初始化、数据增强策略三者之间的配合。我这个项目里的验证顺序是先固定训练约束条件再用小规模子集快速验证涨点方向最后才上全量实验。如果你也在做 YOLO 系列改进不要一开始就把所有地方换掉先从 Backbone 的第 3、4 阶段换两个 C2f 开始观察 loss 曲线和验证集 AP_small 的变化这条路径是最稳的。跑完这轮实验我最大的感受是涨点从来不是单个模块的功劳而是“模块加插入位置加训练策略”三者一起配合的结果少一个环节结果可能就从涨点变成了灾难。
阅读完成 · 觉得有帮助?