Понимание многомерной классификации временных рядов с помощью Keras - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь понять, как правильно подавать данные в мою модель keras для классификации данных многомерного временного ряда на три класса, используя нейронную сеть LSTM.

Я уже изучал различные ресурсы - в основном эти три превосходных блогасообщения от Джейсона Браунли post1 , post2 , post3 ), другие вопросы SO и различные документы , но никтоприведенная там информация точно соответствует моему проблемному случаю, и я не смог выяснить, верна ли моя предварительная обработка / подача данных в модель, поэтому я предположил, что могу получить некоторую помощь, если укажу здесь свои точные условия.

Я пытаюсь классифицировать данные многомерных временных рядов, которые в своем первоначальном виде структурированы следующим образом:

  • У меня 200 выборок

  • Один образец - это один файл CSV.

  • Образец может содержать от 1 до 50 объектов (т. Е. Файл CSV содержит от 1 до 50 столбцов).

  • КаждыйФункция имеет значение, «отслеживаемое» в течение фиксированного количества временных шагов, скажем, 100 (т.е. каждый CSV-файл имеет ровно 100 строк).

  • Каждый CSV-файл имеет один из трех классов («хороший», «слишком маленький», «слишком большой»)

Итак, мой текущий статус выглядит следующим образом:

У меня есть массив numpy «samples» со следующей структурой:

# array holding all samples
[
    # sample 1        
    [
        # feature 1 of sample 1 
        [ 0.1, 0.2, 0.3, 0.2, 0.3, 0.1, 0.2, 0.4, 0.5, 0.1, ... ], # "time series" of feature 1
        # feature 2 of sample 1 
        [ 0.5, 0.6, 0.7, 0.6, 0.4, 0.3, 0.2, 0.1, -0.1, -0.2, ... ], # "time series" of feature 2
        ... # up to 50 features
    ],
    # sample 2        
    [
        # feature 1 of sample 2 
        [ 0.1, 0.2, 0.3, 0.2, 0.3, 0.1, 0.2, 0.4, 0.5, 0.1, ... ], # "time series" of feature 1
        # feature 2 of sample 2 
        [ 0.5, 0.6, 0.7, 0.6, 0.4, 0.3, 0.2, 0.1, -0.1, -0.2, ... ], # "time series" of feature 2
        ...  # up to 50 features
    ],
    ... # up to sample no. 200
]

У меня также есть массив numpy «меток» той же длины, что и «samples» массив (т.е. 200).Этикетки кодируются следующим образом:

  • "хорошо" = 0
  • "слишком мало" = 1
  • "слишком велико" = 2
[0, 2, 2, 1, 0, 1, 2, 0, 0, 0, 1, 2, ... ] # up to label no. 200

Этот "метки" * массив 1062 * затем кодируется с помощью функции to_categorical keras

to_categorical(labels, len(np.unique(labels)))

В настоящее время мое определение модели выглядит так:

max_nb_features = 50
nb_time_steps = 100

model = Sequential()
model.add(LSTM(5, input_shape=(max_nb_features, nb_time_steps)))
model.add(Dense(3, activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
  • 5 единиц в слое LSTM сейчас выбраны случайным образом
  • 3 Выходные нейроны в плотном слое для моих трех классов

Я тогдаразделите данные на данные обучения / тестирования:

samples_train, samples_test, labels_train, labels_test = train_test_split(samples, labels, test_size=0.33)

Это дает нам 134 образца для обучения и 66 образцов для тестирования.

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

model.fit(samples_train, labels_train, epochs=1, batch_size=1)

Ошибка заключается в следующем:

Traceback (most recent call last):
  File "lstm_test.py", line 152, in <module>
    model.fit(samples_train, labels_train, epochs=1, batch_size=1)
  File "C:\Program Files\Python36\lib\site-packages\keras\models.py", line 1002, in fit
    validation_steps=validation_steps)
  File "C:\Program Files\Python36\lib\site-packages\keras\engine\training.py", line 1630, in fit
    batch_size=batch_size)
  File "C:\Program Files\Python36\lib\site-packages\keras\engine\training.py", line 1476, in _standardize_user_data
    exception_prefix='input')
  File "C:\Program Files\Python36\lib\site-packages\keras\engine\training.py", line 113, in _standardize_input_data
    'with shape ' + str(data_shape))

ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (134, 1)

Мне кажется, это не работает из-за переменного количества функций, которые могут иметь мои образцы.Если я использую «поддельные» (сгенерированные) данные, где все параметры одинаковы, за исключением того, что каждый образец имеет одинаковое количество функций (50), код работает.

Теперь, что япытаюсь понять это:

  1. Верны ли мои общие предположения о том, как я структурировал свои данные для ввода LSTM?Являются ли параметры (batch_size, input_shape) правильными / разумными?
  2. Способна ли модель keras LSTM в целом обрабатывать выборки с различным количеством функций?
  3. Если да, как это сделать?Я должен адаптировать свой код, чтобы он работал с различным количеством функций?
  4. Если нет, сработает ли «заполнение нулями» (заполнение) столбцов в примерах с менее чем 50 функциями?Есть ли другие, предпочтительные способы достижения моей цели?

1 Ответ

0 голосов
/ 28 сентября 2018

Я считаю, что форма ввода для Keras должна быть:

input_shape = (number_of_samples, nb_time_steps, max_nb_features).

И чаще всего nb_time_steps = 1

PS: Iпытался решить очень похожую проблему для стажировки (но мои результаты оказались неверными).Вы можете посмотреть здесь: https://github.com/AbbasHub/Deep_Learning_LSTM/blob/master/2018-09-22_Multivariate_LSTM.ipynb (посмотрите, сможете ли вы заметить мою ошибку!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...