Функция nn.conv2d
Функция nn.conv2d применяет операцию свертки к четырехмерному входному тензору.
Первым параметром передается входной тензор формы
[batch, height, width, channels].
Вторым параметром передается тензор фильтров формы
[filter_height, filter_width, in_channels, out_channels].
Третьим параметром задается шаг свертки strides -
список из четырех чисел, определяющий сдвиг окна по каждому измерению.
Четвертым параметром указывается тип паддинга padding:
строка 'SAME' сохраняет пространственные размеры,
а 'VALID' уменьшает их без добавления границ.
Дополнительно можно передать data_format и dilations.
Синтаксис
tf.nn.conv2d(input, filters, strides, padding, [data_format], [dilations])
Пример
Давайте применим свертку к одному изображению размером
4 на 4 с одним каналом.
Используем один фильтр 2 на 2, заполненный единицами:
import tensorflow as tf
# input image: [batch, height, width, channels]
t = tf.constant([[[[1], [2], [3], [4]],
[[5], [6], [7], [8]],
[[9], [10], [11], [12]],
[[13], [14], [15], [16]]]], dtype=tf.float32)
# one filter 2x2 with ones
filters = tf.constant([[[[1]], [[1]]], [[[1]], [[1]]]], dtype=tf.float32)
res = tf.nn.conv2d(t, filters, strides=[1, 1, 1, 1], padding='VALID')
print(res)
Результат выполнения кода:
tf.Tensor(
[[[[14.]
[18.]
[22.]]
[[30.]
[34.]
[38.]]
[[46.]
[50.]
[54.]]]], shape=(1, 3, 3, 1), dtype=float32)
Пример
Давайте сравним режимы паддинга 'VALID' и 'SAME'
на одном и том же входе и фильтре:
Результат выполнения кода:
"VALID: (1, 3, 3, 1)"
"SAME: (1, 4, 4, 1)"
Пример
Давайте выполним свертку с несколькими выходными каналами.
Подадим изображение с тремя каналами и создадим
два фильтра размером 3 на 3:
import tensorflow as tf
tf.random.set_seed(0)
# input: [batch, height, width, channels]
t = tf.random.normal([1, 5, 5, 3])
# filters: [filter_height, filter_width, in_channels, out_channels]
filters = tf.random.normal([3, 3, 3, 2])
res = tf.nn.conv2d(t, filters, strides=[1, 1, 1, 1], padding='SAME')
print(res.shape)
Результат выполнения кода:
(1, 5, 5, 2)
Пример
Давайте применим свертку с шагом 2,
чтобы уменьшить пространственные размеры вдвое:
import tensorflow as tf
t = tf.constant([[[[1], [2], [3], [4]],
[[5], [6], [7], [8]],
[[9], [10], [11], [12]],
[[13], [14], [15], [16]]]], dtype=tf.float32)
filters = tf.constant([[[[1]], [[1]]], [[[1]], [[1]]]], dtype=tf.float32)
res = tf.nn.conv2d(t, filters, strides=[1, 2, 2, 1], padding='VALID')
print(res.shape)
Результат выполнения кода:
(1, 2, 2, 1)
Смотрите также
-
функцию
conv1d,
которая выполняет одномерную свертку -
функцию
conv3d,
которая выполняет трехмерную свертку -
функцию
conv2d_transpose,
которая выполняет транспонированную свертку -
функцию
depthwise_conv2d,
которая выполняет глубинную свертку