Корректная LSTM модель для предсказания перемешанных данных

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

В течение года я собирал данные с моего RPi:

[нагрузка на 0 ядро, нагрузка на 1 ядро, нагрузка на 2 ядро, нагрузка на 3 ядро, температура окружающей среды, скорость вентилятора, температура ЦП]

Теперь я хочу создать модель с Keras и LSTM для прогнозирования температуры ядра на основе вектора
[нагрузка на 0 ядро, нагрузка на 1 ядро, нагрузка на 2 ядро, нагрузка на 3 ядро, температура окружающей среды, скорость вентилятора].

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

Текущая модель вообще не работает:

model = Sequential()

model.add(Dense(128, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(LSTM(128))
model.add(LSTM(128))

model.add(Dense(1, activation='sigmoid'))

Сводка обучения:

Эпоха 1/128
6483/6483 [==============================] - 45с 7мс/шаг - убыток: 140033.1094 - val_loss: 119426.7812
Эпоха 2/128
6483/6483 [==============================] - 45с 7мс/шаг - убыток: 140032.5156 - val_loss: 119426.7812
Эпоха 3/128
6483/6483 [==============================] - 45с 7мс/шаг - убыток: 140034.2500 - val_loss: 119426.7812
Эпоха 4/128
6483/6483 [==============================] - 45с 7мс/шаг - убыток: 140040.8438 - val_loss: 119426.7812
Эпоха 5/128
5071/6483 [======================>.......] - ETA: 9с - убыток: 140302.2812

Как я могу предсказать такие перемешанные данные с помощью LSTM? Я сейчас застрял.

Вход для RNN, таких как LSTM, должен иметь форму (пакет, временной шаг, особенности).

На основе моего опыта, если ваша текущая X_train.shape имеет 2D, вам нужно будет изменить его в 3D массив с помощью X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1)) Затем это будет что-то вроде (общее количество образцов, 7,1); 7 потому что у вас 7 различных признаков.

Кстати, вам, вероятно, стоит начать с одного слоя Dense и LSTM.

Кроме того, использование нескольких слоев LSTM потребует от вас установить return_sequences на True для всех слоев LSTM перед последним

model.add(LSTM(128,return_sequences = True))
model.add(LSTM(128))

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

Для решения задачи предсказания температуры ядра на основе вероятностного набора входных данных, собранных с Raspberry Pi, необходимо учесть, что ваши данные, хотя и являются последовательными записями, были неправильно отсортированы и представлены в случайном порядке. Это является значительным препятствием для работы моделей LSTM, которые, как известно, ориентированы на анализ временных рядов.

1. Подход к решению проблемы

Первое, что необходимо сделать, это исправить способ обработки данных, чтобы подготовить их к подаче в модель LSTM:

  • Понимание структуры данных: У вас есть 7 переменных (0 и 1 ядра загрузки, 2 ядра загрузки, 3 ядра загрузки, температура окружающей среды, скорость вентилятора, температура ЦП). Чтобы обучить модель, эти данные должны быть сгруппированы в последовательности (изменения данных во времени).

  • Формирование временных последовательностей: Перед тем как подавать данные в LSTM, их следует организовать в формате трехмерного массива, который принимает параметры (пакет, временной шаг, количество признаков).

2. Подготовка данных

Вы можете воспользоваться следующим кодом, чтобы преобразовать ваши данные:

import numpy as np

# Допустим, что 'data' — это ваш исходный массив с 7 признаками.
# data.shape: (num_samples, 7)

# Установим длину последовательности. Например, для LSTM может подойти 10
sequence_length = 10

# Создаем временные ряды
X, y = [], []
for i in range(len(data) - sequence_length):
    X.append(data[i:(i + sequence_length), :6])  # Первые 6 признаков
    y.append(data[i + sequence_length, 6])  # Последний признак - температура CPU

X = np.array(X)
y = np.array(y)

# Изменяем форму X в (количество образцов, длина последовательности, количество признаков)
X = np.reshape(X, (X.shape[0], X.shape[1], X.shape[2]))

3. Построение модели

Теперь, когда данные подготовлены, стоит пересмотреть структуру вашей LSTM модели. Настройте модель следующим образом:

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

model = Sequential()
model.add(LSTM(128, return_sequences=True, input_shape=(sequence_length, 6)))  # 6 признаков
model.add(LSTM(128))  # Второй слой LSTM без return_sequences
model.add(Dense(1))  # Один выход для предсказания температуры ядра

model.compile(optimizer='adam', loss='mean_squared_error')

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

Не забудьте разбить ваши данные на обучающую и тестовую выборки:

# Предположим, X и y уже подготовлены
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Обучение модели
model.fit(X_train, y_train, epochs=128, batch_size=32, validation_data=(X_test, y_test))

5. Оценка производительности

После обучения модели важно оценить ее качество:

loss = model.evaluate(X_test, y_test)
print(f'Loss on test data: {loss}')

Заключение

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

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

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