误读 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)
我有一个包含 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)