Сверточные нейронные сети (CNN) — это популярная архитектура глубокого обучения, которая широко используется для обработки изображений и задач компьютерного зрения. CNN используют операции свертки, математическую операцию, которая объединяет две функции для получения третьей функции. Операция свертки включает скольжение ядра по изображению и вычисление скалярного произведения перекрывающихся значений между изображением и ядром. Результатом этого процесса является новое изображение, которое называется картой объектов. Результат операции свертки используется для определения конкретных особенностей изображения, таких как края, углы и текстуры. Затем эти функции проходят через несколько уровней CNN для формирования более сложных представлений изображения. Затем эти представления используются для прогнозирования или принятия решений на основе входного изображения.

Разделимые по глубине свертки

Стандартная операция свертки в CNN является дорогостоящим в вычислительном отношении процессом, который требует большого количества параметров и времени вычислений. Это может быть проблемой для моделей глубокого обучения, предназначенных для использования на мобильных устройствах или в других средах с ограниченными ресурсами. Чтобы решить эту проблему, исследователи разработали новый тип свертки, который называется глубинно отделимой сверткой. В отличие от стандартной свертки, свертка с разделением по глубине разбивает операцию свертки на два отдельных шага. Первым шагом является глубинная свертка, которая применяет отдельное ядро ​​к каждому каналу входной карты объектов. Второй шаг — это точечная свертка, объединяющая результаты глубинной свертки в единую карту объектов.

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

Реализация отделимых по глубине сверток в TensorFlow

В TensorFlow легко реализовать слой свертки с разделением по глубине, используя встроенный tf.keras.layers API. Вот пример кода, который демонстрирует, как реализовать слой свертки с разделением по глубине в TensorFlow:

import tensorflow as tf

def depthwise_separable_conv(inputs, filters, kernel_size, strides, padding):
    depthwise_conv = tf.keras.layers.DepthwiseConv2D(
        kernel_size=kernel_size,
        strides=strides,
        padding=padding,
        depthwise_initializer='he_normal'
    )(inputs)

    pointwise_conv = tf.keras.layers.Conv2D(
        filters=filters,
        kernel_size=(1, 1),
        strides=(1, 1),
        padding='same',
        activation='relu',
        kernel_initializer='he_normal'
    )(depthwise_conv)

    return pointwise_conv

В приведенном выше коде функция depthwise_separable_conv принимает несколько параметров:

  • inputs: карта входных объектов
  • filters: количество фильтров в точечной свертке
  • kernel_size: размер ядра для свертки по глубине
  • strides: шаги для углубленной свертки
  • padding: заполнение для свертки по глубине

Сначала функция применяет к входной карте объектов слой DepthwiseConv2D, который выполняет свертку по глубине. Параметр kernel_size указывает размер ядра для свертки по глубине, а параметр strides указывает шаги. Параметр padding используется для указания заполнения для свертки. Параметр depthwise_initializer используется для инициализации весов для свертки по глубине.

Затем функция применяет слой Conv2D к выходным данным свертки по глубине, которая выполняет точечную свертку. Параметр filters указывает количество фильтров в точечной свертке, а для параметра kernel_size задано значение (1, 1), чтобы гарантировать, что точечная свертка только объединяет каналы входной карты объектов и не изменяет пространственные размеры. Для параметров strides и padding заданы значения (1, 1) и одинаковые соответственно, чтобы гарантировать сохранение пространственных размеров входной карты объектов. Для параметра activation задано значение 'relu', чтобы применить функцию активации ReLU к выходным данным поточечной свертки, и используется параметр kernel_initializer. для инициализации весов для точечной свертки.

Сравнение стандартных сверток и сверток, отделяемых по глубине

Основное отличие стандартных сверток от сверток с разделением по глубине заключается в количестве параметров и времени вычисления. Стандартный сверточный слой имеет большое количество параметров и требует много времени для вычислений, тогда как разделяемый по глубине сверточный слой имеет гораздо меньшее количество параметров и требует гораздо меньше времени для вычислений.

Количество параметров в стандартном слое свертки может быть выражено как:

P_std = F * K² + F

где F — количество фильтров, а K — размер ядра.

Напротив, количество параметров в слое свертки с разделением по глубине может быть выражено как:

P_ds = F_dw + F_pw

где F_dw — количество фильтров в глубинной свёртке, а F_pw — количество фильтров в точечной свёртке.

Время вычисления стандартного слоя свертки может быть выражено как:

T_std = O(F * K² * I * O)

где I — количество входных каналов, а O — количество выходных каналов.

Напротив, время вычисления слоя свертки, разделяемого по глубине, может быть выражено как:

T_ds = O(F_dw * K² * I + F_pw * K² * I * O)

Как видно, время вычисления слоя свертки с разделением по глубине намного меньше по сравнению со стандартным слоем свертки.

Приложения отделимых по глубине сверток

Разделимые по глубине свертки имеют широкий спектр применений в обработке изображений и компьютерном зрении. Они используются в различных моделях глубокого обучения для таких задач, как классификация изображений, обнаружение объектов, сегментация и многое другое.

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

Еще один вариант использования сверток с разделением по глубине — сжатие изображений. Их можно использовать для сжатия больших изображений в более мелкие представления с сохранением важной информации. Это может быть особенно полезно для приложений, требующих передачи больших объемов данных по сети с ограниченной пропускной способностью, таких как спутниковые изображения или дистанционное зондирование.

Кроме того, извилины с разделением по глубине также использовались в медицинской визуализации. Например, они использовались в компьютерной томографии для обнаружения и сегментации легочных узлов, а также в МРТ-сканировании для сегментации опухолей головного мозга.

Заключение

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