Comment comprendre le format d'entrée et de sortie de LSTM

1. Définir la structure LSTM

bilstm = nn.LSTM(input_size=10, hidden_size=20, num_layers=2, bidirectional=True)

Définissez un LSTM bidirectionnel à deux couches avec une taille d'entrée de 10 et une taille masquée de 20.
Remarque: Une fois la structure de LSTM définie, la taille d'entrée, la taille cachée et les couches numériques sous le même programme doivent être les mêmes qu'ici.

2. Format d'entrée

Documentation officielle:
Insérez la description de l'image ici

input = torch.randn(5, 3, 10)#(seq_len, batch, input_size)

(1) Si les données à saisir sont des données unidimensionnelles, alors:
seq_lenIndique la quantité de données entrées pour chaque lot
lotIndique que les données sont divisées en lots
taille_entréeÀ l'heure actuelle, il est de 1
Par exemple:
nous avons des données de données originales = 1,2,3,4,5,6,7,8,9,10 un total de 10 échantillons, puis ces données seront placées dans LSTM pour le traitement, Avant le traitement, nous devons transformer le formulaire de données. Tout d'abord, nous avons défini seq_len sur 3, puis le formulaire de données à ce moment est:
1-2-3, 2-3-4, 3-4-5, 4-5- 6, 5-6-7, 6-7-8, 7-8-9, 8-9-10, 9-10-0, 10-0-0 (les deux dernières données sont incomplètes, un remplissage nul est effectué)

Définissez ensuite batch_size sur 2.
Ensuite, nous sortons le premier lot comme 1-2-3, 2-3-4. La taille de ce lot est (2, 3, 1). Nous introduisons ces éléments dans le modèle.
Le lot suivant est 3-4-5, 4-5-6.
Le troisième lot est 5-6-7, 6-7-8.
Le quatrième lot est le 7-8-9, 8-9-10.
Le cinquième lot est 9-10-0, 10-0-0. Un total de 5 lots a été généré dans nos données.

(2) Si les données à saisir sont des données bidimensionnelles
seq_lenIndique la quantité de données entrées pour chaque lot
lotIndique que les données sont divisées en lots
taille_entréeLa longueur du vecteur attribut représentant chaque donnée

Par exemple:

data_ = [[1, 10, 11, 15, 9, 100],
         [2, 11, 12, 16, 9, 100],
         [3, 12, 13, 17, 9, 100],
         [4, 13, 14, 18, 9, 100],
         [5, 14, 15, 19, 9, 100],
         [6, 15, 16, 10, 9, 100],
         [7, 15, 16, 10, 9, 100],
         [8, 15, 16, 10, 9, 100],
         [9, 15, 16, 10, 9, 100],
         [10, 15, 16, 10, 9, 100]]

seq_len = 3, batch = 2, input_size = 6,
alors notre premier batch est:

tensor([[[  1.,  10.,  11.,  15.,   9., 100.],
         [  2.,  11.,  12.,  16.,   9., 100.],
         [  3.,  12.,  13.,  17.,   9., 100.]],
 
        [[  2.,  11.,  12.,  16.,   9., 100.],
         [  3.,  12.,  13.,  17.,   9., 100.],
         [  4.,  13.,  14.,  18.,   9., 100.]]])

Le dernier lot est:

tensor([[[  9.,  15.,  16.,  10.,   9., 100.],
         [ 10.,  15.,  16.,  10.,   9., 100.],
         [  0.,   0.,   0.,   0.,   0.,   0.]],
 
        [[ 10.,  15.,  16.,  10.,   9., 100.],
         [  0.,   0.,   0.,   0.,   0.,   0.],
         [  0.,   0.,   0.,   0.,   0.,   0.]]])

3. Format de sortie

Documentation officielle:
Insérez la description de l'image iciNotes :
\balle productionLa forme est (seq_len, batch, num_directions * hidden_size): ce tenseur contient les caractéristiques de sortie (h_t) de chaque cycle de la dernière couche de LSTM. S'il s'agit d'un LSTM bidirectionnel, la sortie de chaque pas de temps h = [h avant, h arrière] (les h avant et arrière du même pas de temps sont connectés)
\balle h_nChaque couche est enregistrée avec la sortie h du dernier pas de temps. S'il s'agit d'un LSTM bidirectionnel, la sortie h du dernier pas de temps des directions avant et arrière est enregistrée séparément.
\balle c_nIdentique à h_n, sauf qu'il enregistre la valeur de c

Analyse :
\balle productionEst un tenseur tridimensionnel, la première dimension représente la longueur de la séquence, la deuxième dimension représente un lot d'échantillons (lot), la troisième dimension est hidden_size (taille de couche cachée) * num_directions, où num_directions est basé sur le fait qu'il soit "bidirectionnel" Est 1 ou 2. Par conséquent, nous pouvons savoir que la taille de la troisième dimension de la sortie change selon qu'elle est bidirectionnelle. Si elle n'est pas bidirectionnelle, la troisième dimension est égale à la taille de la couche cachée que nous définissons; si elle est bidirectionnelle, la taille de la troisième dimension est égale à 2 fois La taille du calque masqué.

\balle h_nEst un tenseur tridimensionnel, la première dimension est num_layers num_directions, num_layers est le nombre de couches du réseau neuronal que nous avons défini, num_directions a été introduit ci-dessus, la valeur est 1 ou 2, indiquant s'il s'agit d'un LSTM bidirectionnel. La deuxième dimension représente la taille du lot d'un lot. La troisième dimension représente la taille de la couche cachée. La première dimension est celle où h_n est difficile à comprendre. Tout d'abord, nous définissons le LSTM actuel comme un LSTM unidirectionnel, puis la taille de la première dimension est num_layers, qui représente la sortie du dernier pas de temps de la nième couche. S'il s'agit d'un LSTM bidirectionnel, la taille de la première dimension est de 2 * num_layers, à ce moment, la dimension représente toujours la sortie du dernier pas de temps de chaque couche, et la sortie du dernier pas de temps est utilisée dans les opérations avant et arrière. Une de cette dimension.
Par exemple: nous définissons un LSTM bidirectionnel avec num_layers = 3, la taille de la première dimension de h_n est égale à 6 (2
3), h_n [0] signifie la sortie du dernier pas de temps de la propagation vers l'avant de la première couche, h_n [1 ] Représente la sortie du dernier pas de temps de la propagation vers l'arrière de la première couche, h_n [2] représente la sortie du dernier pas de temps de la propagation vers l'avant de la deuxième couche, h_n [3] représente la sortie du dernier pas de temps de la propagation vers l'arrière de la deuxième couche , H_n [4] et h_n [5] représentent respectivement la sortie du dernier pas de temps de la troisième couche de propagation avant et arrière.

\balle c_nLa structure est la même que celle de h_n, elle ne sera donc pas répétée ici.

4. Compréhension de certains paramètres

\balle seq_lenLa taille_entrée ici sera utilisée lors de la description d'un mot ou d'une donnée, afin que le mot ou les données puissent être plus facilement compris par la machine
\balle lot Le traitement par lots se réfère ici à la mise à jour des paramètres après chaque lot de formation. Si les données ne sont pas divisées en lots pour mettre à jour les données mais les mettre à jour une par une, le montant du calcul est trop grand et le temps est trop long. Si les paramètres sont mis à jour une fois le calcul terminé Finalement, l'erreur sera plus importante.

5. Énumérez ensemble

input(seq_len,batch,input_size)
rnn = torch.nn.LSTM(input_size,hidden_size,num_layers)
h0(num_layers*num_directions,batch,hidden_size)
c0(num_layers*num_directions,batch,hidden_size)
output(seq_len,batch,num_direction*hidden_size)
hn(num_layers*num_directions,batch,hidden_size)
cn(num_layers*num_directions,batch,hidden_size)

pytorch document officiel LSTM .
comprendre le format d'entrée
interpréter le format de sortie

Publié 41 articles originaux · loué 13 · visites 6692

Je suppose que tu aimes

Origine blog.csdn.net/comli_cn/article/details/105275827
conseillé
Classement