Результат предсказания Keras (получение оценки, использование argmax)

Я пытаюсь использовать модель elmo для классификации текста для своего собственного набора данных. Обучение завершено, и количество классов равно 4 (используется модель keras и встраивание elmo). В прогнозе я получил массив numpy. Я прилагаю пример кода и результат ниже...

import tensorflow as tf
import keras.backend as K
new_text_pr = np.array(data, dtype=object)[:, np.newaxis]
with tf.Session() as session:
    K.set_session(session)
    session.run(tf.global_variables_initializer())
    session.run(tf.tables_initializer())
    model_elmo = build_model(classes)
    model_elmo.load_weights(model+"/"+elmo_model)
    import time
    t = time.time()
    predicted = model_elmo.predict(new_text_pr)
    print("time: ", time.time() - t)
    print(predicted)
    # print(predicted[0][0])
    print("result:",np.argmax(predicted[0]))
    return np.argmax(predicted[0])

когда я печатаю переменную прогнозирования, я получаю это.

time:  1.561854362487793
 [[0.17483692 0.21439584 0.24001297 0.3707543 ]
 [0.15607062 0.24448264 0.4398888  0.15955798]
 [0.06494818 0.3439018  0.42254424 0.16860574]
 [0.08343349 0.37218323 0.32528472 0.2190985 ]
 [0.14868192 0.25948635 0.32722548 0.2646063 ]
 [0.0365712  0.4194748  0.3321385  0.21181548]
 [0.05350104 0.18225929 0.56712115 0.19711846]
 [0.08343349 0.37218323 0.32528472 0.2190985 ]
 [0.09541835 0.19085276 0.41069734 0.30303153]
 [0.03930932 0.40526104 0.45785302 0.09757669]
 [0.06377257 0.33980298 0.32396355 0.27246094]
 [0.09784496 0.2292052  0.44426462 0.22868524]
 [0.06089798 0.31685832 0.47317514 0.14906852]
 [0.03956613 0.46605557 0.3502095  0.14416872]
 [0.10513227 0.26166025 0.36598155 0.26722598]
 [0.15165758 0.22900137 0.50939053 0.10995051]
 [0.06377257 0.33980298 0.32396355 0.27246094]
 [0.11404029 0.21311268 0.46880838 0.2040386 ]
 [0.07556026 0.20502563 0.52019936 0.19921473]
 [0.11096822 0.23295449 0.36192006 0.29415724]
 [0.05018891 0.16656907 0.60114646 0.18209551]
 [0.08880813 0.2893545  0.44374797 0.1780894 ]
 [0.14868192 0.25948635 0.32722548 0.2646063 ]
 [0.09596984 0.18282187 0.5053091  0.2158991 ]
 [0.09428936 0.13995855 0.62395805 0.14179407]
 [0.10513227 0.26166025 0.36598155 0.26722598]
 [0.08244281 0.15743142 0.5462735  0.21385226]
 [0.07199708 0.2446867  0.44568574 0.23763043]
 [0.1339082  0.27288827 0.43478844 0.15841508]
 [0.07354636 0.24499843 0.44873005 0.23272514]
 [0.08880813 0.2893545  0.44374797 0.1780894 ]
 [0.14868192 0.25948635 0.32722548 0.2646063 ]
 [0.08924995 0.36547357 0.40014726 0.14512917]
 [0.05132649 0.28190497 0.5224545  0.14431408]
 [0.06377257 0.33980292 0.32396355 0.27246094]
 [0.04849219 0.36724472 0.39698333 0.1872797 ]
 [0.07206573 0.31368822 0.4667826  0.14746341]
 [0.05948553 0.28048623 0.41831577 0.2417125 ]
 [0.07582933 0.18771031 0.54879296 0.18766735]
 [0.03858965 0.20433436 0.5596278  0.19744818]
 [0.07443814 0.20681688 0.3933627  0.32538226]
 [0.0639974  0.23687115 0.5357675  0.16336392]
 [0.11005415 0.22901568 0.4279426  0.23298755]
 [0.12625505 0.22987585 0.31619486 0.32767424]
 [0.08893713 0.14554602 0.45740074 0.30811617]
 [0.07906891 0.18683094 0.5214609  0.21263924]
 [0.06316617 0.30398315 0.4475617  0.185289  ]
 [0.07060979 0.17987429 0.4829593  0.26655656]
 [0.0720717  0.27058697 0.41439256 0.24294883]
 [0.06377257 0.33980292 0.32396355 0.27246094]
 [0.04745338 0.25831962 0.46751252 0.22671448]
 [0.06624557 0.20708969 0.54820716 0.17845756]]
 result:3

Кто-нибудь знает, зачем использовать только 0-е значение индекса. Рассматривая это как список списков, 0-й индекс означает первый список, а argmax возвращает index максимальное значение из списка. Тогда какая польза от других значений в списках? Почему не считается? Также возможно ли получить счет от этого? Надеюсь вопрос ясен. Это правильный путь или неправильный?

Я нашел проблему. просто опубликовать других, которые столкнулись с той же проблемой.

Ответ: При прогнозировании с помощью модели Elmo ожидается список строк. В коде данные предсказания были разделены, и модель предсказала каждое слово. Вот почему я получил этот огромный массив. Я использовал временное решение. Данные добавляются в список, затем к списку добавляется пустая строка. Модель будет предсказывать оба значения списка, но я взял только первые предсказанные данные. Это неправильный способ, но я сделал это как быстрое исправление и надеюсь найти исправление в будущем.


person Amal Joseph    schedule 19.11.2019    source источник
comment
Результатом является вероятность того, что входная выборка принадлежит определенному классу. если вы добавите их все, то станет 1 из-за функции активации (скорее всего, softmax) в последнем слое. Поэтому мы берем argmax, чтобы найти, какой из них имеет наибольшую вероятность, то есть более высокую вероятность того, что текущий ввод принадлежит определенному классу. argmax возвращает индекс максимальной вероятности, и вы используете его, чтобы найти класс, к которому принадлежит вход.   -  person venkata krishnan    schedule 19.11.2019
comment
Что содержит data? Содержит ли он несколько тестовых примеров? Если это так, то для получения классов для каждого примера вам потребуется np.argmax(predicted, axis=1), который вернет n классов, по одному для каждого из тестовых примеров.   -  person Mihail Burduja    schedule 19.11.2019
comment
@MihailBurduja - данные содержат строковое содержимое   -  person Amal Joseph    schedule 19.11.2019


Ответы (1)


Чтобы найти прогнозируемый класс для каждого тестового примера, вам нужно использовать axis=1. Итак, в вашем случае прогнозируемые классы будут:

>>> predicted_classes = predicted.argmax(axis=1)
>>> predicted_classes
[3 2 2 1 2 1 2 1 2 2 1 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2
 2 2 2 2 2 2 3 2 2 2 2 2 1 2 2]

Это означает, что первый тестовый пример принадлежит третьему классу, а второй тестовый пример принадлежит второму. класс и так далее.

Предыдущая часть ответила на ваш вопрос (думаю), теперь посмотрим, что делает np.argmax(predicted). Использование только np.argmax() без указания оси сгладит вашу матрицу predicted и получит аргумент максимального числа.

Давайте посмотрим на этот простой пример, чтобы понять, что я имею в виду:

>>> x = np.matrix(np.arange(12).reshape((3,4)))
>>> x
matrix([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
>>> x.argmax()
11

11 - это индекс 11, который является самым большим числом во всей матрице.

person Anwarvic    schedule 20.11.2019