Как я могу указать входной размер сглаженного слоя после многих свернутых слоев в PyTorch? - PullRequest
0 голосов
/ 24 сентября 2018

Вот моя проблема, я делаю небольшой тест на наборе данных CIFAR10, как я могу указать входной размер сглаженного слоя в PyTorch?как и в следующем примере, размер ввода равен 16 * 5 * 5, однако я не знаю, как рассчитать это, и я хочу получить размер ввода с помощью некоторой функции. Может кто-то просто написать простую функцию в этом классе Net и решить эту проблему??

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3,6,5)  
        self.conv2 = nn.Conv2d(6,16,5)

        # HERE , the input size is 16*5*5, but I don't know how to get it.
        self.fc1 = nn.Linear(16*5*5, 120)
        self.fc2 = nn.Linear(120,84)
        self.fc3 = nn.Linear(84,10)

    def forward(self, x):
        x = F.max_pool2d(F.relu(self.conv1(x)),(2,2))
        x = F.max_pool2d(F.relu(self.conv2(x)),2)
        x = x.view(x.size()[0],-1)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

По умолчанию в Pytorch нет Flatten Layer.Вы можете создать класс, как показано ниже.Ура

class Flatten(nn.Module):
    def forward(self, input):
        return input.view(input.size(0), -1)


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.flatten   = Flatten()  ## describing the layer
        self.conv1 = nn.Conv2d(3,6,5)  
        self.conv2 = nn.Conv2d(6,16,5)

        # HERE , the input size is 16*5*5, but I don't know how to get it.
        self.fc1 = nn.Linear(16*5*5, 120)
        self.fc2 = nn.Linear(120,84)
        self.fc3 = nn.Linear(84,10)

    def forward(self, x):
        x = F.max_pool2d(F.relu(self.conv1(x)),(2,2))
        x = F.max_pool2d(F.relu(self.conv2(x)),2)
        #x = x.view(x.size()[0],-1)
        x = self.flatten(x)   ### using of flatten layer
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x
0 голосов
/ 29 января 2019

Полагаю, это немного кода из учебника по Pytorch, верно?У меня та же проблема, и Дженс Петерсен прав: размер ввода полностью подключенного (FC) слоя зависит от размера ввода и операций, которые вы выполняли над ним до слоя FC.В вашем случае вы забыли учесть шаги max-pooling.Поскольку эта сеть построена так, чтобы принимать входы 32x32, первый конвульсионный уровень выдает 6 * (32-3) * (32-3), что дает нам после максимального объединения 6 * floor (29/2) * floor (29/2) =6 * 14 * 14. И после второго конво-слоя + макс пулинга у нас получится размер 16 * 5 * 5.

0 голосов
/ 24 сентября 2018

Размер ввода для первого слоя FC зависит от размера вашего ввода.Документация сообщает вам, какой будет выходной размер слоя Conv2d для данного ввода, поэтому вам просто нужно перевести эту формулу в функцию.В вашем случае, если ваше входное изображение имеет размер m на n, требуемый размер ввода будет 16 * (m-8) * (n-8).

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