Ответ 1
Сначала рассмотрим, как рассчитывается количество обучаемых параметров для каждого отдельного типа вашего слоя, а затем вычисляем количество параметров в вашем примере.
- Уровень ввода: весь входной слой считывает входное изображение, поэтому нет параметров, которые вы могли бы узнать здесь.
-
Сверточные слои. Рассмотрим сверточный слой, который берет на карте карты функций
l
и имеет в качестве вывода карты функцийk
. Размер фильтраn
xm
. Например, это будет выглядеть так:Здесь вход имеет
l=32
карты функций в качестве входных данных,k=64
- карты функций в качестве вывода, а размер фильтраn=3
xm=3
. Важно понимать, что мы не просто имеем фильтр 3x3, а фактически фильтр 3x3x32, так как наш вход имеет 32 измерения. И мы изучаем 64 различных фильтра 3x3x32. Таким образом, общее число весовn*m*k*l
. Тогда для каждой карты признаков есть также смещение, поэтому мы имеем общее количество параметров(n*m*l+1)*k
. - Объединение слоев. Уровни объединения, например. сделайте следующее: "замените 2x2-окрестность максимальным значением". Таким образом, нет никакого параметра, который вы могли бы изучить на уровне объединения.
- Полностью подключенные слои. В полностью подключенном слое все модули ввода имеют отдельный вес для каждого блока вывода. Для входов
n
и выходовm
количество весовn*m
. Кроме того, у вас есть смещение для каждого выхода node, поэтому вы находитесь в параметрах(n+1)*m
. - Выходной уровень: выходной уровень является нормальным полностью подключенным уровнем, поэтому
(n+1)*m
параметры, гдеn
- количество входов, аm
- количество выходов.
Последняя трудность - это первый полностью связанный слой: мы не знаем размерности ввода этого слоя, поскольку это сверточный слой. Чтобы вычислить его, мы должны начать с размера входного изображения и вычислить размер каждого сверточного слоя. В вашем случае Lasagne уже рассчитывает это для вас и сообщает размеры, которые облегчают нам задачу. Если вам нужно рассчитать размер каждого слоя самостоятельно, это немного сложнее:
- В простейшем случае (например, ваш пример) размер вывода сверточного слоя равен
input_size - (filter_size - 1)
, в вашем случае: 28 - 4 = 24. Это связано с природой свертки: мы используем, например, 5x5-окрестности для вычисления точки, но две внешние строки и столбцы не имеют 5x5-окрестности, поэтому мы не можем вычислить какой-либо результат для этих точек. Вот почему наш вывод 2 * 2 = 4 строки/столбцы меньше ввода. - Если вы не хотите, чтобы результат был меньше, чем вход, можно выполнить нулевое изображение (с параметром
pad
сверточного слоя в Лазанье). Например. если вы добавите 2 кадра/столбцы нулей вокруг изображения, размер вывода будет (28 + 4) -4 = 28. Поэтому в случае заполнения, размер выводаinput_size + 2*padding - (filter_size -1)
. - Если вы явно хотите уменьшить размер изображения во время свертки, вы можете определить шаг, например.
stride=2
, что означает, что вы перемещаете фильтр с шагом в 2 пикселя. Затем выражение становится еще более сложным.
В вашем случае полные вычисления:
# name size parameters
--- -------- ------------------------- ------------------------
0 input 1x28x28 0
1 conv2d1 (28-(5-1))=24 -> 32x24x24 (5*5*1+1)*32 = 832
2 maxpool1 32x12x12 0
3 conv2d2 (12-(3-1))=10 -> 32x10x10 (3*3*32+1)*32 = 9'248
4 maxpool2 32x5x5 0
5 dense 256 (32*5*5+1)*256 = 205'056
6 output 10 (256+1)*10 = 2'570
Итак, в вашей сети у вас есть всего 832 + 9'248 + 205'056 + 2'570 = 217'706 обучаемых параметров, что и есть то, что сообщает Лазань.