web-dev-qa-db-fra.com

Comment comprendre SpatialDropout1D et quand l'utiliser?

Parfois, je vois que certains modèles utilisent SpatialDropout1D au lieu de Dropout. Par exemple, dans la partie du réseau neuronal de balisage vocal, ils utilisent:

model = Sequential()
model.add(Embedding(s_vocabsize, EMBED_SIZE,
                    input_length=MAX_SEQLEN))
model.add(SpatialDropout1D(0.2)) ##This
model.add(GRU(HIDDEN_SIZE, dropout=0.2, recurrent_dropout=0.2))
model.add(RepeatVector(MAX_SEQLEN))
model.add(GRU(HIDDEN_SIZE, return_sequences=True))
model.add(TimeDistributed(Dense(t_vocabsize)))
model.add(Activation("softmax"))

Selon la documentation de Keras, il est dit:

Cette version remplit la même fonction que Dropout, mais elle supprime des cartes d'entités 1D entières au lieu d'éléments individuels.

Cependant, je ne parviens pas à comprendre la signification de la fonction d'entrée 1D . Plus précisément, je ne parviens pas à visualiser SpatialDropout1D dans le même modèle expliqué dans quora . Quelqu'un peut-il expliquer ce concept en utilisant le même modèle que dans quora?

De plus, dans quelle situation nous utiliserons SpatialDropout1D au lieu de Dropout?

23
Raven Cheuk

La forme du bruit

Pour comprendre SpatialDropout1D, Vous devez vous habituer à la notion de forme de bruit . Dans l'abandon de vanille ordinaire, chaque élément est conservé ou supprimé indépendamment. Par exemple, si le tenseur est [2, 2, 2], Chacun des 8 éléments peut être remis à zéro en fonction du tirage aléatoire (avec certaines probabilités de "têtes"); au total, il y aura 8 lancers de pièces indépendants et n'importe quel nombre de valeurs peut devenir nul, de 0 à 8.

Parfois, il faut faire plus que cela. Par exemple, il peut être nécessaire de déposer la tranche entière le long de l'axe 0. Le noise_shape Dans ce cas est [1, 2, 2] Et le décrochage n'implique que 4 lancers aléatoires indépendants. Le premier composant sera soit conservé ensemble, soit déposé ensemble. Le nombre d'éléments mis à zéro peut être 0, 2, 4, 6 Ou 8. Il ne peut pas s'agir de 1 Ou 5.

Une autre façon de voir cela est d'imaginer que le tenseur d'entrée est en fait [2, 2], Mais chaque valeur est en double précision (ou multi-précision). Au lieu de supprimer les octets au milieu, la couche supprime la valeur multi-octets complète.

Pourquoi est-ce utile?

L'exemple ci-dessus est juste à titre d'illustration et n'est pas courant dans les applications réelles. Un exemple plus réaliste est le suivant: shape(x) = [k, l, m, n] et noise_shape = [k, 1, 1, n]. Dans ce cas, chaque composant de lot et de canal sera conservé indépendamment, mais chaque ligne et colonne sera conservée ou non ensemble. En d'autres termes, le entier[l, m] carte des fonctionnalités sera soit conservé, soit supprimé.

Vous souhaiterez peut-être le faire pour tenir compte de la corrélation des pixels adjacents, en particulier dans les premières couches de convolution. En effet, vous voulez empêcher la co-adaptation des pixels avec ses voisins à travers les cartes d'entités et leur faire apprendre comme si aucune autre carte d'entités n'existe. C'est exactement ce que fait SpatialDropout2D: Il favorise l'indépendance entre les cartes d'entités.

SpatialDropout1D Est très similaire: étant donné shape(x) = [k, l, m] il utilise noise_shape = [k, 1, m] Et supprime des cartes d'entités 1-D entières.

Référence: Localisation efficace d'objets utilisant des réseaux convolutionnels par Jonathan Tompson et al.

15
Maxim

Pour faire simple, je voudrais tout d'abord noter que ce que l'on appelle les cartes d'entités (1D, 2D, etc.) sont nos canaux habituels. Regardons des exemples:

  1. Dropout(): Définissons l'entrée 2D: [[1, 1, 1], [2, 2, 2]]. Le décrochage considérera chaque élément indépendamment, et peut entraîner quelque chose comme [[1, 0, 1], [0, 2, 2]]

  2. SpatialDropout1D(): Dans ce cas, le résultat ressemblera à [[1, 0, 1], [2, 0, 2]]. Notez que le 2ème élément a été mis à zéro le long de tous canaux.

10
Dilshat