Класс SeparableConv2D
Класс SeparableConv2D создает слой разделяемой
двумерной свертки. В отличие от обычной свертки,
разделяемая свертка выполняет две операции:
сначала depthwise-свертку (каждый входной канал
обрабатывается отдельным ядром), затем pointwise-свертку
(смешивание каналов ядром 1×1). Первым
параметром слой принимает количество фильтров
filters, вторым - размер ядра
kernel_size. Также можно указать шаг
strides, тип паддинга padding,
функцию активации activation и другие
параметры.
Синтаксис
tf.keras.layers.SeparableConv2D(
filters,
kernel_size,
strides=(1, 1),
padding='valid',
data_format=None,
dilation_rate=(1, 1),
groups=1,
activation=None,
use_bias=True,
depth_multiplier=1,
depthwise_initializer='glorot_uniform',
pointwise_initializer='glorot_uniform',
bias_initializer='zeros',
depthwise_regularizer=None,
pointwise_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
depthwise_constraint=None,
pointwise_constraint=None,
bias_constraint=None
)
Пример
Давайте создадим слой разделяемой свертки
с 32 фильтрами и ядром 3×3,
а затем применим его к входному тензору:
import tensorflow as tf
tf.random.set_seed(0)
layer = tf.keras.layers.SeparableConv2D(
filters=32,
kernel_size=(3, 3),
activation='relu'
)
t = tf.random.normal((1, 28, 28, 3))
res = layer(t)
print(res.shape)
Результат выполнения кода:
(1, 26, 26, 32)
Пример
Давайте создадим слой с шагом 2
и паддингом same, чтобы уменьшить
пространственные размеры:
import tensorflow as tf
tf.random.set_seed(0)
layer = tf.keras.layers.SeparableConv2D(
filters=16,
kernel_size=(3, 3),
strides=(2, 2),
padding='same'
)
t = tf.random.normal((1, 28, 28, 3))
res = layer(t)
print(res.shape)
Результат выполнения кода:
(1, 14, 14, 16)
Пример
Давайте используем слой внутри модели
Sequential для обработки изображений:
import tensorflow as tf
tf.random.set_seed(0)
model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(28, 28, 3)),
tf.keras.layers.SeparableConv2D(
filters=32,
kernel_size=(3, 3),
activation='relu'
),
tf.keras.layers.GlobalAveragePooling2D(),
tf.keras.layers.Dense(10, activation='softmax')
])
t = tf.random.normal((1, 28, 28, 3))
res = model(t)
print(res.shape)
Результат выполнения кода:
(1, 10)
Пример
Давайте создадим слой с depth_multiplier
равным 2, чтобы увеличить количество
каналов на этапе depthwise-свертки:
import tensorflow as tf
tf.random.set_seed(0)
layer = tf.keras.layers.SeparableConv2D(
filters=32,
kernel_size=(3, 3),
depth_multiplier=2,
activation='relu'
)
t = tf.random.normal((1, 28, 28, 3))
res = layer(t)
print(res.shape)
Результат выполнения кода:
(1, 26, 26, 32)
Смотрите также
-
класс
Conv2D,
который создает обычную двумерную свертку -
класс
DepthwiseConv2D,
который выполняет только depthwise-свертку -
класс
Conv3D,
который создает трехмерную свертку -
класс
Conv2DTranspose,
который выполняет транспонированную свертку