【问题标题】:Keras Prediction result (getting score,use of argmax)Keras 预测结果(获取分数,使用 argmax)
【发布时间】:2019-11-19 07:04:36
【问题描述】:

我正在尝试使用 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 返回列表中的最大值的索引。那么列表中其他值的用途是什么?为什么不考虑?也有可能从中获得分数吗?我希望这个问题很清楚。是对还是错?

我找到了问题。只是将它发布给遇到同样问题的其他人。

答案: 当使用 Elmo 模型进行预测时,它需要一个字符串列表。在代码中,预测数据被分割,模型预测每个单词。这就是为什么我得到这个巨大的数组。我使用了临时修复。数据被附加到一个列表中,然后一个空字符串也被附加到列表中。该模型将预测两个列表值,但我只采用了第一个预测数据。这不是正确的方法,但我已将其作为快速修复并希望在未来找到修复

【问题讨论】:

  • 输出是输入样本属于特定类的概率。如果你把它们都加起来,它会变成 1,因为最后一层有激活函数(softmax,最有可能)。因此,我们采用 argmax 来查找哪个概率最大,即当前输入属于特定类的概率较高。 argmax 返回最大概率的索引,您可以使用它来查找输入所属的类
  • data 包含什么?它是否包含多个测试示例?如果是这样,那么要获取每个示例的类,您必须 np.argmax(predicted, axis=1) 这将返回 n 个类,每个测试示例一个类。
  • @MihailBurduja - 数据包含字符串内容

标签: keras deep-learning nlp text-classification elmo


【解决方案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]

也就是说first测试样例属于third类,second测试样例属于second 类等等。

上一部分回答了你的问题(我认为),现在让我们看看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的索引。

【讨论】:

    猜你喜欢
    • 2019-06-07
    • 2018-09-18
    • 2019-01-02
    • 2022-01-10
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多