Classification with Convolutional Neural Networks: A solution

CIFAR10 classification with a convolutional model with pytorch.

In this task, you should train a CNN model with pytorch to classify CIFAR10 dataset.

In [1]:
from typing import Tuple, Iterable
from tqdm import tqdm
from time import time

import torchvision
from torchvision import datasets, transforms
import torch
from torch import nn
from torch.utils.data import DataLoader
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import confusion_matrix
In [2]:
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
device
Out[2]:
device(type='cuda')
In [3]:
SEED = 51
torch.random.manual_seed(SEED)
torch.cuda.manual_seed_all(SEED)
np.random.seed(SEED)

Load the dataset

Load the CIFAR10 dataset bellow. You can use either torchvision.datasets.CIFAR10 or sklearn.datasets.fetch_openml() or any other way to load the dataset.

In [11]:
cifar_root = 'cifir10'
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
])
trainset = torchvision.datasets.CIFAR10(cifar_root, train=True, download=True, transform=transform)
trainsize = int(len(trainset) * 0.9)
valsize = len(trainset) - trainsize
trainset, valset = torch.utils.data.random_split(trainset, [trainsize, valsize])
testset = torchvision.datasets.CIFAR10(cifar_root, train=False, download=True, transform=transform)
Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to cifir10/cifar-10-python.tar.gz
Extracting cifir10/cifar-10-python.tar.gz to cifir10
Files already downloaded and verified

Design your model

Write your CNN model below using torch.nn modules. Feel free to add extra cells.

In [12]:
class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv = nn.Sequential(              # B 3   32  32
            nn.Conv2d(3, 16, 3, padding=1),     # B 16  32  32
            nn.ReLU(),
            nn.Conv2d(16, 16, 3, padding=1),    # B 16  32  32
            nn.ReLU(),
            nn.MaxPool2d(2, 2),                 # B 16  16  16
            nn.Dropout2d(p=0.2),
            nn.BatchNorm2d(16),
        )
        self.fc = nn.Sequential(
            nn.Flatten(),                       # B 4096
            nn.Linear(4096, 10),                # B 10
        )

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        x = self.conv(x)
        x = self.fc(x)
        return x

Train your model

Write the training process below. Instantiate your model, Create an optimizer function such as Adam or SGD, and write your train/validation loop. Then train your model until it converges. Feel free to add extra cells.

In [13]:
class Trainer:
    CHECKPOINT = 'cifar-cnn.pth'
    CLASSES = ('plane', 'car', 'bird', 'cat', 
               'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

    def __init__(self, model: nn.Module, optimizer: torch.optim.Optimizer,
                 trainloader: DataLoader, valloader: DataLoader, testloader: DataLoader,
                 device: torch.device) -> None:
        self.__model = model
        self.__optimizer = optimizer
        self.__trainloader = trainloader
        self.__valloader = valloader
        self.__testloader = testloader
        self.__device = device
        self.__train_loss = []
        self.__train_accuracy = []
        self.__val_loss = []
        self.__val_accuracy = []
        self.__best_val_acc = 0

    def __forward_model(self, x: torch.Tensor, y: torch.Tensor) -> Tuple[torch.Tensor, int]:
        x = x.to(self.__device)
        y = y.to(self.__device)
        s = self.__model(x)
        loss = F.cross_entropy(s, y)
        true = int((s.argmax(dim=-1) == y).sum())
        return loss, true

    def __train_epoch(self) -> Tuple[float, float]:
        epoch_loss = 0
        epoch_accuracy = 0
        n = 0

        self.__model.train()
        with tqdm(enumerate(self.__trainloader), total=len(self.__trainloader)) as pbar:
            for i, (x, y) in pbar:
                loss, true = self.__forward_model(x, y)
                epoch_loss += float(loss)
                epoch_accuracy += true
                n += len(x)

                loss.backward()
                self.__optimizer.step()
                self.__optimizer.zero_grad()

                pbar.set_description(f'train loss: {epoch_loss / (i + 1):.3e} - accuracy: {epoch_accuracy * 100.0 / n:.2f}%')

        epoch_loss /= len(self.__trainloader)
        epoch_accuracy *= 100.0 / n
        return epoch_loss, epoch_accuracy

    def __eval_epoch(self, dataloader: DataLoader) -> Tuple[float, float]:
        epoch_loss = 0
        epoch_accuracy = 0
        n = 0

        self.__model.eval()
        with torch.no_grad(), tqdm(enumerate(dataloader), total=len(dataloader)) as pbar:
            for i, (x, y) in pbar:
                loss, true = self.__forward_model(x, y)
                epoch_loss += float(loss)
                epoch_accuracy += true
                n += len(x)
                pbar.set_description(f'val loss: {epoch_loss / (i + 1):.3e} - accuracy: {epoch_accuracy * 100.0 / n:.2f}%')

        epoch_loss /= len(dataloader)
        epoch_accuracy *= 100.0 / n
        return epoch_loss, epoch_accuracy

    def __val_epoch(self) -> Tuple[float, float]:
        return self.__eval_epoch(self.__valloader)

    def test(self) -> Tuple[float, float]:
        return self.__eval_epoch(self.__testloader)

    def save(self) -> None:
        torch.save(self.__model.state_dict(), self.CHECKPOINT)

    def load(self) -> None:
        self.__model.load_state_dict(torch.load(self.CHECKPOINT))

    def train(self, max_epochs: int) -> None:
        if len(self.__train_loss) >= max_epochs:
            return

        for e in range(len(self.__train_loss), max_epochs):
            start_time = time()
            train_loss, train_accuracy = self.__train_epoch()
            val_loss, val_accuracy = self.__val_epoch()
            end_time = time()

            if val_accuracy > self.__best_val_acc:
                self.__best_val_acc = val_accuracy
                print(f'Saving checkpoint.')
                self.save()
            
            print(f'Epoch {e+1} finished in {end_time - start_time:.2f}s. Train [loss: {train_loss:.3e}, acc: {train_accuracy:.2f}%] - Val [loss: {val_loss:.3e}, acc: {val_accuracy:.2f}%]')

            self.__train_loss.append(train_loss)
            self.__train_accuracy.append(train_accuracy)
            self.__val_loss.append(val_loss)
            self.__val_accuracy.append(val_accuracy)

    def plot_curves(self) -> None:
        fig = plt.figure(figsize=(15, 7))

        # loss
        ax = fig.add_subplot(121)
        ax.set_title('Loss / Epoch')
        ax.set_ylabel('Loss')
        ax.set_xlabel('Epoch')
        ax.set_aspect('auto')

        plt.plot(self.__train_loss, label='Train', color='green', linewidth=3)
        plt.plot(self.__val_loss, label='Validation', color='red', linewidth=3)

        plt.legend()

        # acc
        ax = fig.add_subplot(122)
        ax.set_title('Accuracy / Epoch')
        ax.set_ylabel('Accuracy')
        ax.set_xlabel('Epoch')
        ax.set_aspect('auto')

        plt.plot(self.__train_accuracy, label='Train', color='green', linewidth=3)
        plt.plot(self.__val_accuracy, label='Validation', color='red', linewidth=3)

        plt.legend()

    def predict(self) -> Iterable[int]:
        self.__model.eval()
        with torch.no_grad(), tqdm(self.__testloader, total=len(self.__testloader)) as pbar:
            for x, _ in pbar:
                yield from self.__model(x.to(self.__device)).argmax(dim=-1)

    def draw_misclassified(self, n: int) -> None:
        p = list(self.predict())
        missed_idx = np.random.choice([i for i, (x, y) in enumerate(self.__testloader.dataset) if p[i] != y], size=n)
        missed_samples = [self.__testloader.dataset[i] for i in missed_idx]
        wrong_labels = [p[i] for i in missed_idx]
        correct_labels = [s[1] for s in missed_samples]
        images = [s[0].permute((1, 2, 0)) for s in missed_samples]

        texts = [f'{self.CLASSES[correct]} -> {self.CLASSES[missed]}' for missed, correct in zip(wrong_labels, correct_labels)]

        columns = 10
        rows = int(np.ceil(n / columns))
        fig = plt.figure(figsize=(2 * columns, 2 * rows))
        for i in range(columns * rows):
            ax = fig.add_subplot(rows, columns, i + 1)
            ax.set_title(texts[i])
            ax.set_aspect('equal')
            ax.get_xaxis().set_visible(False)
            ax.get_yaxis().set_visible(False)
            ax.imshow((images[i] - images[i].min()) / (images[i].max() - images[i].min()))

        cax = fig.add_axes([0.12, 0.1, 0.78, 0.8])
        cax.get_xaxis().set_visible(False)
        cax.get_yaxis().set_visible(False)
        cax.set_frame_on(False)

    def plot_cm(self) -> None:
        y_true = [label for _, label in self.__testloader.dataset]
        y_pred = [int(label) for label in self.predict()]
        cm = confusion_matrix(y_true, y_pred)
        sns.heatmap(cm, annot=True, fmt='d')
In [14]:
B = 512
EB = 1024
trainloader = DataLoader(trainset, batch_size=B, shuffle=True)
valloader = DataLoader(valset, batch_size=EB, shuffle=False)
testloader = DataLoader(testset, batch_size=EB, shuffle=False)
net = Net().to(device)
optimizer = torch.optim.Adam(net.parameters(), lr=1e-4)
trainer = Trainer(net, optimizer, trainloader, valloader, testloader, device)
net
Out[14]:
Net(
  (conv): Sequential(
    (0): Conv2d(3, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU()
    (2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (3): ReLU()
    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (5): Dropout2d(p=0.2, inplace=False)
    (6): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  )
  (fc): Sequential(
    (0): Flatten(start_dim=1, end_dim=-1)
    (1): Linear(in_features=4096, out_features=10, bias=True)
  )
)
In [15]:
trainer.train(100)
train loss: 1.962e+00 - accuracy: 29.70%: 100%|██████████| 88/88 [00:15<00:00,  5.72it/s]
val loss: 1.715e+00 - accuracy: 41.42%: 100%|██████████| 5/5 [00:01<00:00,  3.08it/s]
Saving checkpoint.
Epoch 1 finished in 17.03s. Train [loss: 1.962e+00, acc: 29.70%] - Val [loss: 1.715e+00, acc: 41.42%]
train loss: 1.670e+00 - accuracy: 41.30%: 100%|██████████| 88/88 [00:15<00:00,  5.77it/s]
val loss: 1.534e+00 - accuracy: 47.76%: 100%|██████████| 5/5 [00:01<00:00,  3.14it/s]
Saving checkpoint.
Epoch 2 finished in 16.87s. Train [loss: 1.670e+00, acc: 41.30%] - Val [loss: 1.534e+00, acc: 47.76%]
train loss: 1.547e+00 - accuracy: 45.90%: 100%|██████████| 88/88 [00:15<00:00,  5.73it/s]
val loss: 1.443e+00 - accuracy: 50.20%: 100%|██████████| 5/5 [00:01<00:00,  3.16it/s]
Saving checkpoint.
Epoch 3 finished in 16.97s. Train [loss: 1.547e+00, acc: 45.90%] - Val [loss: 1.443e+00, acc: 50.20%]
train loss: 1.469e+00 - accuracy: 48.77%: 100%|██████████| 88/88 [00:15<00:00,  5.77it/s]
val loss: 1.376e+00 - accuracy: 52.18%: 100%|██████████| 5/5 [00:01<00:00,  3.07it/s]
Saving checkpoint.
Epoch 4 finished in 16.93s. Train [loss: 1.469e+00, acc: 48.77%] - Val [loss: 1.376e+00, acc: 52.18%]
train loss: 1.408e+00 - accuracy: 50.90%: 100%|██████████| 88/88 [00:15<00:00,  5.78it/s]
val loss: 1.332e+00 - accuracy: 53.90%: 100%|██████████| 5/5 [00:01<00:00,  3.22it/s]
Saving checkpoint.
Epoch 5 finished in 16.81s. Train [loss: 1.408e+00, acc: 50.90%] - Val [loss: 1.332e+00, acc: 53.90%]
train loss: 1.357e+00 - accuracy: 52.61%: 100%|██████████| 88/88 [00:15<00:00,  5.78it/s]
val loss: 1.297e+00 - accuracy: 54.74%: 100%|██████████| 5/5 [00:01<00:00,  3.14it/s]
Saving checkpoint.
Epoch 6 finished in 16.84s. Train [loss: 1.357e+00, acc: 52.61%] - Val [loss: 1.297e+00, acc: 54.74%]
train loss: 1.317e+00 - accuracy: 53.95%: 100%|██████████| 88/88 [00:15<00:00,  5.57it/s]
val loss: 1.264e+00 - accuracy: 55.92%: 100%|██████████| 5/5 [00:01<00:00,  3.21it/s]
Saving checkpoint.
Epoch 7 finished in 17.39s. Train [loss: 1.317e+00, acc: 53.95%] - Val [loss: 1.264e+00, acc: 55.92%]
train loss: 1.283e+00 - accuracy: 55.38%: 100%|██████████| 88/88 [00:14<00:00,  5.91it/s]
val loss: 1.234e+00 - accuracy: 57.38%: 100%|██████████| 5/5 [00:01<00:00,  3.12it/s]
Saving checkpoint.
Epoch 8 finished in 16.53s. Train [loss: 1.283e+00, acc: 55.38%] - Val [loss: 1.234e+00, acc: 57.38%]
train loss: 1.251e+00 - accuracy: 56.51%: 100%|██████████| 88/88 [00:15<00:00,  5.83it/s]
val loss: 1.210e+00 - accuracy: 58.16%: 100%|██████████| 5/5 [00:01<00:00,  3.18it/s]
Saving checkpoint.
Epoch 9 finished in 16.70s. Train [loss: 1.251e+00, acc: 56.51%] - Val [loss: 1.210e+00, acc: 58.16%]
train loss: 1.229e+00 - accuracy: 57.36%: 100%|██████████| 88/88 [00:15<00:00,  5.84it/s]
val loss: 1.191e+00 - accuracy: 58.10%: 100%|██████████| 5/5 [00:01<00:00,  3.16it/s]
Epoch 10 finished in 16.67s. Train [loss: 1.229e+00, acc: 57.36%] - Val [loss: 1.191e+00, acc: 58.10%]
train loss: 1.207e+00 - accuracy: 58.04%: 100%|██████████| 88/88 [00:15<00:00,  5.86it/s]
val loss: 1.174e+00 - accuracy: 59.40%: 100%|██████████| 5/5 [00:01<00:00,  3.13it/s]
Saving checkpoint.
Epoch 11 finished in 16.64s. Train [loss: 1.207e+00, acc: 58.04%] - Val [loss: 1.174e+00, acc: 59.40%]
train loss: 1.179e+00 - accuracy: 58.94%: 100%|██████████| 88/88 [00:15<00:00,  5.78it/s]
val loss: 1.158e+00 - accuracy: 60.04%: 100%|██████████| 5/5 [00:01<00:00,  3.09it/s]
Saving checkpoint.
Epoch 12 finished in 16.87s. Train [loss: 1.179e+00, acc: 58.94%] - Val [loss: 1.158e+00, acc: 60.04%]
train loss: 1.162e+00 - accuracy: 59.61%: 100%|██████████| 88/88 [00:14<00:00,  5.90it/s]
val loss: 1.146e+00 - accuracy: 60.16%: 100%|██████████| 5/5 [00:01<00:00,  3.01it/s]
Saving checkpoint.
Epoch 13 finished in 16.61s. Train [loss: 1.162e+00, acc: 59.61%] - Val [loss: 1.146e+00, acc: 60.16%]
train loss: 1.146e+00 - accuracy: 60.21%: 100%|██████████| 88/88 [00:15<00:00,  5.82it/s]
val loss: 1.131e+00 - accuracy: 61.02%: 100%|██████████| 5/5 [00:01<00:00,  3.15it/s]
Saving checkpoint.
Epoch 14 finished in 16.73s. Train [loss: 1.146e+00, acc: 60.21%] - Val [loss: 1.131e+00, acc: 61.02%]
train loss: 1.126e+00 - accuracy: 60.92%: 100%|██████████| 88/88 [00:15<00:00,  5.84it/s]
val loss: 1.115e+00 - accuracy: 61.30%: 100%|██████████| 5/5 [00:01<00:00,  3.20it/s]
Saving checkpoint.
Epoch 15 finished in 16.65s. Train [loss: 1.126e+00, acc: 60.92%] - Val [loss: 1.115e+00, acc: 61.30%]
train loss: 1.117e+00 - accuracy: 61.35%: 100%|██████████| 88/88 [00:15<00:00,  5.83it/s]
val loss: 1.113e+00 - accuracy: 61.28%: 100%|██████████| 5/5 [00:01<00:00,  3.19it/s]
Epoch 16 finished in 16.68s. Train [loss: 1.117e+00, acc: 61.35%] - Val [loss: 1.113e+00, acc: 61.28%]
train loss: 1.101e+00 - accuracy: 61.66%: 100%|██████████| 88/88 [00:14<00:00,  5.92it/s]
val loss: 1.101e+00 - accuracy: 61.60%: 100%|██████████| 5/5 [00:01<00:00,  3.21it/s]
Saving checkpoint.
Epoch 17 finished in 16.44s. Train [loss: 1.101e+00, acc: 61.66%] - Val [loss: 1.101e+00, acc: 61.60%]
train loss: 1.085e+00 - accuracy: 62.42%: 100%|██████████| 88/88 [00:15<00:00,  5.86it/s]
val loss: 1.090e+00 - accuracy: 62.02%: 100%|██████████| 5/5 [00:01<00:00,  3.18it/s]
Saving checkpoint.
Epoch 18 finished in 16.60s. Train [loss: 1.085e+00, acc: 62.42%] - Val [loss: 1.090e+00, acc: 62.02%]
train loss: 1.073e+00 - accuracy: 62.55%: 100%|██████████| 88/88 [00:15<00:00,  5.81it/s]
val loss: 1.083e+00 - accuracy: 62.44%: 100%|██████████| 5/5 [00:01<00:00,  3.13it/s]
Saving checkpoint.
Epoch 19 finished in 16.78s. Train [loss: 1.073e+00, acc: 62.55%] - Val [loss: 1.083e+00, acc: 62.44%]
train loss: 1.061e+00 - accuracy: 63.23%: 100%|██████████| 88/88 [00:15<00:00,  5.84it/s]
val loss: 1.076e+00 - accuracy: 62.78%: 100%|██████████| 5/5 [00:01<00:00,  3.15it/s]
Saving checkpoint.
Epoch 20 finished in 16.69s. Train [loss: 1.061e+00, acc: 63.23%] - Val [loss: 1.076e+00, acc: 62.78%]
train loss: 1.051e+00 - accuracy: 63.51%: 100%|██████████| 88/88 [00:15<00:00,  5.85it/s]
val loss: 1.076e+00 - accuracy: 62.78%: 100%|██████████| 5/5 [00:01<00:00,  3.10it/s]
Epoch 21 finished in 16.69s. Train [loss: 1.051e+00, acc: 63.51%] - Val [loss: 1.076e+00, acc: 62.78%]
train loss: 1.041e+00 - accuracy: 63.98%: 100%|██████████| 88/88 [00:15<00:00,  5.82it/s]
val loss: 1.064e+00 - accuracy: 63.04%: 100%|██████████| 5/5 [00:01<00:00,  3.17it/s]
Saving checkpoint.
Epoch 22 finished in 16.72s. Train [loss: 1.041e+00, acc: 63.98%] - Val [loss: 1.064e+00, acc: 63.04%]
train loss: 1.028e+00 - accuracy: 64.65%: 100%|██████████| 88/88 [00:15<00:00,  5.81it/s]
val loss: 1.059e+00 - accuracy: 63.30%: 100%|██████████| 5/5 [00:01<00:00,  3.20it/s]
Saving checkpoint.
Epoch 23 finished in 16.73s. Train [loss: 1.028e+00, acc: 64.65%] - Val [loss: 1.059e+00, acc: 63.30%]
train loss: 1.016e+00 - accuracy: 64.91%: 100%|██████████| 88/88 [00:15<00:00,  5.75it/s]
val loss: 1.051e+00 - accuracy: 63.84%: 100%|██████████| 5/5 [00:01<00:00,  3.15it/s]
Saving checkpoint.
Epoch 24 finished in 16.91s. Train [loss: 1.016e+00, acc: 64.91%] - Val [loss: 1.051e+00, acc: 63.84%]
train loss: 1.008e+00 - accuracy: 65.19%: 100%|██████████| 88/88 [00:16<00:00,  5.19it/s]
val loss: 1.048e+00 - accuracy: 63.64%: 100%|██████████| 5/5 [00:01<00:00,  3.15it/s]
Epoch 25 finished in 18.58s. Train [loss: 1.008e+00, acc: 65.19%] - Val [loss: 1.048e+00, acc: 63.64%]
train loss: 1.001e+00 - accuracy: 65.38%: 100%|██████████| 88/88 [00:14<00:00,  5.88it/s]
val loss: 1.044e+00 - accuracy: 63.82%: 100%|██████████| 5/5 [00:01<00:00,  3.23it/s]
Epoch 26 finished in 16.53s. Train [loss: 1.001e+00, acc: 65.38%] - Val [loss: 1.044e+00, acc: 63.82%]
train loss: 9.884e-01 - accuracy: 65.81%: 100%|██████████| 88/88 [00:14<00:00,  5.91it/s]
val loss: 1.041e+00 - accuracy: 63.82%: 100%|██████████| 5/5 [00:01<00:00,  3.11it/s]
Epoch 27 finished in 16.54s. Train [loss: 9.884e-01, acc: 65.81%] - Val [loss: 1.041e+00, acc: 63.82%]
train loss: 9.790e-01 - accuracy: 66.29%: 100%|██████████| 88/88 [00:14<00:00,  5.87it/s]
val loss: 1.035e+00 - accuracy: 64.06%: 100%|██████████| 5/5 [00:01<00:00,  3.24it/s]
Saving checkpoint.
Epoch 28 finished in 16.55s. Train [loss: 9.790e-01, acc: 66.29%] - Val [loss: 1.035e+00, acc: 64.06%]
train loss: 9.730e-01 - accuracy: 66.30%: 100%|██████████| 88/88 [00:14<00:00,  5.91it/s]
val loss: 1.035e+00 - accuracy: 63.92%: 100%|██████████| 5/5 [00:01<00:00,  3.21it/s]
Epoch 29 finished in 16.48s. Train [loss: 9.730e-01, acc: 66.30%] - Val [loss: 1.035e+00, acc: 63.92%]
train loss: 9.662e-01 - accuracy: 66.46%: 100%|██████████| 88/88 [00:14<00:00,  5.90it/s]
val loss: 1.031e+00 - accuracy: 64.16%: 100%|██████████| 5/5 [00:01<00:00,  3.18it/s]
Saving checkpoint.
Epoch 30 finished in 16.52s. Train [loss: 9.662e-01, acc: 66.46%] - Val [loss: 1.031e+00, acc: 64.16%]
train loss: 9.612e-01 - accuracy: 66.54%: 100%|██████████| 88/88 [00:14<00:00,  5.88it/s]
val loss: 1.025e+00 - accuracy: 64.42%: 100%|██████████| 5/5 [00:01<00:00,  3.09it/s]
Saving checkpoint.
Epoch 31 finished in 16.62s. Train [loss: 9.612e-01, acc: 66.54%] - Val [loss: 1.025e+00, acc: 64.42%]
train loss: 9.515e-01 - accuracy: 67.14%: 100%|██████████| 88/88 [00:15<00:00,  5.80it/s]
val loss: 1.022e+00 - accuracy: 64.26%: 100%|██████████| 5/5 [00:01<00:00,  3.15it/s]
Epoch 32 finished in 16.77s. Train [loss: 9.515e-01, acc: 67.14%] - Val [loss: 1.022e+00, acc: 64.26%]
train loss: 9.464e-01 - accuracy: 67.27%: 100%|██████████| 88/88 [00:15<00:00,  5.74it/s]
val loss: 1.021e+00 - accuracy: 64.56%: 100%|██████████| 5/5 [00:01<00:00,  3.22it/s]
Saving checkpoint.
Epoch 33 finished in 16.91s. Train [loss: 9.464e-01, acc: 67.27%] - Val [loss: 1.021e+00, acc: 64.56%]
train loss: 9.413e-01 - accuracy: 67.52%: 100%|██████████| 88/88 [00:15<00:00,  5.79it/s]
val loss: 1.019e+00 - accuracy: 64.58%: 100%|██████████| 5/5 [00:01<00:00,  3.19it/s]
Saving checkpoint.
Epoch 34 finished in 16.81s. Train [loss: 9.413e-01, acc: 67.52%] - Val [loss: 1.019e+00, acc: 64.58%]
train loss: 9.304e-01 - accuracy: 67.71%: 100%|██████████| 88/88 [00:15<00:00,  5.81it/s]
val loss: 1.016e+00 - accuracy: 64.90%: 100%|██████████| 5/5 [00:01<00:00,  3.18it/s]
Saving checkpoint.
Epoch 35 finished in 16.75s. Train [loss: 9.304e-01, acc: 67.71%] - Val [loss: 1.016e+00, acc: 64.90%]
train loss: 9.268e-01 - accuracy: 67.93%: 100%|██████████| 88/88 [00:15<00:00,  5.82it/s]
val loss: 1.014e+00 - accuracy: 65.10%: 100%|██████████| 5/5 [00:01<00:00,  3.13it/s]
Saving checkpoint.
Epoch 36 finished in 16.73s. Train [loss: 9.268e-01, acc: 67.93%] - Val [loss: 1.014e+00, acc: 65.10%]
train loss: 9.192e-01 - accuracy: 68.13%: 100%|██████████| 88/88 [00:15<00:00,  5.84it/s]
val loss: 1.010e+00 - accuracy: 64.58%: 100%|██████████| 5/5 [00:01<00:00,  3.27it/s]
Epoch 37 finished in 16.64s. Train [loss: 9.192e-01, acc: 68.13%] - Val [loss: 1.010e+00, acc: 64.58%]
train loss: 9.107e-01 - accuracy: 68.48%: 100%|██████████| 88/88 [00:14<00:00,  5.98it/s]
val loss: 1.007e+00 - accuracy: 65.36%: 100%|██████████| 5/5 [00:01<00:00,  3.26it/s]
Saving checkpoint.
Epoch 38 finished in 16.28s. Train [loss: 9.107e-01, acc: 68.48%] - Val [loss: 1.007e+00, acc: 65.36%]
train loss: 9.071e-01 - accuracy: 68.53%: 100%|██████████| 88/88 [00:16<00:00,  5.46it/s]
val loss: 1.009e+00 - accuracy: 64.84%: 100%|██████████| 5/5 [00:01<00:00,  3.24it/s]
Epoch 39 finished in 17.69s. Train [loss: 9.071e-01, acc: 68.53%] - Val [loss: 1.009e+00, acc: 64.84%]
train loss: 9.035e-01 - accuracy: 68.92%: 100%|██████████| 88/88 [00:14<00:00,  5.90it/s]
val loss: 1.007e+00 - accuracy: 64.50%: 100%|██████████| 5/5 [00:01<00:00,  3.18it/s]
Epoch 40 finished in 16.51s. Train [loss: 9.035e-01, acc: 68.92%] - Val [loss: 1.007e+00, acc: 64.50%]
train loss: 8.976e-01 - accuracy: 68.85%: 100%|██████████| 88/88 [00:14<00:00,  5.87it/s]
val loss: 1.003e+00 - accuracy: 64.74%: 100%|██████████| 5/5 [00:01<00:00,  3.18it/s]
Epoch 41 finished in 16.60s. Train [loss: 8.976e-01, acc: 68.85%] - Val [loss: 1.003e+00, acc: 64.74%]
train loss: 8.926e-01 - accuracy: 69.18%: 100%|██████████| 88/88 [00:15<00:00,  5.71it/s]
val loss: 1.004e+00 - accuracy: 65.08%: 100%|██████████| 5/5 [00:01<00:00,  3.16it/s]
Epoch 42 finished in 17.03s. Train [loss: 8.926e-01, acc: 69.18%] - Val [loss: 1.004e+00, acc: 65.08%]
train loss: 8.916e-01 - accuracy: 69.00%: 100%|██████████| 88/88 [00:15<00:00,  5.86it/s]
val loss: 1.003e+00 - accuracy: 64.92%: 100%|██████████| 5/5 [00:01<00:00,  3.22it/s]
Epoch 43 finished in 16.59s. Train [loss: 8.916e-01, acc: 69.00%] - Val [loss: 1.003e+00, acc: 64.92%]
train loss: 8.850e-01 - accuracy: 69.32%: 100%|██████████| 88/88 [00:14<00:00,  5.90it/s]
val loss: 1.004e+00 - accuracy: 64.92%: 100%|██████████| 5/5 [00:01<00:00,  3.10it/s]
Epoch 44 finished in 16.53s. Train [loss: 8.850e-01, acc: 69.32%] - Val [loss: 1.004e+00, acc: 64.92%]
train loss: 8.799e-01 - accuracy: 69.44%: 100%|██████████| 88/88 [00:14<00:00,  5.92it/s]
val loss: 1.000e+00 - accuracy: 65.14%: 100%|██████████| 5/5 [00:01<00:00,  3.23it/s]
Epoch 45 finished in 16.45s. Train [loss: 8.799e-01, acc: 69.44%] - Val [loss: 1.000e+00, acc: 65.14%]
train loss: 8.737e-01 - accuracy: 69.78%: 100%|██████████| 88/88 [00:14<00:00,  5.94it/s]
val loss: 1.002e+00 - accuracy: 64.90%: 100%|██████████| 5/5 [00:01<00:00,  3.29it/s]
Epoch 46 finished in 16.37s. Train [loss: 8.737e-01, acc: 69.78%] - Val [loss: 1.002e+00, acc: 64.90%]
train loss: 8.680e-01 - accuracy: 69.66%: 100%|██████████| 88/88 [00:14<00:00,  5.90it/s]
val loss: 1.001e+00 - accuracy: 65.06%: 100%|██████████| 5/5 [00:01<00:00,  3.19it/s]
Epoch 47 finished in 16.50s. Train [loss: 8.680e-01, acc: 69.66%] - Val [loss: 1.001e+00, acc: 65.06%]
train loss: 8.650e-01 - accuracy: 70.05%: 100%|██████████| 88/88 [00:15<00:00,  5.83it/s]
val loss: 9.988e-01 - accuracy: 65.12%: 100%|██████████| 5/5 [00:01<00:00,  3.18it/s]
Epoch 48 finished in 16.70s. Train [loss: 8.650e-01, acc: 70.05%] - Val [loss: 9.988e-01, acc: 65.12%]
train loss: 8.605e-01 - accuracy: 70.05%: 100%|██████████| 88/88 [00:15<00:00,  5.78it/s]
val loss: 9.991e-01 - accuracy: 65.16%: 100%|██████████| 5/5 [00:01<00:00,  3.22it/s]
Epoch 49 finished in 16.80s. Train [loss: 8.605e-01, acc: 70.05%] - Val [loss: 9.991e-01, acc: 65.16%]
train loss: 8.582e-01 - accuracy: 70.29%: 100%|██████████| 88/88 [00:15<00:00,  5.85it/s]
val loss: 9.972e-01 - accuracy: 65.34%: 100%|██████████| 5/5 [00:01<00:00,  3.15it/s]
Epoch 50 finished in 16.66s. Train [loss: 8.582e-01, acc: 70.29%] - Val [loss: 9.972e-01, acc: 65.34%]
train loss: 8.537e-01 - accuracy: 70.40%: 100%|██████████| 88/88 [00:15<00:00,  5.84it/s]
val loss: 9.958e-01 - accuracy: 65.12%: 100%|██████████| 5/5 [00:01<00:00,  3.20it/s]
Epoch 51 finished in 16.65s. Train [loss: 8.537e-01, acc: 70.40%] - Val [loss: 9.958e-01, acc: 65.12%]
train loss: 8.528e-01 - accuracy: 70.40%: 100%|██████████| 88/88 [00:15<00:00,  5.86it/s]
val loss: 9.987e-01 - accuracy: 65.06%: 100%|██████████| 5/5 [00:01<00:00,  3.22it/s]
Epoch 52 finished in 16.60s. Train [loss: 8.528e-01, acc: 70.40%] - Val [loss: 9.987e-01, acc: 65.06%]
train loss: 8.477e-01 - accuracy: 70.60%: 100%|██████████| 88/88 [00:15<00:00,  5.80it/s]
val loss: 9.977e-01 - accuracy: 65.18%: 100%|██████████| 5/5 [00:01<00:00,  3.20it/s]
Epoch 53 finished in 16.78s. Train [loss: 8.477e-01, acc: 70.60%] - Val [loss: 9.977e-01, acc: 65.18%]
train loss: 8.438e-01 - accuracy: 70.78%: 100%|██████████| 88/88 [00:14<00:00,  5.88it/s]
val loss: 9.968e-01 - accuracy: 65.40%: 100%|██████████| 5/5 [00:01<00:00,  3.15it/s]
Saving checkpoint.
Epoch 54 finished in 16.59s. Train [loss: 8.438e-01, acc: 70.78%] - Val [loss: 9.968e-01, acc: 65.40%]
train loss: 8.365e-01 - accuracy: 71.08%: 100%|██████████| 88/88 [00:15<00:00,  5.84it/s]
val loss: 9.972e-01 - accuracy: 65.18%: 100%|██████████| 5/5 [00:01<00:00,  3.15it/s]
Epoch 55 finished in 16.68s. Train [loss: 8.365e-01, acc: 71.08%] - Val [loss: 9.972e-01, acc: 65.18%]
train loss: 8.351e-01 - accuracy: 70.91%: 100%|██████████| 88/88 [00:15<00:00,  5.83it/s]
val loss: 9.984e-01 - accuracy: 65.14%: 100%|██████████| 5/5 [00:01<00:00,  3.20it/s]
Epoch 56 finished in 16.69s. Train [loss: 8.351e-01, acc: 70.91%] - Val [loss: 9.984e-01, acc: 65.14%]
train loss: 8.282e-01 - accuracy: 71.23%: 100%|██████████| 88/88 [00:15<00:00,  5.85it/s]
val loss: 1.002e+00 - accuracy: 64.92%: 100%|██████████| 5/5 [00:01<00:00,  3.09it/s]
Epoch 57 finished in 16.66s. Train [loss: 8.282e-01, acc: 71.23%] - Val [loss: 1.002e+00, acc: 64.92%]
train loss: 8.300e-01 - accuracy: 71.07%: 100%|██████████| 88/88 [00:15<00:00,  5.84it/s]
val loss: 1.000e+00 - accuracy: 65.40%: 100%|██████████| 5/5 [00:01<00:00,  3.19it/s]
Epoch 58 finished in 16.66s. Train [loss: 8.300e-01, acc: 71.07%] - Val [loss: 1.000e+00, acc: 65.40%]
train loss: 8.254e-01 - accuracy: 71.28%: 100%|██████████| 88/88 [00:15<00:00,  5.85it/s]
val loss: 9.993e-01 - accuracy: 65.40%: 100%|██████████| 5/5 [00:01<00:00,  3.19it/s]
Epoch 59 finished in 16.62s. Train [loss: 8.254e-01, acc: 71.28%] - Val [loss: 9.993e-01, acc: 65.40%]
train loss: 8.227e-01 - accuracy: 71.34%: 100%|██████████| 88/88 [00:15<00:00,  5.86it/s]
val loss: 1.001e+00 - accuracy: 65.30%: 100%|██████████| 5/5 [00:01<00:00,  3.22it/s]
Epoch 60 finished in 16.61s. Train [loss: 8.227e-01, acc: 71.34%] - Val [loss: 1.001e+00, acc: 65.30%]
train loss: 8.131e-01 - accuracy: 71.68%: 100%|██████████| 88/88 [00:15<00:00,  5.83it/s]
val loss: 1.001e+00 - accuracy: 65.14%: 100%|██████████| 5/5 [00:01<00:00,  3.09it/s]
Epoch 61 finished in 16.74s. Train [loss: 8.131e-01, acc: 71.68%] - Val [loss: 1.001e+00, acc: 65.14%]
train loss: 8.119e-01 - accuracy: 71.93%: 100%|██████████| 88/88 [00:15<00:00,  5.83it/s]
val loss: 1.002e+00 - accuracy: 65.16%: 100%|██████████| 5/5 [00:01<00:00,  3.16it/s]
Epoch 62 finished in 16.70s. Train [loss: 8.119e-01, acc: 71.93%] - Val [loss: 1.002e+00, acc: 65.16%]
train loss: 8.105e-01 - accuracy: 71.80%: 100%|██████████| 88/88 [00:15<00:00,  5.80it/s]
val loss: 1.002e+00 - accuracy: 64.66%: 100%|██████████| 5/5 [00:01<00:00,  3.21it/s]
Epoch 63 finished in 16.74s. Train [loss: 8.105e-01, acc: 71.80%] - Val [loss: 1.002e+00, acc: 64.66%]
train loss: 8.090e-01 - accuracy: 71.71%: 100%|██████████| 88/88 [00:15<00:00,  5.80it/s]
val loss: 1.002e+00 - accuracy: 64.80%: 100%|██████████| 5/5 [00:01<00:00,  3.15it/s]
Epoch 64 finished in 16.79s. Train [loss: 8.090e-01, acc: 71.71%] - Val [loss: 1.002e+00, acc: 64.80%]
train loss: 8.030e-01 - accuracy: 72.14%: 100%|██████████| 88/88 [00:15<00:00,  5.76it/s]
val loss: 1.007e+00 - accuracy: 64.96%: 100%|██████████| 5/5 [00:01<00:00,  3.18it/s]
Epoch 65 finished in 16.87s. Train [loss: 8.030e-01, acc: 72.14%] - Val [loss: 1.007e+00, acc: 64.96%]
train loss: 8.054e-01 - accuracy: 71.91%: 100%|██████████| 88/88 [00:15<00:00,  5.77it/s]
val loss: 1.006e+00 - accuracy: 65.08%: 100%|██████████| 5/5 [00:01<00:00,  3.08it/s]
Epoch 66 finished in 16.91s. Train [loss: 8.054e-01, acc: 71.91%] - Val [loss: 1.006e+00, acc: 65.08%]
train loss: 7.953e-01 - accuracy: 72.53%: 100%|██████████| 88/88 [00:15<00:00,  5.86it/s]
val loss: 1.008e+00 - accuracy: 64.92%: 100%|██████████| 5/5 [00:01<00:00,  3.18it/s]
Epoch 67 finished in 16.62s. Train [loss: 7.953e-01, acc: 72.53%] - Val [loss: 1.008e+00, acc: 64.92%]
train loss: 7.966e-01 - accuracy: 72.49%: 100%|██████████| 88/88 [00:15<00:00,  5.85it/s]
val loss: 1.007e+00 - accuracy: 64.88%: 100%|██████████| 5/5 [00:01<00:00,  3.16it/s]
Epoch 68 finished in 16.67s. Train [loss: 7.966e-01, acc: 72.49%] - Val [loss: 1.007e+00, acc: 64.88%]
train loss: 7.973e-01 - accuracy: 72.08%: 100%|██████████| 88/88 [00:15<00:00,  5.84it/s]
val loss: 1.007e+00 - accuracy: 65.24%: 100%|██████████| 5/5 [00:01<00:00,  3.20it/s]
Epoch 69 finished in 16.66s. Train [loss: 7.973e-01, acc: 72.08%] - Val [loss: 1.007e+00, acc: 65.24%]
train loss: 7.937e-01 - accuracy: 72.41%: 100%|██████████| 88/88 [00:15<00:00,  5.82it/s]
val loss: 1.006e+00 - accuracy: 65.46%: 100%|██████████| 5/5 [00:01<00:00,  3.21it/s]
Saving checkpoint.
Epoch 70 finished in 16.70s. Train [loss: 7.937e-01, acc: 72.41%] - Val [loss: 1.006e+00, acc: 65.46%]
train loss: 7.906e-01 - accuracy: 72.35%: 100%|██████████| 88/88 [00:15<00:00,  5.85it/s]
val loss: 1.009e+00 - accuracy: 65.18%: 100%|██████████| 5/5 [00:01<00:00,  3.22it/s]
Epoch 71 finished in 16.62s. Train [loss: 7.906e-01, acc: 72.35%] - Val [loss: 1.009e+00, acc: 65.18%]
train loss: 7.893e-01 - accuracy: 72.53%: 100%|██████████| 88/88 [00:14<00:00,  5.87it/s]
val loss: 1.008e+00 - accuracy: 65.10%: 100%|██████████| 5/5 [00:01<00:00,  3.18it/s]
Epoch 72 finished in 16.59s. Train [loss: 7.893e-01, acc: 72.53%] - Val [loss: 1.008e+00, acc: 65.10%]
train loss: 7.865e-01 - accuracy: 72.56%: 100%|██████████| 88/88 [00:14<00:00,  5.89it/s]
val loss: 1.007e+00 - accuracy: 65.00%: 100%|██████████| 5/5 [00:01<00:00,  3.20it/s]
Epoch 73 finished in 16.53s. Train [loss: 7.865e-01, acc: 72.56%] - Val [loss: 1.007e+00, acc: 65.00%]
train loss: 7.843e-01 - accuracy: 72.52%: 100%|██████████| 88/88 [00:15<00:00,  5.82it/s]
val loss: 1.011e+00 - accuracy: 64.80%: 100%|██████████| 5/5 [00:01<00:00,  3.21it/s]
Epoch 74 finished in 16.71s. Train [loss: 7.843e-01, acc: 72.52%] - Val [loss: 1.011e+00, acc: 64.80%]
train loss: 7.848e-01 - accuracy: 72.60%: 100%|██████████| 88/88 [00:15<00:00,  5.83it/s]
val loss: 1.015e+00 - accuracy: 65.28%: 100%|██████████| 5/5 [00:01<00:00,  3.16it/s]
Epoch 75 finished in 16.70s. Train [loss: 7.848e-01, acc: 72.60%] - Val [loss: 1.015e+00, acc: 65.28%]
train loss: 7.814e-01 - accuracy: 72.60%: 100%|██████████| 88/88 [00:15<00:00,  5.85it/s]
val loss: 1.008e+00 - accuracy: 65.20%: 100%|██████████| 5/5 [00:01<00:00,  3.01it/s]
Epoch 76 finished in 16.72s. Train [loss: 7.814e-01, acc: 72.60%] - Val [loss: 1.008e+00, acc: 65.20%]
train loss: 7.828e-01 - accuracy: 72.43%: 100%|██████████| 88/88 [00:15<00:00,  5.85it/s]
val loss: 1.013e+00 - accuracy: 64.94%: 100%|██████████| 5/5 [00:01<00:00,  3.23it/s]
Epoch 77 finished in 16.61s. Train [loss: 7.828e-01, acc: 72.43%] - Val [loss: 1.013e+00, acc: 64.94%]
train loss: 7.745e-01 - accuracy: 72.76%: 100%|██████████| 88/88 [00:15<00:00,  5.81it/s]
val loss: 1.015e+00 - accuracy: 64.74%: 100%|██████████| 5/5 [00:01<00:00,  3.02it/s]
Epoch 78 finished in 16.84s. Train [loss: 7.745e-01, acc: 72.76%] - Val [loss: 1.015e+00, acc: 64.74%]
train loss: 7.754e-01 - accuracy: 72.89%: 100%|██████████| 88/88 [00:15<00:00,  5.79it/s]
val loss: 1.012e+00 - accuracy: 65.04%: 100%|██████████| 5/5 [00:01<00:00,  3.16it/s]
Epoch 79 finished in 16.82s. Train [loss: 7.754e-01, acc: 72.89%] - Val [loss: 1.012e+00, acc: 65.04%]
train loss: 7.776e-01 - accuracy: 72.92%: 100%|██████████| 88/88 [00:15<00:00,  5.80it/s]
val loss: 1.013e+00 - accuracy: 65.22%: 100%|██████████| 5/5 [00:01<00:00,  3.20it/s]
Epoch 80 finished in 16.77s. Train [loss: 7.776e-01, acc: 72.92%] - Val [loss: 1.013e+00, acc: 65.22%]
train loss: 7.682e-01 - accuracy: 73.08%: 100%|██████████| 88/88 [00:15<00:00,  5.84it/s]
val loss: 1.015e+00 - accuracy: 65.14%: 100%|██████████| 5/5 [00:01<00:00,  3.19it/s]
Epoch 81 finished in 16.66s. Train [loss: 7.682e-01, acc: 73.08%] - Val [loss: 1.015e+00, acc: 65.14%]
train loss: 7.707e-01 - accuracy: 73.18%: 100%|██████████| 88/88 [00:15<00:00,  5.85it/s]
val loss: 1.017e+00 - accuracy: 65.12%: 100%|██████████| 5/5 [00:01<00:00,  3.20it/s]
Epoch 82 finished in 16.63s. Train [loss: 7.707e-01, acc: 73.18%] - Val [loss: 1.017e+00, acc: 65.12%]
train loss: 7.691e-01 - accuracy: 72.83%: 100%|██████████| 88/88 [00:15<00:00,  5.79it/s]
val loss: 1.018e+00 - accuracy: 65.12%: 100%|██████████| 5/5 [00:01<00:00,  3.16it/s]
Epoch 83 finished in 16.80s. Train [loss: 7.691e-01, acc: 72.83%] - Val [loss: 1.018e+00, acc: 65.12%]
train loss: 7.622e-01 - accuracy: 73.02%: 100%|██████████| 88/88 [00:15<00:00,  5.81it/s]
val loss: 1.020e+00 - accuracy: 64.94%: 100%|██████████| 5/5 [00:01<00:00,  3.20it/s]
Epoch 84 finished in 16.72s. Train [loss: 7.622e-01, acc: 73.02%] - Val [loss: 1.020e+00, acc: 64.94%]
train loss: 7.601e-01 - accuracy: 73.28%: 100%|██████████| 88/88 [00:15<00:00,  5.78it/s]
val loss: 1.018e+00 - accuracy: 64.98%: 100%|██████████| 5/5 [00:01<00:00,  3.21it/s]
Epoch 85 finished in 16.80s. Train [loss: 7.601e-01, acc: 73.28%] - Val [loss: 1.018e+00, acc: 64.98%]
train loss: 7.598e-01 - accuracy: 73.46%: 100%|██████████| 88/88 [00:15<00:00,  5.81it/s]
val loss: 1.019e+00 - accuracy: 64.74%: 100%|██████████| 5/5 [00:01<00:00,  3.16it/s]
Epoch 86 finished in 16.77s. Train [loss: 7.598e-01, acc: 73.46%] - Val [loss: 1.019e+00, acc: 64.74%]
train loss: 7.569e-01 - accuracy: 73.53%: 100%|██████████| 88/88 [00:15<00:00,  5.76it/s]
val loss: 1.022e+00 - accuracy: 64.72%: 100%|██████████| 5/5 [00:01<00:00,  3.16it/s]
Epoch 87 finished in 16.89s. Train [loss: 7.569e-01, acc: 73.53%] - Val [loss: 1.022e+00, acc: 64.72%]
train loss: 7.540e-01 - accuracy: 73.58%: 100%|██████████| 88/88 [00:15<00:00,  5.79it/s]
val loss: 1.021e+00 - accuracy: 64.74%: 100%|██████████| 5/5 [00:01<00:00,  3.20it/s]
Epoch 88 finished in 16.79s. Train [loss: 7.540e-01, acc: 73.58%] - Val [loss: 1.021e+00, acc: 64.74%]
train loss: 7.557e-01 - accuracy: 73.32%: 100%|██████████| 88/88 [00:15<00:00,  5.80it/s]
val loss: 1.023e+00 - accuracy: 64.84%: 100%|██████████| 5/5 [00:01<00:00,  3.20it/s]
Epoch 89 finished in 16.77s. Train [loss: 7.557e-01, acc: 73.32%] - Val [loss: 1.023e+00, acc: 64.84%]
train loss: 7.481e-01 - accuracy: 73.48%: 100%|██████████| 88/88 [00:15<00:00,  5.77it/s]
val loss: 1.022e+00 - accuracy: 65.06%: 100%|██████████| 5/5 [00:01<00:00,  3.17it/s]
Epoch 90 finished in 16.86s. Train [loss: 7.481e-01, acc: 73.48%] - Val [loss: 1.022e+00, acc: 65.06%]
train loss: 7.538e-01 - accuracy: 73.55%: 100%|██████████| 88/88 [00:15<00:00,  5.79it/s]
val loss: 1.022e+00 - accuracy: 64.94%: 100%|██████████| 5/5 [00:01<00:00,  2.98it/s]
Epoch 91 finished in 16.91s. Train [loss: 7.538e-01, acc: 73.55%] - Val [loss: 1.022e+00, acc: 64.94%]
train loss: 7.511e-01 - accuracy: 73.47%: 100%|██████████| 88/88 [00:15<00:00,  5.83it/s]
val loss: 1.024e+00 - accuracy: 64.66%: 100%|██████████| 5/5 [00:01<00:00,  3.19it/s]
Epoch 92 finished in 16.70s. Train [loss: 7.511e-01, acc: 73.47%] - Val [loss: 1.024e+00, acc: 64.66%]
train loss: 7.491e-01 - accuracy: 73.76%: 100%|██████████| 88/88 [00:15<00:00,  5.86it/s]
val loss: 1.027e+00 - accuracy: 64.60%: 100%|██████████| 5/5 [00:01<00:00,  3.17it/s]
Epoch 93 finished in 16.62s. Train [loss: 7.491e-01, acc: 73.76%] - Val [loss: 1.027e+00, acc: 64.60%]
train loss: 7.447e-01 - accuracy: 73.90%: 100%|██████████| 88/88 [00:15<00:00,  5.82it/s]
val loss: 1.028e+00 - accuracy: 64.64%: 100%|██████████| 5/5 [00:01<00:00,  3.23it/s]
Epoch 94 finished in 16.69s. Train [loss: 7.447e-01, acc: 73.90%] - Val [loss: 1.028e+00, acc: 64.64%]
train loss: 7.463e-01 - accuracy: 73.80%: 100%|██████████| 88/88 [00:15<00:00,  5.81it/s]
val loss: 1.030e+00 - accuracy: 64.90%: 100%|██████████| 5/5 [00:01<00:00,  3.13it/s]
Epoch 95 finished in 16.75s. Train [loss: 7.463e-01, acc: 73.80%] - Val [loss: 1.030e+00, acc: 64.90%]
train loss: 7.456e-01 - accuracy: 73.90%: 100%|██████████| 88/88 [00:15<00:00,  5.80it/s]
val loss: 1.031e+00 - accuracy: 64.84%: 100%|██████████| 5/5 [00:01<00:00,  3.20it/s]
Epoch 96 finished in 16.75s. Train [loss: 7.456e-01, acc: 73.90%] - Val [loss: 1.031e+00, acc: 64.84%]
train loss: 7.416e-01 - accuracy: 73.87%: 100%|██████████| 88/88 [00:15<00:00,  5.85it/s]
val loss: 1.033e+00 - accuracy: 65.00%: 100%|██████████| 5/5 [00:01<00:00,  3.13it/s]
Epoch 97 finished in 16.68s. Train [loss: 7.416e-01, acc: 73.87%] - Val [loss: 1.033e+00, acc: 65.00%]
train loss: 7.406e-01 - accuracy: 74.20%: 100%|██████████| 88/88 [00:15<00:00,  5.81it/s]
val loss: 1.033e+00 - accuracy: 65.00%: 100%|██████████| 5/5 [00:01<00:00,  3.16it/s]
Epoch 98 finished in 16.75s. Train [loss: 7.406e-01, acc: 74.20%] - Val [loss: 1.033e+00, acc: 65.00%]
train loss: 7.375e-01 - accuracy: 73.98%: 100%|██████████| 88/88 [00:15<00:00,  5.79it/s]
val loss: 1.036e+00 - accuracy: 64.36%: 100%|██████████| 5/5 [00:01<00:00,  3.17it/s]
Epoch 99 finished in 16.82s. Train [loss: 7.375e-01, acc: 73.98%] - Val [loss: 1.036e+00, acc: 64.36%]
train loss: 7.377e-01 - accuracy: 74.17%: 100%|██████████| 88/88 [00:15<00:00,  5.80it/s]
val loss: 1.033e+00 - accuracy: 65.06%: 100%|██████████| 5/5 [00:01<00:00,  3.20it/s]
Epoch 100 finished in 16.76s. Train [loss: 7.377e-01, acc: 74.17%] - Val [loss: 1.033e+00, acc: 65.06%]

Draw the training curves

Draw two diagrams for train and validat ion, one showing loss of each epoch, and another showing accuracy of each epoch.

In [16]:
trainer.plot_curves()
plt.show()

Evaluate your model

Evaluate the best epoch's model (according to the validation accuracy) on the test set, and report the accuracy. Is your model overfitted?

In [17]:
trainer.load()
_, accuracy = trainer.test()
accuracy
val loss: 1.042e+00 - accuracy: 64.08%: 100%|██████████| 10/10 [00:03<00:00,  3.19it/s]
Out[17]:
64.08

Draw misclassified images

Draw 20 misclassified images from test set with expected and predicted labels.

In [18]:
trainer.draw_misclassified(20)
100%|██████████| 10/10 [00:02<00:00,  3.51it/s]

Plot the confusion matrix

Plot the confusion matrix for the test set.

In [19]:
trainer.plot_cm()
plt.show()
100%|██████████| 10/10 [00:03<00:00,  3.13it/s]