Функция nn.depthwise_conv2d
Функция nn.depthwise_conv2d выполняет двумерную глубинную свертку (depthwise convolution). В отличие от обычной свертки, где один фильтр применяется ко всем входным каналам сразу, здесь каждый входной канал обрабатывается своим собственным набором фильтров. Первым параметром функция принимает входной четырехмерный тензор формы [batch, height, width, in_channels]. Вторым параметром передается тензор фильтров формы [filter_height, filter_width, in_channels, depth_multiplier]. Третьим параметром задаются шаги (strides) скольжения окна свертки. Четвертым параметром передается строка padding, принимающая значения 'SAME' или 'VALID'.
Синтаксис
tf.nn.depthwise_conv2d(input, filter, strides, padding, [data_format], [dilations], [name])
Пример
Давайте создадим входной тензор с одним изображением размера 3 на 3 и двумя каналами и применим к нему глубинную свертку с фильтром 2 на 2:
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]]]
])
filter = tf.constant([
[[[1.0]], [[0.0]]],
[[[0.0]], [[1.0]]]
])
res = tf.nn.depthwise_conv2d(
t,
filter,
strides=[1, 1, 1, 1],
padding='VALID'
)
print(res)
Результат выполнения кода:
tf.Tensor(
[[[[ 6.]
[ 8.]]
[[12.]
[14.]]]], shape=(1, 2, 2, 1), dtype=float32)
Пример
Давайте создадим входной тензор с двумя каналами и фильтр с множителем глубины 2, чтобы получить четыре выходных канала:
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, 10.0], [11.0, 12.0]],
[[13.0, 14.0], [15.0, 16.0], [17.0, 18.0]]]
])
filter = tf.constant([
[[[1.0, 1.0], [0.0, 0.0]],
[[0.0, 0.0], [1.0, 1.0]]]
])
filter = tf.reshape(filter, [1, 2, 2, 2])
res = tf.nn.depthwise_conv2d(
t,
filter,
strides=[1, 1, 1, 1],
padding='VALID'
)
print(res.shape)
Результат выполнения кода:
(1, 2, 2, 4)
Пример
Давайте применим глубинную свертку с padding 'SAME' и шагом 1, чтобы сохранить пространственные размеры:
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]]]
])
filter = tf.constant([
[[[1.0]], [[1.0]]],
[[[1.0]], [[1.0]]]
])
res = tf.nn.depthwise_conv2d(
t,
filter,
strides=[1, 1, 1, 1],
padding='SAME'
)
print(res)
Результат выполнения кода:
tf.Tensor(
[[[[12.]
[16.]
[ 9.]]
[[24.]
[28.]
[15.]]
[[21.]
[24.]
[13.]]]], shape=(1, 3, 3, 1), dtype=float32)
Смотрите также
-
функцию
conv2d,
которая выполняет обычную двумерную свертку -
функцию
separable_conv2d,
которая выполняет разделяемую двумерную свертку -
функцию
atrous_conv2d,
которая выполняет двумерную свертку с дырами -
функцию
dilation2d,
которая выполняет двумерную морфологическую дилатацию