PyTorch RuntimeError Неверный аргумент 2 размера - PullRequest
0 голосов
/ 11 октября 2018

Я экспериментирую с нейронной сетью (PyTorch) и получаю эту ошибку.

RuntimeError: неверный аргумент 2: размер '[32 x 9216]' недопустим для ввода с 8192 элементами в/pytorch/aten/src/TH/THStorage.cpp:84

Моя задача заключается в классификации изображений с AlexNet, и я отследил ошибку, чтобы быть размером изображений, передаваемых в нейронную сеть.Мой вопрос, учитывая сетевую архитектуру с ее параметрами, как определить правильный размер изображения, требуемый сетью?

В соответствии с моим кодом, приведенным ниже, я сначала преобразовываю обучающие изображения перед подачей в нейронную сеть.Но я заметил, что нейронная сеть может принимать только размер 224 и, иначе, выдает ошибку выше.Например, мой инстинкт должен был применить transforms.RandomResizedCrop размера 64, но, очевидно, это неправильно.Есть ли формула для определения необходимого размера?

Код

# transformation to be done on images
transform_train = transforms.Compose([
    transforms.RandomResizedCrop(64),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

class AlexNet(nn.Module):

    def __init__(self, num_classes=1000):
        super(AlexNet, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.Conv2d(64, 192, kernel_size=5, padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.Conv2d(192, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(384, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
        )
        self.classifier = nn.Sequential(
            nn.Dropout(),
            nn.Linear(256 * 6 * 6, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Linear(4096, num_classes),
        )

    def forward(self, x):
        x = self.features(x)
        x = x.view(x.size(0), 256 * 6 * 6)
        x = self.classifier(x)
        return x

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Фактическая формула для расчета выходной формы после слоя свертки:

out_size= floor((in_size + 2p -f)/s + 1)

0 голосов
/ 12 октября 2018

Я выяснил алгоритм получения правильного размера ввода.

Out = float(((W−F+2P)/S)+1)

, где

  • Out = Форма вывода
  • W = Размер изображения(размер изображения)
  • F = Поле восприятия (размер фильтра)
  • P = Заполнение
  • S = Шаг

Факторинг в данной сетигиперпараметры,

Требуемый размер изображения, который мне нужен, будет

W = (55 - 1) * 4 - 2(2) + 11
  =  223
  ⩰  224
...