Numpy 在pytorch中显示错误分类的图像

Numpy 在pytorch中显示错误分类的图像,numpy,matplotlib,pytorch,tensorboard,Numpy,Matplotlib,Pytorch,Tensorboard,我是pytorch和numpy的新手,所以这可能是个愚蠢的问题。我希望看到一些图像被我的网络错误分类,带有正确的标签和预测的标签。这是我的密码 valid_and_test_set = torchvision.datasets.MNIST("./mnist", train=False, download=True) dataset_valid, dataset_test = torch.utils.data.random_split(valid_and_test_set,[5

我是pytorch和numpy的新手,所以这可能是个愚蠢的问题。我希望看到一些图像被我的网络错误分类,带有正确的标签和预测的标签。这是我的密码

valid_and_test_set = torchvision.datasets.MNIST("./mnist", train=False, download=True)
dataset_valid, dataset_test = torch.utils.data.random_split(valid_and_test_set,[5000, 5000])
dataset_test.dataset.transform = transform #transform is composed by unsqueeze, normalize, view and gaussian noise with randn
dataset_test.dataset.target_transform = OneHot() #OneHot return the label
dataloader_test = torch.utils.data.DataLoader(dataset_test.dataset, batch_size=5000, num_workers=num_workers, pin_memory=True)

def test(dataset, dataloader):
    net.eval()  
    with torch.no_grad():
        for batch in dataloader:
            inputs = batch[0]
            inputs = inputs.to(device, non_blocking=True)
            outputs = net(inputs)
            predictions = torch.argmax(outputs, dim=1)
            return predictions

提前感谢您

您至少可以通过两种方式来完成此操作

一种是,存储评估过程中错误分类的图像(运行测试数据)并绘制这些图像。如图所示

另一种方法是利用张力板。在我看来,这是相当优雅的,你可以找到一个全面的指南

可以这样编写showing()函数

def showimg(model):
    model=np.reshape(model.numpy(),[28,28]) # For 1D Vector
    
    #If you normalize the image then use Next three-line
    #Otherwise skip that
    mean=np.array([0.485, 0.456, 0.406] )
    std=np.array([0.229, 0.224, 0.225])
    model=(model*std+mean)
    


    #print(model)

    cv2.imshow("ABC", model)
    
    #waits for user to press any key
    #(this is necessary to avoid Python kernel form crashing)
    cv2.waitKey(0)

    #closing all open windows
    cv2.destroyAllWindows()

我得到这个错误,不知道这意味着什么

ValueError                                Traceback (most recent call last)
 in 
    288 
    289         # test on validation
--> 290         predictions = test(dataset_valid, dataloader_valid)
    291         accuracy_valid = 100. * predictions.eq(dataset_valid.dataset.targets[dataset_valid.indices].to(device)).sum().float() / len(dataset_valid)
    292 

 in test(dataset, dataloader)
    236                     print("Predicted Label")
    237                     print(predictions[sampleno])
--> 238                     showimages(inputs[sampleno].cpu())
    239             return predictions
    240 

 in showimages(model)
    240 
    241 def showimages(model):
--> 242     model=np.transpose(model.numpy(),(1,2,0))
    243 
    244     

<__array_function__ internals> in transpose(*args, **kwargs)

~/.local/lib/python3.7/site-packages/numpy/core/fromnumeric.py in transpose(a, axes)
    649 
    650     """
--> 651     return _wrapfunc(a, 'transpose', axes)
    652 
    653 

~/.local/lib/python3.7/site-packages/numpy/core/fromnumeric.py in _wrapfunc(obj, method, *args, **kwds)
     59 
     60     try:
---> 61         return bound(*args, **kwds)
     62     except TypeError:
     63         # A TypeError occurs if the object does have such a method in its

ValueError: axes don't match array
ValueError回溯(最近一次调用)
在里面
288
289#验证测试
-->290预测=测试(数据集有效,数据加载器有效)
291精度\u有效=100。*predictions.eq(dataset_valid.dataset.targets[dataset_valid.index].to(device)).sum().float()/len(dataset_valid)
292
测试中(数据集、数据加载器)
236打印(“预测标签”)
237打印(预测[sampleno])
-->238显示图像(输入[sampleno].cpu())
239返回预测
240
在showimages(模型)中
240
241 def showimages(型号):
-->242 model=np.transpose(model.numpy(),(1,2,0))
243
244
转置(*args,**kwargs)
转置中的~/.local/lib/python3.7/site-packages/numpy/core/fromneric.py(a,轴)
649
650     """
-->651返回(a,‘转置’,轴)
652
653
wrapfunc中的~/.local/lib/python3.7/site-packages/numpy/core/fromneric.py(obj,method,*args,**kwds)
59
60次尝试:
--->61返回边界(*args,**kwds)
62除类型错误外:
63#如果对象中确实有这样的方法,则会发生类型错误
ValueError:轴与阵列不匹配

train函数中的“数据”变量是什么?修改了该变量。您的
input
input[sampleno]
的大小是多少?torch.size([5000784])和torch.size([784])。问题是这是灰度,您使用的是RGB(我想)现在好了,我为3D阵列(RGB图像)做了这件事但是在你的例子中,输入是一个向量,我已经修改了我的答案。我想这一次它会工作的。几乎完成了,我在plt.imshow上得到了一个无效形状的错误(1,28,28)(我不得不使用它,因为我在Debian上使用OpenCV有问题)在使用
plt.inshow
ValueError                                Traceback (most recent call last)
 in 
    288 
    289         # test on validation
--> 290         predictions = test(dataset_valid, dataloader_valid)
    291         accuracy_valid = 100. * predictions.eq(dataset_valid.dataset.targets[dataset_valid.indices].to(device)).sum().float() / len(dataset_valid)
    292 

 in test(dataset, dataloader)
    236                     print("Predicted Label")
    237                     print(predictions[sampleno])
--> 238                     showimages(inputs[sampleno].cpu())
    239             return predictions
    240 

 in showimages(model)
    240 
    241 def showimages(model):
--> 242     model=np.transpose(model.numpy(),(1,2,0))
    243 
    244     

<__array_function__ internals> in transpose(*args, **kwargs)

~/.local/lib/python3.7/site-packages/numpy/core/fromnumeric.py in transpose(a, axes)
    649 
    650     """
--> 651     return _wrapfunc(a, 'transpose', axes)
    652 
    653 

~/.local/lib/python3.7/site-packages/numpy/core/fromnumeric.py in _wrapfunc(obj, method, *args, **kwds)
     59 
     60     try:
---> 61         return bound(*args, **kwds)
     62     except TypeError:
     63         # A TypeError occurs if the object does have such a method in its

ValueError: axes don't match array