【医学图像分割模块】FasterNet / PConvCVPR 2023—— 只卷一部分通道又快又准医学图像分割模型往往跑得慢——不是 FLOPs 高而是内存访问Memory Access太频繁。很多网络 FLOPs 降下去了实测速度却没快就是因为逐层读写显存的开销被忽略了。FasterNetCVPR 2023提出PConvPartial Convolution部分卷积只对输入通道里的一小部分做 3×3 卷积其余通道原样直通既砍 FLOPs、更砍内存访问实测速度显著提升而精度不掉。对已经堆满 3×3 卷积的医学分割网络来说它是替换重型卷积块的首选之一。一、论文出处论文Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks会议CVPR 2023论文链接https://arxiv.org/abs/2303.03667官方代码https://github.com/JierunChen/FasterNet二、模块图截自论文原文 Figure 4图自 FasterNet 原文 Figure 4CVPR 2023。上半部分是 FasterNet 主干Embedding → 4 个 Stage → Global Pool → 1×1 Conv → FC下方两个虚线框分别展开Partial Convolution (PConv)与FasterNet Block的内部结构。拆成一句话输入 → PConv3×3 只作用于 C/4 通道其余通道直通→ BN → 1×1 卷积升维 → 激活 → 1×1 卷积降维 → 加上残差 → 输出。三、核心思想与作用一句话卷积只在「部分通道」上做用更少的内存访问换更高的实测速度FLOPS精度基本不掉。拆解被忽视的瓶颈FasterNet 指出影响推理速度的不只是 FLOPs更是FLOPS每秒浮点运算次数即实际吞吐——频繁的逐层访存会拖慢速度。PConv 的做法对输入特征图只取前cp C/4个通道做 3×3 卷积其余C - cp个通道完全不计算、直接拷贝输出随后用一个 1×1 卷积PWConv把信息在通道间融合。收益PConv 的 FLOPs ≈ 常规卷积的 1/16cpC/4 时内存访问也大幅下降而 PWConv 补回通道交互能力保证表达力。在分割里的作用提速把 U-Net 编码器里的 3×3 卷积块换成 FasterNet Block训练/推理更快省显存对医学影像这种高分辨率、大 batch 受限的场景友好即插即用残差结构 纯卷积替换进现有网络改造成本极低。四、在 U-Net 里的插入位置FasterNet Block 是高效卷积块可直接替换编码器/解码器里的常规 3×3 卷积残差块也可以只替换最吃算力的几个 stage。通道数很大时收益最明显因为 PConv 省的是通道维度的计算。五、复现代码PyTorch逐行注释importtorchimporttorch.nnasnnclassPartial_conv3(nn.Module):PConv3×3 卷积只作用于一部分通道其余通道直通。def__init__(self,dim,n_div4):super().__init__()self.dim_conv3dim//n_div# 参与卷积的通道数默认 C/4self.dim_untoucheddim-self.dim_conv3# 直通、不计算的通道数# 3×3 深度无关的普通卷积但只吃 dim_conv3 个通道self.partial_conv3nn.Conv2d(self.dim_conv3,self.dim_conv3,kernel_size3,stride1,padding1,biasFalse)defforward(self,x):# 按通道切成要算的和直通的两部分x1,x2torch.split(x,[self.dim_conv3,self.dim_untouched],dim1)x1self.partial_conv3(x1)# 只对 x1 做 3×3xtorch.cat((x1,x2),dim1)# x2 原样拼接回去returnxclassFaster_Block(nn.Module):FasterNet BlockPConv 两个 1×1 卷积PWConv 残差。def__init__(self,dim,n_div4,mlp_ratio2,drop_path0.0):super().__init__()self.conv3Partial_conv3(dim,n_div)# PConvself.conv1nn.Conv2d(dim,int(dim*mlp_ratio),1,1,0,biasFalse)# 1×1 升维self.conv2nn.Conv2d(int(dim*mlp_ratio),dim,1,1,0,biasFalse)# 1×1 降维self.bnnn.BatchNorm2d(dim)self.actnn.GELU()self.drop_pathnn.Identity()ifdrop_path0elsenn.Dropout(drop_path)defforward(self,x):shortcutx# 残差分支xself.conv3(x)# PConv只卷部分通道xself.bn(x)xself.conv1(x)# 通道升维增强表达xself.act(x)xself.conv2(x)# 通道降维xshortcutself.drop_path(x)# 残差相加returnx六、插入示例几行塞进你的网络# 例用 FasterNet Block 替换 U-Net 编码器某个 stage 里的重卷积块self.blockFaster_Block(dim256,n_div4,mlp_ratio2)defforward(self,x):xself.down(x)xself.block(x)# ← 替换原来的 DoubleConv / ResBlockreturnx七、实测经验与注意点FLOPs当n_div4时PConv 的 FLOPs ≈ 常规 3×3 卷积的1/16整块因含两个 1×1 卷积整体 FLOPs 显著低于同容量 ResBlock。速度作者核心论点是FLOPS实测吞吐提升而非只看 FLOPs——建议在自己硬件上实测对比。踩坑dim // n_div要保证能被整除、且不是 0小通道时 n_div 调小如 2PConv 的biasFalseBN 在后通道数越大省的计算越多——非常适合高分辨率医学影像的深层特征。医学分割场景3D 医学图像显存吃紧时用 FasterNet Block 替换 3D 重卷积块收益尤其明显。八、完整工程 领取本文的完整可运行工程PConv / FasterNet Block 的.py、U-Net 插入 demo、n_div 可调配置、逐行中文注释我整理好了。领取方式关注公众号MediVision回复「模块」——自动把《即插即用模块合集含 FasterNet / BiFormer / StarNet / RepViT / TransNeXt…统一接口一条 import 就能用》的入口发给你进群免费领。下一篇预告BiFormerCVPR 2023——用双层路由注意力只算该算的地方把注意力的计算量砍掉一大截。