城西有家“一面之缘”面馆,老板老王做面三十年,厨房里只有一口锅、一把刀。没有烤箱、搅拌机,更没有米其林后厨常见的几十种香料,可每天排队的人能从店门口拐到街角。有人问他秘诀,老王只答:“面揉匀,汤调匀,剩下的交给时间。”在图像识别领域,也有一位“老王”——ConvMixer。深度学习架构这些年一直在做加法:Transformer 加注意力机制,ResNet 加深层数。而 ConvMixer 反其道而行,把图片切成小块、逐块揉合、统一调味,全场只有“卷积”这一种招式。最令人意外的是,这位“极简大厨”做出的成绩,足以和那些装备精良的复杂模型平起平坐。这篇文章,就带你走进 ConvMixer 的厨房,看看“少即是多”如何在图像分类中真正落地。

岗位关联

读懂 ConvMixer,你将掌握一种“用最小组件撬动高性能”的架构设计思路——理解空间混合与通道混合的分离哲学,能帮你在设计分类网络、对比新型模型时建立直觉判断,这是深度学习研究者不可或缺的底层认知。

目录
  1. 可视化演示
  2. 极简理念
  3. 图像分块
  4. 深度卷积
  5. 逐点卷积
  6. 块式结构
  7. 对比分析
  8. 训练要点
  9. 性能表现
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

动态演示ConvMixer的核心机制,通过全局/局部/动态/静态四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

ConvMixer:Conv ConvMixer的核心思想: Patch Embedding 核心机制可视化 ConvMixer整体架构与关键组件

极简理念

城西有家“一面之缘”面馆,老板老王做面三十年,厨房里只有一口锅、一把刀。没有复杂的烤箱、搅拌机,没有几十种香料,但每天排队的人能绕街角三圈。老王的哲学是:“招式不用多,把一招练到极致。”在深度学习图像分类的世界里,ConvMixer 就是这位老王。它诞生于 2022 年的论文《Patches Are All You Need》,全文的核心主张只有一句:不需要注意力机制,不需要位置编码,甚至不需要花哨的模块设计——只用最基础的卷积操作反复堆叠,就能在 ImageNet 上取得与 ViT 相当的成绩。

ConvMixer 的完整骨架可以用一条公式概括:图片先进过 Patch 嵌入变成小块特征图,然后重复堆叠 D 个结构完全相同的“混合块”,最后做全局平均池化并接一个线性分类头。这里的 D 和通道数 C 是仅有的两个超参数。没有 attention 里的 QKV 矩阵,没有位置编码,没有复杂的 multi-head 结构,所有信息交换都靠卷积完成。这种设计带来的直觉是:如果一个简单模型和一个复杂模型表现相当,那么复杂模型里那些“多余”的组件可能并不真正重要。

老王的菜单上永远只有一款面,客人却百吃不厌——ConvMixer 的“极简”不是简陋,而是把“混合信息”这一件事做到极致。这份克制正是它的设计哲学:复杂的架构往往是锦上添花,真正决定能力下限的,是基础组件是否被用到了刀刃上。

F(X)=Head(GlobalAvgPool(BlockD(PatchEmbed(X))))\displaystyle \mathcal{F}(X) = \mathrm{Head}\Big( \mathrm{GlobalAvgPool}\big( \mathrm{Block}^{D} (\mathrm{PatchEmbed}(X)) \big) \Big)
这条公式是 ConvMixer 的完整配方:切块 → 反复混合 → 汇总 → 分类。每个环节都是卷积家族的成员。
  1. 输入图像一张 H×W 像素、3 个颜色通道的图片
    X∈R3×H×W\displaystyle X \in \mathbb{R}^{3 \times H \times W}
  2. 分块嵌入用步长等于卷积核大小的卷积把图切成小块并映射到 d 维嵌入
    Z=Conv2Dp×p,s=p(X)\displaystyle Z = \mathrm{Conv2D}_{p \times p, s=p}(X)
  3. 块堆叠D 个结构相同的混合块依次处理特征
    Z′=BlockD(⋯Block1(Z)⋯)\displaystyle Z' = \mathrm{Block}_{D}\big( \cdots \mathrm{Block}_{1}(Z) \cdots \big)
  4. 全局平均池化把特征图每个位置的值取平均,浓缩成一条向量
    zavg=1hw∑i=1h∑j=1wZi,j′\displaystyle z_{\text{avg}} = \frac{1}{h w} \sum_{i=1}^{h} \sum_{j=1}^{w} Z'_{i,j}
  5. 分类头线性层把向量映射为类别得分,Softmax 得到概率
    y^=Softmax(Wzavg+b)\displaystyle \hat{y} = \mathrm{Softmax}(W z_{\text{avg}} + b)

图像分块

做面第一步是切面。老王有一手好刀工:整块面团先擀平,然后“唰唰唰”切成大小完全相同的面段,每一段大小一致,下锅受热才均匀。图片处理同理。深度学习模型无法一口吞下整张 224×224 的图片,需要先切成若干小块,每块再映射成一个向量,这就是 Patch Embedding(图像分块嵌入)。

你可能在 ViT 里听过“图像分块”:ViT 把图片切成 16×16 的 patch,然后靠位置编码告诉模型“这是第几行第几列”。ConvMixer 的切法更朴素——它直接用一个带步长的卷积完成分块。卷积核大小为 p,步长也是 p,窗口移动时恰好不重叠,一张 H×W 的图就被切成了 (H/p)×(W/p) 个小块。每一步卷积同时完成“切块 + 映射到 d 维嵌入”,一个算子顶两个操作。更重要的是,卷积天然自带空间位置关系——卷积核扫过图像时,输出在哪一格就对应原图的哪一块,根本不需要额外的位置编码。

面段切多大,直接决定口感:切太大,面条粗硬难入味;切太小,一煮就糊。ConvMixer 常用 patch=7 或 8,224×224 的图变成 32×32 或 28×28 个“位置块”。这个粒度让后续 9×9 的卷积核,一次就能扫到原图上 63×63 像素的大区域——老王的刀法,切得刚刚好。

Z=We∗s=pX,Z∈Rd×Hp×Wp\displaystyle Z = W_{e} *_{s=p} X,\qquad Z \in \mathbb{R}^{d \times \frac{H}{p} \times \frac{W}{p}}
一次带步长的卷积,同时完成切块与嵌入,且保留了位置信息,这是 ConvMixer 极简的第一步。
  1. 分块卷积核卷积核尺寸 p×p,把 3 个输入通道映射为 d 个嵌入通道
    We∈Rd×3×p×p\displaystyle W_{e} \in \mathbb{R}^{d \times 3 \times p \times p}
  2. 步长等于核大小窗口每次滑动 p 个像素,切出的块互不重叠
    s=p\displaystyle s = p
  3. 输出特征图尺寸高度和宽度都缩小为原来的 p 分之一
    h′=Hp,w′=Wp\displaystyle h' = \frac{H}{p},\quad w' = \frac{W}{p}

深度卷积

切好面段,老王开始揉面。秘诀是:每一根面条只跟它旁边紧挨着的面筋纠缠,不会突然跳到锅的另一头——这就是“空间局部性”。揉面的过程,对应深度学习里的深度卷积(Depthwise Convolution)。

传统卷积有个“坏习惯”:它同时做两件事。一方面,它看邻居像素,做空间上的混合;另一方面,它把 RGB 三个通道以及中间的隐藏通道全部加权重组,做通道上的混合。ConvMixer 认为,两件事混在一起做,既不透明也不高效。于是它把两者拆开:深度卷积只做空间混合。具体做法是:给每个通道配一个独立的 k×k 卷积核,只在当前通道内扫描邻域、加权求和。通道之间互不干扰,就像每一根面条都只跟自己附近的面筋打交道。这种“逐通道”的处理方式,也让卷积核数量从“输出通道 × 输入通道”锐减到“输入通道”,参数大幅节省。

老王揉面时力气很讲究:揉得太轻面没韧性,揉得太重面筋断裂。ConvMixer 把 k 设得很大——常用 9×9——一次揉捏能看到很大一片“面团”,再配合 D 层重复揉捏,等效感受野覆盖全图。空间混合这一步,揉得又透又不越界。

Yc,i,j=∑Δi,ΔjWc,Δi,Δj Xc, i+Δi, j+Δj\displaystyle Y_{c,i,j} = \sum_{\Delta i, \Delta j} W_{c,\Delta i,\Delta j}\, X_{c,\, i+\Delta i,\, j+\Delta j}
深度卷积:每个通道 c 各用一个 k×k 卷积核,只混合空间邻域,不跨通道。
  1. 逐通道索引卷积核按通道编号 c 区分,各用各的核
    c∈{1,2,…,C}\displaystyle c \in \{1, 2, \dots, C\}
  2. 局部邻域求和以 (i,j) 为中心,取 k×k 窗口内的值加权
    Δi,Δj∈{−⌊k2⌋,…,⌊k2⌋}\displaystyle \Delta i, \Delta j \in \left\{ -\left\lfloor \tfrac{k}{2} \right\rfloor, \dots, \left\lfloor \tfrac{k}{2} \right\rfloor \right\}
  3. 输入输出同通道第 c 个通道的输出只由第 c 个通道的输入贡献
    Yc=Wc∗Xc\displaystyle Y_{c} = W_{c} * X_{c}

逐点卷积

面揉好了,接下来要浇卤汁。老王有一锅熬了三小时的秘制卤汁,里面有酱油、醋、花椒、八角。浇卤的动作很有特点:不管面条在哪个位置,浇的都是同一锅汁;每一根面条都被所有调料浸润。这就是逐点卷积(Pointwise Convolution)——用 1×1 卷积做通道混合。

深度卷积把空间信息揉开了,但每个通道仍然是“各自为政”。如果各个通道代表人脸的不同特征——有的负责边缘、有的负责纹理、有的负责颜色——那最终判断“这是猫”需要把这些线索汇总。逐点卷积在同一个空间位置上,把所有通道加权求和,生成新通道。它的卷积核是 1×1,完全没有空间视野,却能把 C 个通道的任意线性组合算出来。加上它,深度卷积负责“空间混合”,逐点卷积负责“通道混合”,两者合起来就是深度可分离卷积。计算量呢?1×1 卷积没有空间扩展,参数只有输入通道数乘以输出通道数,轻得像浇一勺卤汁。

好卤汁的标准是“每根面都入味”。逐点卷积就是那勺卤汁——它不改变面条的位置和形状(空间信息不动),却把所有风味(通道)均匀地融进每一根面里。浇完汁还不算完,老王还会再揉一轮:空间混合与通道混合交替进行,这就是 ConvMixer 每一个基础块的完整节拍。

Yc′,i,j=∑c=1CinWc′,c Xc,i,j\displaystyle Y_{c', i, j} = \sum_{c=1}^{C_{\mathrm{in}}} W_{c', c}\, X_{c, i, j}
逐点卷积:1×1 卷积核跨通道加权,实现通道混合,空间位置保持不变。
  1. 遍历输入通道对同一位置的每个输入通道做加权累加
    c=1,2,…,Cin\displaystyle c = 1, 2, \dots, C_{\mathrm{in}}
  2. 空间位置不动1×1 窗口只看自身像素,不引入邻域
    i,j 保持不变\displaystyle i, j \text{ 保持不变}
  3. 生成新通道每个输出通道是全部输入通道的线性组合
    Yc′=∑cWc′,c Xc\displaystyle Y_{c'} = \sum_{c} W_{c', c}\, X_{c}

块式结构

老王做一碗面的完整工序是:切面段 → 揉面 → 浇汁 → 醒面 → 再揉 → 再浇 → 出锅。ConvMixer 的“一碗面”——ConvMixer Block——也遵循这个节奏,而且每个工序都被精确设计过。首先,一个块由两个子块组成:第一个子块做深度卷积(空间混合),第二个子块做逐点卷积(通道混合)。每个子块内部都是“卷积 → GELU 激活 → 批归一化”三板斧,注意激活在归一化之前,这就是激活前置的设计。这里没有用 ReLU 而是 GELU,因为 GELU 的平滑曲线让梯度流更温和,就像醒面让面团放松一样。

更关键的设计是残差连接:每个子块的输出,都要“加上”子块的输入。这就好比老王每一次加工,都会从案板上留一块原样面团,等加工完再把加工过的和原样的合在一起。为什么要这么做?因为当模型堆到十几层深时,梯度在反向传播中容易消失——残差连接相当于给梯度留了一条“高速公路”,让信息可以无损地直达深层。这样即使某一层揉得过头,原始面团还在,模型也不会跑偏。整张图中,D 个这样的块依次串接,构成了 ConvMixer 的全部主体。

“留一手”的老智慧,在深度架构里变成了训练稳定的关键。老王的 20 层面条越叠越有嚼劲,ConvMixer 的 20 层块越堆越准——残差、GELU、BatchNorm 三者配合,让这个极简结构具备了“堆得深、训得稳”的底气。

\displaystyle x_{1} = x_{0} + \mathrm{BN}\big( \mathrm{GELU}( \mathrm{DWConv}(x_{0}) ) \big),\qquadx_{2} = x_{1} + \mathrm{BN}\big( \mathrm{GELU}( \mathrm{PWConv}(x_{1}) ) \big)
一个 ConvMixer 块 = 空间混合子块(带残差)+ 通道混合子块(带残差)。
  1. 空间混合子块深度卷积输出先激活、再归一化
    u=BN(GELU(DWConv(x0)))\displaystyle u = \mathrm{BN}\big( \mathrm{GELU}( \mathrm{DWConv}(x_{0}) ) \big)
  2. 残差合并一加工结果与输入相加,保留原始信息
    x1=x0+u\displaystyle x_{1} = x_{0} + u
  3. 通道混合子块逐点卷积同样先激活、再归一化
    v=BN(GELU(PWConv(x1)))\displaystyle v = \mathrm{BN}\big( \mathrm{GELU}( \mathrm{PWConv}(x_{1}) ) \big)
  4. 残差合并二再次加回当前状态,完成一个完整块
    x2=x1+v\displaystyle x_{2} = x_{1} + v

对比分析

美食界有三条路线:米其林餐厅,每道菜上桌前厨师都要和全桌其他菜“互相比较”再调整味道——这是 ViT,token 之间靠注意力全局交互;传统大酒店,几十个厨师各守一道工序,每人只做一点点改进——这是 ResNet,几十层 3×3 卷积接力;还有老王的面馆,只有一口锅一把刀,一道工序反复做到极致——这是 ConvMixer。三条路线做出来的菜,最终都能端上同一张餐桌。

与 ViT 相比,ConvMixer 最大的优势是计算复杂度。ViT 的注意力要做所有 token 两两之间的相似度计算,复杂度随 token 数的平方增长;而 ConvMixer 的深度卷积只看 k×k 邻域,复杂度随位置数线性增长,patch 化后 token 只有几百个时差距不明显,一旦输入分辨率变大,优势立刻拉开。与 ResNet 相比,ConvMixer 把“空间 + 通道”的混合拆成了两步,参数和计算量都大幅下降。标准卷积每个输出通道都要和每个输入通道配一个 k×k 核,而深度可分离卷积只需 C 个 k×k 核加 C×C 个 1×1 核。

三条路线各有拥趸,但老王用最少的厨具做到了米其林的星级。研究表明,在相同的训练预算(相同 epoch、相同数据增强、相同参数量)下,ConvMixer 与 ViT 的 ImageNet 精度几乎持平,而参数效率远高于同代 ResNet。这让人不得不重新思考:我们真的需要注意力吗?还是只需要一个把空间和通道分离混合的巧思?

ParamsDSParamsStd=Ck2+C2C2k2=1C+1k2\displaystyle \frac{\mathrm{Params}_{\mathrm{DS}}}{\mathrm{Params}_{\mathrm{Std}}}= \frac{C k^{2} + C^{2}}{C^{2} k^{2}}= \frac{1}{C} + \frac{1}{k^{2}}
通道数 C 较大时,深度可分离卷积的参数量约是标准卷积的 1/k²,9×9 核时约为 1/81。
  1. 标准卷积参数C 个输出通道 × C 个输入通道 × k×k 核,参数为 C²k²
    ParamsStd=C2k2\displaystyle \mathrm{Params}_{\mathrm{Std}} = C^{2} k^{2}
  2. 深度可分离参数C 个 k×k 深度卷积核加上 C×C 个 1×1 逐点核
    ParamsDS=Ck2+C2\displaystyle \mathrm{Params}_{\mathrm{DS}} = C k^{2} + C^{2}
  3. 参数比值把比值拆成两项,当 C 远大于 k² 时第一项趋近于零
    ParamsDSParamsStd≈1k2\displaystyle \frac{\mathrm{Params}_{\mathrm{DS}}}{\mathrm{Params}_{\mathrm{Std}}} \approx \frac{1}{k^{2}}

训练要点

好面还要好火候。老王常说:“面是死的,火候是活的。”意思是同样的面团,有人煮得夹生,有人煮得软烂,关键全在后期的火候控制。ConvMixer 的“火候”,就是它的训练配置。论文中特别强调:极简架构要发挥出全部实力,训练技巧绝不能含糊。这就像米其林评委说的:最简单的菜反而最考验基本功。

ConvMixer 论文给出了一套完整的“煮面配方”:数据增强方面,使用 RandAugment、MixUp、CutMix 的强组合,让模型看到更多样化的“面段”;优化器选用 AdamW 配合余弦退火学习率,前期大步快走、后期细腻收尾;损失函数使用标签平滑,防止模型对训练集过度自信;同时配合适当的权重衰减正则化。论文还着重指出,做对比实验时必须在相同的训练预算下进行——同样的 epoch、同样的增强、同样的 batch size——否则比较就失去了公平性。研究者发现,ConvMixer 在 ImageNet 上的训练精度略低于 ResNet,但测试精度反而相当,说明它的泛化差距更小,过拟合风险更低。

老王把火候拿捏得死死的:大火煮沸、小火慢炖、出锅前焖三分钟。ConvMixer 的“火候学”提醒我们,评价一个架构时不能只盯着模型结构,训练配方同等重要。极简架构配上精心调校的训练流程,才能在 ImageNet 这样的大考中拿到高分。

L=CE(y^,  ysmooth)+λ∥θ∥22,Δ=Acctrain−Acctest\displaystyle \mathcal{L} = \mathrm{CE}\big( \hat{y},\; y_{\mathrm{smooth}} \big) + \lambda \|\theta\|_{2}^{2},\qquad\Delta = \mathrm{Acc}_{\mathrm{train}} - \mathrm{Acc}_{\mathrm{test}}
训练损失 = 平滑标签的交叉熵 + L2 权重衰减;泛化差距 Δ 越小,说明模型学到的规律越通用。
  1. 标签平滑把独热标签改造成带有小噪声的软标签,抑制过拟合
    ysmooth=(1−ε) y+εK\displaystyle y_{\mathrm{smooth}} = (1 - \varepsilon)\, y + \frac{\varepsilon}{K}
  2. 权重衰减对所有权重的平方和施加惩罚,约束参数不过大
    λ∥θ∥22(λ>0)\displaystyle \lambda \|\theta\|_{2}^{2} \quad (\lambda > 0)
  3. 泛化差距训练集与测试集精度的差值,衡量过拟合程度
    Δ=Acctrain−Acctest\displaystyle \Delta = \mathrm{Acc}_{\mathrm{train}} - \mathrm{Acc}_{\mathrm{test}}

性能表现

面馆开业三年,老王的生意额悄悄追平了隔壁米其林。数据不会说谎:ConvMixer 最激进的配置 ConvMixer-1536/20 在 ImageNet 上达到约 81.4% 的 Top-1 精度,与 ViT-B/16 基本持平;而与此同时,它的结构只有卷积,部署时无需特殊算子支持。小配置的 ConvMixer 在相同 FLOPs 预算下,也稳定优于同规模的 ResNet 系列。这就像用一把菜刀做出一桌宴席——工具看着朴素,结果却硬气。

ConvMixer 还表现出清晰的扩展规律。论文发现,模型精度与参数量在对数坐标下近似呈线性关系,即幂率定律;计算量方面,FLOPs 随深度 D 线性增长,却随宽度 C 的平方增长。原因在于每一层都要做 C 通道到 C 通道的逐点卷积,通道数翻倍,计算量翻四倍。这给实践者一个实用的取舍准则:想提精度,优先加宽度;想控预算,先砍通道数。此外,在推理吞吐量上,ConvMixer 与 ResNet 相当,虽然深度卷积的计算密度不如标准卷积,但它的实现简单、算子友好,在 CPU 和 GPU 上都能获得不错的实际速度。

老王不做花活,三年只微调了一次水面比例,口碑稳步上涨。ConvMixer 也没发明任何新算子,却凭借对“混合”二字的精准拆解,在精度、参数、速度的铁三角中取得了漂亮的平衡。少即是多——这不仅是一碗面的哲学,也是这个极简卷积架构给整个视觉领域上的一课。

Acctop-1≈α Paramsβ,FLOPs∝D⋅C2\displaystyle \mathrm{Acc}_{\mathrm{top\text{-}1}} \approx \alpha\, \mathrm{Params}^{\beta},\qquad\mathrm{FLOPs} \propto D \cdot C^{2}
精度随参数呈幂率增长,计算量随深度线性、随宽度平方增长——调参先看 C,省预算先减 D。
  1. 精度-参数幂率两边取对数后为直线,说明参数越多精度越高但边际递减
    log⁡Acc=log⁡α+βlog⁡Params,β∈(0,1)\displaystyle \log \mathrm{Acc} = \log \alpha + \beta \log \mathrm{Params},\quad \beta \in (0,1)
  2. 深度贡献线性每增加一个块,计算量增加一个固定值
    FLOPs∝D\displaystyle \mathrm{FLOPs} \propto D
  3. 宽度贡献平方通道数翻倍,逐点卷积的乘积关系使计算量翻四倍
    FLOPs∝C2\displaystyle \mathrm{FLOPs} \propto C^{2}

AI 应用场景

边缘设备上的工业质检分类

阶段:模型设计与端侧部署

解决的问题:传统质检方案要么用 ResNet 等重型网络,在嵌入式设备上推理慢、占用高;要么手写复杂专用结构,难以维护和复现。ConvMixer 只含标准卷积算子,任何平台的推理引擎都能原生支持,代码简洁到可以一个文件写完。

具体案例:某工厂需要区分 20 类零件表面缺陷。工程师用 ConvMixer 小配置(dim=128, depth=8),在 Jetson 边缘盒子上跑出 30ms 的推理延迟,精度相比此前用 MobileNet 的方案提升了 2.3 个百分点,且后续换产线调整类别时,只改动最后一行分类头即可。

Transformer 基线对照与消融实验

阶段:模型研究与论文实验

解决的问题:研究新架构时,reviewer 常质疑“复杂组件是否真的必要”。ConvMixer 提供了一个绝佳的“消融对照”:如果去掉注意力后的纯卷积模型能达到同精度,就能有力佐证“新组件贡献有限”。

具体案例:某研究团队提出一种新的 token 交互模块,实验中将注意力替换为 ConvMixer 的深度可分离卷积作为消融项,展示二者的精度差距。结果发现差距仅 0.4%,从而证明了组件冗余,也让论文结论更严谨可信。

高分辨率遥感图像的实时分类

阶段:特征提取与推理优化

解决的问题:ViT 的注意力复杂度随 token 数平方增长,高分辨率遥感图切出的 patch 数量巨大时非常吃力;ConvMixer 的深度卷积只随位置数线性增长,天然适配大图。

具体案例:某农业科技公司将航拍图切割成 512×512 的瓦片,用 ConvMixer 区分 12 类作物。相比 ViT-Small,推理吞吐量提升约 2 倍,GPU 显存占用下降约 40%,精度仅低 0.2 个百分点,在业务可接受范围内换来了显著的部署收益。

Python 演示

python78 行
import torchimport torch.nn as nnimport torch.optim as optimimport torchvisionimport torchvision.transforms as transforms  class Residual(nn.Module):    def __init__(self, fn):        super(Residual, self).__init__()        self.fn = fn     def forward(self, x):        return self.fn(x) + x  def convmixer_block(dim, kernel_size):    depthwise = Residual(nn.Sequential(        nn.Conv2d(dim, dim, kernel_size, groups=dim, padding=kernel_size // 2),        nn.GELU(),        nn.BatchNorm2d(dim),    ))    pointwise = Residual(nn.Sequential(        nn.Conv2d(dim, dim, 1),        nn.GELU(),        nn.BatchNorm2d(dim),    ))    return nn.Sequential(depthwise, pointwise)  class ConvMixer(nn.Module):    def __init__(self, dim=64, depth=4, patch_size=7,                 kernel_size=9, num_classes=10):        super(ConvMixer, self).__init__()        self.patch_embed = nn.Conv2d(3, dim, patch_size, stride=patch_size)        self.blocks = nn.Sequential(            *[convmixer_block(dim, kernel_size) for _ in range(depth)]        )        self.head = nn.Linear(dim, num_classes)     def forward(self, x):        x = self.patch_embed(x)        x = self.blocks(x)        x = x.mean(dim=(2, 3))        x = self.head(x)        return x  def train_cifar(model):    transform = transforms.Compose([        transforms.Resize(32),        transforms.ToTensor(),        transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),    ])    trainset = torchvision.datasets.CIFAR10(        root='./data', train=True, download=True, transform=transform)    loader = torch.utils.data.DataLoader(        trainset, batch_size=64, shuffle=True)    opt = optim.AdamW(model.parameters(), lr=1e-3)    loss_fn = nn.CrossEntropyLoss()    model.train()    for epoch in range(1):        total, correct = 0, 0        for xs, ys in loader:            opt.zero_grad()            out = model(xs)            loss = loss_fn(out, ys)            loss.backward()            opt.step()            total += ys.size(0)            correct += (out.argmax(1) == ys).sum().item()        print("epoch 1 acc: %.2f%%" % (100.0 * correct / total))  if __name__ == '__main__':    model = ConvMixer(dim=64, depth=4)    print(model)    train_cifar(model)
目的:从零实现 ConvMixer 并在 CIFAR-10 上完成一个 epoch 的端到端训练,演示极简架构的真实训练流程。
  1. return self.fn(x) + x残差合并:加工结果加回原始输入,给梯度留出直达深层的“高速公路”
  2. nn.Conv2d(dim, dim, kernel_size, groups=dim, padding=kernel_size // 2),深度卷积:groups 等于通道数,每个通道拥有独立卷积核,只做空间混合
  3. nn.Conv2d(dim, dim, 1),逐点卷积:1×1 卷积核负责通道混合,不改变空间尺寸
  4. self.patch_embed = nn.Conv2d(3, dim, patch_size, stride=patch_size)Patch 嵌入:核大小等于步长,一次卷积完成切块与嵌入
  5. x = x.mean(dim=(2, 3))全局平均池化:把每个通道的二维特征图压成一个标量,汇总全图信息
  6. opt = optim.AdamW(model.parameters(), lr=1e-3)AdamW 优化器:论文推荐的训练配置,配合余弦退火可稳定收敛

常见误区

误区我听说深度可分离卷积是 MobileNet 提出来的,ConvMixer 用它就是抄 MobileNet 的思路,没什么新意。

正解深度可分离卷积是 2013 年就存在的通用构建块,MobileNet 只是把它用于压缩计算量,目标是“更小更快”。ConvMixer 把同一构件用于“混合”:深度卷积用 9×9 大核负责空间混合,逐点卷积负责通道混合,且每段单独配残差。目标从“省计算”变成了“做分离式信息混合”,哲学不同,用法不同。

为何常见:MobileNet 是深度可分离卷积最出圈的推广者,初学者容易把“常见用法”误当成“发明权”,忽略同一构件在不同架构中的目的差异。

误区卷积的感受野是局部的,而注意力一次就能看全图,所以 ConvMixer 无法建模长距离依赖,上限一定低于 ViT。

正解ConvMixer 用了 9×9 大卷积核,配合 Patch Embedding 先把图缩小到 32×32 或 28×28,第一层卷积就能覆盖原图 63×63 像素;再经 D 层堆叠后等效感受野覆盖全图。实际上论文实验显示,相同的训练预算下 ConvMixer 与 ViT 精度基本持平,甚至泛化更好。

为何常见:人们习惯把“感受野大小”当作全局建模能力的唯一标尺,忽略了“多层堆叠扩大感受野”这一卷积网络的经典结论。

误区ViT 也要把图片切成 patch 再做嵌入,ConvMixer 也是这么干,所以两者在分块这一步没有区别,后续设计差异才是关键。

正解两者在“切块”这个动作上确实相似,但角色不同。对 ViT,Patch Embedding 只是预处理,真正的信息交互完全交给注意力;对 ConvMixer,Patch Embedding 是唯一的“分块”动作,后续不再有任何 token 化,空间混合完全由卷积完成。相同的起点,不同的旅程。

为何常见:只看到了接口相似(都是切 patch 映射嵌入),没有看到该组件在整体架构流水线中承担的职责差异。

误区模型组件越少,代表越“省事”,那么精度一定不如精心设计的复杂结构,用 ConvMixer 只是图省事。

正解ConvMixer 的结构简单不等于训练简单。论文用了完整的强数据增强(RandAugment、MixUp、CutMix)、AdamW + 余弦退火、标签平滑等一整套配方,任何一个环节缺失都会明显掉点。它的“极简”是组件数量少,但每个组件都被用到了极致;训练预算严格对齐时,它不输复杂模型。

为何常见:把“结构简单”与“工作简单”划等号,忽略了训练配置对最终性能的巨大影响,也忽视了论文在公平对比上的严谨设计。

误区卷积的部署生态成熟,深度可分离卷积参数又少,那么 ConvMixer 的推理速度一定远快于 ResNet 和 ViT。

正解参数量少并不直接等于速度快。深度卷积的计算密度低,在大通道数时访存开销占比高,实际吞吐量未必占优。论文实测显示,ConvMixer 的吞吐量与 ResNet 相当,但低于某些优化良好的 Transformer 实现。速度是工程问题,不能只看架构纸面上的 FLOPs。

为何常见:把“参数少”和“算得快”画等号,忽略了访存带宽、算子融合、硬件利用率等工程因素在推理中的决定作用。

面试题

Q1. ConvMixer 处理图像的第一步操作是什么?

单选题 · easy

  • A.全局平均池化
  • B.Patch嵌入分块← 正确答案
  • C.注意力打分
  • D.全连接分类

答案:B。ConvMixer 的流水线是“切块 → 混合 → 池化 → 分类”,第一步是 Patch Embedding,用带步长的卷积把图切成小块。全局池化和分类都在最后一端,注意力则根本不存在于 ConvMixer 中。

Q2. 深度卷积(Depthwise Conv)的典型特征是?

单选题 · easy

  • A.每个通道独立核← 正确答案
  • B.所有通道共享核
  • C.卷积核尺寸为一
  • D.通道间加权求和

答案:A。深度卷积中每个通道各配一个独立卷积核,只在当前通道内做空间混合,通道之间互不干扰。B 是普通卷积,C 是逐点卷积,D 是逐点卷积做的事。

Q3. 逐点卷积在数学上的本质是什么?

单选题 · mid

  • A.最大池化操作
  • B.1x1卷积求和← 正确答案
  • C.3x3空洞卷积
  • D.转置卷积操作

答案:B。逐点卷积就是 1×1 卷积,在同一空间位置上把所有输入通道加权求和生成新通道。它没有空间感受野,只负责通道混合。C 有空间视野,A 和 D 是池化与上采样的操作,都不符合。

Q4. 关于 ConvMixer 的残差连接,下列说法正确的是?

单选题 · mid

  • A.只在深度卷积前
  • B.双残差各配一路← 正确答案
  • C.完全不使用残差
  • D.末端统一加一次

答案:B。ConvMixer 块的深度卷积子块和逐点卷积子块各自带一条残差连接,每个子块都是“加工结果 + 原始输入”。这保证了梯度能顺畅回传,是模型能堆到 20 层以上的关键。

Q5. ConvMixer 实现 Patch Embedding 采用的方法是?

单选题 · mid

  • A.用全连接层实现
  • B.卷积核等于步长← 正确答案
  • C.必须加位置编码
  • D.输出保持原尺寸

答案:B。ConvMixer 用一个卷积核大小等于步长 p 的卷积完成 Patch Embedding,窗口不重叠地扫过图像,同时完成切块与线性嵌入。卷积天然保留位置关系,不需要位置编码。

Q6. 深度可分离卷积由哪两个部分构成?

多选题 · easy

  • A.深度卷积提取← 正确答案
  • B.逐点卷积融合← 正确答案
  • C.自注意力加权
  • D.全局池化替代

答案:AB。深度可分离卷积 = 深度卷积(逐通道空间混合)+ 逐点卷积(跨通道混合)。注意力与池化都不在它的构成里,C 是 Transformer 的组件,D 是汇总操作。

Q7. ConvMixer 相比 ViT 的核心区别在于?

单选题 · mid

  • A.用注意力替代卷积
  • B.卷积负责混合信息← 正确答案
  • C.完全不使用分块
  • D.去掉分类头结构

答案:B。ViT 用自注意力完成 token 间的信息交互,而 ConvMixer 完全用深度卷积与逐点卷积实现信息混合,且没有注意力与位置编码。两者都用 patch 分块,也都有分类头,C、D 错误。

Q8. 以下哪些是 ConvMixer 在 ImageNet 上取得高精度的关键因素?

多选题 · hard

  • A.大核深度卷积← 正确答案
  • B.双路残差子块← 正确答案
  • C.强数据增强← 正确答案
  • D.位置编码注入

答案:ABC。9×9 大核深度卷积提供了充足的感受野,两个子块各自的残差保证深层可训,RandAugment、MixUp、CutMix 等强增强极大抑制过拟合。ConvMixer 不使用位置编码,D 错误。

Q9. 在通道数 C 很大的情况下,深度可分离卷积参数约为标准卷积的多少?

单选题 · extreme

  • A.约核尺寸平方分之一← 正确答案
  • B.和标准卷积完全一致
  • C.约为标准卷积的两倍
  • D.与输出通道数无关

答案:A。标准卷积参数为 C²k²,深度可分离卷积为 Ck² + C²,比值 = 1/C + 1/k²。C 很大时第一项趋近 0,约为 1/k²。9×9 核时约 1/81,这正是它轻量的根源。

Q10. 关于 ConvMixer 与 ResNet 的对比,以下说法正确的是?

多选题 · mid

  • A.ResNet用标准卷积← 正确答案
  • B.ConvMixer参数更省← 正确答案
  • C.两者都不加残差
  • D.二者都用注意力

答案:AB。ResNet 使用 3×3 标准卷积同时做空间与通道混合,而 ConvMixer 拆成两步混合、参数效率更高。两者都依赖残差连接,且都不使用注意力机制,C、D 错误。