Я пытаюсь построить нейронную сеть с текстовой меткой (многоуровневая), используя Keras.
Я создал словарь из примерно 2000 слов и закодировал обучающие образцы как последовательности индексов слов длиной 140 (с дополнением).
Как результат, данные выглядят как двумерный массив size (num_samples, 140)
. Где количество образцов составляет около 30 тыс.
Вот определение в моей нейронной сети
mdl = Sequential()
mdl.add(Embedding((vocab_len + 1), 300, input_length=140))
mdl.add(LSTM(100))
mdl.add(Dense(train_y.shape[1], activation="sigmoid"))
mdl.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=["accuracy"])
history = mdl.fit(train_x, train_y, epochs=4, verbose=1, validation_data=(valid_x, valid_y), batch_size=100)
Во время обучения Keras показывает точность около 0,93 как для данных обучения, так и для данных проверки. Что выглядит многообещающе.
Но когда я пытаюсь вызвать прогнозирование на тестовых данных
pred_y = mdl.predict(test_x, batch_size=100)
Я получаю массив, где все строки выглядят одинаково, и все меньше, чем 0,5. Следовательно, ни на одном из тестовых образцов не установлены метки.
Пример вывода из mdl.predict ()
Такое же поведение наблюдается, если я запускаю predict()
на тех же самых тренировочных данных, которые я только что использовал для обучения модели.
Но если я запускаю mdl.evaluate()
, я получаю ту же точность 0,93, как показано во время подгонки модели.
Что я делаю не так?