Keras LSTM输入功能和不正确的尺寸数据输入

时间:2017-09-26 23:05:05

标签: machine-learning neural-network keras lstm

所以我正在尝试练习如何在Keras中使用LSTM以及所有参数(样本,时间步长,功能)。 3D列表令我困惑。

所以我有一些股票数据,如果列表中的下一个项目高于5的阈值+2.50它会买入或卖出,如果它在它的持有的阈值中间,这些是我的标签:我的。

对于我的功能我的X我的500个样本的数据帧为[500,1,3],每个时间步长为1,因为每个数据增加1小时,3个功能增加3个。但是我得到了这个错误:

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

感谢。

1 个答案:

答案 0 :(得分:0)

这是我在这里发表的第一篇文章,我希望这会有用,我会努力做到最好

首先,您需要创建3维数组以在keras中使用input_shape,您可以在keras文档中以更好的方式观察: 来自keras.models导入顺序 顺序? 线性叠层。

参数

layers: list of layers to add to the model.

#注意     第一层传递给Sequential模型     应该有一个定义的输入形状。那是什么     意味着它应该收到input_shape     或batch_input_shape论证,     或某些类型的图层(recurrent,Dense ......)     一个input_dim参数。

实施例

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

之后如何在3维度中变换数组2维 检查np.newaxis

有用的命令可以帮助您超出预期:

  • 顺序?, -Sequential ??, -print(list(dir(Sequential)))

最佳