• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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

machine-learning 来源:Definity 20次浏览

所以我想练习如何在Keras和所有参数(样本,时间步长,功能)使用LSTMs。 3D列表令我困惑。Keras LSTM输入功能和不正确的三维数据输入

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

对于我的特征我的XI具有[500,1,3]为我的500个样本的数据帧和每个时步为1,因为每个数据为3个特征1小时增量和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) 
""" 

谢谢。

===========解决方案如下:

这是我的第一篇文章在这里,我想这可能是有用的,我会尽我的最佳

首先,你需要创建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 dimmension 2名维 检查np.newaxis

有用的命令可以帮助你,比你预期:

  • 顺序?, -Sequential ??, -print(清单(目录(顺序)))

最好


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)