2017-09-26 3 views
2

ケラスとすべてのパラメータ(サンプル、タイムステップ、機能)でLSTMを使用する方法を練習しようとしています。 3Dリストは私を混乱させる。ケラスLSTM入力機能と不正確な寸法データ入力

私は株式データを持っています。リストの次の項目が+ -2.50のしきい値を超えている場合は売り買いをします。 :私のY.

私の特徴として、XIは私の500サンプルに対して[500,1,3]のデータフレームを持ち、各データは1時間増分で3つの特徴のため3つのタイムステップが1です。しかし、私はこのエラーが発生します:

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

このコードを修正するにはどうしたらよいですか?

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

ありがとうございます。

答えて

0

これは私がそれは私はあなたがkerasのマニュアルまたはでこれを見ることができますkerasにinput_shapeで動作するように3次元配列を作成する必要が私の最高の

ファーストをしようとします役に立つことがしたいここで私の最初の投稿ですより良い方法: from keras.models import Sequential Sequential? 層の線形スタック。

引数

layers: list of layers to add to the model. 

#注 シーケンシャルモデルに渡される最初の層は、定義された入力形状を有していなければなりません。 が意味することは、input_shape またはbatch_input_shape引数、 、または何らかのタイプのレイヤー(繰り返し、密...) とinput_dim引数を受け取ったはずです。

  • 順次:3 dimmensionで配列に2次元を変換する方法その後

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

    は チェックは、あなたが期待するよりも、あなたに多くを助ける

    便利なコマンドをnp.newaxis ?、 -Sequential ?? -print(list(dir(Sequential)))

最高

関連する問題