UNeXt

1.网络设计

1

分成卷积阶段、标记化MLP阶段

编码器:进行两倍的下采样(2×2的最大池化层)

解码器:进行两倍的上采样(双线性插值),使用双线性插值而不是转置卷积,因为转置卷积基本上是可学习的上采样,会增加更多可学习参数。

C为超参数,一般取C1=32、C2=64、C3=128、C4=160、C5=256(C的取值比UNet小,减少了参数和计算)

注:充分考虑了模型维度对参数量和计算量的影响,采用了更少的参数设计

卷积阶段:每个卷积块配备了一个卷积层、一个批量归一化层和ReLU激活函数,使用3×3的卷积核大小,步幅为1,填充为1,用于保持特征图的空间分辨率不变,同时允许网络学习提取不同位置的特征信息。

Tokenized MLP Stage:

2

Conv:kernel_size=3,stride=2,padding=1,同时输出通道数(E)大于输入通道数(E为超参数,token数量),把特征图大小缩小了一半,增加了通道数

Shifted MLP:让模型更加关注 local 的信息

3

先使用0填充特征图,填充过后在通道维度做切割,再做平移操作,然后将各个切片合并在一起,最后提取特征图中间部分

1
2
3
4
5
6
7
8
9
10
11
12
xn = x.transpose(1, 2).view(B, C, H, W).contiguous()
xn = F.pad(xn, (self.pad, self.pad, self.pad, self.pad) , "constant", 0)
xs = torch.chunk(xn, self.shift_size, 1)
x_shift = [torch.roll(x_c, shift, 3) for x_c, shift in zip(xs, range(-self.pad, self.pad+1))]
x_cat = torch.cat(x_shift, 1)
x_cat = torch.narrow(x_cat, 2, self.pad, H)
x_s = torch.narrow(x_cat, 3, self.pad, W)
x_s = x_s.reshape(B,C,H*W).contiguous()
x_shift_c = x_s.transpose(1,2)
x = self.fc2(x_shift_c)
x = self.drop(x)
return x

DWConv:编码MLP特征的位置信息、减少运算量的作用

2.实验结果及消融实验

4

5