Функция fractional_max_pool
Функция fractional_max_pool применяется к четырехмерному тензору
и выполняет дробный максимальный пулинг. Первым параметром передается
входной тензор, вторым - список коэффициентов пулинга для каждого
измерения (обычно для высоты и ширины). Третьим параметром передается
размер окна пулинга. Функция возвращает кортеж из двух тензоров:
выходного тензора и тензора с индексами выбранных элементов.
Дробный пулинг позволяет использовать нецелые коэффициенты
уменьшения размерности, что дает более гибкий контроль над
выходной формой тензора.
Синтаксис
tf.nn.fractional_max_pool(
value,
pooling_ratio,
[ksize],
[pseudo_random],
[overlapping],
[deterministic],
[seed],
[name]
)
Пример
Давайте создадим четырехмерный тензор и применим к нему
дробный максимальный пулинг с коэффициентами 1.0, 1.5,
1.5, 1.0 и размером окна 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]]]])
res = tf.nn.fractional_max_pool(
t,
pooling_ratio=[1.0, 1.5, 1.5, 1.0],
ksize=2
)
print(res[0].shape)
print(res[0])
Результат выполнения кода:
(1, 3, 3, 1)
tf.Tensor(
[[[[ 1.]
[ 2.]
[ 3.]]
[[ 5.]
[ 6.]
[ 7.]]
[[ 9.]
[10.]
[11.]]]], shape=(1, 3, 3, 1), dtype=float32)
Пример
Давайте получим индексы выбранных элементов вместе с выходным тензором:
import tensorflow as tf
tf.random.set_seed(0)
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]]]])
res = tf.nn.fractional_max_pool(
t,
pooling_ratio=[1.0, 1.5, 1.5, 1.0],
ksize=2,
seed=0
)
output = res[0]
row_pooling_sequence = res[1]
col_pooling_sequence = res[2]
print(output.shape)
print(row_pooling_sequence)
print(col_pooling_sequence)
Результат выполнения кода:
(1, 3, 3, 1)
tf.Tensor([0 2 3], shape=(3,), dtype=int64)
tf.Tensor([0 2 3], shape=(3,), dtype=int64)
Пример
Давайте применим дробный пулинг с перекрывающимися окнами:
import tensorflow as tf
tf.random.set_seed(0)
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]]]])
res = tf.nn.fractional_max_pool(
t,
pooling_ratio=[1.0, 1.5, 1.5, 1.0],
ksize=2,
overlapping=True,
seed=0
)
print(res[0].shape)
print(res[0])
Результат выполнения кода:
(1, 3, 3, 1)
tf.Tensor(
[[[[ 2.]
[ 3.]
[ 4.]]
[[ 6.]
[ 7.]
[ 8.]]
[[10.]
[11.]
[12.]]]], shape=(1, 3, 3, 1), dtype=float32)