À l'aide de AveragePooling2D au lieu de GlobalAveragePooling 2D, afin de remplacer les couches Denses après une FCN pour la classification

0

La question

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

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

La meilleure réponse

2

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

'x = Input(forme=(128,128,3))" après beaucoup plus FCN couches-je obtenir pour : 'a = Conv2D(200 ,(1,1), padding = 'même' , l'activation='softmax', data_format = 'channels_last')(output_of_the_layer_before) " la dernière convolutifs couche puis-je faire 'b = Lambda(lambda x: squeeze(x, axe=2))(AveragePooling2D(pool_size=(1, 128))(a)
DSPinterested

Cela fonctionne parfaitement bien pour la tâche que j'ai, et qui m'a fait me demander que l'utilisation de GlobalaveragePooling2D pourrait ne pas être la seule option disponible pour remplacer les couches denses... avec GlobalAveragePooling2D vous avez l'option de "keepdims= True' ou 'keepdims= False' , ne peut pas partager mon code, j'espère que cela fait sens pour vous
DSPinterested

Oui, il fait sens pour moi.. mais quelle est exactement votre question maintenant, ou ce que n'êtes-vous pas comprendre?
AloneTogether

Comment à l'aide de la AveragePooling2D couche comme décrit ci-dessus conduit à presque les mêmes résultats de la classification en tant que GlobalAveragePooling2D! Habituellement dans la littérature, j'ai presque toujours vu GlobalAveragePooling2D comme un remplacement pour les couches Denses dans le RÉSEAU, mais n'a jamais vu AveragePooling2D être utilisé à la place d'une couche Dense
DSPinterested

Mise à jour de réponse, mais ne pouvait pas reproduire le code que vous avez ajouté dans les commentaires.. s'il vous plaît mettre à jour votre question avec le code, le résultat, et votre question.
AloneTogether

Moyenne globale de mutualisation est rien de spécial. Vous pouvez utiliser le moyen de mise en commun avec filtre de taille égale à la taille d'entrée et valide rembourrage, alors c'est exactement la même. Vous pouvez même utiliser des fonctions comme tf.reduce_mean. La raison personne ne dit c'est que c'est tout simplement plus facile à utiliser la mise en commun directement...
xdurch0

@xdurch0 , de bon sens!
DSPinterested
0

Pour ajouter à la réponse ci-dessus, la moyenne mondiale de mise en commun peut être utilisé pour prendre des variable de la taille des images comme des entrées. Si l'entrée de la forme avant le mondial de la mise en commun est (N,H,W,C) alors la sortie sera (N,1,1,C) pour keras quand keepdims=True. Cela rend la sortie des images avec différentes (H,W) produire la même forme de sorties.

Références:

2021-11-22 13:59:40

Dans d'autres langues

Cette page est dans d'autres langues

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