2017-06-22 2 views
3

Meine Eingabe ist einfach eine CSV-Datei mit 339.732 Zeilen und zwei Spalten:Fehler bei der Überprüfung Modelleingang: erwartet lstm_1_input bis 3 Dimensionen zu haben, bekam aber Array mit Form (339.732, 29)

  • die ersten 29 zu sein Merkmalswerte, dh X
  • der zweite ein binärer Markierungswert, dh Y

ich versuche, meine Daten auf einem gestapelten LSTM Modell zu trainieren:

data_dim = 29 
timesteps = 8 
num_classes = 2 

model = Sequential() 
model.add(LSTM(30, return_sequences=True, 
       input_shape=(timesteps, data_dim))) # returns a sequence of vectors of dimension 30 
model.add(LSTM(30, return_sequences=True)) # returns a sequence of vectors of dimension 30 
model.add(LSTM(30)) # return a single vector of dimension 30 
model.add(Dense(1, activation='softmax')) 

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

model.summary() 
model.fit(X_train, y_train, batch_size = 400, epochs = 20, verbose = 1) 

Dies führt den Fehler:

Traceback (most recent call last): File "first_approach.py", line 80, in model.fit(X_train, y_train, batch_size = 400, epochs = 20, verbose = 1)

ValueError: Error when checking model input: expected lstm_1_input to have 3 dimensions, but got array with shape (339732, 29)

ich meine Eingabe versuchte Umgestaltung X_train.reshape((1,339732, 29)) verwenden, aber es hat nicht funktioniert zeigt Fehler:

ValueError: Error when checking model input: expected lstm_1_input to have shape (None, 8, 29) but got array with shape (1, 339732, 29)

Wie kann ich in meinen Input füttern zum LSTM?

Antwort

3

Einstellung timesteps = 1 (da ich für jede Instanz einen Zeitschritt wollen) und Umformen des X_train und X_test als:

X_train = np.reshape(X_train, (X_train.shape[0], 1, X_train.shape[1])) 
X_test = np.reshape(X_test, (X_test.shape[0], 1, X_test.shape[1])) 

Das funktionierte!

1

Für timesteps != 1, können Sie die unten Funktion (angepasst von here) verwenden

import numpy as np 
def create_dataset(dataset, look_back=1): 
    dataX, dataY = [], [] 
    for i in range(len(dataset)-look_back+1): 
    a = dataset[i:(i+look_back), :] 
    dataX.append(a) 
    dataY.append(dataset[i + look_back - 1, :]) 
    return np.array(dataX), np.array(dataY) 

Beispiele

X = np.reshape(range(30),(3,10)).transpose() 
array([[ 0, 10, 20], 
     [ 1, 11, 21], 
     [ 2, 12, 22], 
     [ 3, 13, 23], 
     [ 4, 14, 24], 
     [ 5, 15, 25], 
     [ 6, 16, 26], 
     [ 7, 17, 27], 
     [ 8, 18, 28], 
     [ 9, 19, 29]]) 

create_dataset(X, look_back=1) 
(array([[[ 0, 10, 20]], 
     [[ 1, 11, 21]], 
     [[ 2, 12, 22]], 
     [[ 3, 13, 23]], 
     [[ 4, 14, 24]], 
     [[ 5, 15, 25]], 
     [[ 6, 16, 26]], 
     [[ 7, 17, 27]], 
     [[ 8, 18, 28]], 
     [[ 9, 19, 29]]]), 
array([[ 0, 10, 20], 
     [ 1, 11, 21], 
     [ 2, 12, 22], 
     [ 3, 13, 23], 
     [ 4, 14, 24], 
     [ 5, 15, 25], 
     [ 6, 16, 26], 
     [ 7, 17, 27], 
     [ 8, 18, 28], 
     [ 9, 19, 29]])) 

create_dataset(X, look_back=3) 
(array([[[ 0, 10, 20], 
     [ 1, 11, 21], 
     [ 2, 12, 22]], 
     [[ 1, 11, 21], 
     [ 2, 12, 22], 
     [ 3, 13, 23]], 
     [[ 2, 12, 22], 
     [ 3, 13, 23], 
     [ 4, 14, 24]], 
     [[ 3, 13, 23], 
     [ 4, 14, 24], 
     [ 5, 15, 25]], 
     [[ 4, 14, 24], 
     [ 5, 15, 25], 
     [ 6, 16, 26]], 
     [[ 5, 15, 25], 
     [ 6, 16, 26], 
     [ 7, 17, 27]], 
     [[ 6, 16, 26], 
     [ 7, 17, 27], 
     [ 8, 18, 28]], 
     [[ 7, 17, 27], 
     [ 8, 18, 28], 
     [ 9, 19, 29]]]), 
array([[ 2, 12, 22], 
     [ 3, 13, 23], 
     [ 4, 14, 24], 
     [ 5, 15, 25], 
     [ 6, 16, 26], 
     [ 7, 17, 27], 
     [ 8, 18, 28], 
     [ 9, 19, 29]])) 
Verwandte Themen