Quelle est la différence entre le rembourrage «SAME» et «VALID» tf.nn.max_pool
de tensorflow
?
À mon avis, «VALIDE» signifie qu'il n'y aura pas de remplissage nul en dehors des bords lorsque nous ferons la piscine maximale.
Selon Un guide de l'arithmétique de convolution pour l'apprentissage en profondeur , il indique qu'il n'y aura pas de remplissage dans l'opérateur de pool, c'est-à-dire qu'il suffit d'utiliser 'VALIDE' de tensorflow
. Mais qu'est-ce que le rembourrage «MÊME» de la piscine max tensorflow
?
python
tensorflow
deep-learning
karl_TUM
la source
la source
Réponses:
Je vais donner un exemple pour le rendre plus clair:
x
: image d'entrée de forme [2, 3], 1 canalvalid_pad
: pool max avec noyau 2x2, foulée 2 et rembourrage VALIDE.same_pad
: pool max avec noyau 2x2, foulée 2 et même rembourrage (c'est la façon classique de procéder)Les formes de sortie sont:
valid_pad
: ici, pas de remplissage donc la forme de sortie est [1, 1]same_pad
: ici, nous remplissons l'image à la forme [2, 4] (avec-inf
puis appliquons le pool max), donc la forme de sortie est [1, 2]la source
Si vous aimez l'art ascii:
"VALID"
= sans rembourrage:"SAME"
= sans remplissage:Dans cet exemple:
Remarques:
"VALID"
ne supprime que les colonnes les plus à droite (ou les lignes les plus basses)."SAME"
essaie de remplir uniformément à gauche et à droite, mais si le nombre de colonnes à ajouter est impair, il ajoutera la colonne supplémentaire à droite, comme c'est le cas dans cet exemple (la même logique s'applique verticalement: il peut y avoir une ligne supplémentaire de zéros en bas).Modifier :
À propos du nom:
"SAME"
remplissage, si vous utilisez une foulée de 1, les sorties du calque auront les mêmes dimensions spatiales que ses entrées."VALID"
rembourrage, il n'y a pas d'entrées de remplissage «composées». La couche utilise uniquement des données d'entrée valides .la source
-inf
.Quand
stride
est 1 (plus typique avec convolution que regroupement), on peut penser à la distinction suivante:"SAME"
: la taille de sortie est la même que la taille d'entrée. Cela nécessite que la fenêtre de filtre glisse en dehors de la carte d'entrée, d'où la nécessité de remplir."VALID"
: La fenêtre de filtre reste à une position valide dans la carte d'entrée, donc la taille de sortie diminuefilter_size - 1
. Aucun rembourrage ne se produit.la source
SAME
etVALID
aurait aussi bien pu être appeléfoo
etbar
L' exemple de convolution TensorFlow donne un aperçu de la différence entre
SAME
etVALID
:Pour le
SAME
rembourrage, la hauteur et la largeur de sortie sont calculées comme suit:Et
Pour le
VALID
rembourrage, la hauteur et la largeur de sortie sont calculées comme suit:la source
Le remplissage est une opération pour augmenter la taille des données d'entrée. Dans le cas de données à 1 dimension, vous ajoutez / ajoutez simplement le tableau avec une constante, en 2-dim vous entourez la matrice avec ces constantes. Dans n-dim, vous entourez votre hypercube n-dim de la constante. Dans la plupart des cas, cette constante est nulle et elle est appelée remplissage nul.
Voici un exemple de remplissage nul avec un
p=1
tenseur 2D appliqué:Vous pouvez utiliser un remplissage arbitraire pour votre noyau, mais certaines des valeurs de remplissage sont utilisées plus fréquemment que d'autres:
k
k
, ce remplissage est égal àk - 1
.Pour utiliser un remplissage arbitraire dans TF, vous pouvez utiliser
tf.pad()
la source
Explication rapide
VALID
: N'appliquez aucun remplissage, c'est-à-dire, supposez que toutes les dimensions sont valides afin que l'image d'entrée soit entièrement couverte par le filtre et la foulée que vous avez spécifiés.SAME
: Appliquez un remplissage à l'entrée (si nécessaire) afin que l'image d'entrée soit entièrement couverte par le filtre et la foulée que vous avez spécifiés. Pour la foulée 1, cela garantira que la taille de l'image de sortie est identique à celle de l'entrée.Remarques
NO_PADDING
place.AUTO_PADDING
place.SAME
(c'est-à-dire en mode auto-pad), Tensorflow essaiera de répartir le rembourrage uniformément à gauche et à droite.VALID
(c'est-à-dire sans mode de remplissage), Tensorflow supprimera les cellules de droite et / ou de bas si votre filtre et votre foulée ne couvrent pas complètement l'image d'entrée.la source
Je cite cette réponse des documents officiels de tensorflow https://www.tensorflow.org/api_guides/python/nn#Convolution Pour le rembourrage 'SAME', la hauteur et la largeur de sortie sont calculées comme suit:
et le rembourrage en haut et à gauche sont calculés comme:
Pour le rembourrage «VALIDE», la hauteur et la largeur de sortie sont calculées comme suit:
et les valeurs de remplissage sont toujours nulles.
la source
Il y a trois choix de rembourrage: valide (pas de rembourrage), identique (ou demi), complet. Vous pouvez trouver des explications (dans Theano) ici: http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html
Le remplissage valide n'implique aucun remplissage nul, il ne couvre donc que l'entrée valide, sans inclure les zéros générés artificiellement. La longueur de sortie est ((la longueur d'entrée) - (k-1)) pour la taille du noyau k si la foulée s = 1.
Le même rembourrage rend la taille des sorties identique à celle des entrées lorsque s = 1. Si s = 1, le nombre de zéros remplis est (k-1).
Le remplissage complet signifie que le noyau s'exécute sur toutes les entrées, donc à la fin, le noyau peut rencontrer la seule entrée et des zéros. Le nombre de zéros remplis est 2 (k-1) si s = 1. La longueur de sortie est ((la longueur d'entrée) + (k-1)) si s = 1.
Par conséquent, le nombre de rembourrages: (valide) <= (identique) <= (complet)
la source
Rembourrage activé / désactivé. Détermine la taille effective de votre entrée.
VALID:
Pas de rembourrage. Les opérations de convolution, etc. ne sont effectuées qu'aux emplacements qui sont "valides", c'est-à-dire pas trop près des frontières de votre tenseur.Avec un noyau de 3x3 et une image de 10x10, vous effectuez une convolution sur la zone 8x8 à l'intérieur des bordures.
SAME:
Le rembourrage est fourni. Chaque fois que votre opération fait référence à un voisinage (quelle que soit sa taille), des valeurs nulles sont fournies lorsque ce voisinage s'étend en dehors du tenseur d'origine pour permettre à cette opération de fonctionner également sur les valeurs de bordure.Avec un noyau de 3x3 et une image de 10x10, vous effectuez une convolution sur toute la zone 10x10.
la source
Rembourrage VALIDE : c'est avec un remplissage nul. J'espère qu'il n'y a pas de confusion.
MÊME rembourrage: c'est un peu délicat à comprendre en premier lieu car nous devons considérer deux conditions séparément, comme mentionné dans les documents officiels .
Prenons entrée as , sortie as , padding as , stride as et kernel size as (une seule dimension est prise en compte)
Cas 01 ::
Cas 02 ::
est calculé de telle sorte que la valeur minimale qui peut être prise pour le rembourrage. Puisque la valeur de est connue, la valeur de peut être trouvée en utilisant cette formule .
Voyons cet exemple:
Ici, la dimension de x est (3,4). Alors si la direction horizontale est prise (3):
Si la direction verticale est prise (4):
J'espère que cela vous aidera à comprendre comment fonctionne réellement le même rembourrage dans TF.
la source
Sur la base de l'explication ici et du suivi de la réponse de Tristan, j'utilise généralement ces fonctions rapides pour les contrôles de santé mentale.
la source
En résumé, un remplissage «valide» signifie qu'il n'y a pas de remplissage. La taille de sortie de la couche convolutionnelle diminue en fonction de la taille d'entrée et de la taille du noyau.
Au contraire, un même rembourrage signifie utiliser un rembourrage. Lorsque la foulée est définie sur 1, la taille de sortie de la couche convolutionnelle reste la taille d'entrée en ajoutant un certain nombre de `` bord 0 '' autour des données d'entrée lors du calcul de la convolution.
J'espère que cette description intuitive vous aidera.
la source
Ici, W et H sont la largeur et la hauteur de l'entrée, F les dimensions du filtre, P la taille de remplissage (c'est-à-dire le nombre de lignes ou de colonnes à remplir)
Pour le même rembourrage:
Pour un rembourrage VALIDE:
la source
En complément de l'excellente réponse d'YvesgereY, j'ai trouvé cette visualisation extrêmement utile:
Rembourrage ' valide » est le premier chiffre. La fenêtre du filtre reste à l'intérieur de l'image.
Le rembourrage « identique » est le troisième chiffre. La sortie est de la même taille.
Trouvé sur cet article .
la source
Réponse compatible avec Tensorflow 2.0 : Des explications détaillées ont été fournies ci-dessus, concernant le remplissage "valide" et "identique".
Cependant, je spécifierai différentes fonctions de regroupement et leurs commandes respectives dans
Tensorflow 2.x (>= 2.0)
, pour le bénéfice de la communauté.Fonctions en 1.x :
tf.nn.max_pool
tf.keras.layers.MaxPool2D
Average Pooling => None in tf.nn, tf.keras.layers.AveragePooling2D
Fonctions en 2.x :
tf.nn.max_pool
si utilisé dans 2.x ettf.compat.v1.nn.max_pool_v2
outf.compat.v2.nn.max_pool
, si migré de 1.x vers 2.x.tf.keras.layers.MaxPool2D
si utilisé dans 2.x ettf.compat.v1.keras.layers.MaxPool2D
outf.compat.v1.keras.layers.MaxPooling2D
outf.compat.v2.keras.layers.MaxPool2D
outf.compat.v2.keras.layers.MaxPooling2D
, en cas de migration de 1.x vers 2.x.Average Pooling => tf.nn.avg_pool2d
outf.keras.layers.AveragePooling2D
si utilisé dans TF 2.x ettf.compat.v1.nn.avg_pool_v2
outf.compat.v2.nn.avg_pool
outf.compat.v1.keras.layers.AveragePooling2D
outf.compat.v1.keras.layers.AvgPool2D
outf.compat.v2.keras.layers.AveragePooling2D
outf.compat.v2.keras.layers.AvgPool2D
, en cas de migration de 1.x vers 2.x.Pour plus d'informations sur la migration de Tensorflow 1.x vers 2.x, veuillez consulter ce guide de migration .
la source