Функция nn.atrous_conv2d
Функция nn.atrous_conv2d применяет
двумерный фильтр к входному тензору
с заданным шагом дилатации. Первым параметром
передается входной тензор формы
[batch, height, width, channels].
Вторым параметром передается фильтр формы
[filter_height, filter_width, in_channels, out_channels].
Третьим параметром задается коэффициент
дилатации rate. Четвертым - тип
паддинга padding. Пятым - шаг свертки
strides.
Синтаксис
tf.nn.atrous_conv2d(value, filters, rate, padding, [strides])
Пример
Давайте выполним атроусную свертку над
входным тензором с коэффициентом дилатации
2 и паддингом SAME:
import tensorflow as tf
# input tensor: batch=1, height=5, width=5, channels=1
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], [19.0], [20.0]],
[[21.0], [22.0], [23.0], [24.0], [25.0]]]])
# filter: height=3, width=3, in_channels=1, out_channels=1
filters = tf.constant([[[[1.0]], [[0.0]], [[-1.0]]],
[[[1.0]], [[0.0]], [[-1.0]]],
[[[1.0]], [[0.0]], [[-1.0]]]])
res = tf.nn.atrous_conv2d(t, filters, rate=2, padding='SAME')
print(res)
Результат выполнения кода:
tf.Tensor(
[[[[-12.]
[-18.]
[-18.]
[-18.]
[-12.]]
[[-42.]
[-48.]
[-48.]
[-48.]
[-42.]]
[[-42.]
[-48.]
[-48.]
[-48.]
[-42.]]
[[-42.]
[-48.]
[-48.]
[-48.]
[-42.]]
[[-12.]
[-18.]
[-18.]
[-18.]
[-12.]]]], shape=(1, 5, 5, 1), dtype=float32)
Пример
Давайте выполним атроусную свертку
с паддингом VALID и другим фильтром:
import tensorflow as tf
# input tensor: batch=1, height=7, width=7, channels=1
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], [19.0], [20.0], [21.0]],
[[22.0], [23.0], [24.0], [25.0], [26.0], [27.0], [28.0]],
[[29.0], [30.0], [31.0], [32.0], [33.0], [34.0], [35.0]],
[[36.0], [37.0], [38.0], [39.0], [40.0], [41.0], [42.0]],
[[43.0], [44.0], [45.0], [46.0], [47.0], [48.0], [49.0]]]])
# filter: height=3, width=3, in_channels=1, out_channels=1
filters = tf.constant([[[[1.0]], [[1.0]], [[1.0]]],
[[[1.0]], [[1.0]], [[1.0]]],
[[[1.0]], [[1.0]], [[1.0]]]])
res = tf.nn.atrous_conv2d(t, filters, rate=1, padding='VALID')
print(res)
Результат выполнения кода:
tf.Tensor(
[[[[117.]
[126.]
[135.]
[144.]
[153.]]
[[162.]
[171.]
[180.]
[189.]
[198.]]
[[207.]
[216.]
[225.]
[234.]
[243.]]
[[252.]
[261.]
[270.]
[279.]
[288.]]
[[297.]
[306.]
[315.]
[324.]
[333.]]]], shape=(1, 5, 5, 1), dtype=float32)
Пример
Давайте выполним атроусную свертку с несколькими выходными каналами:
import tensorflow as tf
# input tensor: batch=1, height=5, width=5, channels=1
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], [19.0], [20.0]],
[[21.0], [22.0], [23.0], [24.0], [25.0]]]])
# filter: height=2, width=2, in_channels=1, out_channels=2
filters = tf.constant([[[[1.0, 0.5]], [[-1.0, 0.5]]],
[[[1.0, -0.5]], [[-1.0, -0.5]]]])
res = tf.nn.atrous_conv2d(t, filters, rate=1, padding='VALID')
print(res)
Результат выполнения кода:
tf.Tensor(
[[[[ 0. 19. ]
[ 0. 21. ]
[ 0. 23. ]
[ 0. 25. ]]
[[ 0. 39. ]
[ 0. 41. ]
[ 0. 43. ]
[ 0. 45. ]]
[[ 0. 59. ]
[ 0. 61. ]
[ 0. 63. ]
[ 0. 65. ]]
[[ 0. 79. ]
[ 0. 81. ]
[ 0. 83. ]
[ 0. 85. ]]]], shape=(1, 4, 4, 2), dtype=float32)
Смотрите также
-
функцию
conv2d,
которая выполняет обычную двумерную свертку -
функцию
dilation2d,
которая выполняет морфологическую дилатацию -
функцию
depthwise_conv2d,
которая выполняет глубинную свертку -
функцию
separable_conv2d,
которая выполняет разделяемую свертку