Я пытаюсь решить проблему классификации последовательностей с помощью LSTM, где каждый образец имеет разную длину (но выходные данные имеют ту же длину, что и входные). Я не хочу обучать только один образец и хочу контролировать размер моего пакета.
Итак, для x.shape = (samples, max_timesteps, features) я добавил special_value_x, который используется для дополнения всех функций оставшиеся временные шаги.
Выходные данные y представляют собой последовательность классов на каждом временном шаге для каждой выборки, поэтому y.shape = (samples, timesteps, 1). Есть 5 классов для задачи. «Пустые» временные интервалы дополняются классом 0, но это уже один из существующих классов. Я не могу добавить к нему новое значение, потому что keras ограничивает его значением [0,5), когда у меня есть класс 5.
Затем я попытался установить маскирующий слой, чтобы игнорировать специальное значение для x:
special_value_x = 10
model = keras.Sequential()
model.add(Masking(mask_value=special_value_x, input_shape=(None, 10)))
model.add(LSTM(80, return_sequences=True))
model.add(TimeDistributed(Dense(5, activation='softmax')))
model.compile(loss=SparseCategoricalCrossentropy(from_logits=True),
optimizer=Adam(learning_rate=0.01),
metrics=['accuracy'])
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=20)
history = model.fit(x_train, y_train, batch_size=10, epochs=200, verbose=2,
validation_data=(x_test, y_test), callbacks=[es],
shuffle=True)
Я получил точность и val_accuracy, которые слишком высоки, потому что метрики включают эти дополненные временные шаги. Итак, мой вопрос: как я могу отображать показатели, которые игнорируют эти дополненные временные интервалы?