В контексте машинного обучения свертка — это процесс вычисления двух матриц A и B, где матрица A будет входом, а B — фильтром, также называемым ядром, затем будет сгенерирована новая матрица C, которая называется карта объектов.
Существуют разные типы сверток, каждый из которых имеет свои плюсы и минусы, но здесь мы рассмотрим свертки с разделением по глубине, а также как их реализовать в Pytorch.
Свертки с разделением по глубине были впервые использованы в Rigid-Motion Scattering, а затем популяризированы сетями Xception.
Глубинная свертка – это тип свертки, при котором мы применяем один сверточный фильтр для каждого входного канала.
Поточечная свертка — это тип свертки, в котором используется ядро 1x1.
Свертка с разделением по глубине – это комбинация обеих сверток по глубине, за которой следует точечная свертка.
Основные преимущества отделимых по глубине сверток
- У них меньшее количество параметров для настройки по сравнению со стандартными CNN, что уменьшает переобучение.
- Они в вычислительном отношении дешевле из-за меньшего количества вычислений, что делает их отличным вариантом для работы на слабом оборудовании (см. MobileNet).
Реализация Pytorch
Как видите, в свертке по глубине намного меньше параметров (1/4), что просто означает, что свертка с разделением по глубине работает намного быстрее, чем обычная свертка.
Если вы хотите глубже изучить извилины, а также производительность, я рекомендую вам прочитать оригинальную статью Xception, объясняющую все это https://arxiv.org/pdf/1610.02357v3.pdf.