Posso utilizzare un AveragePooling2D strato con la pool_size uguale alla dimensione della funzionalità della mappa invece di un GlobalAveragePooling2D strato? lo scopo di questo è quello di sostituire un denso strato dopo un FCN. È GlobalAveragePooling2D un caso speciale di AveragePooling2D??
GlobalAveragePooling2D
sarà il downsampling un ingresso dalla media del valore lungo la dimensione spaziale e restituire una 1D uscita per impostazione predefinita, a meno che non si imposta keepdims= True
. AveragePooling2D
inoltre riduci un input, ma assume il valore medio su una finestra di immissione definiti dal pool_size
parametro. Così, restituirà un output 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)
Probabilmente si dovrà appiattire la vostra uscita dal AveragePooling2D
il livello se si desidera che il cibo per un Dense
strato dopo:
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 questo non è il caso si può semplicemente lasciare così com'è.
Aggiornamento: GlobalAveragePooling2D
e AveragePooling2D
può, a volte, si comportano allo stesso modo, se si regola il strides
e pool_size
parametri di conseguenza:
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
. Il motivo nessuno fa questo è che è solo il modo più facile utilizzare globale pooling direttamente...