2016-06-28 79 views
5

C'è un modo per calcolare il numero totale di parametri in una rete LSTM.Come calcolare il numero di parametri di una rete LSTM?

Ho trovato un esempio ma non sono sicuro della correttezza di this o Se l'ho capita correttamente.

Per esempio, consideri il seguente esempio: -

from keras.models import Sequential 
from keras.layers import Dense, Dropout, Activation 
from keras.layers import Embedding 
from keras.layers import LSTM 
model = Sequential() 
model.add(LSTM(256, input_dim=4096, input_length=16)) 
model.summary() 

uscita

____________________________________________________________________________________________________ 
Layer (type)      Output Shape  Param #  Connected to      
==================================================================================================== 
lstm_1 (LSTM)      (None, 256)   4457472  lstm_input_1[0][0]    
==================================================================================================== 
Total params: 4457472 
____________________________________________________________________________________________________ 

Come per la mia comprensione n è il vettore di input lunghezza. E m è il numero di passaggi temporali. e in questo esempio considerano il numero di livelli nascosti come 1.

Quindi secondo la formula in the post.4(nm+n^2) nel mio esempio m=16; n=4096; num_of_units=256

4*((4096*16)+(4096*4096))*256 = 17246978048 

Perché c'è una tale differenza? Ho frainteso l'esempio o la formula era sbagliata?

+0

fare riferimento a questo link se avete bisogno di un certo aiuto visivo: http://datascience.stackexchange.com/questions/10615/number-of-parameters-in-an-lstm-model – Ali

risposta

14

No - il numero di parametri di un livello LSTM in Keras uguale a:

params = 4 * ((size_of_input + 1) * size_of_output + size_of_output^2) 

Ulteriori 1 viene da termini di polarizzazione. Quindi n è la dimensione di input (aumentata dal termine di bias) e m è la dimensione dell'output di un layer LSTM.

Così finalmente:

4 * (4097 * 256 + 256^2) = 4457472 
+0

Grazie per la risposta .. Potresti anche aggiungere la fonte –

+1

Grazie!Stavo cercando di ricavarlo e non riuscivo a capire cosa inserisse quel termine "+1" mancante. – Prune

+0

Quindi, se non ho sbagliato input_length come nessun effetto sui parametri, la stessa matrice di peso sarebbe stata riutilizzata per 1 o 100 passi temporali ?? –

1

Formula espansione per @JohnStrong:

significa che abbiamo diverse variabili di peso e di polarizzazione per 3 cancelli (lettura/scrittura/Froget) e - 4- th - per lo stato della cella (nello stesso stato nascosto). (Questi citati sono condivise tra Timesteps lungo particolare vettore di stato nascosto)

4 * lstm_hidden_state_size * (lstm_inputs_size + bias_variable + lstm_outputs_size) 

come uscita LSTM (y) è h (stato nascosto) approccio, così, senza una proiezione supplementare, per produzioni LSTM abbiamo:

lstm_hidden_state_size = lstm_outputs_size 

diciamo che è d:

d = lstm_hidden_state_size = lstm_outputs_size 

Poi

params = 4 * d * ((lstm_inputs_size + 1) + d) = 4 * ((lstm_inputs_size + 1) * d + d^2)