Могу ли я использовать слой AveragePooling2D с размером пула, равным размеру карты объектов, вместо слоя GlobalAveragePooling2D? цель этого состоит в том, чтобы заменить плотный слой после FCN. ЯВЛЯЕТСЯ ли GlobalAveragePooling2D частным случаем AveragePooling2D??
GlobalAveragePooling2D
будет уменьшена выборка входных данных, взяв среднее значение по пространственным размерам, и по умолчанию вернет 1D-вывод, если вы не зададите keepdims= True
. AveragePooling2D
также уменьшает входные данные, но принимает среднее значение по окну ввода, определяемому pool_size
параметр. Таким образом, он вернет 3D-вывод:
import tensorflow as tf
x = tf.constant([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
x = tf.reshape(x, [1, 3, 3, 1]) # Add batch dimension
avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(2, 2),
strides=(1, 1), padding='valid')
avg_global_2d = tf.keras.layers.GlobalAveragePooling2D()
print(avg_pool_2d(x).shape)
print(avg_global_2d(x).shape)
(1, 2, 2, 1)
(1, 1)
Вам, вероятно, придется выровнять свой вывод из AveragePooling2D
слой, если вы хотите передать его в Dense
слой после этого:
import tensorflow as tf
x = tf.constant([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
x = tf.reshape(x, [1, 3, 3, 1]) # Add batch dimension
avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(2, 2),
strides=(1, 1), padding='valid')
avg_global_2d = tf.keras.layers.GlobalAveragePooling2D()
print(tf.keras.layers.Flatten()(avg_pool_2d(x)).shape)
print(avg_global_2d(x).shape)
(1, 4)
(1, 1)
Если это не так, вы можете просто оставить все как есть.
Обновить: GlobalAveragePooling2D
и AveragePooling2D
иногда может вести себя аналогично, если вы отрегулируете strides
и pool_size
параметры соответственно:
import tensorflow as tf
x = tf.constant([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
x = tf.reshape(x, [1, 3, 3, 1]) # Add batch dimension
avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(2, 2),
strides=(3, 3), padding='valid')
avg_global_2d = tf.keras.layers.GlobalAveragePooling2D()
print(avg_pool_2d(x))
print(avg_global_2d(x))
tf.Tensor([[[[3.]]]], shape=(1, 1, 1, 1), dtype=float32)
tf.Tensor([[5.]], shape=(1, 1), dtype=float32)
Или
avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(3, 3),
strides=(2, 2), padding='valid')
avg_global_2d = tf.keras.layers.GlobalAveragePooling2D()
tf.Tensor([[[[5.]]]], shape=(1, 1, 1, 1), dtype=float32)
tf.Tensor([[5.]], shape=(1, 1), dtype=float32)
tf.reduce_mean
. Причина, по которой никто этого не делает, заключается в том, что гораздо проще напрямую использовать глобальный пул...