Класс DepthwiseConv2D
Класс DepthwiseConv2D выполняет глубинную двумерную свертку над входными данными.
В отличие от обычной свертки Conv2D, где каждый фильтр применяется ко всем входным
каналам сразу, глубинная свертка применяет отдельный фильтр к каждому каналу независимо.
Первым параметром передается размер ядра свертки (например, 3 или кортеж (3, 3)).
Параметр strides задает шаг свертки, padding - режим дополнения
('valid' или 'same'), depth_multiplier - множитель числа выходных
каналов на каждый входной канал, activation - функцию активации,
use_bias - использовать ли смещение.
Синтаксис
tf.keras.layers.DepthwiseConv2D(
kernel_size,
strides=(1, 1),
padding='valid',
depth_multiplier=1,
activation=None,
use_bias=True,
depthwise_initializer='glorot_uniform',
bias_initializer='zeros'
)
Пример
Давайте создадим слой глубинной свертки с ядром 3 и применим его
к тензору формы (1, 4, 4, 2):
import tensorflow as tf
tf.random.set_seed(0)
layer = tf.keras.layers.DepthwiseConv2D(kernel_size=3, padding='same')
t = tf.constant([[[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]],
[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]],
[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]],
[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]]]])
res = layer(t)
print(res.shape)
Результат выполнения кода:
(1, 4, 4, 2)
Пример
Давайте используем параметр depth_multiplier, чтобы увеличить
число выходных каналов в два раза:
import tensorflow as tf
tf.random.set_seed(0)
layer = tf.keras.layers.DepthwiseConv2D(
kernel_size=3,
padding='same',
depth_multiplier=2
)
t = tf.constant([[[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]],
[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]],
[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]],
[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]]]])
res = layer(t)
print(res.shape)
Результат выполнения кода:
(1, 4, 4, 4)
Пример
Давайте создадим модель с глубинной сверткой и функцией активации relu:
import tensorflow as tf
tf.random.set_seed(0)
model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(4, 4, 2)),
tf.keras.layers.DepthwiseConv2D(kernel_size=3, padding='same', activation='relu'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(2)
])
t = tf.constant([[[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]],
[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]],
[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]],
[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]]]])
res = model(t)
print(res.shape)
Результат выполнения кода:
(1, 2)
Смотрите также
-
класс
Conv2D,
который выполняет обычную двумерную свертку -
класс
SeparableConv2D,
который выполняет разделимую двумерную свертку -
класс
Conv2DTranspose,
который выполняет транспонированную двумерную свертку -
класс
ZeroPadding2D,
который добавляет нулевое дополнение к двумерным данным