Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建具有正确计数的验证结果矩阵_Python_Numpy_Pytorch - Fatal编程技术网

Python 创建具有正确计数的验证结果矩阵

Python 创建具有正确计数的验证结果矩阵,python,numpy,pytorch,Python,Numpy,Pytorch,我有一个经过训练的10类机器学习模型,类似于MNIST数字分类器。我想确定每个数字类正确的频率,以及如果出现错误,它会混淆为哪个类。我想用它来创建一个混乱矩阵 无论如何,每个过程的输入是来自验证集的一批图片(形状(32,3224224),其中3,224和224是图片尺寸,32是批量大小)以及这些图片匹配的类号标签(形状32,1)。模型输出为(形状32,1),并列出模型认为最匹配的类号。通过比较标签和输出张量,我可以很容易地找到有多少匹配项,但我很难说出错误分类是如何遗漏的。下面是主验证循环的一个

我有一个经过训练的10类机器学习模型,类似于MNIST数字分类器。我想确定每个数字类正确的频率,以及如果出现错误,它会混淆为哪个类。我想用它来创建一个混乱矩阵

无论如何,每个过程的输入是来自验证集的一批图片(形状(32,3224224),其中3,224和224是图片尺寸,32是批量大小)以及这些图片匹配的类号标签(形状32,1)。模型输出为(形状32,1),并列出模型认为最匹配的类号。通过比较标签和输出张量,我可以很容易地找到有多少匹配项,但我很难说出错误分类是如何遗漏的。下面是主验证循环的一个片段

# Main validation loop
valid_accuracy = 0.0
model.eval()
device = 'cuda'
raw_counts = torch.zeros((11,11)) # leave room for totals in the last row and column
with torch.no_grad():
    for inputs, labels in validloader:
        # Run each image through the network to get log probabilities of each class
        inputs, labels = inputs.to(device), labels.to(device)
        logps = model.forward(inputs)  

        # Calculate accuracy
        ps = torch.exp(logps) # 32 X 10: probability of each label in every case
        top_p, top_class = ps.topk(1, dim=1)
        equals = top_class == labels.view(*top_class.shape)
        valid_accuracy += torch.mean(equals.type(torch.FloatTensor)).item()

        # Count confusions
        raw_counts[labels[:],top_class[:,0]] += 1  # <<<<---- This is the problem!

        # Accumulate letter-by-letter certainties
        for i in range(ll):
            sum_ps[i,] += sum(ps[labels==i])
            letter_counts[i] += len(ps[labels==i])

# Print validation accuracy
valid_accuracy = valid_accuracy/len(validloader)
print(f"Validation accuracy: {valid_accuracy:.3f}")
一切如期而至。但在执行该行之后:

(Pdb) n
> /home/model.py(219)main()
-> for i in range(10):
(Pdb) raw_counts
tensor([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])

尽管这批产品中有五个标签是5个,而且型号都很好,但仍然
原始计数[4,4]==1
。有没有什么类似python的方法来计算所有五个正确答案,而不让循环变得混乱之类的呢?

没有足够的声誉来评论,所以我重复一下


我使用这两个函数来计算混淆矩阵(如中所定义):

#将sklearn方法重写为torch
定义混淆矩阵1(y_真,y_pred):
N=max(max(y_真)、max(y_pred))+1
y_-true=torch.tensor(y_-true,dtype=torch.long)
y_pred=火炬.张量(y_pred,dtype=火炬.长)
返回火炬.稀疏.长传感器(
火炬堆栈([y_true,y_pred]),
torch.one_like(y_true,dtype=torch.long),
火炬尺寸([N,N])至密度()
#用bincount玩的诡计
def混淆矩阵2(y_真,y_pred):
N=max(max(y_真)、max(y_pred))+1
y_-true=torch.tensor(y_-true,dtype=torch.long)
y_pred=火炬.张量(y_pred,dtype=火炬.长)
y=N*y_真+y_预测
y=火炬的宾数(y)
如果len(y)
第二个函数在类数较少的情况下速度更快

%%timeit
混淆矩阵1(y_真,y_pred)
#每个回路102µs±30.7µs(7次运行的平均值±标准偏差,每个1000个回路)
%%时间
混淆矩阵2(y_真,y_pred)
#每个回路25µs±149 ns(7次运行的平均值±标准偏差,每个10000个回路)

如果您可以复制另一个问题的答案来回答这个问题,那么这个问题是重复的,应该关闭。或者,如果它们是不同的问题,你的答案并不真正回答其中一个问题。
(Pdb) n
> /home/model.py(219)main()
-> for i in range(10):
(Pdb) raw_counts
tensor([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])