Застрял в расчетах размеров матрицы для CNN - PullRequest
0 голосов
/ 12 января 2020

В моей архитектуре CNN для бинарной классификации у меня есть 2 сверточных уровня, 2 максимальных пула, 2 операции пакетной нормализации, 1 RELu и 1 полностью связанный слой.

Case1 : При количестве каналов d=1: на первом слое входной канал размером [28*28*d], d=1 свернут с количеством M_1=20 фильтров, примененных ко всем входным каналам размером (f_h x f_w x d) = [3x 3x1], имеющим размер шага (шаг) как 1, который создает карту объектов размером {(h-f_h+1) x (w - f_w +1)x d x M_1} = (28-3 +1)x(28-3+1)x1x 20 = [25x 25x 20].

Второй сверточный слой содержит в два раза больше фильтров = 40 одинакового размера [3x 3 x 1]. Таким образом, число параметров становится [23 * 23 * 1 * 40] в качестве вывода из второго сверточного слоя. Таким образом, общее количество параметров = [25x 25x 20]+ [23 * 23 * 40]

Случай 2 : Когда d=2 и все другие размеры одинаковы. Размер фильтра становится [3 x 3 x 2]. Выход первого сверточного слоя будет содержать: (28-3 +1)x(28-3+1)x2 x20 = [25x 25x 40].

Для второго сверточного слоя выходные данные будут содержать [23 x 23 x 2 x 40] параметров.

Вопрос) Верны ли мои вычисления для каждого приведенного выше случая? Что будет входом для полностью связанного слоя?

Ответы [ 2 ]

0 голосов
/ 12 января 2020

Есть пара ошибок. Первый является тривиальным и имеет размер выходного сигнала первого слоя, так как он должен быть 26x26x20, а не 25x25x20, потому что размер ядра 3 без отступов приведет к потере всего лишь пикселя с каждого края .

Более важная проблема в ваших рассуждениях возникает при расчете количества параметров второго сверточного слоя. Обычная обычная свертка требует, чтобы вы также учитывали глубину: предположим, у вас есть сверточный слой с m выходными картами объектов f_1,...,f_m и входными данными размером h*w*d. Предположим также, что ядро ​​свертки имеет пространственную размерность k*k. Тогда пиксель x в любой из выходных карт, скажем, f_j, будет результатом 3d свертки между вводом размера h*w*d и ядром размера k*k*d. Следовательно, сверточный слой имеет k*k*d*m параметров. Это означает, что в вашем случае:

input of layer: 26x26x20
number of filters in layer: 40
number of parameters: 26x26x20x40

То же самое можно сказать о ваших рассуждениях с d=2: вторая свертка будет иметь 20x40 выходных карт, а не 2x40.

0 голосов
/ 12 января 2020

В сверточном слое нет. Количество каналов в фильтре сохраняется равным количеству каналов ввода. Также нет. Количество каналов в фильтре не влияет на размер вывода. Размер вывода определяется как:

height = (input_height - filter_height + 1) (Assuming no padding and stride = 1)
width = (input_width - filter_width + 1)
channels = no. of filters

Итак, на ваш вопрос:

Случай 1 (d = 1):

Conv layer # 1

Input : 28 x 28 x 1, Filter : 3 x 3 x 1, #filters : 20
So your output becomes (28-3+1) x (28-3+1) X #filters = 26 x 26 x 20

Приведенный выше вывод становится вашим вводом для второго сверточного слоя, что приводит к:

Conv layer # 2

Input : 26 x 26 x 20, Filter : 3 x 3 x 20, #filters : 40 (You mentioned size of filter as 3x3x1, but it should be 3x3x20 since the no. of filter channels = no. of input channel)
Output for this layer : (26-3+1) x (26-3+1) x #filters = 24 x 24 x 40

Случай 2 (d = 2): В этом случае выходной сигнал двух конвальных слоев также будет таким же, как указано выше, поскольку выходной сигнал не зависит от количества каналов

Слой № 1

Input : 28 x 28 x 2, Filter : 3 x 3 x 2, #filters : 20
So your output becomes (28-3+1) x (28-3+1) X #filters = 26 x 26 x 20

Слой № 2

Input : 26 x 26 x 20, Filter : 3 x 3 x 20, #filters : 40
Output for this layer : (26-3+1) x (26-3+1) x #filters = 24 x 24 x 40

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

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