Mohu použít e AveragePooling2D vrstva s pool_size rovná velikosti funkce mapy místo GlobalAveragePooling2D vrstva? účelem je nahradit hustou vrstvu po FCN. JE GlobalAveragePooling2D zvláštní případ AveragePooling2D??
GlobalAveragePooling2D
bude převzorkovat vstupní tím, že průměrná hodnota podél prostorové dimenze a vrátit 1D výstup ve výchozím nastavení, pokud jste nenastavili keepdims= True
. AveragePooling2D
také downsamples vstup, ale bere průměrná hodnota za vstupní okno definované pool_size
parametr. Takže, to vrátí 3D výstup:
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)
Pravděpodobně budete muset srovnat svůj výstup z AveragePooling2D
vrstvu, pokud chcete krmit Dense
vrstva poté:
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)
Pokud to není váš případ, můžete jen nechat to, jak to je.
Aktualizace: GlobalAveragePooling2D
a AveragePooling2D
někdy může chovat podobně, pokud jste nastavit strides
a pool_size
parametry:
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)
Nebo
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
. Důvod, proč tohle nikdo nedělá, že je to jen způsob, jak jednodušší použít globální sdílení přímo...