Добавить карту объектов в промежуточные слои сети в PyTorch - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть следующая сетевая архитектура 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)

1 Ответ

0 голосов
/ 09 апреля 2020

Таким образом, решение было просто изменить способ записи сети, как указано { ссылка }. Следующее изменение показывает, как можно записать сеть, чтобы можно было добавить дополнительный ввод. В функции 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)
...