¿Puedo usar un AveragePooling2D capa con la pool_size igual al tamaño de la función de mapa en lugar de un GlobalAveragePooling2D capa? el propósito de esto es para sustituir una densa capa después de un FCN. ES GlobalAveragePooling2D un caso especial de AveragePooling2D??
GlobalAveragePooling2D
le baje la frecuencia de entrada al tomar el valor promedio a lo largo de las dimensiones espaciales y el retorno de una 1D salida por defecto, a menos que establezca keepdims= True
. AveragePooling2D
también downsamples una entrada, pero se toma el valor promedio a través de una ventana de entrada de datos definidos por el pool_size
parámetro. Así, devolverá una salida de 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)
Usted probablemente tendrá que acoplar a su salida de la AveragePooling2D
capa si queremos alimentar a una Dense
capa después:
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)
Si ese no es el caso, usted puede simplemente dejarlo como está.
Actualización: GlobalAveragePooling2D
y AveragePooling2D
a veces puede comportarse de manera similar si el ajuste de la strides
y pool_size
los parámetros de acuerdo a:
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)
O
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
. La razón por la que nadie hace esto es que es el camino más fácil para el uso global de la agrupación directamente...