Comprensione del parametro input_shape in LSTM con Keras


20

Sto cercando di usare l'esempio descritto nella documentazione di Keras denominata "Stacked LSTM per la classificazione delle sequenze" (vedere il codice seguente) e non riesco a capire il input_shapeparametro nel contesto dei miei dati.

Ho come input una matrice di sequenze di 25 possibili caratteri codificati in numeri interi in una sequenza imbottita di lunghezza massima 31. Di conseguenza, my x_trainha il (1085420, 31)significato della forma (n_observations, sequence_length).

from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np

data_dim = 16
timesteps = 8
num_classes = 10

# expected input data shape: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32, return_sequences=True))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32))  # return a single vector of dimension 32
model.add(Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

# Generate dummy training data
x_train = np.random.random((1000, timesteps, data_dim))
y_train = np.random.random((1000, num_classes))

# Generate dummy validation data
x_val = np.random.random((100, timesteps, data_dim))
y_val = np.random.random((100, num_classes))

model.fit(x_train, y_train,
          batch_size=64, epochs=5,
          validation_data=(x_val, y_val))

In questo codice x_trainha la forma (1000, 8, 16), come per un array di 1000 array di 8 array di 16 elementi. Lì mi perdo completamente su ciò che è cosa e come i miei dati possono raggiungere questa forma.

Guardando il documento di Keras e vari tutorial e domande e risposte, sembra che mi manchi qualcosa di ovvio. Qualcuno può darmi un suggerimento su cosa cercare?

Grazie per l'aiuto !

Risposte:


23

Le forme LSTM sono resistenti, quindi non stare male, ho dovuto passare un paio di giorni a combatterle da solo:

Se fornirai dati 1 carattere alla volta la tua forma di input dovrebbe essere (31,1) poiché l'input ha 31 timestep, 1 carattere ciascuno. Dovrai rimodellare il tuo x_train da (1085420, 31) a (1085420, 31,1), cosa che può essere facilmente eseguita con questo comando:

 x_train=x_train.reshape(x_train.shape[0],x_train.shape[1],1))

2

Dai un'occhiata a questo diagramma riassuntivo di GST del repository git e credo che dovresti ottenere tutto in modo chiaro.

Questo repository git include un diagramma di riepilogo Keras LSTM che mostra:

  • l'utilizzo di parametri come return_sequences, batch_size, time_step...
  • la vera struttura degli strati di lstm
  • il concetto di questi strati in keras
  • come manipolare i dati di input e output per soddisfare i requisiti del modello come impilare i livelli di LSTM

E altro ancora


Grazie per quello, @MohammadFneish. Sembra che sarebbe più utile ora. Tuttavia, non è chiaro che questa sia piuttosto una risposta alla domanda , al contrario di un suggerimento utile. Tieni presente che Cross Validated è rigorosamente un sito di domande e risposte, non un forum. Potete aggiungere [ancora più] informazioni per spiegare il parametro della forma di input?
gung - Ripristina Monica

3
@gung Apprezzo molto il modo in cui riesci a rivedere queste risposte per mantenere gli standard, ma penso di non poter elaborare ancora di più su questi parametri dove ci sono molti dettagli tecnici che lo riguardano. Penso solo che la mia risposta potrebbe essere utile per gli sviluppatori che affrontano problemi simili con gli input di keras e non necessariamente questo particolare problema. Grazie
Mohammad Fneish

1

So che non è una risposta diretta alla tua domanda. Questo è un esempio semplificato con una sola cella LSTM, che mi aiuta a capire l'operazione di risagoma per i dati di input.

from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
import numpy as np

# define model
inputs1 = Input(shape=(2, 3))
lstm1, state_h, state_c = LSTM(1, return_sequences=True, return_state=True)(inputs1)
model = Model(inputs=inputs1, outputs=[lstm1, state_h, state_c])

# define input data
data = np.random.rand(2, 3)
data = data.reshape((1,2,3))

# make and show prediction
print(model.predict(data))

Questo sarebbe un esempio della rete LSTM con una sola cella LSTM e con i dati di input di forma specifica.

A quanto pare, stiamo solo prevedendo che la formazione non è presente per semplicità, ma guarda come abbiamo bisogno di rimodellare i dati (per aggiungere ulteriori dimensioni) prima del predictmetodo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.