Môžem použiť k AveragePooling2D vrstva s pool_size rovná veľkosti extra mapu namiesto GlobalAveragePooling2D vrstvy? úlohou je nahradiť hustá vrstva po FCN. JE GlobalAveragePooling2D špeciálnym prípadom AveragePooling2D??
GlobalAveragePooling2D
bude prevzorkuje dole vstup, pričom priemerná hodnota spolu priestorových dimenzií, a vrátenie 1D výstup v predvolenom nastavení, ak nastavíte keepdims= True
. AveragePooling2D
aj downsamples vstup, ale berie priemerná hodnota za vstupné okno definovaná pool_size
parameter. Tak, to sa vráti na 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)
Budete pravdepodobne musieť vyrovnať váš výstup z AveragePooling2D
vrstva ak chcete kŕmiť ho na Dense
vrstva neskôr:
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)
Ak to nie je váš prípad, môžete nechať tak ako to je.
Aktualizácia: GlobalAveragePooling2D
a AveragePooling2D
niekedy sa správajú podobne, ak sa vám prispôsobí strides
a pool_size
parametre spôsobom:
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)
Alebo
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, nikto sa je to, že je to len spôsob, ako jednoduchšie použiť globálne združovania priamo...