Как я могу указать входной размер сглаженного слоя после многих свернутых слоев в PyTorch?

1

Вот моя проблема, я делаю небольшой тест в наборе данных 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
Теги:
python-3.x
pytorch

3 ответа

2
Лучший ответ

В 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
    @gaoquanliang ты не можешь сделать это. Это означает, что «я хочу изменить график для каждой итерации», в этом случае модель не может выучить ничего. Нет такого варианта в любой структуре. Насколько мне известно
  • 0
    Другими словами, можете ли вы рассказать мне о том, как получить размер ввода fc1 16 * 5 * 5?
Показать ещё 1 комментарий
0

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню