KERAS LSTM输入功能和不正确的维数据输入



因此,我正在尝试练习如何在keras和所有参数中使用LSTM(样本,时间段,功能)。3D列表使我感到困惑。

因此,我有一些库存数据,如果列表中的下一个项目高于5的门槛,即 -2.50,则购买或出售,如果它处于该阈值中的中间,则这些是我的标签:我的Y。

对于我的功能,我的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
Anaconda3envsFinalpython.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 "Anaconda3envsFinallibsite-packageskerasmodels.py", line 845, in fit
    initial_epoch=initial_epoch)
  File "Anaconda3envsFinallibsite-packageskerasenginetraining.py", line 1405, in fit
    batch_size=batch_size)
  File "Anaconda3envsFinallibsite-packageskerasenginetraining.py", line 1295, in _standardize_user_data
    exception_prefix='model input')
  File "Anaconda3envsFinallibsite-packageskerasenginetraining.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)
"""

谢谢。

这是我希望有用的第一篇文章,我会尽力而为

首先,您需要创建3维数组才能使用Keras中的Input_shape,您可以在Keras文档中或以更好的方式观看此信息:来自keras.models导入顺序顺序?层线性堆栈。

参数

layers: list of layers to add to the model.

#注意 第一层传递给顺序模型 应具有定义的输入形状。那是什么 意味着它应该收到input_shapebatch_input_shape参数, 或对于某种类型的层(经常性,密集...) 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

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

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

最佳

最新更新