Итак, есть у меня нейросеть, которая на основе 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 и так до конца эпохи, но я этого видимо реализовать не смог. Прошу помочь, а в частности просто подсказать, в каком направлении идти, так как я не очень понимаю, как нормально настроить рекуррентную сеть