Pomocí AveragePooling2D místo GlobalAveragePooling 2D nahradit Hustých vrstev po FCN pro klasifikaci

0

Otázka

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??

deep-learning keras tensorflow
2021-11-22 13:35:20
2

Nejlepší odpověď

2

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)
2021-11-22 14:51:04

'x = Input(tvar=(128,128,3))' po mnoha FCN vrstev jsem si : 'a = Conv2D(200 ,(1,1), odsazení = "stejné", aktivace='softmax', data_format = 'channels_last')(output_of_the_layer_before)' je poslední konvoluční vrstva pak jsem si 'b = Lambda(lambda x: squeeze(x, osy=2))(AveragePooling2D(pool_size=(1, 128)) ()
DSPinterested

To funguje naprosto v pořádku pro konkrétní úkol, co mám, což mě přivedlo k myšlence, že pomocí GlobalaveragePooling2D nemusí být jedinou možností pro nahrazení hustých vrstev... také s GlobalAveragePooling2D máte možnost 'keepdims= True "nebo" keepdims= False' , neumí sdílet svůj kód, doufám, že to dávalo smysl pro vás
DSPinterested

Ano, dává mi to smysl.. ale co přesně je vaše otázka teď, nebo co nechápeš?
AloneTogether

Jak pomocí AveragePooling2D vrstvy, jako je popsáno výše, vede k téměř stejným výsledkům klasifikace jako GlobalAveragePooling2D! Obvykle se v literatuře jsem téměř vždy viděl GlobalAveragePooling2D jako náhrada za Hustých vrstev v FCN, ale nikdy jsem neviděl AveragePooling2D používán namísto Husté vrstvy
DSPinterested

Aktualizováno odpověď, ale nemohl reprodukovat kód, který jste přidali v komentářích.. prosím aktualizujte svou otázku s příslušným kódem, výsledek, a vaše otázka.
AloneTogether

Globální průměrná sdružování není nic zvláštního. Můžete použít průměrné sdružování s filtrem velikost se rovná velikosti vstupu a platné polstrování, pak je to přesně to samé. Dalo by se dokonce použít funkce, jako je 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...
xdurch0

@xdurch0 , dává smysl!
DSPinterested
0

Přidání k odpovědi výše, globální průměrná sdružování může být použit pro přijetí variabilní velikost obrázků jako vstupy. Pokud je vstupní tvar, než globální sdílení je (N,H,W,C) pak výstup bude (N,1,1,C) pro keras, když keepdims=True. To je výstup z obrázků s různými (H,W) vyrobit podobný tvar výstupů.

Odkazy:

2021-11-22 13:59:40

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................