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

Давайте начнем.

Вопрос 1. Рассчитайте форму и количество параметров модели CNN.

Предполагается, что вы знакомы с архитектурой CNN. Модель CNN с пятью сверточными слоями, включая объединяющий слой, три полносвязных слоя и 1000 выходных классификаций, показана на рисунке ниже.

Пожалуйста, напомните, что:

Нам нужно рассчитать форму модели CNN для пространственного измерения уровня полного соединения 1, и нам *не нужно вычислять* количество параметров модели для построения модели CNN, но это необходимо *знать* количество параметров в сверточном слое.

Аргументы в модели CNN:

Предположим, что сверточный слой в функции __init__ использует следующий формат:

self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)
self.pool = nn.MaxPool2d(kernel_size,stride)
self.fc = nn.Linear(in_features, out_features)

Аргументы, которые будут использоваться:

  • in_channels - Количество входов (углубленных), 3 для изображения RGB, например.
  • out_channels — количество выходных каналов, т. е. количество отфильтрованных «изображений», из которых состоит сверточный слой, или количество уникальных сверточных ядер, которые будут применяться к входным данным.
  • kernel_size — число, указывающее как высоту, так и ширину (квадратного) ядра свертки и ядра пула.
  • in_features- Размер каждой входной выборки
  • out_features- Размер каждого выходного образца

Будут предоставлены все аргументы (это ваше решение), кроме in_features из полносвязного слоя 1, который является целью расчета формы модели.

Теперь давайте проверим данную модель CNN. Он содержит слои свертки, слой пакетной нормализации, функции активации, объединяющие слои и полносвязные слои.

Вычисление формы сверточного слоя

Когда мы говорим о форме сверточного слоя, мы имеем в виду пространственное измерение и глубину слоя.

Пространственные размеры(x,y) сверточного слоя можно рассчитать следующим образом: (W_in−F+2P)/S+1 .

Глубина сверточного слоя всегда будет равна количеству фильтров K.

  • K - количество фильтров в сверточном слое
  • F - высота и ширина сверточных фильтров
  • S - шаг свертки
  • P - отступ
  • W_in - ширина/высота (квадрат) предыдущего слоя

Пока:

  • K = out_channels
  • F = kernel_size
  • S = stride
  • W_in — это первое и второе значение кортежа input_shape (например, 224*224, W_in=224).

Аргументы, заданные кодами:

input_shape кортеж: 224*224*3(RGB)

out_channels из conv1, 2, 3: 32, 64, 128

kernel_size =F : 3x3,

padding=1 для трех слоев свертки

stride в конв1,2,3=1

stride в макспуле=2

Рассчитаем:

Вход Conv1: W_in = 224, F = 3, P = 1, S = 1, in_channels = 3, out_channels = 32

Вывод Conv1: размер (x,y) вывода из conv1: (224–3+2x1)/1+1 = 224, depth_1=out_channels=32.

Вход уровня 1 пула: W_in=224, kernel_size=2, шаг=2

Вывод уровня 1 пула:
Размер x-y вывода после максимального уровня пула: 224/2(kernel_size)=112

Вход Conv2: W_in=112, kernel_size=3, in_channels=32, out_channels=64

Вывод Conv2: размер x-y вывода из conv2: (112–3+2x1)/1+1= 112, depth_2=64

Ввод уровня 2 пула: W_in=112, kernel_size=2, шаг=2

Выход уровня 2 пула: 112/2=56

Вход Conv3: W_in=56, kernel_size=3,in_channels=64, out_channels=128

Вывод Conv3: Размер x-y вывода из conv3: (56–3+2x1)/1+1=56, depth3=128

Вход уровня 3 пула: W_in=56, kernel_size=2, шаг=2

Выход уровня 3 объединения: 56/2=28

Выходной размер слоя пула 3: 28*28*128=100352 будет входным для полностью подключенного слоя.

FC1: размер становится 100352*1, вывод 2500*1

FC2: размер от 2500*1 до 500*1

FC3: размер от 500*1 до 133*1

Теперь мы видим, как приходит 128*28*28. Теоретически, как только мы получаем форму, проектирование модели закончено, но нам лучше знать, сколько параметров у этой модели, для более четкого понимания процесса.

Рассчитать количество параметров в сверточном слое

Количество параметров в сверточном слое зависит от предоставленных значений filters/out_channels, kernel_size и input_shape.

  • D_in - глубина предыдущего слоя
  • F - высота и ширина сверточных фильтров
  • K - количество фильтров в сверточном слое

Пока:

K = out_channels

F = kernel_size

D_in — это последнее значение в кортеже input_shape, обычно это 1 или 3 (RGB и оттенки серого соответственно).

Процесс расчета как:

  • Каждый фильтр имеет F*F*D_in веса
  • Сверточный слой состоит из K фильтров.
  • Общее количество весов в сверточном слое равно K*F*F*D_in.
  • На фильтр приходится один член смещения, сверточный слой имеет K смещения.
  • Количество параметров в сверточном слое составляет K*F*F*D_in + K

Для каждого слоя:

Входной слой: все, что делает входной слой, — это считывает входное изображение, поэтому здесь нет параметров, которые вы могли бы изучить.

Слой пула: на этом уровне нет необходимости изучать параметры.

Сверточные слои:

conv1: каждый фильтр имеет 3*3*3 веса, слой состоит из 32 фильтров, количество весов в этом слое 3*3*3*32, плюс 32 смещения, количество параметров в этом слое 3*3*3*32+32=896

conv2: k=64, F=3,D_in=32, количество параметров= 64*3*3*32+64=18496

conv3: k=128, F=3,D_in=64, количество параметров=128*3*3*64+128=73856

FC1: в полностью подключенном слое все входные единицы имеют отдельный вес для каждой выходной единицы. Для 100352 входов и 2500 выходов количество весов равно 100352*2500=250880000. Кроме того, слой имеет смещение для каждого выходного узла, поэтому имеется (100352+1)*2500=250882500 параметров.

FC2: (2500+1)*500=1250500

FC3: (500+1)*133=66633

Теперь мы видим, сколько параметров будет смоделировано.

Дополнительная информация:

  • Добавление слоя BatchNorm2d помогает повысить точность теста за счет минимизации внутреннего ковариатного сдвига.
  • Отбросьте наборы как 0,2, чтобы устранить эффект переобучения.

Я знаю, что процесс довольно долгий и может быть скучным :-), но он базовый, и если однажды понять кейс, это будет очень полезно для понимания подобных кейсов.

Вопрос 2. Проверьте формулу пространственного измерения (W_in−F+2P)/S+1 самостоятельно

Как проверить формулу пространственного измерения? Вы можете обратиться к ссылке на курс CS231n, чтобы проверить теорию. Но мне пример поможет крепко запомнить.

случай 1: заполнение = 0, шаг = 0, ввод: 6x6, фильтр: 3x3, как насчет размера вывода (x, y)? (6–3)/1+1=4

случай 2: заполнение = 1, шаг = 0, ввод: 6x6, фильтр: 3x3, как насчет размера вывода (x, y)? (6–3+2)/1+1=6

Каковы ваши ответы без формулы? И соответствует ли ваш ответ результату формулы (W_in-F+2p)/S+1?

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

Вопрос 3. Некоторые неявные сведения и правила преобразования изображений

Некоторые неявные знания, которые лучше знать:

Детектору OpenCV требуется, чтобы входное изображение было в оттенках серого, но размер не требовался.

VGG16, VGG19 и ResNet принимают размер изображения 224x224, а Inception V3 и Xception принимают размер изображения 299x299.

Сотрите CNN, используя изображения из ImageNet: на самом деле, вы можете выбрать свой собственный размер изображения, отличный от VGG16: 240 x 240 или 256 x 256, но вы должны зафиксировать размер, так как размер изображения из ImageNet разнообразен.

Наборы данных изображений

CIFAR-10: содержит 10 изображений классов с фиксированным размером: 32x32x3, всего 60000 изображений, каждый класс включает 6000. Десять классов: самолет, автомобиль, птица, кошка, олень, собака, лягушка, лошадь, корабль и грузовик.

MNIST: содержит 60 000 изображений в градациях серого размером 28×28 пикселей, состоящих из рукописных одиночных цифр от 0 до 9.

ImageNet: изображения в ImageNet имеют различные размеры, такие как 224×224, 227×227, 256×256, 299×299 и т. д.

Некоторые правила:

Я не нахожу точных правил предобработки изображений, только какие-то правила разбросаны. Добро пожаловать, чтобы поделиться, если у вас есть. Нижеприведенные правила, которые я ищу в этой ветке StackOverflow, очень помогают:

  1. «Случайное увеличение данных разрешено только в обучающем наборе, вы можете применять увеличение данных к проверочным и тестовым наборам при условии, что ни одно из дополнений не является случайным».
  2. «Когда вы используете нормализацию на проверочном и тестовом наборах, вы ДОЛЖНЫ использовать те же самые факторы, которые вы использовали для обучающего набора».
  3. «Необходимость изменить размер, а затем центрировать обрезку связана с тем, что набор val должен исходить из того же домена, что и набор поездов, поэтому, если размер первого был изменен случайным образом и обрезан до 224, набор val должен детерминистически изменить размер и обрезать». .

В сегодняшней истории я сосредоточусь на обсуждении расчета формы и количества параметров простой модели CNN, а также включу некоторые другие проблемы.

Спасибо за ваше чтение.

Использованная литература:

  1. https://pytorch.org/docs/stable
  2. Наноградусы глубокого обучения Udacity
  3. https://cs231n.github.io/convolutional-networks