Posso usar um AveragePooling2D camada com o pool_size igual ao tamanho do recurso de mapa em vez de um GlobalAveragePooling2D camada? o objetivo é substituir uma densa camada após uma FCN. É GlobalAveragePooling2D um caso especial de AveragePooling2D??
GlobalAveragePooling2D
vai downsample uma entrada tomando o valor médio ao longo das dimensões espaciais e retorno 1D saída por padrão, a menos que você defina keepdims= True
. AveragePooling2D
também fará o downsample uma entrada, mas toma o valor médio de uma janela de entrada definidos pelo pool_size
o parâmetro. Assim, ele vai retornar um 3D de saída:
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)
Provavelmente você vai ter para achatar a sua saída do AveragePooling2D
camada se você quer alimentá-lo para um Dense
a camada mais tarde:
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)
Se não for esse o caso, você pode deixar como está.
Atualização: GlobalAveragePooling2D
e AveragePooling2D
por vezes, pode comportar-se da mesma forma, se você ajustar o strides
e pool_size
parâmetros de acordo:
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)
Ou
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
. A razão, ninguém faz isso é que é apenas a maneira mais fácil de uso global do agrupamento diretamente...