PyTorchとResNetで犬と猫を分類するための基本的なプログラムを作成する

モデルの評価を行う

では、実際に作成したモデルの評価を行ってみましょう。

評価するファイルを以下のように作成していきます。

import os
import torch
import torch.nn as nn
from torchvision import datasets, models, transforms
from sklearn.metrics import confusion_matrix

# Data augmentation and normalization for test
data_transforms = 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 = '/app/data'
image_dataset = datasets.ImageFolder(os.path.join(data_dir, 'test'), data_transforms)
dataloader = torch.utils.data.DataLoader(image_dataset, batch_size=4, shuffle=True, num_workers=4)
class_names = image_dataset.classes

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

# Load pretrained ResNet
model = models.resnet50(pretrained=False)

# Replace the last layer
model.fc = nn.Linear(model.fc.in_features, len(class_names))

model = model.to(device)

# Load the trained weights
print("Loading trained weights")
model.load_state_dict(torch.load('model.pth'))
model.eval()

# Initialize the prediction and label lists(tensors)
predlist=torch.zeros(0,dtype=torch.long, device='cpu')
lbllist=torch.zeros(0,dtype=torch.long, device='cpu')

print("Evaluating model")
with torch.no_grad():
    for i, (inputs, classes) in enumerate(dataloader):
        inputs = inputs.to(device)
        classes = classes.to(device)
        outputs = model(inputs)
        _, preds = torch.max(outputs, 1)
        predlist=torch.cat([predlist,preds.view(-1).cpu()])
        lbllist=torch.cat([lbllist,classes.view(-1).cpu()])
        if i % 100 == 0:
            print(f'Processing batch {i}')

print("Creating confusion matrix")
conf_mat=confusion_matrix(lbllist.numpy(), predlist.numpy())
print('Confusion Matrix')
print('-'*60)
print(conf_mat)

# Calculate the accuracy for each class
print("Calculating per class accuracy")
class_accuracy=100*conf_mat.diagonal()/conf_mat.sum(1)
print('Per class accuracy')
print('-'*60)
print(class_accuracy)

こちらのコードでは先ほど作った「model.pth」の評価を行います。

ただ、新しいディレクトリとして、先ほどの写真が入っているディレクトリに以下のように追加しましょう。

../data/
    train/
        dogs/
            dog001.jpg
            dog002.jpg
            ...
        cats/
            cat001.jpg
            cat002.jpg
            ...
    val/
        dogs/
            dog001.jpg
            dog002.jpg
            ...
        cats/
            cat001.jpg
            cat002.jpg
            ...
    test/
        dogs/
            dog001.jpg
            dog002.jpg
            ...
        cats/
            cat001.jpg
            cat002.jpg
            ...

testディレクトリを追加しましょう!

評価をしてみる

では、先ほど書いたコードを動かしてみましょう。

そうすると最後に[○○,○○] のような数字がでてきます。

1つ目のカラムは1つ目のclass(つまり cat)、2つ目のカラムは2つ目のclass(つまり dog)の制度を評価してくれています。

とびちゃん
とびちゃん

これで、基本的な分類をして評価する学習モデルが作成できたね!

とびちゃん
とびちゃんは最新のAI技術を併用しながら記事を書く子です!とってもいい子!

コメント

タイトルとURLをコピーしました