Gevorderde Deep Learning met PyTorch
Michal Oleszak
Machine Learning Engineer
Data-augmentatie voor trainingsdata:
train_transforms = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(45),
transforms.RandomAutocontrast(),
transforms.ToTensor(),
transforms.Resize((64, 64)),
])
dataset_train = ImageFolder(
"clouds_train",
transform=train_transforms,
)
Data-augmentatie voor testdata:
test_transforms = transforms.Compose([
#
# GEEN DATA-AUGMENTATIE TIJDENS TESTEN
#
transforms.ToTensor(),
transforms.Resize((64, 64)),
])
dataset_test = ImageFolder(
"clouds_test",
transform=test_transforms,
)
Bij binaire classificatie:

Bij multi-class classificatie: aparte precision en recall per klasse

from torchmetrics import Recall
recall_per_class = Recall(task="multiclass", num_classes=7, average=None)
recall_micro = Recall(task="multiclass", num_classes=7, average="micro")
recall_macro = Recall(task="multiclass", num_classes=7, average="macro")
recall_weighted = Recall(task="multiclass", num_classes=7, average="weighted")
Wanneer gebruik je welke:
from torchmetrics import Precision, Recall metric_precision = Precision( task="multiclass", num_classes=7, average="macro" ) metric_recall = Recall( task="multiclass", num_classes=7, average="macro" )net.eval() with torch.no_grad(): for images, labels in dataloader_test:outputs = net(images) _, preds = torch.max(outputs, 1) metric_precision(preds, labels) metric_recall(preds, labels)precision = metric_precision.compute() recall = metric_recall.compute()
print(f"Precision: {precision}")
print(f"Recall: {recall}")
Precision: 0.7284010648727417
Recall: 0.763038694858551
metric_recall = Recall(
task="multiclass", num_classes=7, average=None
)
net.eval()
with torch.no_grad():
for images, labels in dataloader_test:
outputs = net(images)
_, preds = torch.max(outputs, 1)
metric_recall(preds, labels)
recall = metric_recall.compute()
print(recall)
tensor([0.6364, 1.0000, 0.9091, 0.7917,
0.5049, 0.9500, 0.5493],
dtype=torch.float32)
average=None.class_to_idx van Dataset koppelt klassennamen aan indexendataset_test.class_to_idx
{'cirriform clouds': 0,
'clear sky': 1,
'cumulonimbus clouds': 2,
'cumulus clouds': 3,
'high cumuliform clouds': 4,
'stratiform clouds': 5,
'stratocumulus clouds': 6}
{
k: recall[v].item()
for k, v
in dataset_test.class_to_idx.items()
}
{'cirriform clouds': 0.6363636255264282,
'clear sky': 1.0,
'cumulonimbus clouds': 0.9090909361839294,
'cumulus clouds': 0.7916666865348816,
'high cumuliform clouds': 0.5048543810844421,
'stratiform clouds': 0.949999988079071,
'stratocumulus clouds': 0.5492957830429077}
k = klassenaam, bijv. cirriform cloudsv = klasse-index, bijv. 0recall[v] = tensor(0.6364, dtype=torch.float32)recall[v].item() = 0.6364Gevorderde Deep Learning met PyTorch