Итак, из этой статьи. Многомасштабное агрегирование контекста с помощью расширенной свертки, я познакомился с операцией расширенной свертки. И, честно говоря, это просто операция свертки с модифицированным ядром, а точнее с более широким ядром. Однако, чтобы понять что-то полностью, мне нужно это реализовать, отсюда и существование этой публикации.

Свертка против расширенной свертки (теория)

Красная линия → Взаимосвязь между «знакомой» дискретной сверткой (в нашем случае - обычной двумерной сверткой) и расширенной сверткой.

«Знакомая дискретная свертка - это просто свертка с одним расширением». Таким образом, только из этого утверждения мы уже можем сказать, когда значение 1 увеличивается до 2, это не «знакомая» операция свертки, которую мы все научились любить. И это хорошо видно по картинкам.

Синее письмо → Фактор расширения 1, 2 и 4. (Или 1-расширенная свертка, 2-расширенная свертка и 4-расширенная свертка)

Так что же это за факторы расширения? Что ж, это можно очень легко объяснить с помощью другого изображения. (Собственно то же изображение, лол)

Синие числа → Факторы расширения, примененные к ядру

Таким образом, изображение выше не является лучшим представлением расширенной свертки, но вы получаете общее представление о том, что такое коэффициент расширения. И по мере увеличения коэффициента расширения пространство между исходными элементами ядра становится все шире и шире. Итак, теперь перейдем к примерам.

Настройка эксперимента

Red Box → Исходная матрица
Blue Box → Ядро, которое мы собираемся использовать

Итак, мы просто собираемся выполнить операцию множественной свертки для матрицы в красной рамке, используя ядро ​​в синей рамке. Однако следует отметить три момента.

  1. Существует два способа выполнить расширенную свертку в Tensorflow: либо с помощью базового tf.nn.conv2d () (путем установки расширенного), либо с помощью tf.nn.atrous_conv2d ()
  2. Однако похоже, что обе операции не переворачивают ядро. Итак, они выполняют взаимную корреляцию (пожалуйста, поправьте меня, если я ошибаюсь), поэтому мы вручную перевернем ядро, как показано ниже. (Красная линия)

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 здесь, если вам интересно.

Ссылка

  1. Расширенные свертки и свертки по фактору Кронекера. (2016). ИНФЕРЕНЦИЯ. Получено 12 марта 2018 г. с сайта http://www.inference.vc/dilated-convolutions-and-kronecker-factorisation/.
  2. Учебное пособие по сверточной арифметике - документация Theano 1.0.0. (2018). Deeplearning.net. Получено 12 марта 2018 г. с сайта http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html.
  3. tf.nn.atrous_conv2d | TensorFlow. (2018). TensorFlow. Получено 12 марта 2018 г. с сайта https://www.tensorflow.org/api_docs/python/tf/nn/atrous_conv2d.
  4. 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.
  5. массив, И. (2018). Преобразование типа массива NumPy на месте. Stackoverflow.com. Получено 12 марта 2018 г. с сайта https://stackoverflow.com/questions/4389517/in-place-type-conversion-of-a-numpy-array.
  6. tf.nn.conv2d_backprop_filter | TensorFlow. (2018). TensorFlow. Получено 12 марта 2018 г. с сайта https://www.tensorflow.org/api_docs/python/tf/nn/conv2d_backprop_filter.
  7. tf.nn.conv2d | TensorFlow. (2018). TensorFlow. Получено 12 марта 2018 г. с сайта https://www.tensorflow.org/api_docs/python/tf/nn/conv2d.
  8. В чем разница между расширенной сверткой и сверткой + шаг? - Quora . 2018. Quora.Com. По состоянию на 12 марта 2018 г. https://www.quora.com/What-is-the-difference-between-dilated-convolution-and-convolution+stride.
  9. Ю. Ф., и Колтун В. (2015). Многомасштабная агрегация контекста с помощью расширенных сверток. Препринт arXiv arXiv: 1511.07122.
  10. Только Numpy: Понимание обратного распространения для транспонированной свертки в многослойной CNN с…. (2018). Середина. Получено 12 марта 2018 г. с сайта https://medium.com/swlh/only-numpy-understanding-back-propagation-for-transpose-convolution-in-multi-layer-cnn-with-c0a07d191981.