Прогнозирование в Керасе со слоем LSTM - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь построить нейронную сеть с текстовой меткой (многоуровневая), используя 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, как показано во время подгонки модели.

Что я делаю не так?

Ответы [ 2 ]

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

model.predict(test_x, batch_size=100) выведет вероятность каждого из классов

model.predict_classes(test_x, batch_size=100) выведет наиболее вероятный класс / фактический прогноз

Так что из твоего вопроса кажется, что ты хочешь model.predict_classes. Запустите dir(model), чтобы увидеть все доступные функции.

Если вы хотите сгенерировать вывод model.predict_classes из вывода model.predict, выполните

pred = model.predict()
pred_classes_output = pred.argmax(axis=1)

что он делает, он проходит по каждой строке, например, ниже приведен вывод model.predict, который содержит вероятность для class1, class2, class3

[[0,15, 0,73, 0,02], # обратите внимание, что сумма вероятностей равна = 1

[0,23, 0,33, 0,44]]

находит индекс максимальной вероятности, т. Е. 0,73 имеет индекс 1, и создает массив этого значения, поэтому результат будет [1, 2].

model.evaluate запускает проверку model.predict_classes.

Также я надеюсь, что вы понимаете, что если ваша выборка была сугубо смещена, скажем, у вас было 90 из класса 1, 10 из класса 2, то, просто предсказав 1, вы получите точность 90%, известную как базовая точность.

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

Точность не является хорошей метрикой, если ваши классы не сбалансированы.Imaging у вас есть набор данных с 80% от 0 и 20% от 1.Вы можете создать модель, которая будет возвращать 0 во всех случаях, и ее точность будет равна 80%.

...