Как эффективнее использовать операцию im2col в сверточных сетях?

Я пытаюсь реализовать сверточную нейронную сеть и не понимаю, почему использование im2col более эффективно. Он в основном хранит входные данные, которые будут умножены на фильтр в отдельных столбцах Но почему бы не использовать циклы напрямую для вычисления свертки, вместо того, чтобы сначала выполнить im2col?

1 ответ

Решение
  1. Что ж, вы думаете правильно: в Alex Net почти 95% времени GPU и 89% времени CPU тратится на сверточный слой и полностью подключенный слой.

  2. Сверточный слой и полностью связанный слой реализованы с использованием GEMM, что означает "Общее матричное умножение".

  3. Так что в основном в GEMM мы преобразуем операцию свертки в операцию умножения матриц, используя функцию im2col() который упорядочивает данные таким образом, что вывод свертки может быть достигнут с помощью умножения матриц.

  4. Теперь у вас может возникнуть вопрос, вместо того, чтобы напрямую выполнять поэлементную свертку, почему мы добавляем промежуточный шаг, чтобы упорядочить данные по-другому, а затем использовать GEMM.

  5. Ответ на это заключается в том, что научные программисты потратили десятилетия на оптимизацию кода для выполнения умножения больших матриц на матриц, а преимущества от очень регулярных шаблонов доступа к памяти перевешивают любые другие потери. У нас есть оптимизированный CUDA GEMM API в библиотеке cuBLAS, Intel MKL имеет оптимизированный CPU GEMM, а ciBLAS GEMM API можно использовать для устройств, поддерживающих OpenCL.

  6. Элементная мудрая свертка работает плохо из-за нерегулярных обращений к памяти, связанных с ней.

  7. В очереди, Im2col() упорядочивает данные таким образом, чтобы обращения к памяти были регулярными для умножения матриц.

  8. Im2col() Функция добавляет много избыточности данных, но выигрыш в производительности от использования Gemm перевешивает эту избыточность данных.

  9. Это причина использования Im2col() операция в нейронных сетях.

  10. Эта ссылка объясняет, как Im2col() организует данные для GEMM: https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/

Другие вопросы по тегам