Создание стека сверточных слоев с использованием для l oop в прямой функции класса pytoch для Остаточного блока - PullRequest
0 голосов
/ 12 апреля 2020

Я определяю остаточный блок в pytorch для Re sNet, в котором вы можете указать, сколько сверточных слоев вы хотите иметь, а не обязательно два. Это делается с помощью параметра с именем n c (количество Convs). Первый уровень получает ni как количество входных nf количество фильтров. Но со второго слоя я положил их на 1 oop. Вот мой код:

class ResBlock(nn.Module):
    def __init__(self, ni, nf,nc=2):
        super().__init__()
        self.conv1 = nn.Conv2d(ni,nf, kernel_size=3, stride=2, padding=0)
        self.conv2 = nn.Conv2d(nf,nf, kernel_size=3, stride=1, padding=0)
        self.conv1x1 = nn.Conv2d(ni, nf, kernel_size=1, stride=1, padding=0)
        self.nc = nc    
    def forward(self, x): 
        y = self.conv1(x)
        for i in range(self.nc-1):
            y = self.conv2(y)
            print(torch.mean(y))            
        return self.conv1x1(x) + y

Но независимо от того, какое значение я даю n c, он всегда возвращает 2 конв с размером ядра 3. Я не уверен, что для l oop действительно может эта работа в pytorch, но она работала, когда я использовал функциональный API в Keras. Может ли кто-нибудь помочь мне понять, что происходит?

1 Ответ

1 голос
/ 12 апреля 2020

Да, печать объекта nn.Module часто вводит в заблуждение. При печати вы получаете:

# for ni=3, nf=16
ResBlock(
  (conv1): Conv2d(3, 16, kernel_size=(3, 3), stride=(2, 2))
  (conv2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1))
  (conv1x1): Conv2d(3, 16, kernel_size=(1, 1), stride=(1, 1))
)

, потому что это только 3 Module s, которые вы зарегистрировали в __init__ из ResBlock.

Фактический форвард может ( и в вашем случае будет) делать что-то совершенно другое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...