Как вставить данные в одномерный ConvLSTM2D с keras?

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

Я пытаюсь адаптировать модель предсказания кадров из примеров keras для работы с набором 1-D датчиков. У меня есть данные с носимых датчиков Android, и я разрабатываю алгоритм, который, надеюсь, сможет предсказать, какие будут будущие показания датчиков на основе предыдущих показаний датчиков.

Модель

model = Sequential()
model.add(ConvLSTM2D(filters=filters, kernel_size=(1, 1), input_shape=(None, 9, 1, 1), padding='same', return_sequences=True))
model.add(BatchNormalization())
model.add(ConvLSTM2D(filters=filters, kernel_size=(1, 1), padding='same', return_sequences=True))
model.add(BatchNormalization())
model.add(ConvLSTM2D(filters=filters, kernel_size=(1, 1), padding='same', return_sequences=True))
model.add(BatchNormalization())
model.add(Conv3D(filters=1, kernel_size=(3, 3, 3), activation='sigmoid', padding='same', data_format="channels_last"))
model.compile(loss="binary_crossentropy", optimizer="adadelta")

Резюме

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv_lst_m2d_1 (ConvLSTM2D)  (None, None, 9, 1, 10)    480       
_________________________________________________________________
batch_normalization_1 (Batch (None, None, 9, 1, 10)    40        
_________________________________________________________________
conv_lst_m2d_2 (ConvLSTM2D)  (None, None, 9, 1, 10)    840       
_________________________________________________________________
batch_normalization_2 (Batch (None, None, 9, 1, 10)    40        
_________________________________________________________________
conv_lst_m2d_3 (ConvLSTM2D)  (None, None, 9, 1, 10)    840       
_________________________________________________________________
batch_normalization_3 (Batch (None, None, 9, 1, 10)    40        
_________________________________________________________________
conv3d_1 (Conv3D)            (None, None, 9, 1, 1)     271       
=================================================================
Total params: 2,551
Trainable params: 2,491
Non-trainable params: 60
_________________________________________________________________

Данные

У меня есть серия CSV файлов с данными датчиков (9 датчиков, ускорение по 3 осям, вращение по 3 осям и крен, тангаж и ролл). Данные были выборкой с частотой 10 герц. Вход модели – это “кадр” или момент времени данных с датчиков, а выход – это следующий “момент” или момент времени данных с датчиков.

Я изучил алгоритм предсказания кадров и хотел понять, как адаптировать мои загруженные данные для обучения модели.

Мои данные состоят из 15 CSV файлов с примерно 10,000 строк каждая, отражающей набор датчиков в момент времени. Каждый CSV файл принадлежит разным людям, и я хотел бы улучшить свою модель, чтобы она могла учитывать различия между каждым человеком, если это возможно.

Загрузка данных

import pandas as pd
csvs = get_csvs() 
for file in csvs:
    data = transform_df_to_deep_frame(pd.read_csv(file))
    model.fit(data[:-1], data[1:], batch_size=10, epochs=300, validation_split=0.05)

Этот код выдает следующую ошибку/вывод по относительно очевидным причинам, которые я все еще не могу исправить.

Вывод/Ошибка

(10778, 9, 1, 1)
Traceback (most recent call last):
  File "compare_models.py", line 220, in leave_one_out_comparisons
    model.fit(data[:-1], data[1:], batch_size=10, epochs=300, validation_split=0.05)
  File "/home/victor/anaconda3/lib/python3.7/site-packages/keras/engine/training.py", line 952, in fit
    batch_size=batch_size)
  File "/home/victor/anaconda3/lib/python3.7/site-packages/keras/engine/training.py", line 751, in _standardize_user_data
    exception_prefix='input')
  File "/home/victor/anaconda3/lib/python3.7/site-packages/keras/engine/training_utils.py", line 128, in standardize_input_data
    'with shape ' + str(data_shape))
ValueError: Error when checking input: expected conv_lst_m2d_1_input to have 5 dimensions, but got array with shape (10778, 9, 1, 1)

Проблема

Проблема, похоже, заключается в том, что я неправильно подготавливаю данные. None сбивало меня с толку. Я относительно нов в машинном обучении, так что простите меня. Как мне адаптировать мои входные и выходные данные размером (10778, 9, 1, 1) для соответствия этому модели.

Мне нужно было изменить форму моих данных на кадры. Ожидаемая форма – это

(баллы, нет_кадров, строка, колонка, оттенок серого)

Я вставлял

(баллы, строка, колонка, оттенок серого)

В конечном итоге, я изменил форму данных.

size = data.shape[0]//frames
data = data[:size*frames, :, :, :]
print(data.shape)
data = data.reshape(size, frames, 9, 1, 1)
print(data.shape)

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

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

Шаг 1: Понимание структуры данных для ConvLSTM2D

ConvLSTM2D в Keras ожидает входные данные в формате 5D тензора с размерами (samples, time_steps, rows, cols, channels), где:

  • samples – количество образцов (выборок) в вашем обучающем наборе данных.
  • time_steps – количество временных шагов (кадров) в каждом образце.
  • rows и cols – размеры входных данных (вы должны учитывать, что для одномерных данных cols будет равен 1).
  • channels – количество каналов (в вашем случае, это может быть 1 для одноцветного (граскейл) ввода).

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

Учитывая, что ваши данные из CSV-файлов имеют форму (порядок_кадров, 9, 1, 1), где 9 – это количество датчиков (акселерометр и гироскопами), вам необходимо преобразовать эти данные так, чтобы они соответствовали требованиям модели.

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

import numpy as np
import pandas as pd

# Получаем ваши CSV файлы
csvs = get_csvs() 
frames = 10  # Определите количество кадров
data_list = []

for file in csvs:
    data = pd.read_csv(file).values  # считывание данных
    # Убедитесь, что данные имеют правильный формат
    if len(data.shape) != 2 or data.shape[1] != 9:
        raise ValueError("Неверный формат данных, ожидается массив 2D с 9 столбцами")

    # Переподготовка данных, разбитие на кадры
    num_samples = data.shape[0] - frames  # Минус количество временных шагов
    reshaped_data = np.array([data[i:i+frames] for i in range(num_samples)])
    reshaped_data = reshaped_data.reshape(num_samples, frames, 9, 1, 1)  # Подгоняем под формат

    data_list.append(reshaped_data)

# Объединяем все данные вместе
data = np.concatenate(data_list, axis=0)

# Разделение на входные и выходные данные
X = data[:-1]  # Вход – все кадры, кроме последнего
y = data[1:]   # Выход – все кадры, начиная со второго

Шаг 3: Обучение модели

Теперь, когда данные имеют форму (samples, time_steps, rows, cols, channels), вы можете обучать модель ConvLSTM2D. Просто вызовите метод .fit() следующим образом:

model.fit(X, y, batch_size=10, epochs=300, validation_split=0.05)

Заключение

Таким образом, правильная подготовка данных — ключевой элемент при работе с ConvLSTM2D в Keras. Основной шаг заключается в превращении ваших данных из простой 2D-формы в необходимый 5D-тенсор, который принимает ваша модель. Убедитесь, что данные нормализованы, чтобы улучшить общую производительность модели.

Если у вас возникнут дополнительные вопросы или потребуется помощь в дальнейшем, не стесняйтесь задавать их. Удачи!

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

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