Я пытаюсь решить задачу классификации с помощью последовательного машинного обучения LSTM. Моя структура DataFrame находится здесь:
функция1, функция2, функция3, категория

функции — это точка данных датчика акселерометра в плавающем формате, а категория — метка для классов активности (значения 0–5)
Я разделил данные обучения и испытаний с помощью
из sklearn.model_selection import train_test_split x_columns = acc.iloc[:, 0:3] y_columns = acc.iloc[:, 3:4] trainx, testx, trainy, testy = train_test_split(x_columns, y_columns, test_size=0.2, shuffle=False) Assert(len(trainx) == len(trainy)) Я также подготовил последовательность, поскольку данные коррелируют по времени.
из режима импорта scipy.stats окно_лен = 100 шаг_лен = 10 def последовательности_генератора (x, y, длина, шаг): seq_x = [] seq_y = [] data_length = длина (х) для i в диапазоне (0, длина_данных - длина + 1, шаг): input_sequence = x.iloc[i: i + длина] target_sequence = y.iloc[i: i + длина] target_mode = режим (target_sequence.values)[0][0] seq_x.append(input_sequence) seq_y.append(target_mode) вернуть np.array(seq_x), np.array(seq_y) tx, ty = последовательность_генератора (trainx, trainy, window_len, stride_len) vx, vy = последовательность_генератора (testx, testy, window_len, stride_len) Я также закодировал целевой столбец в горячем режиме
из keras.utils import to_categorical tty = to_categorical(ty, num_classes=len(set(ty))) # num_classes = 6 vvy = to_categorical(vy, num_classes=len(set(ty))) Вот некоторые результаты, которые могут помочь вам определить мою проблему:
tx.shape = (113020, 100, 3)
ty.shape = (113020, 6)
set(ty) = {0, 1, 2, 3, 4, 5

На этом этапе я определил архитектуру своей модели. Не обращайте внимания на точность модели, потому что я использую ее только в учебных целях.
импортировать numpy как np импортировать панд как pd импортировать тензорный поток как tf из тензорного потока импорта кераса из keras.layers импортировать LSTM из keras.models импортировать последовательный, модель из keras.layers импортировать Dense, Input, Dropout, Flatten из keras.utils импорт в_categorical n_class = len(set(ty)) # 6 n_features = len(x_columns.columns) # 3 модель2 = Последовательный() model2.add(Вход((window_len, n_features))) model2.add(Сгладить()) model2.add(Dense(128, активация='relu')) model2.add(Dense(n_class, активация = 'softmax')) model2.compile(loss='categorical_crossentropy',оптимизатор='адам', метрики=['точность']) #history = model2.fit(tx, ty, epochs=5) история = model2.fit(tx, tty, epochs=5) При запуске произошла следующая ошибка. Что мне не хватает?
ValueError Traceback (последний вызов последним) Ячейка In[246], строка 19 17 model2.compile(loss='categorical_crossentropy',оптимизатор='адам', метрики=['точность']) 18 #history = model2.fit(tx, ty, epochs=5) ---> 19 история = model2.fit(tx, tty, epochs=5) Файл ~/anaconda3/lib/python3.11/site-packages/keras/src/utils/traceback_utils.py:70 в filter_traceback..error_handler(*args, **kwargs) 67 filtered_tb = _process_traceback_frames(e.__traceback__) 68 # Чтобы получить полную трассировку стека, вызовите: 69 # `tf.debugging.disable_traceback_filtering()` ---> 70 поднять e.with_traceback(filtered_tb) с None 71 наконец: 72 дель filtered_tb Файл /tmp/__autograph_generated_filefn9kd22q.py:15 в external_factory..inner_factory..tf__train_function(итератор) 13 попытка: 14 do_return = Истина ---> 15 retval_ = ag__.converted_call(ag__.ld(step_function), (ag__.ld(self), ag__.ld(итератор)), None, fscope) 16 кроме: 17 do_return = Ложь ValueError: в коде пользователя: Файл «/Users/hissain/anaconda3/lib/python3.11/site-packages/keras/src/engine/training.py», строка 1377, в train_function * вернуть Step_function (я, итератор) Файл «/Users/hissain/anaconda3/lib/python3.11/site-packages/keras/src/engine/training.py», строка 1360, в шаге_функции ** выходные данные = model.distribute_strategy.run(run_step, args=(data,)) Файл «/Users/hissain/anaconda3/lib/python3.11/site-packages/keras/src/engine/training.py», строка 1349, в run_step ** выходные данные = model.train_step(данные) Файл «/Users/hissain/anaconda3/lib/python3.11/site-packages/keras/src/engine/training.py», строка 1127, в train_step потеря = self.compute_loss(x, y, y_pred, sample_weight) Файл «/Users/hissain/anaconda3/lib/python3.11/site-packages/keras/src/engine/training.py», строка 1185, в Compute_loss вернуть self.compiled_loss( Файл «/Users/hissain/anaconda3/lib/python3.11/site-packages/keras/src/engine/compile_utils.py», строка 277, в __call__ loss_value = loss_obj(y_t, y_p, sample_weight=sw) Файл «/Users/hissain/anaconda3/lib/python3.11/site-packages/keras/src/losses.py», строка 143, в __call__ потери = call_fn(y_true, y_pred) Файл «/Users/hissain/anaconda3/lib/python3.11/site-packages/keras/src/losses.py», строка 270, в вызове ** return ag_fn(y_true, y_pred, **self._fn_kwargs) Файл «/Users/hissain/anaconda3/lib/python3.11/site-packages/keras/src/losses.py», строка 2221, в categorical_crossentropy вернуть backend.categorical_crossentropy( Файл «/Users/hissain/anaconda3/lib/python3.11/site-packages/keras/src/backend.py», строка 5575, в categorical_crossentropy target.shape.assert_is_совместимо_with(output.shape) ValueError: фигуры (Нет, 6) и (Нет, 100, 6) несовместимы. Обновление 1:
Как Джо предложил в комментарии использовать слой Flatten, я добавил его, но безуспешно.