Как выбрать параметры для nn. Linear слоя во время обучения CNN? - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь обучить CNN классифицировать изображения из данных Fashion-MNIST, используя слои Conv2d, Maxpool и Linear.Я сталкивался с кодом, как упомянуто ниже, с in_features = 12*4*4 в nn.Linear слое.

Могу ли я получить помощь о том, как выбрать параметр in_features для nn.Linear слоя?

class Network(nn.Module):
    def __init__(self):
        super(Network, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5)
        self.conv2 = nn.Conv2d(in_channels=6, out_channels=12, kernel_size=5)

        self.fc1 = nn.Linear(in_features=12*4*4, out_features=120)
        self.fc2 = nn.Linear(in_features=120, out_features=60)
        self.out = nn.Linear(in_features=60, out_features=10)

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Каждый пример в наборе данных Fashion-MNIST представляет собой 28 x 28 изображение в градациях серого.

  1. Ввод 28 x 28
  2. Мы делаем 5 x 5 свертку без заполнения (так какdefault padding=0) и stride=1(by default), поэтому мы теряем 2 пикселей с каждой стороны, опускаемся до 24 x 24, т. Е. (28-5) / 1 + 1
  3. Затем выполняем операцию maxpoolingс восприимчивым полем 2 x 2, мы сокращаем каждое измерение вдвое, до 12 x 12
  4. Мы снова делаем еще одну 5 x 5 свертку без padding и stride=1, мы опускаемся до 8 x 8, т. е. (12-5) / 1 + 1
  5. Затем мы выполняем еще одну операцию maxpooling, мы опускаемся до 4 x 4

Вот почему self.fc1 = nn.Linear(in_features=12*4*4, out_features=120).Это в основном n_features_conv * height * width, где высота и ширина 4 соответственно и n_features_conv такие же, как out_channels слоя conv2D, расположенного чуть выше него.

Обратите внимание, что если вы измените размер входного изображения, вам придется выполнить вышеуказанные вычисления и соответствующим образом настроить первый слой Linear.

Надеюсь, это поможет вам!

0 голосов
/ 19 июня 2019

Если в конце у CNN есть слои fc, сначала вы должны выбрать размер ввода.Далее у вас есть три варианта:

  1. Сделайте математику самостоятельно.Вычислите, как изменяются размеры тензора при прохождении через разные слои, объединяющие слои.

  2. Просто введите случайный тензор размера, который вы зафиксировали в начальных слоях.Затем посмотрите размер вывода (tensor.size()).В приведенном вами примере это будет (torch.Size([12, 4, 4])).

  3. Используйте что-то вроде tsalib для обработки изменения размера за кулисами.

Я лично предпочитаю метод 2, потому что он быстрый, точный и не требует каких-либо сторонних библиотек.

...