【问题标题】:Append feature maps to intermediate layers of network in PyTorch在 PyTorch 中将特征映射附加到网络的中间层
【发布时间】:2020-04-09 06:52:23
【问题描述】:

我有如下所示的 PyTorch 网络架构。它接受大小为 16x8x2048 的输入,并给出大小为 256x128x3 的输出。我有一个特征图,我想在下面架构中的每个上采样层之后沿着通道维度附加。在附加之前,我会将特征图缩放到适当的分辨率。如何将这些特征图附加到网络的中间层?

model = []
model += [Conv2dBlock(2048, 256, 3, 1, 1, norm='bn', activation=activ, pad_type=pad_type)]
model +=  [nn.Upsample(scale_factor=2, mode='bilinear')] 
model +=  [Conv2dBlock(256, 128, 3, 1, 1, norm='bn', activation=activ, pad_type=pad_type)]
model +=  [nn.Upsample(scale_factor=2, mode='bilinear')]
model +=  [Conv2dBlock(128, 64, 3, 1, 1, norm='bn', activation=activ, pad_type=pad_type)]                        
model +=  [nn.Upsample(scale_factor=2, mode='bilinear')] 
model +=  [Conv2dBlock(64, 32, 3, 1, 1, norm='bn', activation=activ, pad_type=pad_type)]
model +=  [nn.Upsample(scale_factor=2, mode='bilinear')] 
model +=  [Conv2dBlock(32, 32, 3, 1, 1, norm='bn', activation=activ, pad_type=pad_type)]                        
model += [Conv2dBlock(32, 3, 3, 1, 1, norm='none', activation=activ, pad_type=pad_type)]                        
model = nn.Sequential(*model)

【问题讨论】:

  • 像这样定义模型并不是很好的做法,主要是因为您无法像现在想要的那样定义动态输入行为。您必须定义一个实际的 nn.Module 类网络,然后以您想要的方式编写前向函数:您在每个上采样的输出上调用 torch.cat 以添加额外的特征图。查看如何定义跳过连接。
  • 谢谢!这种方法奏效了。

标签: python computer-vision pytorch conv-neural-network


【解决方案1】:

因此,正如https://stackoverflow.com/users/10229754/mercury 所指出的那样,解决方案只是改变了网络的编写方式。以下更改显示了一种可以编写网络的方式,以便可以附加额外的输入。在forward()函数中,输入可以直接使用torch.cat()追加-

conv1 = Conv2dBlock(2063, 256, 3, 1, 1, norm='bn', activation=activ, pad_type=pad_type)
up1 = nn.Upsample(scale_factor=2, mode='bilinear')
conv2 = Conv2dBlock(256, 128, 3, 1, 1, norm='bn', activation=activ, pad_type=pad_type)
up2 = nn.Upsample(scale_factor=2, mode='bilinear')
conv3 = Conv2dBlock(128, 64, 3, 1, 1, norm='bn', activation=activ, pad_type=pad_type)
up3 = nn.Upsample(scale_factor=2, mode='bilinear')
conv4 = Conv2dBlock(64, 32, 3, 1, 1, norm='bn', activation=activ, pad_type=pad_type)
up4 = nn.Upsample(scale_factor=2, mode='bilinear')
conv5 = Conv2dBlock(32, 32, 3, 1, 1, norm='bn', activation=activ, pad_type=pad_type)
conv6 = Conv2dBlock(32, 3, 3, 1, 1, norm='none', activation=activ, pad_type=pad_type)

【讨论】:

    猜你喜欢
    • 2019-06-28
    • 2023-02-07
    • 1970-01-01
    • 2019-07-21
    • 2020-03-15
    • 2020-03-24
    • 1970-01-01
    • 2021-12-30
    • 2019-06-01
    相关资源
    最近更新 更多