2017-09-26 4 views
2

So versuche ich zu üben, wie LSTMs in Keras und alle Parameter (Samples, Zeitschritte, Funktionen) zu verwenden. 3D-Liste verwirrte mich.Keras LSTM Eingabe-Features und falsche dimensionale Dateneingabe

So habe ich einige Lager Daten und wenn das nächste Element in der Liste über dem Schwellenwert von 5 ist, die + -2,50 es kauft oder verkauft, wenn es in der Mitte des Schwellenwerts ist, sind dies meine Etiketten : Meine Y.

Für meine Funktionen meine XI haben einen Datenrahmen von [500, 1, 3] für meine 500 Proben und jeder Zeitschritt ist 1, da jede Daten 1 Stunde Inkrement und 3 für 3 Funktionen ist. Aber ich bekomme diesen Fehler:

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

Wie kann ich diesen Code beheben und was mache ich falsch?

import json 
import pandas as pd 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.layers import LSTM 

""" 
Sample of JSON file 
{"time":"2017-01-02T01:56:14.000Z","usd":8.14}, 
{"time":"2017-01-02T02:56:14.000Z","usd":8.16}, 
{"time":"2017-01-02T03:56:15.000Z","usd":8.14}, 
{"time":"2017-01-02T04:56:16.000Z","usd":8.15} 
""" 
file = open("E.json", "r", encoding="utf8") 
file = json.load(file) 

""" 
If the price jump of the next item is > or < +-2.50 the append 'Buy or 'Sell' 
If its in the range of +- 2.50 then append 'Hold' 
This si my classifier labels 
""" 
data = [] 
for row in range(len(file['data'])): 
    row2 = row + 1 
    if row2 == len(file['data']): 
     break 
    else: 
     difference = file['data'][row]['usd'] - file['data'][row2]['usd'] 
     if difference > 2.50: 
      data.append((file['data'][row]['usd'], 'SELL')) 
     elif difference < -2.50: 
      data.append((file['data'][row]['usd'], 'BUY')) 
     else: 
      data.append((file['data'][row]['usd'], 'HOLD')) 

""" 
add the price the time step which si 1 and the features which is 3 
""" 
frame = pd.DataFrame(data) 
features = pd.DataFrame() 
# train LSTM 
for x in range(500): 
    series = pd.Series(data=[500, 1, frame.iloc[x][0]]) 
    features = features.append(series, ignore_index=True) 

labels = frame.iloc[16000:16500][1] 

# test 
#yt = frame.iloc[16500:16512][0] 
#xt = pd.get_dummies(frame.iloc[16500:16512][1]) 


# create LSTM 
model = Sequential() 
model.add(LSTM(3, input_shape=features.shape, activation='relu', return_sequences=False)) 
model.add(Dense(2, activation='relu')) 
model.add(Dense(1, activation='relu')) 

model.compile(loss='mse', optimizer='adam', metrics=['accuracy']) 


model.fit(x=features.as_matrix(), y=labels.as_matrix()) 

""" 
ERROR 
Anaconda3\envs\Final\python.exe C:/Users/Def/PycharmProjects/Ether/Main.py 
Using Theano backend. 
Traceback (most recent call last): 
    File "C:/Users/Def/PycharmProjects/Ether/Main.py", line 62, in <module> 
    model.fit(x=features.as_matrix(), y=labels.as_matrix()) 
    File "\Anaconda3\envs\Final\lib\site-packages\keras\models.py", line 845, in fit 
    initial_epoch=initial_epoch) 
    File "\Anaconda3\envs\Final\lib\site-packages\keras\engine\training.py", line 1405, in fit 
    batch_size=batch_size) 
    File "\Anaconda3\envs\Final\lib\site-packages\keras\engine\training.py", line 1295, in _standardize_user_data 
    exception_prefix='model input') 
    File "\Anaconda3\envs\Final\lib\site-packages\keras\engine\training.py", line 121, in _standardize_input_data 
    str(array.shape)) 
ValueError: Error when checking model input: expected lstm_1_input to have 3 dimensions, but got array with shape (500, 3) 
""" 

Danke.

Antwort

0

Dies ist mein erster Beitrag hier wünsche ich, dass nützlich sein könnte, ich versuche mein Bestes

Zuerst Array 3 Dimension erstellen tun müssen, um mit input_shape in keras arbeiten Sie dies in keras Dokumentation anschauen können oder in ein besserer weg: von keras.models import Sequential Sequential? Linearer Stapel von Schichten.

Argument

layers: list of layers to add to the model. 

# Hinweis Die erste Schicht sollte eine definierte Eingabeform hat auf ein sequentielles Modell übergeben. Was die bedeutet, dass es ein input_shape oder batch_input_shape Argument erhalten hat, oder für irgendeine Art von Schichten (rezidivierende, Dense ...) ein input_dim Argument.

Beispiel

```python 
    model = Sequential() 
    # first layer must have a defined input shape 
    model.add(Dense(32, input_dim=500)) 
    # afterwards, Keras does automatic shape inference 
    model.add(Dense(32)) 

    # also possible (equivalent to the above): 
    model = Sequential() 
    model.add(Dense(32, input_shape=(500,))) 
    model.add(Dense(32)) 

    # also possible (equivalent to the above): 
    model = Sequential() 
    # here the batch dimension is None, 
    # which means any batch size will be accepted by the model. 
    model.add(Dense(32, batch_input_shape=(None, 500))) 
    model.add(Dense(32)) 

Danach, wie Arrays 2 Dimensionen in 3 Dimmension Check np.newaxis

Nützliche Kommandos zu transformieren, die Ihnen mehr helfen, als Sie erwarten:

  • Sequential ?, -Sequential ??, -print (Liste (dir (Sequential)))

Am besten