主要工作
- 结构上的设计
- 使用卷积tokenizer来从图像中提取token特征,空间下采样1/4
- tokenization后使用一个纯卷积结构再下采样1/2
- 替换空间mlp为通道mlp和空间卷积的组合,这可以打破对于输入维度的限定(卷积的优势)
- 引入多尺度结构,使用跨步卷积实现下采样
- 卷积的引入了补充了空间上的交互
整体结构具有更少的参数量(这主要还是因为以上卷积策略的应用)
关键图示
核心代码
class ConvMLPStage(Module):
def __init__(self,
embedding_dim,
dim_feedforward=2048,
stochastic_depth_rate=0.1):
super(ConvMLPStage, self).__init__()
self.norm1 = LayerNorm(embedding_dim)
self.channel_mlp1 = Mlp(embedding_dim_in=embedding_dim, hidden_dim=dim_feedforward)
self.norm2 = LayerNorm(embedding_dim)
self.connect = Conv2d(embedding_dim,
embedding_dim,
kernel_size=(3, 3),
stride=(1, 1),
padding=(1, 1),
groups=embedding_dim,
bias=False)
self.connect_norm = LayerNorm(embedding_dim)
self.channel_mlp2 = Mlp(embedding_dim_in=embedding_dim, hidden_dim=dim_feedforward)
self.drop_path = DropPath(stochastic_depth_rate) if stochastic_depth_rate > 0 else Identity()
def forward(self, src):
src = src + self.drop_path(self.channel_mlp1(self.norm1(src)))
src = self.connect(self.connect_norm(src).permute(0, 3, 1, 2)).permute(0, 2, 3, 1)
src = src + self.drop_path(self.channel_mlp2(self.norm2(src)))
return src
链接