Я пытаюсь понять, как правильно подавать данные в мою модель 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), код работает.
Теперь, что япытаюсь понять это:
- Верны ли мои общие предположения о том, как я структурировал свои данные для ввода LSTM?Являются ли параметры (
batch_size
, input_shape
) правильными / разумными? - Способна ли модель keras LSTM в целом обрабатывать выборки с различным количеством функций?
- Если да, как это сделать?Я должен адаптировать свой код, чтобы он работал с различным количеством функций?
- Если нет, сработает ли «заполнение нулями» (заполнение) столбцов в примерах с менее чем 50 функциями?Есть ли другие, предпочтительные способы достижения моей цели?