Депсвайз (Depthwise Convolution) — это разновидность свёртки, которая применяется по каждому каналу входного тензора отдельно, без объединения информации между каналами. Если обычная свёртка работает с входным тензором, суммируя результаты по всем каналам через ядра свёртки, то депсвайз создает отдельное ядро для каждого канала и применяет его к соответствующему каналу.
Преимущество такого подхода заключается в значительном сокращении числа параметров и вычислительной нагрузки. Для входного тензора размером (H W C) и ядра размером (K K) количество параметров при депсвайз свёртке составляет:
[ C K K]
вместо
[ C K K N]
в случае обычной свёртки с (N) выходными каналами.
Сепарабельная свёртка (Separable Convolution) — это комбинация депсвайз свёртки и точечной свёртки (1 ). Сначала входной тензор проходит через депсвайз свёртку для пространственного извлечения признаков по каждому каналу, а затем через точечную свёртку, которая объединяет информацию между каналами. Такой подход позволяет уменьшить количество параметров и ускорить обучение без значительной потери точности.
TensorFlow.js предоставляет готовый слой
tf.layers.depthwiseConv2d. Основные параметры слоя:
[height, width].'valid' или 'same'.Пример инициализации слоя:
const depthwiseLayer = tf.layers.depthwiseConv2d({
kernelSize: 3,
depthMultiplier: 1,
strides: 1,
padding: 'same',
activation: 'relu'
});
Входной тензор можно подать как tf.tensor4d с формой
[batch, height, width, channels]. Выходной тензор будет
иметь размерность
[batch, height, width, channels * depthMultiplier].
Сепарабельная свёртка реализована через слой
tf.layers.separableConv2d. Этот слой объединяет депсвайз
свёртку и точечную свёртку. Основные параметры:
'valid' или
'same'.Пример создания слоя:
const separableLayer = tf.layers.separableConv2d({
filters: 32,
kernelSize: 3,
depthMultiplier: 1,
strides: 1,
padding: 'same',
activation: 'relu'
});
При использовании сепарабельной свёртки сначала выполняется глубинная свёртка, которая работает по каждому каналу отдельно, а затем точечная свёртка (1x1), которая комбинирует каналы в новый набор признаков.
Сепарабельные свёртки часто используются в мобильных архитектурах, таких как MobileNet, где критически важны минимальное количество параметров и высокая скорость вычислений. Стандартная последовательность выглядит так:
Пример в TensorFlow.js:
const model = tf.sequential();
model.add(tf.layers.inputLayer({inputShape: [128, 128, 3]}));
model.add(tf.layers.separableConv2d({
filters: 64,
kernelSize: 3,
strides: 1,
padding: 'same',
activation: 'relu'
}));
model.add(tf.layers.batchNormalization());
model.add(tf.layers.maxPooling2d({poolSize: 2, strides: 2}));
Использование депсвайз и сепарабельных свёрток уменьшает:
Например, для обычной свёртки с входом (128 ) и ядром (3 ), если требуется 64 выходных канала, число параметров будет:
[ 3 = 18432]
Для сепарабельной свёртки с тем же ядром и depthMultiplier = 1:
[ (3 ) + (1 ) = 288 + 2048 = 2336]
Экономия почти в 8 раз при сохранении сопоставимой выразительной способности модели.
Использование этих техник позволяет создавать эффективные и быстрые модели прямо в браузере или Node.js, сохраняя точность и снижая вычислительные затраты.