Прогнозирующая модель ожидает 3 измерения, но массив с формой не совпадает - PullRequest
0 голосов
/ 14 апреля 2020

Я использую эту формулу, чтобы предсказать цену акций в Jupyter:

import keys
import datetime
from binance.client import Client
import pandas as pd

client = Client(keys.APIKey, keys.SecretKey)

symbol= 'BTCUSDT'
BTC= client.get_historical_klines(symbol=symbol, interval=Client.KLINE_INTERVAL_30MINUTE, start_str="1 year ago UTC")

%matplotlib inline

BTC= pd.DataFrame(BTC, columns=['Open time', 'Open', 'High', 'Low', 
                                'Close', 'Volume', 'Close time', 
                                'Quote asset volume','Number of trades',
                                'Taker buy base asset volume', 
                                'Taker buy quote asset volume','Ignore'])

BTC['Open time'] = pd.to_datetime(BTC['Open time'], unit='ms')

BTC.set_index('Open time', inplace=True)
BTC

data= BTC.iloc[:,3:4].astype(float).values
from sklearn.preprocessing import MinMaxScaler

scaler= MinMaxScaler()
data=scaler.fit_transform(data)
training_set= data[:10000]
test_set=data[10000:]

X_train= training_set[0:len(training_set)-1]
y_train= training_set[1:len(training_set)]
X_test= test_set[0:len(test_set)-1]
y_test= test_set[1:len(test_set)]

import numpy as np
X_train = np.reshape(X_train, (len(X_train), 1, X_train.shape[1]))
x_test = np.reshape(X_test, (len(X_test), 1, X_test.shape[1]))

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM

model = Sequential()
model.add(LSTM(256, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(LSTM(256))
model.add(Dense(1))

model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(X_train, y_train, epochs=50, batch_size=16, shuffle=False)

predicted_price= model.predict(X_test)
predicted_price= scaler.inverse_transform(predicted_price)
real_price = scaler.inverse_transform(y_test)

Но вместо того, чтобы получить График Real vs Predicted, я получаю эту ошибку:


ValueError Traceback (последний вызов был последним) в ----> 1 предсказанный_прием = model.predict ([X_test]) 2 прогнозируемый_прием = scaler.inverse_transform (предсказанный_приз) 3 real_price = scaler.inverse_transform (y_test)

E: \ anaconda3 \ lib \ site-packages \ keras \ engine \ training.py в предикате (self, x, batch_size, подробный, шаги, обратные вызовы, max_queue_size, worker, use_multiprocessing) 1439 1440

Case 2: Symboli c тензоры или Numpy массивоподобные. -> 1441 x, _, _ = self._standardize_user_data (x) 1442, если self.stateful: 1443, если x [0] .shape [0]> batch_size и x [0] .shape [0]% batch_size! = 0:

E: \ anaconda3 \ lib \ site-packages \ keras \ engine \ training.py в _standardize_user_data (self, x, y, sample_weight, class_weight, check_array_lengths, batch_size) 577 feed_input_shapes, 578 check_batch_axis = False, False, Не применяйте размер пакета. -> 579 exception_prefix = 'input') 580 581, если y не None:

E: \ anaconda3 \ lib \ site-packages \ keras \ engine \ training_utils.py в standardize_input_data (данные, имена, формы , check_batch_axis, exception_prefix) 133 ': ожидаемые' + names [i] + 'будут иметь' + 134 str (len (shape)) + 'размеры, но получили массив' -> 135 'с shape' + str (data_shape) ) 136 если нет check_batch_axis: 137 data_shape = data_shape [1:]

ValueError: Ошибка при проверке ввода: ожидалось, что lstm_1_input будет иметь 3 измерения, но получил массив с формой (7505, 1)

Даже с этим журналом я не могу указать root причину, чтобы исправить это.

1 Ответ

1 голос
/ 14 апреля 2020

Модели LSTM ожидают ввода dim = 3: (#samples, timestamp, features).
Так, например, если у вас 7505 аудиофайлов, у каждого есть 100 временных меток, каждая временная метка имеет 578 функций - набор поездов должен быть с текущей формой: (3 100 578).
Ваша входная форма (#samples, features), поэтому измените ее на 3-мерную - для X_train и X_train.

x_train = np.reshape(X_train, (len(X_train), 1, X_train.shape[1]))
x_test = np.reshape(X_test, (len(X_test), 1, X_test.shape[1]))

Кроме того, убедитесь, что вы вызываете fit и predict с измененными данными.

model.fit(x_train, y_train, epochs=50, batch_size=16, shuffle=False)
#.....
predicted_price= model.predict(x_test) #<--- Your problem was here! Make sure you use x_test and not X_test.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...