В настоящее время я занимаюсь учебником по углубленному изучению Udacity. В уроке 3 они говорят о свертке 1x1. Эта свертка 1x1 используется в начальном модуле Google. У меня проблемы с пониманием, что такое свертка 1x1.
Я также видел этот пост от Янн Лекун.
Может ли кто-нибудь любезно объяснить это мне?
Ответы:
Предположим, что у меня есть извилистый слой, который выводит тензор в форме где:( N, F, Ч, Вт)
Предположим, что этот выходной сигнал подается в сверточный слой с фильтрами 1x1, заполнением нулями и шагом 1. Затем выходной сигнал этого слоя сверток 1x1 будет иметь форму ( N , F 1 , H , W ) .F1 ( N, F1, Ч, Вт)
Таким образом, фильтры 1x1 могут использоваться для изменения размерности в пространстве фильтров. Если то мы увеличиваем размерность, если F 1 < F, мы уменьшаем размерность в измерении фильтра.F1> F F1< F
В самом деле, в статье Google Inception Going Deeper with Convolutions говорится (жирным шрифтом является мой, а не авторы оригинала):
Таким образом, в начальной архитектуре мы используем сверточные фильтры 1x1, чтобы уменьшить размерность в измерении фильтра. Как я объяснил выше, эти слои 1x1 conv могут использоваться в общем случае для изменения размерности пространства фильтра (увеличения или уменьшения), и в архитектуре Inception мы видим, насколько эффективными могут быть эти фильтры 1x1 для уменьшения размерности, явно в пространстве измерений фильтра. , а не пространство пространственного измерения.
Возможно, существуют другие интерпретации конв-фильтров 1x1, но я предпочитаю это объяснение, особенно в контексте архитектуры Google Inception.
источник
Свертка 1x1 просто отображает входной пиксель со всеми его каналами в выходной пиксель, не смотря ни на что вокруг. Он часто используется для уменьшения количества каналов глубины, так как часто очень медленно умножать объемы с чрезвычайно большой глубиной.
Нижняя примерно на 3,7 раза медленнее.
Теоретически нейронная сеть может «выбирать», какие входные «цвета» смотреть, используя это, вместо того, чтобы перемножать все грубой силой.
источник
num_weights = in_depth x out_depth x kernel_size = 256x256x4x4
. В первом случаеnum_weights = 256x64x1x1+64x265x4x4=256x64x17
. Возьмите коэффициент, и это даст 256/17 ~ 3,7. Проверьте эту бумажную страницу 9 для визуализации того, как числовые веса связаны с глубиной ввода и глубиной вывода. arxiv.org/pdf/1603.07285.pdfhttps://datascience.stackexchange.com/questions/9175/how-do-subsequent-convolution-layers-work
В частности, тип 2.2 является правильным описанием свертки там.
Еще один полезный ответ:
https://ai.stackexchange.com/questions/5769/in-a-cnn-does-each-new-filter-have-different-weights-for-each-input-channel-or
Этот ответ объясняет, как у вас есть отдельный фильтр для каждой комбинации каналов ввода / вывода . После вычисления каждого из них результаты суммируются по оси входного канала, оставляя с номером значения выходного канала .
Вот видео, которое я нашел, которое помогло мне понять, как работает свертка 1x1.
https://www.coursera.org/lecture/convolutional-neural-networks/networks-in-networks-and-1x1-convolutions-ZTb8x
Вот основные вещи, которые я получил от этого:
источник
Я постараюсь объяснить более интуитивно и вкратце с иллюстрациями!
Конв 1 * 1 (он же сеть в сети )?
скажем, вы вводите (n_H, n_W, n_c_prev). Вы можете думать о (1 * 1 * n_c_prev) как об одном нейроне (полностью подключенная сеть, т.е. почему N / w в N / w ), который принимает (n_c_prev) числа на входе, умножая их на (1 * 1 * n_c_prev) ), а затем добавление и затем получение ReLu & output (n_H, n_W), и если у вас есть несколько фильтров (n_c), то вывод будет (n_H, n_W, n_C).
Таким образом, вы можете использовать уровень пула для уменьшения пространственных измерений (n_H, n_W) и использовать 1 * 1 conv для уменьшения n_c_prev (то есть количества каналов), что экономит много вычислений. Например
Поэтому забрать
Вы можете использовать сверточный слой 1x1, чтобы уменьшить n_C, но не n_H, n_W.
Вы можете использовать уровень пула для уменьшения n_H, n_W и n_C.
Другими словами,
источник
Еще одна идея об уменьшении размерности в контексте фильтров 1x1:
Возьмите, например, слой 4096x8x8 fc7 из FCN. Что произойдет, если следующий слой (назовите его fc8) будет 2048x8x8 с размером фильтра 1? fc7 очень глубоко внутри сети, каждая из 4096 функций семантически богата, но каждый нейрон (например, входное изображение 250x250x3) имеет большое восприимчивое поле. Другими словами, если нейрон очень активен, мы знаем, что где-то в его семантическом поле присутствует соответствующая особенность.
Возьмем, к примеру, левый верхний нейрон в fc8 с фильтром 1x1. Он подключается ко всем 4096 нейронам / объектам только в одном и том же рецептивном поле (верхний левый угол изображения), каждый из которых активируется одной функцией. Некоторые (давайте же 500) из них очень активны. Если полученный нейрон также очень активен, это означает, что он, вероятно, научился идентифицировать 1 или более признаков в этой области восприятия. После того, как вы проделали это 2048 раз для самых верхних левых нейронов в fc8, довольно многие из них (например, 250) будут очень активными, что означает, что они «собирали» элементы из одного и того же рецептивного поля через fc7, и многие из них, вероятно, более один.
Если вы продолжите уменьшать размерность, то уменьшающееся число нейронов будет учить все большее число функций из одной и той же рецептивной области. И поскольку пространственные параметры 8x8 остаются неизменными, мы не меняем «вид» каждого нейрона, таким образом, не уменьшаем пространственную грубость.
Возможно, вы захотите взглянуть на «Полностью сверточные сети» Лонга, Шелхамера и Дарреля.
источник
Математическая операция свертки означает вычисление произведения двух (непрерывных или дискретных) функций по всем возможным положениям сдвига.
Приложения обработки изображений нейронных сетей, включая сверточные нейронные сети , были рассмотрены в: [M. Эгмонт-Петерсен, Д. де Риддер, Х. Гендельс. Обработка изображений с помощью нейронных сетей - обзор , Pattern Recognition , Vol. 35, No. 10, pp. 2279-2301, 2002].
источник