Функция nn.separable_conv2d
Функция nn.separable_conv2d применяет к входному тензору
двумерную разделяемую свертку. Такая свертка выполняется
в два этапа: сначала depthwise-свертка (каждый входной канал
обрабатывается своим фильтром), затем pointwise-свертка
(смешивание каналов сверткой 1×1). Первым параметром
передается входной тензор, вторым - тензор depthwise-ядер,
третьим - тензор pointwise-ядер. Четвертым параметром
указываются шаги (strides), пятым - тип дополнения (padding).
Дополнительно можно задать формат данных (data_format)
и коэффициент расширения (dilations).
Синтаксис
tf.nn.separable_conv2d(
input,
depthwise_filter,
pointwise_filter,
strides,
padding,
data_format=None,
dilations=None,
name=None
)
Пример
Давайте создадим входной тензор с одним изображением размером 5×5 и тремя каналами, а затем применим разделяемую свертку с двумя выходными каналами:
import tensorflow as tf
t = tf.constant([[[[1.0], [2.0], [3.0], [4.0], [5.0]],
[[1.0], [2.0], [3.0], [4.0], [5.0]],
[[1.0], [2.0], [3.0], [4.0], [5.0]],
[[1.0], [2.0], [3.0], [4.0], [5.0]],
[[1.0], [2.0], [3.0], [4.0], [5.0]]]])
depthwise = tf.constant([[[[1.0]]], [[[1.0]]], [[[1.0]]]])
pointwise = tf.constant([[[[1.0], [2.0]]]])
res = tf.nn.separable_conv2d(
t,
depthwise,
pointwise,
strides=[1, 1, 1, 1],
padding='VALID'
)
print(res)
Результат выполнения кода:
tf.Tensor(
[[[[ 3.]
[ 6.]]
[[ 6.]
[12.]]
[[ 9.]
[18.]]
[[12.]
[24.]]]], shape=(1, 4, 4, 2), dtype=float32)
Пример
Давайте применим разделяемую свертку с дополнением
SAME, чтобы выходной тензор сохранил пространственные
размеры входного:
import tensorflow as tf
t = tf.constant([[[[1.0], [2.0], [3.0]],
[[4.0], [5.0], [6.0]],
[[7.0], [8.0], [9.0]]]])
depthwise = tf.constant([[[[1.0]]], [[[1.0]]], [[[1.0]]]])
pointwise = tf.constant([[[[1.0], [1.0]]]])
res = tf.nn.separable_conv2d(
t,
depthwise,
pointwise,
strides=[1, 1, 1, 1],
padding='SAME'
)
print(res.shape)
Результат выполнения кода:
(1, 3, 3, 2)
Пример
Давайте применим разделяемую свертку с шагом 2, чтобы уменьшить пространственные размеры тензора:
import tensorflow as tf
t = tf.constant([[[[1.0], [2.0], [3.0], [4.0]],
[[1.0], [2.0], [3.0], [4.0]],
[[1.0], [2.0], [3.0], [4.0]],
[[1.0], [2.0], [3.0], [4.0]]]])
depthwise = tf.constant([[[[1.0]]], [[[1.0]]], [[[1.0]]]])
pointwise = tf.constant([[[[1.0]]]])
res = tf.nn.separable_conv2d(
t,
depthwise,
pointwise,
strides=[1, 2, 2, 1],
padding='VALID'
)
print(res.shape)
Результат выполнения кода:
(1, 2, 2, 1)
Смотрите также
-
функцию
conv2d,
которая выполняет обычную двумерную свертку -
функцию
depthwise_conv2d,
которая выполняет только depthwise-свертку -
функцию
conv1d,
которая выполняет одномерную свертку -
функцию
conv3d,
которая выполняет трехмерную свертку