def forward(self, x):
size = x.size(-2) // self.reduction, x.size(-1) // self.reduction
x = self.backbone.conv1(x)
x = self.backbone.bn1(x)
x = self.backbone.relu(x)
x = self.backbone.maxpool(x)
x = self.backbone.layer1(x)
x = layer2 = self.backbone.layer2(x)
x = layer3 = self.backbone.layer3(x)
x = layer4 = self.backbone.layer4(x)
x = torch.cat([
F.interpolate(f, size=size, mode='bilinear', align_corners=True)
for f in [layer2, layer3, layer4]
], dim=1)
return x
(1)layer2
、layer3
和 layer4
可以被视为中间变量,但它们与 x
共享相同的数据,因此它们更像是 x
在网络中的不同阶段的别名
(2)上采样 & 下采样
上采样【空间维度放大】:
- 特征图放大:在卷积神经网络(CNN)中,为了将深层的特征图与浅层的特征图进行融合,需要将深层的特征图放大到与浅层特征图相同的尺寸。
- 图像分辨率增强:在图像超分辨率任务中,上采样用于将低分辨率的图像放大到更高的分辨率。
- 插值 通常 上采样
下采样【空间维度缩小】:
- 特征图降维:在CNN中,为了减少计算量和提取更抽象的特征,通常会在网络中使用池化层进行下采样。
- 图像分辨率降低:在某些图像处理任务中,可能需要将高分辨率的图像降低到更低的分辨率
- 池化一般与下采样
(3)
使用 F.interpolate
函数,并且指定了 mode='bilinear'
,这通常用于上采样。这是因为 layer2
、layer3
和 layer4
可能来自不同层级的卷积层,它们的尺寸可能不同。为了将它们沿着 dim=1
维度(通道维度)拼接起来,需要先将它们的大小调整到一致,这通常意味着将较小的特征图放大到较大的特征图的大小,因此是上采样
💡