将 ViT 的第一个卷积层转为 MatMul,要求步长和卷积核相等
ViT 卷积层
为了将输入的图片转为 patch,然后送入到 Transformer 中,ViT 第一个卷积的步长和卷积核大小是相等的,都是 16。如下图所示,
某些框架可能不支持这么大的 Conv 步长,导致无法转换相应模型。
MatMul
卷积可以使用 im2col
加 matmul
来实现,但是由于 im2col
可能效率不高,所以一般不使用这个方式。
不过我们注意到 ViT 第一个卷积层里的步长和卷积核大小是相等的,所以我们可以用 reshape + transpose 来实现 im2col。代码如下:
1 |
|
测试结果如下,对比了使用 conv2d_to_matmul
和 F.conv2d
的结果,误差在 1e-4 左右,还能接受。(实际上不应该有误差,因为数学上是等价的)
1 |
|
将 ViT 的第一个卷积层转为 MatMul,要求步长和卷积核相等
http://hebangwen.github.io/2024/11/20/convert-first-conv-in-vit/