Рассчитать форму в полностью связанном слое после cnn - PullRequest
0 голосов
/ 12 ноября 2019

Я пытаюсь выучить PyTorch. Но я действительно растерялся из-за формы в полностью связанном слое после свертки и максимального объединения.

Случай 1. Как мы вычисляем число 5408 в nn.Linear Я думаю, 5408 = 32 *m * m, где 32 взято из nn.Conv2d(3, **32**, kernel_size=7, stride=2), но тогда m будет равно 13. Однако откуда взято 13?

simple_model = nn.Sequential(
                nn.Conv2d(3, 32, kernel_size=7, stride=2),
                nn.ReLU(inplace=True),
                Flatten(), # see above for explanation
                nn.Linear(5408, 10), # affine layer
              )

Случай 2 Как мы получаемчисло 4 * 4 в fc = nn.Linear(64*4*4, 10), та же проблема, что и в случае 1. Я не знаю, откуда исходит число 4 ...

# (conv -> batchnorm -> relu -> maxpool) * 3 -> fc

layer1 = nn.Sequential(
    nn.Conv2d(3, 16, kernel_size = 5, padding = 2),
    nn.BatchNorm2d(16),
    nn.ReLU(),
    nn.MaxPool2d(2)
)
layer2 = nn.Sequential(
    nn.Conv2d(16, 32, kernel_size = 3, padding = 1),
    nn.BatchNorm2d(32),
    nn.ReLU(),
    nn.MaxPool2d(2)  
)
layer3 = nn.Sequential(
    nn.Conv2d(32, 64, kernel_size = 3, padding = 1),
    nn.BatchNorm2d(64),
    nn.ReLU(),
    nn.MaxPool2d(2)  
)
fc = nn.Linear(64*4*4, 10)

1 Ответ

2 голосов
/ 12 ноября 2019

Вот хороший учебник (в частности, краткое изложение) для расчета таких вещей: http://cs231n.github.io/convolutional-networks/

Calculations for Height and Width after applying a convolution

Где

  • W = ширина ввода
  • Fw = ширина поля восприятия (ядра)
  • P = заполнение
  • Sw = шаг по ширине

Вы не упомянули свои ширину / высоту ввода, но я предполагаю, что они 28x28 MNIST изображений.

В этом случае у нас есть:

  • W = 28
  • Fw = 7
  • P = 2
  • Sw = 2

Включение этих чисел в приведенное вышеуравнение даст вам 13.5, что неудобно, потому что это не целое число. В случае с PyTorch кажется, что он округляется до до 13. (На самом деле довольно трудно найти документацию по этому факту, кроме этого сообщения на форуме)

Редактировать: Фактическая реализация cuDNN находится здесь: https://github.com/pytorch/pytorch/blob/fdab1cf0d485820907d7541266d69b70e1d3d16b/aten/src/ATen/native/cudnn/Conv.cpp#L157-L158

Для вашего второго случая, кажется, что ваши входные данные не 28x28 и должны быть 32x32. Свертки не уменьшают высоту и ширину (вы можете вставить цифры в себя и проверить). Однако слой MaxPool2d(2) уменьшает высоту и ширину вдвое после каждой свертки. Итак, вы идете из:

32x32 -> 16x16 -> 8x8 -> 4x4

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