2017-10-16 3 views
1

Ich habe Daten mit 250 Tagen, 72 Funktionen des Trainingsbeispiels und einer Spalte der Zielvariablen. Und möchte für jede der 21351 Zeilen mit 72 Features die nächsten 30 Tage vorhersagen. Wie werde ich meine Daten sowohl für die Eingabe als auch für die Ausgabe umformen. Es scheint, dass ich ein wenig Verwirrung habe und die Bibliothek gibt mir Fehler über die Form Inkompatibilität.Vorhersage für mehrere Zeilen für einzelne/mehrere Zeitschritte lstm

Ich war Umformung wie:

trainX.reshape(1, len(trainX), trainX.shape[1]) 

trainY.reshape(1, len(trainX)) 

Aber gibt mir Fehler:

Valueerror: Input-Arrays die gleiche Anzahl von Proben als Zielarrays haben sollte. Gefunden 1 Eingangsproben und 250 Zielproben.

gleichen Fehler mit:

trainX.reshape(1, len(trainX), trainX.shape[1]) 

trainY.reshape(len(trainX),) 

und gleichen Fehler mit:

trainX.reshape(1, len(trainX), trainX.shape[1]) 

trainY.reshape(len(trainX), 1) 

Derzeit ist trainX neu geformt wie:

trainX.reshape(trainX.shape[0], 1, trainX.shape[1]) 

array([[[ 4.49027601e+00, -3.71848297e-01, -3.71848297e-01, ..., 
      1.06175239e+17, 1.24734085e+06, 5.16668131e+00]], 

     [[ 2.05921386e+00, -3.71848297e-01, -3.71848297e-01, ..., 
      8.44426594e+17, 1.39098642e+06, 4.01803817e+00]], 

     [[ 9.25515792e+00, -3.71848297e-01, -3.71848297e-01, ..., 
      4.08800518e+17, 1.24441013e+06, 3.69129399e+00]], 

     ..., 
     [[ 3.80037999e+00, -3.71848297e-01, -3.71848297e-01, ..., 
      1.35414902e+18, 1.23823291e+06, 3.54601899e+00]], 

     [[ 3.73994822e+00, -3.71848297e-01, 8.40698741e+00, ..., 
      3.93863169e+17, 1.25693299e+06, 3.29993440e+00]], 

     [[ 3.56843035e+00, -3.71848297e-01, 1.53710656e+00, ..., 
      3.28306336e+17, 1.22667253e+06, 3.36569960e+00]]]) 

Trainy als neu gestaltet:

trainY.reshape(trainY.shape[0],) 

array([[-0.7238661 ], 

     [-0.43128777], 

     [-0.31542821], 

     [-0.35185375], 

     ..., 

     [-0.28319519], 

     [-0.28740503], 

     [-0.24209411], 

     [-0.3202021 ]]) 

und testX neu geformt als:

testX.reshape(1, testX.shape[0], testX.shape[1]) 

array([[[ -3.71848297e-01, -3.71848297e-01, -3.71848297e-01, ..., 
      -3.71848297e-01, 2.73982042e+06, -3.71848297e-01], 

     [ -3.71848297e-01, -3.71848297e-01, -3.71848297e-01, ..., 
      -3.71848297e-01, 2.73982042e+06, -3.71848297e-01], 

     [ -3.71848297e-01, -3.71848297e-01, -3.71848297e-01, ..., 
      2.00988794e+18, 1.05992636e+06, 2.49920150e+01], 

     ..., 

     [ -3.71848297e-01, -3.71848297e-01, -3.71848297e-01, ..., 
      -3.71848297e-01, -3.71848297e-01, -3.71848297e-01], 

     [ -3.71848297e-01, -3.71848297e-01, -3.71848297e-01, ..., 
      -3.71848297e-01, -3.71848297e-01, -3.71848297e-01], 

     [ -3.71848297e-01, -3.71848297e-01, -3.71848297e-01, ..., 
      -3.71848297e-01, -3.71848297e-01, -3.71848297e-01]]]) 

und Fehler ist:

Valueerror: Fehler bei der Überprüfung: erwartete lstm_25_input Form zu haben (keine, 1, 72), bekam aber Array mit Form (1, 2895067, 72)

EDIT 1:

Hier ist der Code von meinem Modell:

trainX = trainX.reshape(trainX.shape[0], 1, trainX.shape[1]) 
trainY = trainY.reshape(trainY.shape[0],) 
testX = testX.reshape(1, testX.shape[0], testX.shape[1]) 

model = Sequential() 

model.add(LSTM(100, return_sequences=True, input_shape = trainX.shape[0], trainX.shape[2]))) 
model.add(LSTM(100)) 
model.add(Dense(1, activation='linear')) 

model.compile(loss='mse', optimizer='adam') 

model.fit(trainX, trainY, epochs=500, shuffle=False, verbose=1) 

model.save('model_lstm.h5') 

model = load_model('model_lstm.h5') 

prediction = model.predict(testX, verbose=0) 

ValueError Traceback (most recent call last) in() 43 model.compile(loss='mse', optimizer='adam') 44 ---> 45 model.fit(exog, endog, epochs=50, shuffle=False, verbose=1) 46 47 start_date = endog_end + timedelta(days = 1)

D:\AnacondaIDE\lib\site-packages\keras\models.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, **kwargs) 865 class_weight=class_weight, 866 sample_weight=sample_weight, --> 867 initial_epoch=initial_epoch) 868 869 def evaluate(self, x, y, batch_size=32, verbose=1,

D:\AnacondaIDE\lib\site-packages\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs) 1520
class_weight=class_weight, 1521 check_batch_axis=False, -> 1522 batch_size=batch_size) 1523 # Prepare validation data. 1524 do_validation = False

D:\AnacondaIDE\lib\site-packages\keras\engine\training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_batch_axis, batch_size) 1376
self._feed_input_shapes, 1377
check_batch_axis=False, -> 1378 exception_prefix='input') 1379 y = _standardize_input_data(y, self._feed_output_names,
1380 output_shapes,

D:\AnacondaIDE\lib\site-packages\keras\engine\training.py in _standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix) 142 ' to have shape ' + str(shapes[i]) + 143 ' but got array with shape ' + --> 144 str(array.shape)) 145 return arrays 146

ValueError: Error when checking input: expected lstm_31_input to have shape (None, 250, 72) but got array with shape (21351, 1, 72)

EDIT 2:

Nach Erhalt der aktualisierten Lösung von @Paddy versucht, bekam ich diesen Fehler beim Aufruf vorhersagen():


ValueError Traceback (most recent call last) in() 1 model = load_model('model_lstm.h5') 2 ----> 3 prediction = model.predict(exog_test, verbose=0) 4 # for x in range(0, len(exog_test)):

D:\AnacondaIDE\lib\site-packages\keras\models.py in predict(self, x, batch_size, verbose) 911 if not self.built: 912 self.build() --> 913 return self.model.predict(x, batch_size=batch_size, verbose=verbose) 914 915 def predict_on_batch(self, x):

D:\AnacondaIDE\lib\site-packages\keras\engine\training.py in predict(self, x, batch_size, verbose, steps) 1693 x = _standardize_input_data(x, self._feed_input_names, 1694 self._feed_input_shapes, -> 1695 check_batch_axis=False) 1696 if self.stateful: 1697 if x[0].shape[0] > batch_size and x[0].shape[0] % batch_size != 0:

D:\AnacondaIDE\lib\site-packages\keras\engine\training.py in _standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix) 130 ' to have ' + str(len(shapes[i])) + 131 ' dimensions, but got array with shape ' + --> 132 str(array.shape)) 133 for j, (dim, ref_dim) in enumerate(zip(array.shape, shapes[i])): 134 if not j and not check_batch_axis:

ValueError: Error when checking : expected lstm_64_input to have 3 dimensions, but got array with shape (2895067, 72)

+0

Ich habe Erfolg Ich habe das Modell trainiert. Aber es gibt mir einen Fehler beim Aufruf von Predicted(). –

+0

Sie haben die falschen Abmessungen an testX übergeben – DJK

+0

@ djk47463 Also können Sie mir die Linie der Umgestaltung des testX zur Verfügung stellen? Damit habe ich Probleme. –

Antwort

1

Sie haben:

trainX = trainX.reshape(trainX.shape[0], 1, trainX.shape[1]) 
trainY = trainY.reshape(trainY.shape[0],) 
testX = testX.reshape(1, testX.shape[0], testX.shape[1]) 

Sie wollen:

trainX = trainX.reshape(trainX.shape[0], 1, trainX.shape[1]) 
trainY = trainY.reshape(trainY.shape[0],) 
testX = testX.reshape(testX.shape[0],1, testX.shape[1]) 

Sie die Proben gemischt und Zeitschritt Abmessungen in testX

+0

Ja, ich hatte es ausprobiert und es hat mein Problem gelöst. Ich habe nur die Helligkeit von TestX falsch verstanden. Vielen Dank. –

1

dieses reshape Versuchen:

trainX.reshape(len(trainX),1, trainX.shape[1]) 

trainY.reshape(len(trainX), 1) 

Aber im Allgemeinen haben Sie zwei Möglichkeiten, entweder Eingabedaten umzuformen oder die Modellparameter zu ändern.

Und bitte schauen Sie auf die Fehlermeldung, es sagt alles hier!

ok, hier ist ein Update für Ihren Code:

trainX = trainX.reshape(trainX.shape[0], trainX.shape[1],1) 
trainY = trainY.reshape(trainY.shape[0],) 
testX = testX.reshape(testX.shape[0], testX.shape[1], 1) 

model = Sequential() 

model.add(LSTM(100, return_sequences= True, input_shape=(trainX.shape[1],1))) 
model.add(LSTM(100, return_sequences= False)) 
model.add(Dense(1, activation='linear')) 

model.compile(loss='mse', optimizer='adam') 

model.fit(trainX, trainY, epochs=500, shuffle=False, verbose=1) 

model.save('model_lstm.h5') 

model = load_model('model_lstm.h5') 

prediction = model.predict(testX, verbose=0) 
+0

Ja, ich habe es so umgestaltet, wie du es gesagt hast. Bitte schauen Sie sich die letzten drei Code-Snippets für trainX, trainY, testX an. Dann wird es mit der Form von testX inkompatibel (wie in der Fehlermeldung angegeben). Bitte beachten Sie, dass ich mehrere Schritte (etwa 30 Tage) für jeden Datensatz in testX vorhersagen möchte. –

+0

Ich brauche Code von Ihrem Modell – Paddy

+0

Bitte überprüfen Sie die Bearbeitung. Vielen Dank für Ihre Zeit. :) –