In [1]:
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import torch.optim as optim
from tqdm import tqdm

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

torch.manual_seed(42);
np.random.seed(42)
In [2]:
CIFAR10_MEAN = [0.4914, 0.4822, 0.4465]
CIFAR10_STD = [0.2470, 0.2435, 0.2616]

train_transform = transforms.Compose([
    transforms.RandomCrop(32, padding=4),
    transforms.RandomHorizontalFlip(),
    transforms.ColorJitter(
        brightness=0.2,
        contrast=0.2,
        saturation=0.2,
        hue=0.1
    ),
    transforms.ToTensor(),
    transforms.Normalize(CIFAR10_MEAN, CIFAR10_STD),
    transforms.RandomErasing(p=0.5, scale=(0.02, 0.2), ratio=(0.3, 3.3))
])

test_transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(CIFAR10_MEAN, CIFAR10_STD)
])

train_dataset = datasets.CIFAR10(
  root='./data',
  train=True,
  download=True,
  transform=train_transform
)

test_dataset = datasets.CIFAR10(
    root='./data',
    train=False,
    download=True,
    transform=test_transform
)

print(f"Training dataset size: {len(train_dataset)}")
print(f"Test dataset size: {len(test_dataset)}")
print(f"Number of classes: {len(train_dataset.classes)}")
print(f"Classes: {train_dataset.classes}")

train_loader = DataLoader(
    dataset=train_dataset,
    batch_size=128,
    shuffle=True,
    num_workers=4,
    pin_memory=True,
    persistent_workers=True
)

test_loader = DataLoader(
    dataset=test_dataset,
    batch_size=128,
    shuffle=False,
    num_workers=4,
    pin_memory=True,
    persistent_workers=True
)
100%|██████████| 170M/170M [00:14<00:00, 11.9MB/s]
Training dataset size: 50000
Test dataset size: 10000
Number of classes: 10
Classes: ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
In [3]:
class AlexNetCIFAR(nn.Module):
  def __init__(self, num_classes=10):
    super(AlexNetCIFAR, self).__init__()

    self.features = nn.Sequential(
      # Conv1: 32x32x3 -> 32x32x64
      nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1),
      nn.BatchNorm2d(64),
      nn.ReLU(inplace=True),
      nn.MaxPool2d(kernel_size=2, stride=2),  # 32x32 -> 16x16

      # Conv2: 16x16x64 -> 16x16x192
      nn.Conv2d(64, 192, kernel_size=3, padding=1),
      nn.BatchNorm2d(192),
      nn.ReLU(inplace=True),
      nn.MaxPool2d(kernel_size=2, stride=2),  # 16x16 -> 8x8

      # Conv3: 8x8x192 -> 8x8x384
      nn.Conv2d(192, 384, kernel_size=3, padding=1),
      nn.BatchNorm2d(384),
      nn.ReLU(inplace=True),

      # Conv4: 8x8x384 -> 8x8x256
      nn.Conv2d(384, 256, kernel_size=3, padding=1),
      nn.BatchNorm2d(256),
      nn.ReLU(inplace=True),

      # Conv5: 8x8x256 -> 8x8x256
      nn.Conv2d(256, 256, kernel_size=3, padding=1),
      nn.BatchNorm2d(256),
      nn.ReLU(inplace=True),
      nn.MaxPool2d(kernel_size=2, stride=2),  # 8x8 -> 4x4
    )

    self.classifier = nn.Sequential(
      nn.Dropout(0.5),
      nn.Linear(256 * 4 * 4, 1024),
      nn.BatchNorm1d(1024),
      nn.ReLU(inplace=True),
      nn.Dropout(0.5),
      nn.Linear(1024, 512),
      nn.BatchNorm1d(512),
      nn.ReLU(inplace=True),
      nn.Linear(512, num_classes),
    )

    self._initialize_weights()

  def forward(self, x):
    x = self.features(x)
    x = torch.flatten(x, 1)
    x = self.classifier(x)
    return x


  def _initialize_weights(self):
    for m in self.modules():
      if isinstance(m, nn.Conv2d):
        nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
        if m.bias is not None:
          nn.init.constant_(m.bias, 0)
      elif isinstance(m, nn.Linear):
        nn.init.normal_(m.weight, 0, 0.01)
        nn.init.constant_(m.bias, 0)
In [4]:
model = AlexNetCIFAR(num_classes=10).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4)
scheduler = optim.lr_scheduler.MultiStepLR(optimizer, milestones=[30, 60, 80], gamma=0.2)

for epoch in range(100):
    model.train()
    train_loss = 0.0
    train_correct = 0
    train_total = 0

    train_loop = tqdm(train_loader, desc=f"Epoch {epoch} Training")
    for batch_idx, (inputs, targets) in enumerate(train_loop):
        inputs, targets = inputs.to(device), targets.to(device)

        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, targets)
        loss.backward()
        optimizer.step()

        train_loss += loss.item()
        _, predicted = outputs.max(1)
        train_total += targets.size(0)
        train_correct += predicted.eq(targets).sum().item()

        train_loop.set_postfix({
            'loss': f'{train_loss/(batch_idx+1):.3f}',
            'acc': f'{100.*train_correct/train_total:.2f}%'
        })

    model.eval()
    test_correct = 0
    test_total = 0
    test_loss = 0.0

    with torch.no_grad():
        test_loop = tqdm(test_loader, desc=f"Epoch {epoch} Validation")
        for batch_idx, (inputs, targets) in enumerate(test_loop):
            inputs, targets = inputs.to(device), targets.to(device)
            outputs = model(inputs)
            loss = criterion(outputs, targets)
            test_loss += loss.item()
            _, predicted = outputs.max(1)
            test_total += targets.size(0)
            test_correct += predicted.eq(targets).sum().item()

            test_loop.set_postfix({
                'loss': f'{test_loss/(batch_idx+1):.3f}',
                'acc': f'{100.*test_correct/test_total:.2f}%'
            })

    test_acc = 100. * test_correct / test_total
    print(f'Epoch {epoch}: Test Accuracy: {test_acc:.2f}%')
    scheduler.step()
Epoch 0 Training: 100%|██████████| 391/391 [00:15<00:00, 26.02it/s, loss=1.760, acc=37.10%]
Epoch 0 Validation: 100%|██████████| 79/79 [00:00<00:00, 94.40it/s, loss=1.312, acc=52.83%] 
Epoch 0: Test Accuracy: 52.83%
Epoch 1 Training: 100%|██████████| 391/391 [00:13<00:00, 29.78it/s, loss=1.310, acc=53.09%]
Epoch 1 Validation: 100%|██████████| 79/79 [00:00<00:00, 113.45it/s, loss=1.144, acc=60.14%]
Epoch 1: Test Accuracy: 60.14%
Epoch 2 Training: 100%|██████████| 391/391 [00:13<00:00, 29.45it/s, loss=1.127, acc=59.91%]
Epoch 2 Validation: 100%|██████████| 79/79 [00:00<00:00, 107.99it/s, loss=0.964, acc=66.21%]
Epoch 2: Test Accuracy: 66.21%
Epoch 3 Training: 100%|██████████| 391/391 [00:13<00:00, 29.83it/s, loss=1.013, acc=64.26%]
Epoch 3 Validation: 100%|██████████| 79/79 [00:00<00:00, 110.76it/s, loss=0.886, acc=67.96%]
Epoch 3: Test Accuracy: 67.96%
Epoch 4 Training: 100%|██████████| 391/391 [00:13<00:00, 29.81it/s, loss=0.934, acc=67.30%]
Epoch 4 Validation: 100%|██████████| 79/79 [00:00<00:00, 112.89it/s, loss=0.935, acc=67.54%]
Epoch 4: Test Accuracy: 67.54%
Epoch 5 Training: 100%|██████████| 391/391 [00:13<00:00, 29.83it/s, loss=0.885, acc=69.38%]
Epoch 5 Validation: 100%|██████████| 79/79 [00:00<00:00, 114.09it/s, loss=0.763, acc=73.86%]
Epoch 5: Test Accuracy: 73.86%
Epoch 6 Training: 100%|██████████| 391/391 [00:13<00:00, 29.57it/s, loss=0.846, acc=70.83%]
Epoch 6 Validation: 100%|██████████| 79/79 [00:00<00:00, 109.14it/s, loss=0.776, acc=73.22%]
Epoch 6: Test Accuracy: 73.22%
Epoch 7 Training: 100%|██████████| 391/391 [00:13<00:00, 29.78it/s, loss=0.829, acc=71.31%]
Epoch 7 Validation: 100%|██████████| 79/79 [00:00<00:00, 111.54it/s, loss=0.752, acc=74.75%]
Epoch 7: Test Accuracy: 74.75%
Epoch 8 Training: 100%|██████████| 391/391 [00:13<00:00, 29.34it/s, loss=0.801, acc=72.61%]
Epoch 8 Validation: 100%|██████████| 79/79 [00:00<00:00, 104.27it/s, loss=0.794, acc=72.63%]
Epoch 8: Test Accuracy: 72.63%
Epoch 9 Training: 100%|██████████| 391/391 [00:13<00:00, 29.91it/s, loss=0.784, acc=73.14%]
Epoch 9 Validation: 100%|██████████| 79/79 [00:00<00:00, 115.65it/s, loss=0.843, acc=71.27%]
Epoch 9: Test Accuracy: 71.27%
Epoch 10 Training: 100%|██████████| 391/391 [00:13<00:00, 29.65it/s, loss=0.768, acc=73.51%]
Epoch 10 Validation: 100%|██████████| 79/79 [00:00<00:00, 111.58it/s, loss=0.718, acc=76.28%]
Epoch 10: Test Accuracy: 76.28%
Epoch 11 Training: 100%|██████████| 391/391 [00:13<00:00, 29.65it/s, loss=0.759, acc=74.00%]
Epoch 11 Validation: 100%|██████████| 79/79 [00:00<00:00, 110.35it/s, loss=0.961, acc=68.47%]
Epoch 11: Test Accuracy: 68.47%
Epoch 12 Training: 100%|██████████| 391/391 [00:13<00:00, 29.95it/s, loss=0.735, acc=74.96%]
Epoch 12 Validation: 100%|██████████| 79/79 [00:00<00:00, 110.63it/s, loss=0.851, acc=72.04%]
Epoch 12: Test Accuracy: 72.04%
Epoch 13 Training: 100%|██████████| 391/391 [00:13<00:00, 29.65it/s, loss=0.728, acc=75.07%]
Epoch 13 Validation: 100%|██████████| 79/79 [00:00<00:00, 106.90it/s, loss=0.759, acc=74.48%]
Epoch 13: Test Accuracy: 74.48%
Epoch 14 Training: 100%|██████████| 391/391 [00:13<00:00, 29.63it/s, loss=0.725, acc=75.18%]
Epoch 14 Validation: 100%|██████████| 79/79 [00:00<00:00, 111.80it/s, loss=0.670, acc=77.72%]
Epoch 14: Test Accuracy: 77.72%
Epoch 15 Training: 100%|██████████| 391/391 [00:13<00:00, 29.80it/s, loss=0.714, acc=75.63%]
Epoch 15 Validation: 100%|██████████| 79/79 [00:00<00:00, 113.75it/s, loss=0.775, acc=73.89%]
Epoch 15: Test Accuracy: 73.89%
Epoch 16 Training: 100%|██████████| 391/391 [00:13<00:00, 29.88it/s, loss=0.705, acc=76.09%]
Epoch 16 Validation: 100%|██████████| 79/79 [00:00<00:00, 112.66it/s, loss=0.625, acc=78.88%]
Epoch 16: Test Accuracy: 78.88%
Epoch 17 Training: 100%|██████████| 391/391 [00:13<00:00, 29.99it/s, loss=0.700, acc=76.09%]
Epoch 17 Validation: 100%|██████████| 79/79 [00:00<00:00, 113.36it/s, loss=0.701, acc=77.18%]
Epoch 17: Test Accuracy: 77.18%
Epoch 18 Training: 100%|██████████| 391/391 [00:13<00:00, 30.05it/s, loss=0.695, acc=76.22%]
Epoch 18 Validation: 100%|██████████| 79/79 [00:00<00:00, 109.44it/s, loss=0.605, acc=79.50%]
Epoch 18: Test Accuracy: 79.50%
Epoch 19 Training: 100%|██████████| 391/391 [00:13<00:00, 29.68it/s, loss=0.692, acc=76.67%]
Epoch 19 Validation: 100%|██████████| 79/79 [00:00<00:00, 115.51it/s, loss=0.792, acc=73.93%]
Epoch 19: Test Accuracy: 73.93%
Epoch 20 Training: 100%|██████████| 391/391 [00:12<00:00, 30.19it/s, loss=0.690, acc=76.57%]
Epoch 20 Validation: 100%|██████████| 79/79 [00:00<00:00, 110.18it/s, loss=0.676, acc=77.39%]
Epoch 20: Test Accuracy: 77.39%
Epoch 21 Training: 100%|██████████| 391/391 [00:13<00:00, 29.63it/s, loss=0.690, acc=76.64%]
Epoch 21 Validation: 100%|██████████| 79/79 [00:00<00:00, 108.91it/s, loss=0.765, acc=74.20%]
Epoch 21: Test Accuracy: 74.20%
Epoch 22 Training: 100%|██████████| 391/391 [00:13<00:00, 29.74it/s, loss=0.683, acc=76.58%]
Epoch 22 Validation: 100%|██████████| 79/79 [00:00<00:00, 110.91it/s, loss=0.776, acc=75.67%]
Epoch 22: Test Accuracy: 75.67%
Epoch 23 Training: 100%|██████████| 391/391 [00:13<00:00, 29.60it/s, loss=0.679, acc=77.00%]
Epoch 23 Validation: 100%|██████████| 79/79 [00:00<00:00, 103.25it/s, loss=0.801, acc=73.78%]
Epoch 23: Test Accuracy: 73.78%
Epoch 24 Training: 100%|██████████| 391/391 [00:13<00:00, 29.96it/s, loss=0.672, acc=77.18%]
Epoch 24 Validation: 100%|██████████| 79/79 [00:00<00:00, 102.58it/s, loss=0.711, acc=75.67%]
Epoch 24: Test Accuracy: 75.67%
Epoch 25 Training: 100%|██████████| 391/391 [00:13<00:00, 29.65it/s, loss=0.670, acc=77.38%]
Epoch 25 Validation: 100%|██████████| 79/79 [00:00<00:00, 110.28it/s, loss=0.713, acc=75.95%]
Epoch 25: Test Accuracy: 75.95%
Epoch 26 Training: 100%|██████████| 391/391 [00:13<00:00, 29.89it/s, loss=0.666, acc=77.39%]
Epoch 26 Validation: 100%|██████████| 79/79 [00:00<00:00, 110.12it/s, loss=0.633, acc=78.66%]
Epoch 26: Test Accuracy: 78.66%
Epoch 27 Training: 100%|██████████| 391/391 [00:13<00:00, 29.91it/s, loss=0.669, acc=77.20%]
Epoch 27 Validation: 100%|██████████| 79/79 [00:00<00:00, 111.20it/s, loss=0.611, acc=79.47%]
Epoch 27: Test Accuracy: 79.47%
Epoch 28 Training: 100%|██████████| 391/391 [00:13<00:00, 29.64it/s, loss=0.672, acc=77.17%]
Epoch 28 Validation: 100%|██████████| 79/79 [00:00<00:00, 104.74it/s, loss=0.622, acc=78.59%]
Epoch 28: Test Accuracy: 78.59%
Epoch 29 Training: 100%|██████████| 391/391 [00:13<00:00, 29.79it/s, loss=0.660, acc=77.55%]
Epoch 29 Validation: 100%|██████████| 79/79 [00:00<00:00, 106.96it/s, loss=0.714, acc=74.94%]
Epoch 29: Test Accuracy: 74.94%
Epoch 30 Training: 100%|██████████| 391/391 [00:13<00:00, 29.79it/s, loss=0.471, acc=84.13%]
Epoch 30 Validation: 100%|██████████| 79/79 [00:00<00:00, 113.71it/s, loss=0.361, acc=87.83%]
Epoch 30: Test Accuracy: 87.83%
Epoch 31 Training: 100%|██████████| 391/391 [00:13<00:00, 29.61it/s, loss=0.420, acc=85.71%]
Epoch 31 Validation: 100%|██████████| 79/79 [00:00<00:00, 106.33it/s, loss=0.347, acc=88.25%]
Epoch 31: Test Accuracy: 88.25%
Epoch 32 Training: 100%|██████████| 391/391 [00:13<00:00, 30.01it/s, loss=0.399, acc=86.53%]
Epoch 32 Validation: 100%|██████████| 79/79 [00:00<00:00, 105.77it/s, loss=0.364, acc=87.45%]
Epoch 32: Test Accuracy: 87.45%
Epoch 33 Training: 100%|██████████| 391/391 [00:13<00:00, 29.73it/s, loss=0.388, acc=86.86%]
Epoch 33 Validation: 100%|██████████| 79/79 [00:00<00:00, 106.72it/s, loss=0.389, acc=86.99%]
Epoch 33: Test Accuracy: 86.99%
Epoch 34 Training: 100%|██████████| 391/391 [00:13<00:00, 29.56it/s, loss=0.383, acc=86.88%]
Epoch 34 Validation: 100%|██████████| 79/79 [00:00<00:00, 111.85it/s, loss=0.352, acc=88.37%]
Epoch 34: Test Accuracy: 88.37%
Epoch 35 Training: 100%|██████████| 391/391 [00:13<00:00, 29.64it/s, loss=0.371, acc=87.35%]
Epoch 35 Validation: 100%|██████████| 79/79 [00:00<00:00, 114.87it/s, loss=0.337, acc=88.82%]
Epoch 35: Test Accuracy: 88.82%
Epoch 36 Training: 100%|██████████| 391/391 [00:13<00:00, 29.53it/s, loss=0.365, acc=87.65%]
Epoch 36 Validation: 100%|██████████| 79/79 [00:00<00:00, 108.72it/s, loss=0.368, acc=87.90%]
Epoch 36: Test Accuracy: 87.90%
Epoch 37 Training: 100%|██████████| 391/391 [00:13<00:00, 29.45it/s, loss=0.367, acc=87.39%]
Epoch 37 Validation: 100%|██████████| 79/79 [00:00<00:00, 106.61it/s, loss=0.369, acc=87.35%]
Epoch 37: Test Accuracy: 87.35%
Epoch 38 Training: 100%|██████████| 391/391 [00:13<00:00, 29.95it/s, loss=0.368, acc=87.45%]
Epoch 38 Validation: 100%|██████████| 79/79 [00:00<00:00, 112.19it/s, loss=0.375, acc=87.46%]
Epoch 38: Test Accuracy: 87.46%
Epoch 39 Training: 100%|██████████| 391/391 [00:13<00:00, 29.60it/s, loss=0.360, acc=87.78%]
Epoch 39 Validation: 100%|██████████| 79/79 [00:00<00:00, 109.36it/s, loss=0.384, acc=86.88%]
Epoch 39: Test Accuracy: 86.88%
Epoch 40 Training: 100%|██████████| 391/391 [00:13<00:00, 29.56it/s, loss=0.361, acc=87.64%]
Epoch 40 Validation: 100%|██████████| 79/79 [00:00<00:00, 109.29it/s, loss=0.380, acc=86.99%]
Epoch 40: Test Accuracy: 86.99%
Epoch 41 Training: 100%|██████████| 391/391 [00:13<00:00, 29.83it/s, loss=0.353, acc=88.05%]
Epoch 41 Validation: 100%|██████████| 79/79 [00:00<00:00, 112.35it/s, loss=0.361, acc=88.13%]
Epoch 41: Test Accuracy: 88.13%
Epoch 42 Training: 100%|██████████| 391/391 [00:13<00:00, 29.95it/s, loss=0.359, acc=87.67%]
Epoch 42 Validation: 100%|██████████| 79/79 [00:00<00:00, 100.94it/s, loss=0.366, acc=87.71%]
Epoch 42: Test Accuracy: 87.71%
Epoch 43 Training: 100%|██████████| 391/391 [00:13<00:00, 29.61it/s, loss=0.353, acc=87.86%]
Epoch 43 Validation: 100%|██████████| 79/79 [00:00<00:00, 113.49it/s, loss=0.366, acc=87.73%]
Epoch 43: Test Accuracy: 87.73%
Epoch 44 Training: 100%|██████████| 391/391 [00:13<00:00, 29.69it/s, loss=0.356, acc=87.95%]
Epoch 44 Validation: 100%|██████████| 79/79 [00:00<00:00, 112.18it/s, loss=0.398, acc=86.96%]
Epoch 44: Test Accuracy: 86.96%
Epoch 45 Training: 100%|██████████| 391/391 [00:13<00:00, 29.74it/s, loss=0.350, acc=88.13%]
Epoch 45 Validation: 100%|██████████| 79/79 [00:00<00:00, 114.65it/s, loss=0.367, acc=87.58%]
Epoch 45: Test Accuracy: 87.58%
Epoch 46 Training: 100%|██████████| 391/391 [00:13<00:00, 29.34it/s, loss=0.355, acc=87.99%]
Epoch 46 Validation: 100%|██████████| 79/79 [00:00<00:00, 109.02it/s, loss=0.352, acc=87.87%]
Epoch 46: Test Accuracy: 87.87%
Epoch 47 Training: 100%|██████████| 391/391 [00:13<00:00, 29.78it/s, loss=0.357, acc=87.77%]
Epoch 47 Validation: 100%|██████████| 79/79 [00:00<00:00, 113.57it/s, loss=0.372, acc=87.50%]
Epoch 47: Test Accuracy: 87.50%
Epoch 48 Training: 100%|██████████| 391/391 [00:13<00:00, 29.88it/s, loss=0.355, acc=87.76%]
Epoch 48 Validation: 100%|██████████| 79/79 [00:00<00:00, 114.27it/s, loss=0.382, acc=87.29%]
Epoch 48: Test Accuracy: 87.29%
Epoch 49 Training: 100%|██████████| 391/391 [00:13<00:00, 30.04it/s, loss=0.355, acc=87.95%]
Epoch 49 Validation: 100%|██████████| 79/79 [00:00<00:00, 112.41it/s, loss=0.369, acc=87.36%]
Epoch 49: Test Accuracy: 87.36%
Epoch 50 Training: 100%|██████████| 391/391 [00:13<00:00, 29.55it/s, loss=0.348, acc=88.11%]
Epoch 50 Validation: 100%|██████████| 79/79 [00:00<00:00, 113.24it/s, loss=0.386, acc=86.94%]
Epoch 50: Test Accuracy: 86.94%
Epoch 51 Training: 100%|██████████| 391/391 [00:13<00:00, 29.66it/s, loss=0.350, acc=87.94%]
Epoch 51 Validation: 100%|██████████| 79/79 [00:00<00:00, 109.33it/s, loss=0.405, acc=86.62%]
Epoch 51: Test Accuracy: 86.62%
Epoch 52 Training: 100%|██████████| 391/391 [00:13<00:00, 29.28it/s, loss=0.344, acc=88.26%]
Epoch 52 Validation: 100%|██████████| 79/79 [00:00<00:00, 113.10it/s, loss=0.389, acc=86.71%]
Epoch 52: Test Accuracy: 86.71%
Epoch 53 Training: 100%|██████████| 391/391 [00:13<00:00, 29.66it/s, loss=0.347, acc=88.12%]
Epoch 53 Validation: 100%|██████████| 79/79 [00:00<00:00, 111.63it/s, loss=0.405, acc=86.52%]
Epoch 53: Test Accuracy: 86.52%
Epoch 54 Training: 100%|██████████| 391/391 [00:13<00:00, 29.54it/s, loss=0.344, acc=88.30%]
Epoch 54 Validation: 100%|██████████| 79/79 [00:00<00:00, 108.35it/s, loss=0.362, acc=87.37%]
Epoch 54: Test Accuracy: 87.37%
Epoch 55 Training: 100%|██████████| 391/391 [00:13<00:00, 29.72it/s, loss=0.348, acc=88.03%]
Epoch 55 Validation: 100%|██████████| 79/79 [00:00<00:00, 113.30it/s, loss=0.388, acc=86.96%]
Epoch 55: Test Accuracy: 86.96%
Epoch 56 Training: 100%|██████████| 391/391 [00:13<00:00, 29.56it/s, loss=0.341, acc=88.37%]
Epoch 56 Validation: 100%|██████████| 79/79 [00:00<00:00, 108.91it/s, loss=0.357, acc=87.98%]
Epoch 56: Test Accuracy: 87.98%
Epoch 57 Training: 100%|██████████| 391/391 [00:13<00:00, 29.62it/s, loss=0.344, acc=88.32%]
Epoch 57 Validation: 100%|██████████| 79/79 [00:00<00:00, 114.03it/s, loss=0.357, acc=87.87%]
Epoch 57: Test Accuracy: 87.87%
Epoch 58 Training: 100%|██████████| 391/391 [00:13<00:00, 29.84it/s, loss=0.339, acc=88.43%]
Epoch 58 Validation: 100%|██████████| 79/79 [00:00<00:00, 107.48it/s, loss=0.421, acc=85.96%]
Epoch 58: Test Accuracy: 85.96%
Epoch 59 Training: 100%|██████████| 391/391 [00:13<00:00, 29.72it/s, loss=0.336, acc=88.64%]
Epoch 59 Validation: 100%|██████████| 79/79 [00:00<00:00, 109.53it/s, loss=0.366, acc=87.68%]
Epoch 59: Test Accuracy: 87.68%
Epoch 60 Training: 100%|██████████| 391/391 [00:13<00:00, 29.85it/s, loss=0.240, acc=91.96%]
Epoch 60 Validation: 100%|██████████| 79/79 [00:00<00:00, 112.34it/s, loss=0.263, acc=91.12%]
Epoch 60: Test Accuracy: 91.12%
Epoch 61 Training: 100%|██████████| 391/391 [00:13<00:00, 29.63it/s, loss=0.212, acc=92.83%]
Epoch 61 Validation: 100%|██████████| 79/79 [00:00<00:00, 104.67it/s, loss=0.262, acc=91.59%]
Epoch 61: Test Accuracy: 91.59%
Epoch 62 Training: 100%|██████████| 391/391 [00:13<00:00, 29.28it/s, loss=0.196, acc=93.39%]
Epoch 62 Validation: 100%|██████████| 79/79 [00:00<00:00, 114.26it/s, loss=0.264, acc=91.46%]
Epoch 62: Test Accuracy: 91.46%
Epoch 63 Training: 100%|██████████| 391/391 [00:13<00:00, 29.94it/s, loss=0.187, acc=93.74%]
Epoch 63 Validation: 100%|██████████| 79/79 [00:00<00:00, 107.23it/s, loss=0.255, acc=91.46%]
Epoch 63: Test Accuracy: 91.46%
Epoch 64 Training: 100%|██████████| 391/391 [00:13<00:00, 29.59it/s, loss=0.178, acc=93.98%]
Epoch 64 Validation: 100%|██████████| 79/79 [00:00<00:00, 110.55it/s, loss=0.253, acc=91.64%]
Epoch 64: Test Accuracy: 91.64%
Epoch 65 Training: 100%|██████████| 391/391 [00:13<00:00, 29.81it/s, loss=0.176, acc=94.05%]
Epoch 65 Validation: 100%|██████████| 79/79 [00:00<00:00, 109.54it/s, loss=0.264, acc=91.37%]
Epoch 65: Test Accuracy: 91.37%
Epoch 66 Training: 100%|██████████| 391/391 [00:13<00:00, 29.82it/s, loss=0.169, acc=94.31%]
Epoch 66 Validation: 100%|██████████| 79/79 [00:00<00:00, 109.09it/s, loss=0.253, acc=92.17%]
Epoch 66: Test Accuracy: 92.17%
Epoch 67 Training: 100%|██████████| 391/391 [00:13<00:00, 29.51it/s, loss=0.168, acc=94.38%]
Epoch 67 Validation: 100%|██████████| 79/79 [00:00<00:00, 110.09it/s, loss=0.254, acc=91.83%]
Epoch 67: Test Accuracy: 91.83%
Epoch 68 Training: 100%|██████████| 391/391 [00:13<00:00, 29.75it/s, loss=0.159, acc=94.77%]
Epoch 68 Validation: 100%|██████████| 79/79 [00:00<00:00, 108.28it/s, loss=0.254, acc=91.95%]
Epoch 68: Test Accuracy: 91.95%
Epoch 69 Training: 100%|██████████| 391/391 [00:13<00:00, 29.73it/s, loss=0.161, acc=94.57%]
Epoch 69 Validation: 100%|██████████| 79/79 [00:00<00:00, 110.56it/s, loss=0.270, acc=91.52%]
Epoch 69: Test Accuracy: 91.52%
Epoch 70 Training: 100%|██████████| 391/391 [00:13<00:00, 29.76it/s, loss=0.156, acc=94.67%]
Epoch 70 Validation: 100%|██████████| 79/79 [00:00<00:00, 110.81it/s, loss=0.258, acc=91.87%]
Epoch 70: Test Accuracy: 91.87%
Epoch 71 Training: 100%|██████████| 391/391 [00:13<00:00, 30.04it/s, loss=0.155, acc=94.86%]
Epoch 71 Validation: 100%|██████████| 79/79 [00:00<00:00, 111.08it/s, loss=0.269, acc=91.38%]
Epoch 71: Test Accuracy: 91.38%
Epoch 72 Training: 100%|██████████| 391/391 [00:13<00:00, 29.87it/s, loss=0.153, acc=94.86%]
Epoch 72 Validation: 100%|██████████| 79/79 [00:00<00:00, 112.85it/s, loss=0.270, acc=91.50%]
Epoch 72: Test Accuracy: 91.50%
Epoch 73 Training: 100%|██████████| 391/391 [00:13<00:00, 29.74it/s, loss=0.150, acc=94.93%]
Epoch 73 Validation: 100%|██████████| 79/79 [00:00<00:00, 109.33it/s, loss=0.255, acc=91.86%]
Epoch 73: Test Accuracy: 91.86%
Epoch 74 Training: 100%|██████████| 391/391 [00:13<00:00, 29.50it/s, loss=0.153, acc=94.96%]
Epoch 74 Validation: 100%|██████████| 79/79 [00:00<00:00, 107.07it/s, loss=0.272, acc=91.37%]
Epoch 74: Test Accuracy: 91.37%
Epoch 75 Training: 100%|██████████| 391/391 [00:13<00:00, 29.73it/s, loss=0.148, acc=95.00%]
Epoch 75 Validation: 100%|██████████| 79/79 [00:00<00:00, 102.47it/s, loss=0.280, acc=91.09%]
Epoch 75: Test Accuracy: 91.09%
Epoch 76 Training: 100%|██████████| 391/391 [00:13<00:00, 29.88it/s, loss=0.145, acc=95.12%]
Epoch 76 Validation: 100%|██████████| 79/79 [00:00<00:00, 113.18it/s, loss=0.267, acc=91.66%]
Epoch 76: Test Accuracy: 91.66%
Epoch 77 Training: 100%|██████████| 391/391 [00:13<00:00, 29.49it/s, loss=0.145, acc=95.10%]
Epoch 77 Validation: 100%|██████████| 79/79 [00:00<00:00, 111.01it/s, loss=0.270, acc=91.64%]
Epoch 77: Test Accuracy: 91.64%
Epoch 78 Training: 100%|██████████| 391/391 [00:13<00:00, 29.71it/s, loss=0.145, acc=95.10%]
Epoch 78 Validation: 100%|██████████| 79/79 [00:00<00:00, 107.54it/s, loss=0.283, acc=91.17%]
Epoch 78: Test Accuracy: 91.17%
Epoch 79 Training: 100%|██████████| 391/391 [00:13<00:00, 29.90it/s, loss=0.145, acc=95.18%]
Epoch 79 Validation: 100%|██████████| 79/79 [00:00<00:00, 104.75it/s, loss=0.273, acc=91.60%]
Epoch 79: Test Accuracy: 91.60%
Epoch 80 Training: 100%|██████████| 391/391 [00:13<00:00, 29.97it/s, loss=0.122, acc=95.98%]
Epoch 80 Validation: 100%|██████████| 79/79 [00:00<00:00, 105.43it/s, loss=0.246, acc=92.39%]
Epoch 80: Test Accuracy: 92.39%
Epoch 81 Training: 100%|██████████| 391/391 [00:13<00:00, 29.50it/s, loss=0.117, acc=96.10%]
Epoch 81 Validation: 100%|██████████| 79/79 [00:00<00:00, 113.54it/s, loss=0.249, acc=92.45%]
Epoch 81: Test Accuracy: 92.45%
Epoch 82 Training: 100%|██████████| 391/391 [00:13<00:00, 29.91it/s, loss=0.110, acc=96.38%]
Epoch 82 Validation: 100%|██████████| 79/79 [00:00<00:00, 107.80it/s, loss=0.247, acc=92.41%]
Epoch 82: Test Accuracy: 92.41%
Epoch 83 Training: 100%|██████████| 391/391 [00:13<00:00, 29.32it/s, loss=0.111, acc=96.35%]
Epoch 83 Validation: 100%|██████████| 79/79 [00:00<00:00, 106.95it/s, loss=0.250, acc=92.31%]
Epoch 83: Test Accuracy: 92.31%
Epoch 84 Training: 100%|██████████| 391/391 [00:13<00:00, 29.75it/s, loss=0.108, acc=96.49%]
Epoch 84 Validation: 100%|██████████| 79/79 [00:00<00:00, 113.89it/s, loss=0.246, acc=92.43%]
Epoch 84: Test Accuracy: 92.43%
Epoch 85 Training: 100%|██████████| 391/391 [00:13<00:00, 29.97it/s, loss=0.110, acc=96.38%]
Epoch 85 Validation: 100%|██████████| 79/79 [00:00<00:00, 95.75it/s, loss=0.244, acc=92.55%]
Epoch 85: Test Accuracy: 92.55%
Epoch 86 Training: 100%|██████████| 391/391 [00:13<00:00, 29.79it/s, loss=0.103, acc=96.68%]
Epoch 86 Validation: 100%|██████████| 79/79 [00:00<00:00, 112.49it/s, loss=0.244, acc=92.62%]
Epoch 86: Test Accuracy: 92.62%
Epoch 87 Training: 100%|██████████| 391/391 [00:13<00:00, 29.46it/s, loss=0.103, acc=96.61%]
Epoch 87 Validation: 100%|██████████| 79/79 [00:00<00:00, 109.83it/s, loss=0.246, acc=92.48%]
Epoch 87: Test Accuracy: 92.48%
Epoch 88 Training: 100%|██████████| 391/391 [00:13<00:00, 29.53it/s, loss=0.101, acc=96.73%]
Epoch 88 Validation: 100%|██████████| 79/79 [00:00<00:00, 110.69it/s, loss=0.244, acc=92.66%]
Epoch 88: Test Accuracy: 92.66%
Epoch 89 Training: 100%|██████████| 391/391 [00:13<00:00, 29.77it/s, loss=0.100, acc=96.73%]
Epoch 89 Validation: 100%|██████████| 79/79 [00:00<00:00, 112.51it/s, loss=0.243, acc=92.74%]
Epoch 89: Test Accuracy: 92.74%
Epoch 90 Training: 100%|██████████| 391/391 [00:13<00:00, 29.97it/s, loss=0.100, acc=96.65%]
Epoch 90 Validation: 100%|██████████| 79/79 [00:00<00:00, 105.69it/s, loss=0.242, acc=92.37%]
Epoch 90: Test Accuracy: 92.37%
Epoch 91 Training: 100%|██████████| 391/391 [00:13<00:00, 29.49it/s, loss=0.097, acc=96.88%]
Epoch 91 Validation: 100%|██████████| 79/79 [00:00<00:00, 108.60it/s, loss=0.246, acc=92.67%]
Epoch 91: Test Accuracy: 92.67%
Epoch 92 Training: 100%|██████████| 391/391 [00:12<00:00, 30.11it/s, loss=0.095, acc=96.79%]
Epoch 92 Validation: 100%|██████████| 79/79 [00:00<00:00, 106.90it/s, loss=0.246, acc=92.40%]
Epoch 92: Test Accuracy: 92.40%
Epoch 93 Training: 100%|██████████| 391/391 [00:13<00:00, 29.74it/s, loss=0.100, acc=96.68%]
Epoch 93 Validation: 100%|██████████| 79/79 [00:00<00:00, 113.49it/s, loss=0.245, acc=92.50%]
Epoch 93: Test Accuracy: 92.50%
Epoch 94 Training: 100%|██████████| 391/391 [00:13<00:00, 29.89it/s, loss=0.099, acc=96.71%]
Epoch 94 Validation: 100%|██████████| 79/79 [00:00<00:00, 110.86it/s, loss=0.248, acc=92.30%]
Epoch 94: Test Accuracy: 92.30%
Epoch 95 Training: 100%|██████████| 391/391 [00:13<00:00, 29.51it/s, loss=0.094, acc=96.84%]
Epoch 95 Validation: 100%|██████████| 79/79 [00:00<00:00, 108.50it/s, loss=0.245, acc=92.54%]
Epoch 95: Test Accuracy: 92.54%
Epoch 96 Training: 100%|██████████| 391/391 [00:13<00:00, 29.89it/s, loss=0.097, acc=96.83%]
Epoch 96 Validation: 100%|██████████| 79/79 [00:00<00:00, 109.75it/s, loss=0.248, acc=92.55%]
Epoch 96: Test Accuracy: 92.55%
Epoch 97 Training: 100%|██████████| 391/391 [00:13<00:00, 29.66it/s, loss=0.096, acc=96.83%]
Epoch 97 Validation: 100%|██████████| 79/79 [00:00<00:00, 113.31it/s, loss=0.250, acc=92.43%]
Epoch 97: Test Accuracy: 92.43%
Epoch 98 Training: 100%|██████████| 391/391 [00:13<00:00, 29.82it/s, loss=0.094, acc=96.96%]
Epoch 98 Validation: 100%|██████████| 79/79 [00:00<00:00, 111.97it/s, loss=0.248, acc=92.40%]
Epoch 98: Test Accuracy: 92.40%
Epoch 99 Training: 100%|██████████| 391/391 [00:13<00:00, 29.67it/s, loss=0.092, acc=96.98%]
Epoch 99 Validation: 100%|██████████| 79/79 [00:00<00:00, 100.04it/s, loss=0.249, acc=92.39%]
Epoch 99: Test Accuracy: 92.39%