2017-09-26 1 views
2

J'essaie donc de m'exercer à utiliser les LSTM dans Keras et tous les paramètres (échantillons, timesteps, features). La liste 3D me perturbe.Fonctions d'entrée Keras LSTM et saisie de données dimensionnelles incorrectes

Donc, j'ai des données de stock et si le prochain article dans la liste est au-dessus du seuil de 5 qui est + -2.50 il achète OU vend, si c'est au milieu de ce seuil, ce sont mes étiquettes : my Y.

Pour mes caractéristiques, mon XI a une base de données de [500, 1, 3] pour mes 500 échantillons et chaque pas de temps est 1 puisque chaque donnée est incrément de 1 heure et 3 pour 3 caractéristiques. Mais je reçois cette erreur:

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

Comment puis-je corriger ce code et ce que je fais mal?

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) 
""" 

Merci.

Répondre

0

Ceci est mon premier post ici, je voudrais que cela pourrait être utile, je vais essayer de faire de mon mieux

D'abord, vous devez créer 3 matrice de dimension pour travailler avec input_shape dans keras vous pouvez regarder cela dans la documentation de keras ou un meilleur moyen: de keras.models importation Sequential Sequential? Pile linéaire de couches.

Arguments

layers: list of layers to add to the model. 

# Note La première couche est passé à un modèle séquentiel doivent avoir une forme d'entrée définie. Qu'est-ce que signifie est qu'il aurait dû recevoir un input_shape ou un argument batch_input_shape, ou pour un certain type de couches (récurrentes, ... Dense) un argument input_dim.

Exemple

```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)) 

Après cela comment transformer les tableaux 2 dimensions en 3 Dimmension check np.newaxis

commandes utiles qui vous aideront plus que vous attendez:

  • séquentielle ?, -Sequentiel ??, -print (list (dir (Sequential)))

Meilleur