我的模型是否有可能在同一测试集上给出不同的结果?我错过了什么?

问题描述 投票:0回答:0

此代码有 2 个部分:在第一个部分中,我只想评估单个图像。在第二个中,我加载一个 ImageFolder,并评估每个结果以获得模型准确性。尽管从与 ImageFolder 相同的文件夹中选择图像,但我加载的模型输出完全错误的标签。 ImageFolder 的准确度为 0.93

import sys
import os
import re
import torch
from torchvision.models import resnet18, ResNet18_Weights
from PIL import Image
from torchvision import transforms
import torch.nn as nn
from torch.utils.data import ConcatDataset
from torchvision import datasets
from tqdm import tqdm
import json
from sklearn.metrics import confusion_matrix
from sklearn.metrics import ConfusionMatrixDisplay
import matplotlib.pyplot as plt

args = sys.argv

test_transform = transforms.Compose([
 transforms.Resize(256),
 transforms.CenterCrop(224),
 transforms.RandomHorizontalFlip(),
 transforms.ToTensor(),
 transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])       
])

classes = {
  'Annunciazione': 0,
  'Libro d\'Ore miniato': 1,
  'Lastra tombale di Giovanni Cabastida': 2,
  'Madonna del Cardillo': 3,
  'Disputa di San Tommaso': 4,
  'Traslazione della Santa Casa': 5,
  'Madonna col Bambino': 6,
  'L\'immacolata Concezione e Dio Padre in Gloria': 7,
  'Adorazione dei Magi': 8,
  'Sant\'Elena e Costantino e Madonna con Bambino in gloria fra angeli': 9,
  'Taccuini di disegni': 10,
  'Martirio di S. Lucia': 11,
  'Volto di Cristo': 12,
  'Dipinti di Sant\'Orsola': 13,
  'Immacolata e i santi Chiara, Francesco, Antonio, Abate, Barbara e Maria Maddalena': 14,
  'Storia della Genesi': 15
}

def load_image(img):
    img = test_transform(img)
    img = img.to(device)
    img = img.unsqueeze(0)
    return img

def get_resnet(num_class=16):
  model = resnet18(weights=ResNet18_Weights.DEFAULT)
  model.fc = nn.Linear(512, num_class)
  return model

argv = sys.argv


device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = get_resnet()
model = model.to(device)
model.load_state_dict(torch.load('./code/weights/best_model_params.pt'))
model.eval()



if len(argv) == 2:
  path = argv[1]

  if os.path.exists(path):
      match = re.findall(r'\d+', path)
      y_true = match[-1]
      print("True: ", y_true, ' | ', list(classes.keys())[list(classes.values()).index(int(y_true))])
  else:
      y_true = "unknown"
  img = Image.open(path)
  #img.show()
  img = load_image(img)
  print(img)
  img = img.to(device)
  with torch.no_grad():
    output = model(img)
    print(output)
    _, predicted_label = torch.max(output, 1)

  print("Pred: ", predicted_label.item(), ' | ', list(classes.keys())[list(classes.values()).index(int(predicted_label.item()))])

if len(args) == 1:
  test_dataset =  ConcatDataset([datasets.ImageFolder('./data/cropped_Datasets/Hololens/Test', test_transform), datasets.ImageFolder('./data/cropped_Datasets/GoPro/Test', test_transform)])
  test_json = json.load(open('./data/MDA_Bellomo/Hololens/Test/test_set.json'))
  images = test_json['images']
  annotations = test_json['annotations']
  print(images[0])



  test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=1, shuffle=False)

  total = len(test_dataset)
  y_preds = []
  y_true = []
  with torch.no_grad():
    correct = 0
    for images, labels in test_loader:
      images = images.to(device)
      labels = labels.to(device)
      outputs = model(images)
      print(outputs)
      _, predicted = torch.max(outputs, 1)
      y_preds.append(predicted.item())
      y_true.append(labels.item())

      correct += (predicted == labels).sum().item()
    print('Accuracy of the network on the test images: %d %%' % (100 * correct / total))

  cm = confusion_matrix(y_true, y_preds)
  print(cm)
  disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=list(classes.keys()))
  disp.plot()
  plt.show()

  

Transform 与模型相同(据我所知)。 考虑到模型经过适当训练,我希望评估正确的类别。

python machine-learning deep-learning pytorch
© www.soinside.com 2019 - 2024. All rights reserved.