#tensorflow
#tensorflow
Вопрос:
Я не понимаю, почему в официальной документации свертка патча 5×5 с фильтром 2×2 создает 32 объекта…
Свертка сдвигается на 1 каждый раз, поэтому она должна создавать 6 * 6 = 36 объектов, а не 32. Я чего-то не понимаю?
Комментарии:
1. 32 — это количество каналов, а не количество объектов
2. в нем говорится: «Сверточный вычислит 32 объекта для каждого патча размером 5×5».
3. Извините, я думал, что вы получаете 32 из кода ‘W_conv1 = weight_variable([5, 5, 1, 32])’. Я не понимаю, как он может генерировать 32 объекта в виде новых «пикселей», потому что квадратный корень из 32 не является целым числом, а изображение является квадратным.
4. то есть вы имеете в виду , что в официальном руководстве есть проблема?
Ответ №1:
32 — это гиперпараметр: как только вы определяете сеть, вы выбираете, сколько объектов извлечь из входных данных.
При вводе 28x28x1 вы выбираете для изучения 32 сверточных фильтра. Изученный сверточный фильтр извлекает один объект.
W_conv1 = weight_variable([5, 5, 1, 32])
… это определение набора из 32 фильтров, каждый из которых размером 5x5x1, который сеть изучит после этапа обучения.
Вы можете изменить количество сверточных фильтров для изучения, поскольку это гиперпараметр, поэтому он абсолютно произвольный.
Например, вы можете выбрать извлечение 64 объектов из первого сверточного слоя, изменив предыдущую строку следующим образом:
W_conv1 = weight_variable([5, 5, 1, 64])
b_conv1 = bias_variable([64]) #change biases as well
Но вы должны отслеживать это изменение на следующем слое.
В руководстве вы найдете определение другого набора сверточных фильтров:
W_conv2 = weight_variable([5, 5, 32, 64])
Это определение набора из 64 сверточных фильтров, каждый размером 5x5x32.
Если вы измените первый слой, чтобы извлечь 64 объекта, вы должны соответствующим образом изменить этот слой:
W_conv2 = weight_variable([5, 5, 64, 64])
Это означает, что каждый из 64 извлеченных объектов объединяется с другими 64 объектами: абстракция увеличивается.
Первые слои извлекают простые объекты (ребра, линии, …), другие слои объединяют извлеченные объекты для формирования более сложных объектов.
Свертка сдвигается на 1 каждый раз, поэтому она должна создавать 6 * 6 = 36 объектов, а не 32.
«Сдвиг» (он называется шагом S
) — это количество пикселей, на которые нужно перейти при выполнении 2D-свертки.
Если вход имеет сторону 28 пикселей, результат свертки с (набором) фильтров стороны 5 равен (28 - 5 2P)/S=1 1 = 24
Поскольку операция свертки имеет аргумент заполнения=SAME , значение P
вычисляется для получения выходных данных того же размера, что и входные данные, то есть 28.
Ваши 6* 6 не имеют никакого значения.
Короче говоря, длинная история:
Не путайте количество извлеченных объектов (гиперпараметр) с размером карты активации. Карта активации является результатом свертки между входными данными и изученными сверточными фильтрами (также называемыми ядрами).
Комментарии:
1. На самом деле это идеальное объяснение, осталось одно: как вы получили это уравнение: (28 — 5 2P) / S = 1 1 = 24 ?
2. Другой вопрос, заполнение = ТО ЖЕ САМОЕ … означает ли это, что фильтр размером 5×5 не должен выходить за пределы границы изображения? если это так, то это должно быть 28-4, а не 28-5.. Я все еще не получаю часть /S = 1 1 = 24 …
3. Эта часть, возможно, немного запутана. Я пытаюсь прояснить. Формула для вычисления стороны вывода: (Input_side — kernel_side 2 отступа) / Шаг 1. Эта формула, на самом деле, хорошо известна в области компьютерного зрения. Вы можете убедиться, что вычисленное значение правильное, просто попробуйте. Если значение не является целым числом, значение шага неверно (другой гиперпараметр, и вы должны его изменить). Заполнение = то же самое означает: сторона ввода = сторона вывода. Таким образом, он вычисляет допустимое значение для P (параметра заполнения), чтобы уравнение было истинным
Ответ №2:
В документации говорится:
Сверточный вычислит 32 объекта для каждого патча размером 5×5. Его тензор веса будет иметь форму [5, 5, 1, 32]
Ваша путаница возникает из-за того, что вы думаете, что 32 объекта представляют количество параметров, которые будут иметь выходные данные свертки. Но это не так.
tf.nn.conv2d() говорит, что второй параметр представляет ваш фильтр и состоит из [filter_height, filter_width, in_channels, out_channels]
. Это [5, 5, 1, 32]
означает, что ваше in_channels
значение равно 1: у вас изображение в оттенках серого, поэтому здесь нет сюрпризов.
32 означает, что на этапе обучения сеть попытается изучить 32 разных ядра, которые будут использоваться во время прогнозирования. Вы можете изменить это число на любое другое число, поскольку это гиперпараметр, который вы можете настроить.