Confusion matrix and test accuracy for PyTorch Transfer Learning tutorial










0















Following the Pytorch Transfer learning tutorial, I am interested in reporting only train and test accuracy as well as confusion matrix (say using sklearn confusionmatrix). How can I do that? The current tutorial only reports train/val accuracy and I am having hard time figuring how to incorporate the sklearn confusionmatrix code there. Link to original tutorial here: https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html



%matplotlib inline
from graphviz import Digraph
import torch
from torch.autograd import Variable
# Author: Sasank Chilamkurthy

from __future__ import print_function, division

import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim import lr_scheduler
import numpy as np
import torchvision
from torchvision import datasets, models, transforms
import matplotlib.pyplot as plt
import time
import os
import copy

plt.ion()
data_transforms =
'train': transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
'val': transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),



data_dir = "images"
image_datasets = x: datasets.ImageFolder(os.path.join(data_dir, x),
data_transforms[x])
for x in ['train', 'val']
dataloaders = x: torch.utils.data.DataLoader(image_datasets[x], batch_size=4,
shuffle=True, num_workers=4)
for x in ['train', 'val']
dataset_sizes = x: len(image_datasets[x]) for x in ['train', 'val']
class_names = image_datasets['train'].classes

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

def imshow(inp, title=None):
"""Imshow for Tensor."""
inp = inp.numpy().transpose((1, 2, 0))
mean = np.array([0.485, 0.456, 0.406])
std = np.array([0.229, 0.224, 0.225])
inp = std * inp + mean
inp = np.clip(inp, 0, 1)
plt.imshow(inp)
if title is not None:
plt.title(title)
plt.pause(0.001) # pause a bit so that plots are updated


# Get a batch of training data
inputs, classes = next(iter(dataloaders['train']))

# Make a grid from batch
out = torchvision.utils.make_grid(inputs)

imshow(out, title=[class_names[x] for x in classes])

def train_model(model, criterion, optimizer, scheduler, num_epochs=25):
since = time.time()

best_model_wts = copy.deepcopy(model.state_dict())
best_acc = 0.0

for epoch in range(num_epochs):
print('Epoch /'.format(epoch, num_epochs - 1))
print('-' * 10)

# Each epoch has a training and validation phase
for phase in ['train', 'val']:
if phase == 'train':
scheduler.step()
model.train() # Set model to training mode
else:
model.eval() # Set model to evaluate mode

running_loss = 0.0
running_corrects = 0

# Iterate over data.
for inputs, labels in dataloaders[phase]:
inputs = inputs.to(device)
labels = labels.to(device)

# zero the parameter gradients
optimizer.zero_grad()

# forward
# track history if only in train
with torch.set_grad_enabled(phase == 'train'):
outputs = model(inputs)
_, preds = torch.max(outputs, 1)
loss = criterion(outputs, labels)

# backward + optimize only if in training phase
if phase == 'train':
loss.backward()
optimizer.step()

# statistics
running_loss += loss.item() * inputs.size(0)
running_corrects += torch.sum(preds == labels.data)

epoch_loss = running_loss / dataset_sizes[phase]
epoch_acc = running_corrects.double() / dataset_sizes[phase]

print(' Loss: :.4f Acc: :.4f'.format(
phase, epoch_loss, epoch_acc))

# deep copy the model
if phase == 'val' and epoch_acc > best_acc:
best_acc = epoch_acc
best_model_wts = copy.deepcopy(model.state_dict())

print()

time_elapsed = time.time() - since
print('Training complete in :.0fm :.0fs'.format(
time_elapsed // 60, time_elapsed % 60))
print('Best val Acc: :4f'.format(best_acc))

# load best model weights
model.load_state_dict(best_model_wts)
return model

def visualize_model(model, num_images=6):
was_training = model.training
model.eval()
images_so_far = 0
fig = plt.figure()

with torch.no_grad():
for i, (inputs, labels) in enumerate(dataloaders['val']):
inputs = inputs.to(device)
labels = labels.to(device)

outputs = model(inputs)
_, preds = torch.max(outputs, 1)

for j in range(inputs.size()[0]):
images_so_far += 1
ax = plt.subplot(num_images//2, 2, images_so_far)
ax.axis('off')
ax.set_title('predicted: '.format(class_names[preds[j]]))
imshow(inputs.cpu().data[j])

if images_so_far == num_images:
model.train(mode=was_training)
return
model.train(mode=was_training)

model_ft = models.resnet18(pretrained=True)
num_ftrs = model_ft.fc.in_features
model_ft.fc = nn.Linear(num_ftrs, 9)

model_ft = model_ft.to(device)

criterion = nn.CrossEntropyLoss()

# Observe that all parameters are being optimized
optimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)

# Decay LR by a factor of 0.1 every 7 epochs
exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)

model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler,
num_epochs=25)

visualize_model(model_ft)









share|improve this question


























    0















    Following the Pytorch Transfer learning tutorial, I am interested in reporting only train and test accuracy as well as confusion matrix (say using sklearn confusionmatrix). How can I do that? The current tutorial only reports train/val accuracy and I am having hard time figuring how to incorporate the sklearn confusionmatrix code there. Link to original tutorial here: https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html



    %matplotlib inline
    from graphviz import Digraph
    import torch
    from torch.autograd import Variable
    # Author: Sasank Chilamkurthy

    from __future__ import print_function, division

    import torch
    import torch.nn as nn
    import torch.optim as optim
    from torch.optim import lr_scheduler
    import numpy as np
    import torchvision
    from torchvision import datasets, models, transforms
    import matplotlib.pyplot as plt
    import time
    import os
    import copy

    plt.ion()
    data_transforms =
    'train': transforms.Compose([
    transforms.RandomResizedCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    'val': transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),



    data_dir = "images"
    image_datasets = x: datasets.ImageFolder(os.path.join(data_dir, x),
    data_transforms[x])
    for x in ['train', 'val']
    dataloaders = x: torch.utils.data.DataLoader(image_datasets[x], batch_size=4,
    shuffle=True, num_workers=4)
    for x in ['train', 'val']
    dataset_sizes = x: len(image_datasets[x]) for x in ['train', 'val']
    class_names = image_datasets['train'].classes

    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

    def imshow(inp, title=None):
    """Imshow for Tensor."""
    inp = inp.numpy().transpose((1, 2, 0))
    mean = np.array([0.485, 0.456, 0.406])
    std = np.array([0.229, 0.224, 0.225])
    inp = std * inp + mean
    inp = np.clip(inp, 0, 1)
    plt.imshow(inp)
    if title is not None:
    plt.title(title)
    plt.pause(0.001) # pause a bit so that plots are updated


    # Get a batch of training data
    inputs, classes = next(iter(dataloaders['train']))

    # Make a grid from batch
    out = torchvision.utils.make_grid(inputs)

    imshow(out, title=[class_names[x] for x in classes])

    def train_model(model, criterion, optimizer, scheduler, num_epochs=25):
    since = time.time()

    best_model_wts = copy.deepcopy(model.state_dict())
    best_acc = 0.0

    for epoch in range(num_epochs):
    print('Epoch /'.format(epoch, num_epochs - 1))
    print('-' * 10)

    # Each epoch has a training and validation phase
    for phase in ['train', 'val']:
    if phase == 'train':
    scheduler.step()
    model.train() # Set model to training mode
    else:
    model.eval() # Set model to evaluate mode

    running_loss = 0.0
    running_corrects = 0

    # Iterate over data.
    for inputs, labels in dataloaders[phase]:
    inputs = inputs.to(device)
    labels = labels.to(device)

    # zero the parameter gradients
    optimizer.zero_grad()

    # forward
    # track history if only in train
    with torch.set_grad_enabled(phase == 'train'):
    outputs = model(inputs)
    _, preds = torch.max(outputs, 1)
    loss = criterion(outputs, labels)

    # backward + optimize only if in training phase
    if phase == 'train':
    loss.backward()
    optimizer.step()

    # statistics
    running_loss += loss.item() * inputs.size(0)
    running_corrects += torch.sum(preds == labels.data)

    epoch_loss = running_loss / dataset_sizes[phase]
    epoch_acc = running_corrects.double() / dataset_sizes[phase]

    print(' Loss: :.4f Acc: :.4f'.format(
    phase, epoch_loss, epoch_acc))

    # deep copy the model
    if phase == 'val' and epoch_acc > best_acc:
    best_acc = epoch_acc
    best_model_wts = copy.deepcopy(model.state_dict())

    print()

    time_elapsed = time.time() - since
    print('Training complete in :.0fm :.0fs'.format(
    time_elapsed // 60, time_elapsed % 60))
    print('Best val Acc: :4f'.format(best_acc))

    # load best model weights
    model.load_state_dict(best_model_wts)
    return model

    def visualize_model(model, num_images=6):
    was_training = model.training
    model.eval()
    images_so_far = 0
    fig = plt.figure()

    with torch.no_grad():
    for i, (inputs, labels) in enumerate(dataloaders['val']):
    inputs = inputs.to(device)
    labels = labels.to(device)

    outputs = model(inputs)
    _, preds = torch.max(outputs, 1)

    for j in range(inputs.size()[0]):
    images_so_far += 1
    ax = plt.subplot(num_images//2, 2, images_so_far)
    ax.axis('off')
    ax.set_title('predicted: '.format(class_names[preds[j]]))
    imshow(inputs.cpu().data[j])

    if images_so_far == num_images:
    model.train(mode=was_training)
    return
    model.train(mode=was_training)

    model_ft = models.resnet18(pretrained=True)
    num_ftrs = model_ft.fc.in_features
    model_ft.fc = nn.Linear(num_ftrs, 9)

    model_ft = model_ft.to(device)

    criterion = nn.CrossEntropyLoss()

    # Observe that all parameters are being optimized
    optimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)

    # Decay LR by a factor of 0.1 every 7 epochs
    exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)

    model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler,
    num_epochs=25)

    visualize_model(model_ft)









    share|improve this question
























      0












      0








      0








      Following the Pytorch Transfer learning tutorial, I am interested in reporting only train and test accuracy as well as confusion matrix (say using sklearn confusionmatrix). How can I do that? The current tutorial only reports train/val accuracy and I am having hard time figuring how to incorporate the sklearn confusionmatrix code there. Link to original tutorial here: https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html



      %matplotlib inline
      from graphviz import Digraph
      import torch
      from torch.autograd import Variable
      # Author: Sasank Chilamkurthy

      from __future__ import print_function, division

      import torch
      import torch.nn as nn
      import torch.optim as optim
      from torch.optim import lr_scheduler
      import numpy as np
      import torchvision
      from torchvision import datasets, models, transforms
      import matplotlib.pyplot as plt
      import time
      import os
      import copy

      plt.ion()
      data_transforms =
      'train': transforms.Compose([
      transforms.RandomResizedCrop(224),
      transforms.RandomHorizontalFlip(),
      transforms.ToTensor(),
      transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
      ]),
      'val': transforms.Compose([
      transforms.Resize(256),
      transforms.CenterCrop(224),
      transforms.ToTensor(),
      transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
      ]),



      data_dir = "images"
      image_datasets = x: datasets.ImageFolder(os.path.join(data_dir, x),
      data_transforms[x])
      for x in ['train', 'val']
      dataloaders = x: torch.utils.data.DataLoader(image_datasets[x], batch_size=4,
      shuffle=True, num_workers=4)
      for x in ['train', 'val']
      dataset_sizes = x: len(image_datasets[x]) for x in ['train', 'val']
      class_names = image_datasets['train'].classes

      device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

      def imshow(inp, title=None):
      """Imshow for Tensor."""
      inp = inp.numpy().transpose((1, 2, 0))
      mean = np.array([0.485, 0.456, 0.406])
      std = np.array([0.229, 0.224, 0.225])
      inp = std * inp + mean
      inp = np.clip(inp, 0, 1)
      plt.imshow(inp)
      if title is not None:
      plt.title(title)
      plt.pause(0.001) # pause a bit so that plots are updated


      # Get a batch of training data
      inputs, classes = next(iter(dataloaders['train']))

      # Make a grid from batch
      out = torchvision.utils.make_grid(inputs)

      imshow(out, title=[class_names[x] for x in classes])

      def train_model(model, criterion, optimizer, scheduler, num_epochs=25):
      since = time.time()

      best_model_wts = copy.deepcopy(model.state_dict())
      best_acc = 0.0

      for epoch in range(num_epochs):
      print('Epoch /'.format(epoch, num_epochs - 1))
      print('-' * 10)

      # Each epoch has a training and validation phase
      for phase in ['train', 'val']:
      if phase == 'train':
      scheduler.step()
      model.train() # Set model to training mode
      else:
      model.eval() # Set model to evaluate mode

      running_loss = 0.0
      running_corrects = 0

      # Iterate over data.
      for inputs, labels in dataloaders[phase]:
      inputs = inputs.to(device)
      labels = labels.to(device)

      # zero the parameter gradients
      optimizer.zero_grad()

      # forward
      # track history if only in train
      with torch.set_grad_enabled(phase == 'train'):
      outputs = model(inputs)
      _, preds = torch.max(outputs, 1)
      loss = criterion(outputs, labels)

      # backward + optimize only if in training phase
      if phase == 'train':
      loss.backward()
      optimizer.step()

      # statistics
      running_loss += loss.item() * inputs.size(0)
      running_corrects += torch.sum(preds == labels.data)

      epoch_loss = running_loss / dataset_sizes[phase]
      epoch_acc = running_corrects.double() / dataset_sizes[phase]

      print(' Loss: :.4f Acc: :.4f'.format(
      phase, epoch_loss, epoch_acc))

      # deep copy the model
      if phase == 'val' and epoch_acc > best_acc:
      best_acc = epoch_acc
      best_model_wts = copy.deepcopy(model.state_dict())

      print()

      time_elapsed = time.time() - since
      print('Training complete in :.0fm :.0fs'.format(
      time_elapsed // 60, time_elapsed % 60))
      print('Best val Acc: :4f'.format(best_acc))

      # load best model weights
      model.load_state_dict(best_model_wts)
      return model

      def visualize_model(model, num_images=6):
      was_training = model.training
      model.eval()
      images_so_far = 0
      fig = plt.figure()

      with torch.no_grad():
      for i, (inputs, labels) in enumerate(dataloaders['val']):
      inputs = inputs.to(device)
      labels = labels.to(device)

      outputs = model(inputs)
      _, preds = torch.max(outputs, 1)

      for j in range(inputs.size()[0]):
      images_so_far += 1
      ax = plt.subplot(num_images//2, 2, images_so_far)
      ax.axis('off')
      ax.set_title('predicted: '.format(class_names[preds[j]]))
      imshow(inputs.cpu().data[j])

      if images_so_far == num_images:
      model.train(mode=was_training)
      return
      model.train(mode=was_training)

      model_ft = models.resnet18(pretrained=True)
      num_ftrs = model_ft.fc.in_features
      model_ft.fc = nn.Linear(num_ftrs, 9)

      model_ft = model_ft.to(device)

      criterion = nn.CrossEntropyLoss()

      # Observe that all parameters are being optimized
      optimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)

      # Decay LR by a factor of 0.1 every 7 epochs
      exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)

      model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler,
      num_epochs=25)

      visualize_model(model_ft)









      share|improve this question














      Following the Pytorch Transfer learning tutorial, I am interested in reporting only train and test accuracy as well as confusion matrix (say using sklearn confusionmatrix). How can I do that? The current tutorial only reports train/val accuracy and I am having hard time figuring how to incorporate the sklearn confusionmatrix code there. Link to original tutorial here: https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html



      %matplotlib inline
      from graphviz import Digraph
      import torch
      from torch.autograd import Variable
      # Author: Sasank Chilamkurthy

      from __future__ import print_function, division

      import torch
      import torch.nn as nn
      import torch.optim as optim
      from torch.optim import lr_scheduler
      import numpy as np
      import torchvision
      from torchvision import datasets, models, transforms
      import matplotlib.pyplot as plt
      import time
      import os
      import copy

      plt.ion()
      data_transforms =
      'train': transforms.Compose([
      transforms.RandomResizedCrop(224),
      transforms.RandomHorizontalFlip(),
      transforms.ToTensor(),
      transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
      ]),
      'val': transforms.Compose([
      transforms.Resize(256),
      transforms.CenterCrop(224),
      transforms.ToTensor(),
      transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
      ]),



      data_dir = "images"
      image_datasets = x: datasets.ImageFolder(os.path.join(data_dir, x),
      data_transforms[x])
      for x in ['train', 'val']
      dataloaders = x: torch.utils.data.DataLoader(image_datasets[x], batch_size=4,
      shuffle=True, num_workers=4)
      for x in ['train', 'val']
      dataset_sizes = x: len(image_datasets[x]) for x in ['train', 'val']
      class_names = image_datasets['train'].classes

      device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

      def imshow(inp, title=None):
      """Imshow for Tensor."""
      inp = inp.numpy().transpose((1, 2, 0))
      mean = np.array([0.485, 0.456, 0.406])
      std = np.array([0.229, 0.224, 0.225])
      inp = std * inp + mean
      inp = np.clip(inp, 0, 1)
      plt.imshow(inp)
      if title is not None:
      plt.title(title)
      plt.pause(0.001) # pause a bit so that plots are updated


      # Get a batch of training data
      inputs, classes = next(iter(dataloaders['train']))

      # Make a grid from batch
      out = torchvision.utils.make_grid(inputs)

      imshow(out, title=[class_names[x] for x in classes])

      def train_model(model, criterion, optimizer, scheduler, num_epochs=25):
      since = time.time()

      best_model_wts = copy.deepcopy(model.state_dict())
      best_acc = 0.0

      for epoch in range(num_epochs):
      print('Epoch /'.format(epoch, num_epochs - 1))
      print('-' * 10)

      # Each epoch has a training and validation phase
      for phase in ['train', 'val']:
      if phase == 'train':
      scheduler.step()
      model.train() # Set model to training mode
      else:
      model.eval() # Set model to evaluate mode

      running_loss = 0.0
      running_corrects = 0

      # Iterate over data.
      for inputs, labels in dataloaders[phase]:
      inputs = inputs.to(device)
      labels = labels.to(device)

      # zero the parameter gradients
      optimizer.zero_grad()

      # forward
      # track history if only in train
      with torch.set_grad_enabled(phase == 'train'):
      outputs = model(inputs)
      _, preds = torch.max(outputs, 1)
      loss = criterion(outputs, labels)

      # backward + optimize only if in training phase
      if phase == 'train':
      loss.backward()
      optimizer.step()

      # statistics
      running_loss += loss.item() * inputs.size(0)
      running_corrects += torch.sum(preds == labels.data)

      epoch_loss = running_loss / dataset_sizes[phase]
      epoch_acc = running_corrects.double() / dataset_sizes[phase]

      print(' Loss: :.4f Acc: :.4f'.format(
      phase, epoch_loss, epoch_acc))

      # deep copy the model
      if phase == 'val' and epoch_acc > best_acc:
      best_acc = epoch_acc
      best_model_wts = copy.deepcopy(model.state_dict())

      print()

      time_elapsed = time.time() - since
      print('Training complete in :.0fm :.0fs'.format(
      time_elapsed // 60, time_elapsed % 60))
      print('Best val Acc: :4f'.format(best_acc))

      # load best model weights
      model.load_state_dict(best_model_wts)
      return model

      def visualize_model(model, num_images=6):
      was_training = model.training
      model.eval()
      images_so_far = 0
      fig = plt.figure()

      with torch.no_grad():
      for i, (inputs, labels) in enumerate(dataloaders['val']):
      inputs = inputs.to(device)
      labels = labels.to(device)

      outputs = model(inputs)
      _, preds = torch.max(outputs, 1)

      for j in range(inputs.size()[0]):
      images_so_far += 1
      ax = plt.subplot(num_images//2, 2, images_so_far)
      ax.axis('off')
      ax.set_title('predicted: '.format(class_names[preds[j]]))
      imshow(inputs.cpu().data[j])

      if images_so_far == num_images:
      model.train(mode=was_training)
      return
      model.train(mode=was_training)

      model_ft = models.resnet18(pretrained=True)
      num_ftrs = model_ft.fc.in_features
      model_ft.fc = nn.Linear(num_ftrs, 9)

      model_ft = model_ft.to(device)

      criterion = nn.CrossEntropyLoss()

      # Observe that all parameters are being optimized
      optimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)

      # Decay LR by a factor of 0.1 every 7 epochs
      exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)

      model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler,
      num_epochs=25)

      visualize_model(model_ft)






      python scikit-learn pytorch confusion-matrix transfer-learning






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 13 '18 at 22:13









      Mona JalalMona Jalal

      8,07428108210




      8,07428108210






















          1 Answer
          1






          active

          oldest

          votes


















          0














          Answer given by ptrblck of PyTorch community. Thanks a lot!



          nb_classes = 9

          confusion_matrix = torch.zeros(nb_classes, nb_classes)
          with torch.no_grad():
          for i, (inputs, classes) in enumerate(dataloaders['val']):
          inputs = inputs.to(device)
          classes = classes.to(device)
          outputs = model_ft(inputs)
          _, preds = torch.max(outputs, 1)
          for t, p in zip(classes.view(-1), preds.view(-1)):
          confusion_matrix[t.long(), p.long()] += 1

          print(confusion_matrix)


          To get the per-class accuracy:



          print(confusion_matrix.diag()/confusion_matrix.sum(1))





          share|improve this answer
























            Your Answer






            StackExchange.ifUsing("editor", function ()
            StackExchange.using("externalEditor", function ()
            StackExchange.using("snippets", function ()
            StackExchange.snippets.init();
            );
            );
            , "code-snippets");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "1"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53290306%2fconfusion-matrix-and-test-accuracy-for-pytorch-transfer-learning-tutorial%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            Answer given by ptrblck of PyTorch community. Thanks a lot!



            nb_classes = 9

            confusion_matrix = torch.zeros(nb_classes, nb_classes)
            with torch.no_grad():
            for i, (inputs, classes) in enumerate(dataloaders['val']):
            inputs = inputs.to(device)
            classes = classes.to(device)
            outputs = model_ft(inputs)
            _, preds = torch.max(outputs, 1)
            for t, p in zip(classes.view(-1), preds.view(-1)):
            confusion_matrix[t.long(), p.long()] += 1

            print(confusion_matrix)


            To get the per-class accuracy:



            print(confusion_matrix.diag()/confusion_matrix.sum(1))





            share|improve this answer





























              0














              Answer given by ptrblck of PyTorch community. Thanks a lot!



              nb_classes = 9

              confusion_matrix = torch.zeros(nb_classes, nb_classes)
              with torch.no_grad():
              for i, (inputs, classes) in enumerate(dataloaders['val']):
              inputs = inputs.to(device)
              classes = classes.to(device)
              outputs = model_ft(inputs)
              _, preds = torch.max(outputs, 1)
              for t, p in zip(classes.view(-1), preds.view(-1)):
              confusion_matrix[t.long(), p.long()] += 1

              print(confusion_matrix)


              To get the per-class accuracy:



              print(confusion_matrix.diag()/confusion_matrix.sum(1))





              share|improve this answer



























                0












                0








                0







                Answer given by ptrblck of PyTorch community. Thanks a lot!



                nb_classes = 9

                confusion_matrix = torch.zeros(nb_classes, nb_classes)
                with torch.no_grad():
                for i, (inputs, classes) in enumerate(dataloaders['val']):
                inputs = inputs.to(device)
                classes = classes.to(device)
                outputs = model_ft(inputs)
                _, preds = torch.max(outputs, 1)
                for t, p in zip(classes.view(-1), preds.view(-1)):
                confusion_matrix[t.long(), p.long()] += 1

                print(confusion_matrix)


                To get the per-class accuracy:



                print(confusion_matrix.diag()/confusion_matrix.sum(1))





                share|improve this answer















                Answer given by ptrblck of PyTorch community. Thanks a lot!



                nb_classes = 9

                confusion_matrix = torch.zeros(nb_classes, nb_classes)
                with torch.no_grad():
                for i, (inputs, classes) in enumerate(dataloaders['val']):
                inputs = inputs.to(device)
                classes = classes.to(device)
                outputs = model_ft(inputs)
                _, preds = torch.max(outputs, 1)
                for t, p in zip(classes.view(-1), preds.view(-1)):
                confusion_matrix[t.long(), p.long()] += 1

                print(confusion_matrix)


                To get the per-class accuracy:



                print(confusion_matrix.diag()/confusion_matrix.sum(1))






                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Nov 14 '18 at 2:44

























                answered Nov 14 '18 at 0:12









                Mona JalalMona Jalal

                8,07428108210




                8,07428108210



























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53290306%2fconfusion-matrix-and-test-accuracy-for-pytorch-transfer-learning-tutorial%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    這個網誌中的熱門文章

                    Barbados

                    How to read a connectionString WITH PROVIDER in .NET Core?

                    Node.js Script on GitHub Pages or Amazon S3