1

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

4

1 回答 1

3

要查找每个测试示例的预测类,您需要使用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 的索引。

于 2019-11-20T05:55:27.487 回答