Как я могу решить проблему размерности временных рядов в TensorFlow?

Вопрос или проблема

Я пытаюсь обучить нейронную сеть прямого распространения, но когда я обучаю модель, она говорит: “Значения None не поддерживаются”. Я уже проверил данные, и там нет NaN или Null, мои временные ряды – это временные ряды акций, поэтому там нет других измерений, кроме цены.

model = Sequential()
model.add(Dense(64, input_shape=(1,), activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(1))
model.compile(optimizer="adam", loss="mean_squared_error", metrics=['mae'])
Stock_AMZN_PRCL_Train = Stock_AMZN_PRCL_Train.values.reshape(-1, 1)
model.fit(Stock_AMZN_PRCL_Train, epochs=100, batch_size=32, validation_split=0.2)

Я ожидаю, что моя модель будет обучена

Ответ или решение

Чтобы решить проблему с размерностью временного ряда в TensorFlow, вам нужно рассмотреть несколько ключевых аспектов, касающихся структуры ваших данных и архитектуры вашей модели. На основании предоставленной информации, давайте проанализируем код и предложим необходимые изменения.

1. Проверка структуры данных

Согласно вашему описанию, ваш временной ряд представляет собой последовательность цен акций, что является одномерным набором данных. Однако модель Feed Forward Neural Network (FFNN) требует, чтобы данные имели правильную размерность. Вы упомянули, что ваш набор данных не содержит значений NaN или NULL, что хорошо.

Проблема: Вы используете слой Dense, который ожидает на вход данные в формате (N, D), где N — количество образцов, а D — количество признаков. В вашем случае, если вы просто передаёте одномерные данные, это может привести к смещению в размерности.

2. Изменение декодирования данных

Для повышения эффективности вашей модели возможно стоит рассмотреть использование оконного подхода (windowing), когда временной ряд разбивается на последовательности фиксированной длины. Это обычно позволяет модели учитывать временные зависимости. Вот пример, как это можно сделать:

import numpy as np

def create_dataset(data, time_step=1):
    X, Y = [], []
    for i in range(len(data) - time_step):
        X.append(data[i:(i + time_step)])
        Y.append(data[i + time_step])
    return np.array(X), np.array(Y)

time_step = 10  # размер окна
X, y = create_dataset(Stock_AMZN_PRCL_Train, time_step)

3. Изменение архитектуры модели

Здесь будет необходимо изменить входное пространство вашей модели. Теперь input_shape будет (time_step, 1), если вы используете одно значение (цену) за временной шаг:

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

model = Sequential()
model.add(Dense(64, input_shape=(time_step, 1), activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(1))
model.compile(optimizer="adam", loss="mean_squared_error", metrics=['mae'])

4. Подготовка данных для fitting

Убедитесь, что вы правильно формируете данные для обучения. Используйте функцию reshape, чтобы гарантировать, что данные имеют нужный формат:

X = X.reshape(X.shape[0], X.shape[1], 1)  # изменяем форму данных на (кол-во образцов, длина окна, 1)

5. Обучение модели

Теперь вы можете тренировать модель с корректно подготовленными данными:

model.fit(X, y, epochs=100, batch_size=32, validation_split=0.2)

Заключение

Следуя этим шагам, вы должны смочь решить проблему с размерностью ваших данных временного ряда. Использование оконного подхода позволяет учитывать предшествующие значения для прогнозирования, что является важным аспектом анализа временных рядов.

Если после внесения вышеуказанных изменений появляются ошибки или проблемы, убедитесь, что данные передаются корректно на каждом этапе обработки. Проверьте также, что у вас достаточно данных для обучения модели, так как для нейронных сетей требуются большие объёмы данных для эффективного обучения.

Оцените материал
Добавить комментарий

Капча загружается...