误读 argmax 的预测

misreading of predictions with argmax

我有一个包含 8 个 类 的分类器模型。我 运行 在测试集和模型 returns 上用它预测了一个热编码数组。现在,当我对这些预测进行 argmax 以便将它们转换成字符串时,它们并没有被转换成正确的类别。我认为编码数组是正确的预测,但在 argmax 之后,它变得一团糟。

import cv2
def prepare(path):
    imgsize=128
    img_array = cv2.imread(path)
    new_array = cv2.resize(img_array, (imgsize,imgsize))
    return new_array.reshape(-1,imgsize,imgsize,3)

predictions = []
matrix = []
for label in os.listdir(path_test):
    p = model.predict([prepare(path_test+"/"+label)])
    cl = numpy.argmax(p)
    matrix.append(p)
    predictions.append(cl)

我的八个 类 是:

['yam', 'hak', 'ali', 'udi', 'uri', 'tam', 'ssi', 'iya']

因此,当我 运行 在三个列表上进行 for 循环时,它们不匹配:

for i in predictions:
    print(classes[i], matrix[int(i)], i)

ssi [[0. 0. 0. 0. 0. 0. 1. 0.]] 6
ssi [[0. 0. 0. 0. 0. 0. 1. 0.]] 6
ali [[0. 0. 0. 0. 0. 0. 1. 0.]] 2
yam [[0. 0. 0. 0. 0. 0. 1. 0.]] 0
udi [[0. 0. 1. 0. 0. 0. 0. 0.]] 3
ali [[0. 0. 0. 0. 0. 0. 1. 0.]] 2
yam [[0. 0. 0. 0. 0. 0. 1. 0.]] 0
tam [[0. 0. 0. 0. 0. 0. 1. 0.]] 5
uri [[0. 0. 0. 0. 0. 0. 1. 0.]] 4

如您所见,相同的数组在 argmax 之后被分配了不同的值。对于测试集中出现索引 6 的许多图像,它们被归类为任何东西。我不确定其他 类 是否也会发生同样的情况。有人可以解释为什么会发生这种情况,或者我没有正确解释吗?

我认为您的打印循环是错误的,因为您使用预测 class 索引而不是实际对应的行对 matrix 进行索引。试试这个。

for cl, preds in zip(predictions, matrix):
    print(classes[cl], preds, cl)