Utilizzando AveragePooling2D invece di GlobalAveragePooling 2D per sostituire i Densi strati dopo un FCN per la classificazione

0

Domanda

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

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

Migliore risposta

2

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

'x = Input(forma=(128,128,3))" dopo tanti più FCN strati ricevo a : 'a = Conv2D(200 ,(1,1), padding = 'stesso' , l'attivazione='softmax', data_format = 'channels_last')(output_of_the_layer_before)' è l'ultima convolutional livello e poi mi do 'b = Lambda(lambda x: squeeze(x, asse=2))(AveragePooling2D(pool_size=(1, 128))(a)
DSPinterested

Questo funziona bene per il compito specifico che ho, che mi chiedo che utilizza GlobalaveragePooling2D potrebbe non essere l'unica opzione disponibile per la sostituzione densi strati... anche con GlobalAveragePooling2D hai l'opzione di 'keepdims= True' o 'keepdims= False' , non possono condividere il mio codice, spero che questo ha un senso per voi
DSPinterested

Sì, ha senso per me.. ma che cosa è esattamente la tua domanda o la cosa non vi fa capire?
AloneTogether

Come utilizzando il AveragePooling2D strato come sopra descritto porta a quasi gli stessi risultati di classificazione come GlobalAveragePooling2D! Di solito in letteratura ho quasi sempre visto GlobalAveragePooling2D come una sostituzione per i Densi strati in FCN ma non ha mai visto AveragePooling2D utilizzato invece di un Denso strato
DSPinterested

Aggiornato risposta, ma non poteva riprodurre il codice che hai aggiunto nei commenti.. si prega di aggiornare la tua domanda con il relativo codice, il risultato, e la tua domanda.
AloneTogether

Global media pool è niente di speciale. È possibile utilizzare media pool con filtro di dimensione uguale alla dimensione di input e valido imbottitura, quindi è esattamente la stessa cosa. Si potrebbe anche utilizzare funzioni come tf.reduce_mean. Il motivo nessuno fa questo è che è solo il modo più facile utilizzare globale pooling direttamente...
xdurch0

@xdurch0 , ha un senso!
DSPinterested
0

Aggiunta alla risposta di cui sopra, globale media pool può essere utilizzato per l'assunzione di dimensione variabile immagini come input. Se l'input prima forma globale pool (N,H,W,C) allora l'uscita sarà (N,1,1,C) per keras quando keepdims=True. Questo rende l'output di immagini con diverse (H,W) produrre forma simile uscite.

Riferimenti:

2021-11-22 13:59:40

In altre lingue

Questa pagina è in altre lingue

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