Puis-je utiliser un AveragePooling2D couche avec le pool_size égale à la taille de la fonctionnalité de la carte au lieu d'un GlobalAveragePooling2D couche? le but est de remplacer une couche dense après une FCN. EST GlobalAveragePooling2D un cas particulier de AveragePooling2D??
GlobalAveragePooling2D
va sous-échantillonner une entrée en prenant la moyenne de la valeur le long de la dimensions spatiales et retour 1D de sortie par défaut, sauf si vous définissez keepdims= True
. AveragePooling2D
aussi downsamples une entrée, mais prend la valeur moyenne sur une fenêtre d'entrée définie par l' pool_size
le paramètre. Ainsi, il sera de retour d'une sortie 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)
Vous aurez probablement à aplatir votre sortie de l' AveragePooling2D
couche si vous voulez donnez à un Dense
couche aprè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 ce n'est pas le cas, vous pouvez simplement le laisser tel qu'il est.
Mise à jour: GlobalAveragePooling2D
et AveragePooling2D
peut parfois se comporter de la même manière si vous réglez la strides
et pool_size
les paramètres en conséquence:
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
. La raison personne ne dit c'est que c'est tout simplement plus facile à utiliser la mise en commun directement...