Tobilog-Selection
モデルの評価を行う
では、実際に作成したモデルの評価を行ってみましょう。
評価するファイルを以下のように作成していきます。
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)の制度を評価してくれています。
とびちゃん
これで、基本的な分類をして評価する学習モデルが作成できたね!
コメント