论文地址:Patches Are All You Need?
作者在最近的研究中发现很多关于transformer的结构,发现transformer 中的结构效果非常的好,特别是vision-transformer 表现的异常的优秀,然而,由于transformer中自注意了层的平方运算导致计算量大,所以VIT提出了patch-embedding的方式,将一个图片打散成一个个块后组合成一个组。作者就开始怀疑,引起VIT模型好的到底是transformer结构还是patch-embedding。作者就对此进行研究,用一堆纯的卷积网络进行构建patch-embedding 操作,看看纯用卷积操作是否也行,或者比VIT更好,这样就形成了ConvMixer这篇论文。
我们仅仅只用了标准的卷积神经网络就能独立的在空间融合(depthwise-convolution)和通道融合(pointwise-convolution),并且用卷积实现了patch-embeding 我们把这种网络叫做ConvMixer;受到了ViTs和MLP-mixers的启发,我们也因为用到了较大的卷积核得到了较大的性能提升。但是我们的模型和实验在设计的时候既没有最大化精度也没有得到好的速度,并且也没有得到好的超参数,但我们发现ConvMixers性能上优于VIT和MLP-Mixer,并且能和resnets,deits,resmlps等模型竞争;我们证明了通过简单的patch-embedding组成的“各向同性”结构会成为未来的深度学习的模板。patch-embedding允许一次性进行下采样,这样可以减少内部分辨率和有效增加感受野、从而能够更容易的混合远距离的空间信息。反正,tokenizing 输入和patch embedding 是一种非常有效和重要的方法。
对于普通的卷积神经网络来说,我们是通过卷积核将输入的所有通道进行融合计算,如下图所示:
groups = 1
normal_conv = nn.Conv2d(in_channels=3,out_channels=1,kernel_size=5,groups=1)
对于depthwise-convolution来说,主要是每一个通道channel单独进行计算,互补干涉
groups = in_channel = 3
depthwise_conv = nn.Conv2d(in_channels=3,out_channels=3,kernel_size=5,groups=3)
不做空间计算,所以卷积核的大小为1x1,这样就可以就所有通道进行融合计算;这个好早就有了,感觉为了新颖换成了pointwise名字,噱头啊!
用 1 x 1 卷积核
pointwise_conv = nn.Conv2d(in_channels=3, out_channels=1, kernel_size=1)
patch-embedding:
GELU:
一个纯卷积的patch-embedding网络,思路很优秀,通过depthwise-convolution和pointwise-convolution来减少模型的参数