Итак, из этой статьи. Многомасштабное агрегирование контекста с помощью расширенной свертки, я познакомился с операцией расширенной свертки. И, честно говоря, это просто операция свертки с модифицированным ядром, а точнее с более широким ядром. Однако, чтобы понять что-то полностью, мне нужно это реализовать, отсюда и существование этой публикации.
Свертка против расширенной свертки (теория)
Красная линия → Взаимосвязь между «знакомой» дискретной сверткой (в нашем случае - обычной двумерной сверткой) и расширенной сверткой.
«Знакомая дискретная свертка - это просто свертка с одним расширением». Таким образом, только из этого утверждения мы уже можем сказать, когда значение 1 увеличивается до 2, это не «знакомая» операция свертки, которую мы все научились любить. И это хорошо видно по картинкам.
Синее письмо → Фактор расширения 1, 2 и 4. (Или 1-расширенная свертка, 2-расширенная свертка и 4-расширенная свертка)
Так что же это за факторы расширения? Что ж, это можно очень легко объяснить с помощью другого изображения. (Собственно то же изображение, лол)
Синие числа → Факторы расширения, примененные к ядру
Таким образом, изображение выше не является лучшим представлением расширенной свертки, но вы получаете общее представление о том, что такое коэффициент расширения. И по мере увеличения коэффициента расширения пространство между исходными элементами ядра становится все шире и шире. Итак, теперь перейдем к примерам.
Настройка эксперимента
Red Box → Исходная матрица
Blue Box → Ядро, которое мы собираемся использовать
Итак, мы просто собираемся выполнить операцию множественной свертки для матрицы в красной рамке, используя ядро в синей рамке. Однако следует отметить три момента.
- Существует два способа выполнить расширенную свертку в Tensorflow: либо с помощью базового tf.nn.conv2d () (путем установки расширенного), либо с помощью tf.nn.atrous_conv2d ()
- Однако похоже, что обе операции не переворачивают ядро. Итак, они выполняют взаимную корреляцию (пожалуйста, поправьте меня, если я ошибаюсь), поэтому мы вручную перевернем ядро, как показано ниже. (Красная линия)
3. Как видно выше, операция ВСЕ Tensorflow будет использовать исходное (3 * 3) ядро при изменении коэффициента расширения, в то время как для Numpy мы будем ГЕНЕРИРОВАТЬ конкретное ядро для каждого Нормы расширения.
Пример 1. Расширенный фактор 1
Мы уже знаем, что если установить коэффициент расширения равным 1, это будет похоже на операцию свертки, которую мы научились любить. Так что в этом примере нет ничего особенного. Теперь посмотрим на код.
Красная линия → Обратите внимание, что мы выполняем «знакомую» операцию свертки для Numpy
Желтая линия → Фактор расширения для Tensorflow
Пример 2 - Расширенный фактор 2
Красный ящик → сгенерированное ядро с коэффициентом расширения 2 для Numpy
Теперь, когда коэффициент расширения увеличился до 2, мы собираемся сгенерировать новое ядро для Numpy.
Красная линия → Обратите внимание, что мы выполняем «знакомую» операцию свертки для Numpy
Желтая линия → Фактор расширения для Tensorflow
Пример 3 - Расширенный фактор 3
Красный ящик → сгенерированное ядро с фактором расширения 3 для Numpy
Теперь, когда коэффициент расширения увеличился до 3, мы собираемся сгенерировать новое ядро для Numpy.
Красная линия → Обратите внимание, что мы выполняем «знакомую» операцию свертки для Numpy
Желтая линия → Фактор расширения для Tensorflow
Пример 4 - Расширенный фактор 4
Красный ящик → сгенерированное ядро с коэффициентом расширения 4 для Numpy
Теперь, когда коэффициент расширения увеличился до 4, мы собираемся сгенерировать новое ядро для Numpy.
Красная линия → Обратите внимание, что мы выполняем «знакомую» операцию свертки для Numpy
Желтая линия → Фактор расширения для Tensorflow
Интерактивный код
Я перешел на Google Colab для интерактивных кодов! Таким образом, вам понадобится учетная запись Google для просмотра кодов, также вы не можете запускать сценарии только для чтения в Google Colab, поэтому сделайте копию на своей игровой площадке. Наконец, я никогда не буду спрашивать разрешения на доступ к вашим файлам на Google Диске, просто к сведению. Удачного кодирования!
** ПРИМЕЧАНИЕ ** Похоже, что версия Tensorflow, установленная в Google Collab, не поддерживает Dilated Convolution с коэффициентом расширения больше 2 (только для tf.nn.conv2d ()) выдает ошибку ниже. Итак, я закомментировал tf.nn.cond2d ().
Чтобы получить доступ к коду, нажмите здесь.
Заключительные слова
Удивительный факт: выполнение обратного распространения для операции расширенной свертки - это просто операция транспонированной свертки.
Если будут обнаружены какие-либо ошибки, пожалуйста, напишите мне на [email protected], если вы хотите увидеть список всех моих писем, пожалуйста, просмотрите мой сайт здесь.
Тем временем подпишитесь на меня в моем твиттере здесь и посетите мой веб-сайт или мой канал Youtube для получения дополнительной информации. Я также сделал сравнение Decoupled Neural Network здесь, если вам интересно.
Ссылка
- Расширенные свертки и свертки по фактору Кронекера. (2016). ИНФЕРЕНЦИЯ. Получено 12 марта 2018 г. с сайта http://www.inference.vc/dilated-convolutions-and-kronecker-factorisation/.
- Учебное пособие по сверточной арифметике - документация Theano 1.0.0. (2018). Deeplearning.net. Получено 12 марта 2018 г. с сайта http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html.
- tf.nn.atrous_conv2d | TensorFlow. (2018). TensorFlow. Получено 12 марта 2018 г. с сайта https://www.tensorflow.org/api_docs/python/tf/nn/atrous_conv2d.
- scipy.signal.convolve2d - Справочное руководство SciPy v1.0.0. (2018). Docs.scipy.org. Получено 12 марта 2018 г. с сайта https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.convolve2d.html.
- массив, И. (2018). Преобразование типа массива NumPy на месте. Stackoverflow.com. Получено 12 марта 2018 г. с сайта https://stackoverflow.com/questions/4389517/in-place-type-conversion-of-a-numpy-array.
- tf.nn.conv2d_backprop_filter | TensorFlow. (2018). TensorFlow. Получено 12 марта 2018 г. с сайта https://www.tensorflow.org/api_docs/python/tf/nn/conv2d_backprop_filter.
- tf.nn.conv2d | TensorFlow. (2018). TensorFlow. Получено 12 марта 2018 г. с сайта https://www.tensorflow.org/api_docs/python/tf/nn/conv2d.
- В чем разница между расширенной сверткой и сверткой + шаг? - Quora . 2018. Quora.Com. По состоянию на 12 марта 2018 г. https://www.quora.com/What-is-the-difference-between-dilated-convolution-and-convolution+stride.
- Ю. Ф., и Колтун В. (2015). Многомасштабная агрегация контекста с помощью расширенных сверток. Препринт arXiv arXiv: 1511.07122.
- Только Numpy: Понимание обратного распространения для транспонированной свертки в многослойной CNN с…. (2018). Середина. Получено 12 марта 2018 г. с сайта https://medium.com/swlh/only-numpy-understanding-back-propagation-for-transpose-convolution-in-multi-layer-cnn-with-c0a07d191981.