Вопрос или проблема
В течение года я собирал данные с моего 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 мог учитывать последовательности информации. При корректной обработке и настройке модели вы сможете достичь удовлетворительных результатов в предсказании температуры ядра вашего процессора.