Как эффективнее использовать операцию im2col в сверточных сетях?
Я пытаюсь реализовать сверточную нейронную сеть и не понимаю, почему использование im2col более эффективно. Он в основном хранит входные данные, которые будут умножены на фильтр в отдельных столбцах Но почему бы не использовать циклы напрямую для вычисления свертки, вместо того, чтобы сначала выполнить im2col?
1 ответ
Что ж, вы думаете правильно: в Alex Net почти 95% времени GPU и 89% времени CPU тратится на сверточный слой и полностью подключенный слой.
Сверточный слой и полностью связанный слой реализованы с использованием GEMM, что означает "Общее матричное умножение".
Так что в основном в GEMM мы преобразуем операцию свертки в операцию умножения матриц, используя функцию
im2col()
который упорядочивает данные таким образом, что вывод свертки может быть достигнут с помощью умножения матриц.Теперь у вас может возникнуть вопрос, вместо того, чтобы напрямую выполнять поэлементную свертку, почему мы добавляем промежуточный шаг, чтобы упорядочить данные по-другому, а затем использовать GEMM.
Ответ на это заключается в том, что научные программисты потратили десятилетия на оптимизацию кода для выполнения умножения больших матриц на матриц, а преимущества от очень регулярных шаблонов доступа к памяти перевешивают любые другие потери. У нас есть оптимизированный CUDA GEMM API в библиотеке cuBLAS, Intel MKL имеет оптимизированный CPU GEMM, а ciBLAS GEMM API можно использовать для устройств, поддерживающих OpenCL.
Элементная мудрая свертка работает плохо из-за нерегулярных обращений к памяти, связанных с ней.
В очереди,
Im2col()
упорядочивает данные таким образом, чтобы обращения к памяти были регулярными для умножения матриц.Im2col()
Функция добавляет много избыточности данных, но выигрыш в производительности от использования Gemm перевешивает эту избыточность данных.Это причина использования
Im2col()
операция в нейронных сетях.Эта ссылка объясняет, как
Im2col()
организует данные для GEMM: https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/