Рекуррентная нейросеть для прогнозирования на keras?

Итак, есть у меня нейросеть, которая на основе 15 предыдущих свечей на криптовалютной бирже предсказывает следующую, ну как есть, она в разработке и большая часть выполнена(была) пока я не понял, что обычная нейронка слабовата на такие дела, после чего я начал работать с рекуррентной нейросетью, и вот тут пошли проблемы. Первая проблема это решейп векторов в тензоры для последующего загона в сеть, но с этим я справился. Потом я не очень понимаю какую именно рекуррентную сеть сделать, выбрал пока с двумя LSTM слоями. Ну и последний вопрос, я не очень понимаю, почему она падает, точнее понимаю, но не знаю как решить.

Ниже прикреплю кусок кода и разьяснения где что выполняется
# Импортирование необходимых библиотек
import os.path

from keras import Sequential
from keras.layers import LSTM, Dense
import sys
import pandas as pd
import tensorflow as tf
from binance.client import Client

# Получение доступа к API биржи бинанс
api_key = 'ключ'
api_secret = 'Секрет'
client = Client(api_key, api_secret)

# Сбор данных о криптовалютах и их изменении цен за определенный период времени
"""if os.path.exists("data.csv"):
    bars = pd.read_csv("data.csv")
else:
    data_file = open("data.csv", "w+")
    data_file.close()
    df = pd.DataFrame(client.get_historical_klines("BTCUSDT", Client.KLINE_INTERVAL_5MINUTE, "90 days ago UTC"))
    df.to_csv("data.csv", index=False)
    bars = pd.read_csv("data.csv")"""

bars = client.get_historical_klines("BTCUSDT", Client.KLINE_INTERVAL_5MINUTE, "30 days ago UTC")

# Подготовка данных для обучения нейросети
data = pd.DataFrame(bars,
                    columns=['timestamp', 'open', 'high', 'low', 'close', 'volume', 'close_time', 'quote_asset_volume',
                             'number_of_trades', 'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume',
                             'ignore'])
data['timestamp'] = pd.to_datetime(data['timestamp'], unit='ms')
data.set_index('timestamp', inplace=True)
data = data.astype(float) / 255

train_data = data.iloc[:-20]
max_rows = train_data.shape[0] // 15 * 15
train_data = train_data.values[:max_rows].reshape((-1, 15, 11))

train_labels = data.iloc[:-20]
max_rows_labels = train_labels.shape[0] // 15 * 15
train_labels = train_labels.values[:max_rows_labels].reshape((-1, 15, 11))

# Создание модели нейросети
#model = tf.keras.models.Model(inputs=input_layer, outputs=output_layer)
model = Sequential()
model.add(LSTM(128, batch_size=20, return_sequences=True, input_shape=[15, 11]))
model.add(LSTM(64, return_sequences=False))
model.add(Dense(11))

MyOpt = tf.keras.optimizers.SGD(learning_rate=0.1, momentum=0.1, nesterov=False)
# Компиляция модели
model.compile(optimizer=MyOpt,
              loss='mse',
              metrics=["accuracy"])

# Обучение модели на подготовленных данных
model.fit(train_data, train_labels, batch_size=20, epochs=150, validation_split=0.2)

print('Сохранить текущую модель в файл? Y/N')
answer=input()
if answer == 'Y':
    model.save('model.h5')
else:
    sys.exit()


Итак, вот код, сверху всё ясно вроде, берём библиотеки, подрубаемся к api бинанса, вытаскиваем с сервера данные и подготавливаем их для прохода по сети. Данные у нас хранятся в виде векторов, где каждый вектор это набор значений соответствующей свечи на графике цены, то есть на каком уровне открылась, закрылась, наивысшая цена, наименьшая и т.д. Дальше идёт преобразование данных в тензоры по 15 векторов, собственно, чтобы нейросеть училась по предыдущим 15 свечам предсказывать следующую. Дальше идёт создание модели нейронки, потом я немного изменил оптимизатор, чтобы лучше подогнать аргументы для обучения, ну и сама компиляция. Пока сеть ложится на следующем шаге, то есть обучении, выдаётся вот такая ошибка.
Node: 'gradient_tape/mean_squared_error/BroadcastGradientArgs'
Incompatible shapes: [20,11] vs. [20,15,11]
[[{{node gradient_tape/mean_squared_error/BroadcastGradientArgs}}]] [Op:__inference_train_function_5424]


Сама ошибка понятна, но не ясно, что с ней делать. И вообще мне кажется что я где то накосячил с созданием тензоров, так как получается что большую часть обучения сеть будет пропускать. Надо чтобы она брала 15 свеч, предсказывала 16, и следующим шагом брала со 2 по 16 свечи и предсказывала 17 и так до конца эпохи, но я этого видимо реализовать не смог. Прошу помочь, а в частности просто подсказать, в каком направлении идти, так как я не очень понимаю, как нормально настроить рекуррентную сеть
  • Вопрос задан
  • 136 просмотров
Пригласить эксперта
Ответы на вопрос 1
Maksim_64
@Maksim_64
Data Analyst
Ну в целом в плане решейпинга, все не правильно. Посмотри размерности своего labels. Это должен быть одномерный массив, длинной соответствующий количеству рядов в массиве features (ты его назвал training data). Потом а на чем ты тренируешься 15 рядов 11 колонок, я про training_data. Это абсурд. Этот код не поправить. Тебе нужен туториал и по нему адаптируюй под свои данные.

Например вот там google colab c предсказаниями акций с использованием kears.Sequential, ну и комментарии кое какие имеются.

Также на медиуме есть туториалы с объяснениями (на английском). В общем гугли keras sequential stock prices example и разбирайся по примерам. Это мертвый код, весь решейпинг переписывать надо. Плюс там надо будет тестовые данные хитро готовить, двигать и подавать в модель в цикле. В общем тебе нужен пример.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы