In [2]:
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader, SubsetRandomSampler
from tqdm import tqdm

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
In [3]:
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,
    transform=train_transform,
    download=True
)

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

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

val_loader = DataLoader(
    dataset=test_dataset,
    batch_size=128,
    shuffle=False,
    num_workers=4,
    pin_memory=True,
    persistent_workers=True
)
100%|██████████| 170M/170M [00:04<00:00, 36.6MB/s]
In [4]:
class VggCIFAR(nn.Module):
  def __init__(self, num_classes=10, width_multiplier=1.2):
    super().__init__()

    c1 = int(64 * width_multiplier)   # 96
    c2 = int(128 * width_multiplier)  # 192
    c3 = int(256 * width_multiplier)  # 384
    c4 = int(512 * width_multiplier)  # 768

    self.features = nn.Sequential(
      # Block 1
      nn.Conv2d(3, c1, 3, padding=1),
      nn.BatchNorm2d(c1),
      nn.ReLU(inplace=True),
      nn.MaxPool2d(2, 2),

      # Block 2
      nn.Conv2d(c1, c2, 3, padding=1),
      nn.BatchNorm2d(c2),
      nn.ReLU(inplace=True),
      nn.MaxPool2d(2, 2),

      # Block 3
      nn.Conv2d(c2, c3, 3, padding=1),
      nn.BatchNorm2d(c3),
      nn.ReLU(inplace=True),
      nn.Conv2d(c3, c3, 3, padding=1),
      nn.BatchNorm2d(c3),
      nn.ReLU(inplace=True),
      nn.MaxPool2d(2, 2),

      # Block 4
      nn.Conv2d(c3, c4, 3, padding=1),
      nn.BatchNorm2d(c4),
      nn.ReLU(inplace=True),
      nn.Conv2d(c4, c4, 3, padding=1),
      nn.BatchNorm2d(c4),
      nn.ReLU(inplace=True),
      nn.MaxPool2d(2, 2)
    )

    self.classifier = nn.Sequential(
      nn.Dropout(0.5),
      nn.Linear(c4 * 2 * 2, 1024),
      nn.ReLU(inplace=True),
      nn.Dropout(0.5),
      nn.Linear(1024, 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')
      elif isinstance(m, nn.BatchNorm2d):
        nn.init.constant_(m.weight, 1)
        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 [5]:
model = VggCIFAR().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)

best_acc = 0
epochs = 100

for epoch in range(epochs):
  model.train()
  running_loss = 0.0
  correct = 0
  total = 0

  train_pbar = tqdm(train_loader, desc=f"Epoch {epoch+1}/{epochs} [Train]")
  for inputs, targets in train_pbar:
    inputs, targets = inputs.to(device), targets.to(device)
    optimizer.zero_grad()
    outputs = model(inputs)
    loss = criterion(outputs, targets)
    loss.backward()
    optimizer.step()

    running_loss += loss.item()
    _, predicted = outputs.max(1)
    total += targets.size(0)
    correct += predicted.eq(targets).sum().item()

    train_pbar.set_postfix(loss=running_loss/(total/targets.size(0)), acc=100.*correct/total)

  train_loss = running_loss / len(train_loader)
  train_acc = 100. * correct / total

  model.eval()
  val_loss = 0.0
  val_correct = 0
  val_total = 0

  with torch.no_grad():
    val_pbar = tqdm(val_loader, desc=f"Epoch {epoch+1}/{epochs} [Val]")
    for inputs, targets in val_pbar:
      inputs, targets = inputs.to(device), targets.to(device)
      outputs = model(inputs)
      loss = criterion(outputs, targets)

      val_loss += loss.item()
      _, predicted = outputs.max(1)
      val_total += targets.size(0)
      val_correct += predicted.eq(targets).sum().item()
      val_pbar.set_postfix(loss=val_loss/(val_total/targets.size(0)), acc=100.*val_correct/val_total)

  validation_loss = val_loss / len(val_loader)
  validation_acc = 100. * val_correct / val_total

  print(f"Epoch {epoch+1}/{epochs} | Train Loss: {train_loss:.4f}, Train Acc: {train_acc:.2f}% | Val Loss: {validation_loss:.4f}, Val Acc: {validation_acc:.2f}%")

  scheduler.step()

  if validation_acc > best_acc:
    best_acc = validation_acc
    torch.save(model.state_dict(), 'best_lenet_classic_model.pth')
    print(f"New best model found! Accuracy: {best_acc:.2f}%. Saving model...")

print("\nTraining finished.")
print(f"Best validation accuracy: {best_acc:.2f}%")
Epoch 1/100 [Train]: 100%|██████████| 391/391 [00:14<00:00, 26.62it/s, acc=13.9, loss=1.4]
Epoch 1/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 96.96it/s, acc=16.5, loss=0.27] 
Epoch 1/100 | Train Loss: 2.2451, Train Acc: 13.91% | Val Loss: 2.1343, Val Acc: 16.49%
New best model found! Accuracy: 16.49%. Saving model...
Epoch 2/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.09it/s, acc=21.1, loss=1.26]
Epoch 2/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.65it/s, acc=30.6, loss=0.225]
Epoch 2/100 | Train Loss: 2.0116, Train Acc: 21.10% | Val Loss: 1.7839, Val Acc: 30.64%
New best model found! Accuracy: 30.64%. Saving model...
Epoch 3/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.84it/s, acc=33.3, loss=1.09]
Epoch 3/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.99it/s, acc=41.3, loss=0.199]
Epoch 3/100 | Train Loss: 1.7362, Train Acc: 33.30% | Val Loss: 1.5765, Val Acc: 41.26%
New best model found! Accuracy: 41.26%. Saving model...
Epoch 4/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.75it/s, acc=46.3, loss=0.937]
Epoch 4/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.76it/s, acc=53.7, loss=0.166]
Epoch 4/100 | Train Loss: 1.4973, Train Acc: 46.30% | Val Loss: 1.3144, Val Acc: 53.70%
New best model found! Accuracy: 53.70%. Saving model...
Epoch 5/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.88it/s, acc=56.2, loss=0.779]
Epoch 5/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 100.80it/s, acc=58.6, loss=0.148]
Epoch 5/100 | Train Loss: 1.2455, Train Acc: 56.17% | Val Loss: 1.1747, Val Acc: 58.63%
New best model found! Accuracy: 58.63%. Saving model...
Epoch 6/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.71it/s, acc=61.6, loss=0.693]
Epoch 6/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 112.03it/s, acc=64.3, loss=0.133]
Epoch 6/100 | Train Loss: 1.1084, Train Acc: 61.62% | Val Loss: 1.0488, Val Acc: 64.29%
New best model found! Accuracy: 64.29%. Saving model...
Epoch 7/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 30.07it/s, acc=65.3, loss=0.634]
Epoch 7/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.84it/s, acc=68.8, loss=0.119]
Epoch 7/100 | Train Loss: 1.0142, Train Acc: 65.26% | Val Loss: 0.9389, Val Acc: 68.78%
New best model found! Accuracy: 68.78%. Saving model...
Epoch 8/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.90it/s, acc=67.6, loss=0.605]
Epoch 8/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.79it/s, acc=65.6, loss=0.133]
Epoch 8/100 | Train Loss: 0.9665, Train Acc: 67.59% | Val Loss: 1.0534, Val Acc: 65.58%
Epoch 9/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.22it/s, acc=69.2, loss=0.571]
Epoch 9/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 105.65it/s, acc=72.6, loss=0.104]
Epoch 9/100 | Train Loss: 0.9134, Train Acc: 69.22% | Val Loss: 0.8219, Val Acc: 72.64%
New best model found! Accuracy: 72.64%. Saving model...
Epoch 10/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.89it/s, acc=70.6, loss=0.55]
Epoch 10/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 102.24it/s, acc=70.4, loss=0.115]
Epoch 10/100 | Train Loss: 0.8788, Train Acc: 70.58% | Val Loss: 0.9067, Val Acc: 70.36%
Epoch 11/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.27it/s, acc=71.5, loss=0.533]
Epoch 11/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.94it/s, acc=75.6, loss=0.0901]
Epoch 11/100 | Train Loss: 0.8521, Train Acc: 71.53% | Val Loss: 0.7130, Val Acc: 75.60%
New best model found! Accuracy: 75.60%. Saving model...
Epoch 12/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.33it/s, acc=72.4, loss=0.521]
Epoch 12/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 110.53it/s, acc=76, loss=0.0919]
Epoch 12/100 | Train Loss: 0.8325, Train Acc: 72.40% | Val Loss: 0.7268, Val Acc: 76.04%
New best model found! Accuracy: 76.04%. Saving model...
Epoch 13/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.35it/s, acc=72.7, loss=0.512]
Epoch 13/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.42it/s, acc=69.8, loss=0.115]
Epoch 13/100 | Train Loss: 0.8184, Train Acc: 72.74% | Val Loss: 0.9130, Val Acc: 69.84%
Epoch 14/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 30.04it/s, acc=73.5, loss=0.5]
Epoch 14/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.45it/s, acc=76.6, loss=0.0868]
Epoch 14/100 | Train Loss: 0.8000, Train Acc: 73.52% | Val Loss: 0.6870, Val Acc: 76.62%
New best model found! Accuracy: 76.62%. Saving model...
Epoch 15/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.14it/s, acc=73.8, loss=0.495]
Epoch 15/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 106.17it/s, acc=70.7, loss=0.116]
Epoch 15/100 | Train Loss: 0.7910, Train Acc: 73.85% | Val Loss: 0.9207, Val Acc: 70.68%
Epoch 16/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.09it/s, acc=74.4, loss=0.483]
Epoch 16/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.96it/s, acc=76.5, loss=0.0882]
Epoch 16/100 | Train Loss: 0.7721, Train Acc: 74.37% | Val Loss: 0.6981, Val Acc: 76.49%
Epoch 17/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.11it/s, acc=75, loss=0.476]
Epoch 17/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 112.32it/s, acc=71.2, loss=0.111]
Epoch 17/100 | Train Loss: 0.7610, Train Acc: 74.97% | Val Loss: 0.8767, Val Acc: 71.17%
Epoch 18/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.39it/s, acc=75.2, loss=0.469]
Epoch 18/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.31it/s, acc=75.3, loss=0.0995]
Epoch 18/100 | Train Loss: 0.7496, Train Acc: 75.24% | Val Loss: 0.7876, Val Acc: 75.32%
Epoch 19/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.26it/s, acc=75.5, loss=0.465]
Epoch 19/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 115.26it/s, acc=77.3, loss=0.0864]
Epoch 19/100 | Train Loss: 0.7430, Train Acc: 75.53% | Val Loss: 0.6832, Val Acc: 77.30%
New best model found! Accuracy: 77.30%. Saving model...
Epoch 20/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.13it/s, acc=75.1, loss=0.471]
Epoch 20/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 116.90it/s, acc=70.2, loss=0.121]
Epoch 20/100 | Train Loss: 0.7529, Train Acc: 75.12% | Val Loss: 0.9568, Val Acc: 70.17%
Epoch 21/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.68it/s, acc=75.8, loss=0.457]
Epoch 21/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 104.77it/s, acc=64.8, loss=0.147]
Epoch 21/100 | Train Loss: 0.7297, Train Acc: 75.85% | Val Loss: 1.1618, Val Acc: 64.80%
Epoch 22/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.97it/s, acc=76.3, loss=0.454]
Epoch 22/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 114.74it/s, acc=74.9, loss=0.104]
Epoch 22/100 | Train Loss: 0.7255, Train Acc: 76.30% | Val Loss: 0.8197, Val Acc: 74.93%
Epoch 23/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.15it/s, acc=76.2, loss=0.454]
Epoch 23/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 112.39it/s, acc=77, loss=0.0912]
Epoch 23/100 | Train Loss: 0.7253, Train Acc: 76.21% | Val Loss: 0.7212, Val Acc: 77.00%
Epoch 24/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.10it/s, acc=76.2, loss=0.448]
Epoch 24/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 115.06it/s, acc=78.3, loss=0.0872]
Epoch 24/100 | Train Loss: 0.7160, Train Acc: 76.23% | Val Loss: 0.6901, Val Acc: 78.32%
New best model found! Accuracy: 78.32%. Saving model...
Epoch 25/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.82it/s, acc=76.4, loss=0.447]
Epoch 25/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.65it/s, acc=74.2, loss=0.106]
Epoch 25/100 | Train Loss: 0.7140, Train Acc: 76.41% | Val Loss: 0.8353, Val Acc: 74.16%
Epoch 26/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.98it/s, acc=76.3, loss=0.448]
Epoch 26/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 110.20it/s, acc=76.5, loss=0.0855]
Epoch 26/100 | Train Loss: 0.7169, Train Acc: 76.31% | Val Loss: 0.6762, Val Acc: 76.48%
Epoch 27/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.24it/s, acc=76.6, loss=0.444]
Epoch 27/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 112.33it/s, acc=79, loss=0.0792]
Epoch 27/100 | Train Loss: 0.7099, Train Acc: 76.59% | Val Loss: 0.6264, Val Acc: 78.98%
New best model found! Accuracy: 78.98%. Saving model...
Epoch 28/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.10it/s, acc=76.4, loss=0.447]
Epoch 28/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 114.08it/s, acc=74.4, loss=0.0991]
Epoch 28/100 | Train Loss: 0.7146, Train Acc: 76.42% | Val Loss: 0.7841, Val Acc: 74.43%
Epoch 29/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.93it/s, acc=77.1, loss=0.438]
Epoch 29/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 112.44it/s, acc=74.1, loss=0.0954]
Epoch 29/100 | Train Loss: 0.6999, Train Acc: 77.07% | Val Loss: 0.7550, Val Acc: 74.13%
Epoch 30/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.91it/s, acc=77, loss=0.438]
Epoch 30/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 116.41it/s, acc=74.1, loss=0.0991]
Epoch 30/100 | Train Loss: 0.6994, Train Acc: 77.05% | Val Loss: 0.7841, Val Acc: 74.14%
Epoch 31/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.82it/s, acc=83.9, loss=0.301]
Epoch 31/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.00it/s, acc=86.7, loss=0.0494]
Epoch 31/100 | Train Loss: 0.4819, Train Acc: 83.90% | Val Loss: 0.3908, Val Acc: 86.71%
New best model found! Accuracy: 86.71%. Saving model...
Epoch 32/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 30.07it/s, acc=85.8, loss=0.265]
Epoch 32/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 113.55it/s, acc=87.3, loss=0.047]
Epoch 32/100 | Train Loss: 0.4244, Train Acc: 85.84% | Val Loss: 0.3717, Val Acc: 87.26%
New best model found! Accuracy: 87.26%. Saving model...
Epoch 33/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.12it/s, acc=86.7, loss=0.251]
Epoch 33/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.25it/s, acc=87.3, loss=0.0471]
Epoch 33/100 | Train Loss: 0.4009, Train Acc: 86.74% | Val Loss: 0.3722, Val Acc: 87.33%
New best model found! Accuracy: 87.33%. Saving model...
Epoch 34/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 30.06it/s, acc=87, loss=0.241]
Epoch 34/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 104.29it/s, acc=87.2, loss=0.0481]
Epoch 34/100 | Train Loss: 0.3845, Train Acc: 87.02% | Val Loss: 0.3805, Val Acc: 87.25%
Epoch 35/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.94it/s, acc=87.6, loss=0.233]
Epoch 35/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 113.51it/s, acc=88, loss=0.0444]
Epoch 35/100 | Train Loss: 0.3716, Train Acc: 87.58% | Val Loss: 0.3514, Val Acc: 88.04%
New best model found! Accuracy: 88.04%. Saving model...
Epoch 36/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.80it/s, acc=87.6, loss=0.23]
Epoch 36/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.36it/s, acc=87, loss=0.0495]
Epoch 36/100 | Train Loss: 0.3681, Train Acc: 87.59% | Val Loss: 0.3918, Val Acc: 86.95%
Epoch 37/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 30.00it/s, acc=87.9, loss=0.225]
Epoch 37/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.31it/s, acc=86.9, loss=0.0498]
Epoch 37/100 | Train Loss: 0.3590, Train Acc: 87.92% | Val Loss: 0.3937, Val Acc: 86.94%
Epoch 38/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.09it/s, acc=87.9, loss=0.225]
Epoch 38/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.11it/s, acc=88.4, loss=0.0444]
Epoch 38/100 | Train Loss: 0.3596, Train Acc: 87.92% | Val Loss: 0.3510, Val Acc: 88.42%
New best model found! Accuracy: 88.42%. Saving model...
Epoch 39/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.14it/s, acc=88, loss=0.219]
Epoch 39/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.78it/s, acc=87.4, loss=0.0466]
Epoch 39/100 | Train Loss: 0.3503, Train Acc: 88.00% | Val Loss: 0.3683, Val Acc: 87.43%
Epoch 40/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.90it/s, acc=88.2, loss=0.22]
Epoch 40/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 110.91it/s, acc=87.2, loss=0.0491]
Epoch 40/100 | Train Loss: 0.3521, Train Acc: 88.15% | Val Loss: 0.3884, Val Acc: 87.25%
Epoch 41/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.94it/s, acc=88, loss=0.22]
Epoch 41/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.22it/s, acc=88.1, loss=0.0467]
Epoch 41/100 | Train Loss: 0.3519, Train Acc: 88.05% | Val Loss: 0.3694, Val Acc: 88.09%
Epoch 42/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 30.04it/s, acc=88.4, loss=0.215]
Epoch 42/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.13it/s, acc=86.6, loss=0.0503]
Epoch 42/100 | Train Loss: 0.3432, Train Acc: 88.36% | Val Loss: 0.3977, Val Acc: 86.62%
Epoch 43/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.11it/s, acc=88.4, loss=0.214]
Epoch 43/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 113.75it/s, acc=87.1, loss=0.0496]
Epoch 43/100 | Train Loss: 0.3425, Train Acc: 88.43% | Val Loss: 0.3928, Val Acc: 87.12%
Epoch 44/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.98it/s, acc=88.3, loss=0.217]
Epoch 44/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.49it/s, acc=87.6, loss=0.045]
Epoch 44/100 | Train Loss: 0.3464, Train Acc: 88.31% | Val Loss: 0.3557, Val Acc: 87.64%
Epoch 45/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.12it/s, acc=88.3, loss=0.214]
Epoch 45/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.98it/s, acc=88, loss=0.0478]
Epoch 45/100 | Train Loss: 0.3427, Train Acc: 88.30% | Val Loss: 0.3784, Val Acc: 87.97%
Epoch 46/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.14it/s, acc=88.3, loss=0.215]
Epoch 46/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.68it/s, acc=83.7, loss=0.0685]
Epoch 46/100 | Train Loss: 0.3436, Train Acc: 88.30% | Val Loss: 0.5419, Val Acc: 83.66%
Epoch 47/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.11it/s, acc=88.3, loss=0.215]
Epoch 47/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.44it/s, acc=86.7, loss=0.0519]
Epoch 47/100 | Train Loss: 0.3441, Train Acc: 88.26% | Val Loss: 0.4108, Val Acc: 86.72%
Epoch 48/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 30.03it/s, acc=88.4, loss=0.213]
Epoch 48/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 104.99it/s, acc=87.5, loss=0.0465]
Epoch 48/100 | Train Loss: 0.3398, Train Acc: 88.43% | Val Loss: 0.3678, Val Acc: 87.49%
Epoch 49/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.96it/s, acc=88.3, loss=0.215]
Epoch 49/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.81it/s, acc=85.8, loss=0.055]
Epoch 49/100 | Train Loss: 0.3430, Train Acc: 88.34% | Val Loss: 0.4354, Val Acc: 85.85%
Epoch 50/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.92it/s, acc=88.6, loss=0.209]
Epoch 50/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 103.45it/s, acc=86.1, loss=0.0536]
Epoch 50/100 | Train Loss: 0.3346, Train Acc: 88.56% | Val Loss: 0.4242, Val Acc: 86.13%
Epoch 51/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.84it/s, acc=88.5, loss=0.212]
Epoch 51/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 105.60it/s, acc=88, loss=0.046]
Epoch 51/100 | Train Loss: 0.3394, Train Acc: 88.49% | Val Loss: 0.3642, Val Acc: 88.00%
Epoch 52/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.92it/s, acc=88.7, loss=0.209]
Epoch 52/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.52it/s, acc=86.7, loss=0.0536]
Epoch 52/100 | Train Loss: 0.3345, Train Acc: 88.67% | Val Loss: 0.4243, Val Acc: 86.66%
Epoch 53/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.12it/s, acc=88.8, loss=0.208]
Epoch 53/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 116.03it/s, acc=86.6, loss=0.0509]
Epoch 53/100 | Train Loss: 0.3320, Train Acc: 88.79% | Val Loss: 0.4027, Val Acc: 86.61%
Epoch 54/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.96it/s, acc=88.9, loss=0.203]
Epoch 54/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 114.37it/s, acc=88.1, loss=0.0457]
Epoch 54/100 | Train Loss: 0.3252, Train Acc: 88.93% | Val Loss: 0.3616, Val Acc: 88.10%
Epoch 55/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 30.01it/s, acc=88.9, loss=0.206]
Epoch 55/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 110.06it/s, acc=87.7, loss=0.0498]
Epoch 55/100 | Train Loss: 0.3288, Train Acc: 88.89% | Val Loss: 0.3940, Val Acc: 87.67%
Epoch 56/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.23it/s, acc=89.2, loss=0.199]
Epoch 56/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 110.79it/s, acc=87.6, loss=0.0488]
Epoch 56/100 | Train Loss: 0.3188, Train Acc: 89.23% | Val Loss: 0.3863, Val Acc: 87.62%
Epoch 57/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 30.05it/s, acc=89.2, loss=0.201]
Epoch 57/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.58it/s, acc=87, loss=0.0505]
Epoch 57/100 | Train Loss: 0.3220, Train Acc: 89.21% | Val Loss: 0.3994, Val Acc: 87.04%
Epoch 58/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.85it/s, acc=89, loss=0.201]
Epoch 58/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 105.22it/s, acc=88, loss=0.0479]
Epoch 58/100 | Train Loss: 0.3221, Train Acc: 89.03% | Val Loss: 0.3789, Val Acc: 87.97%
Epoch 59/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.99it/s, acc=89.1, loss=0.202]
Epoch 59/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.63it/s, acc=88.9, loss=0.0433]
Epoch 59/100 | Train Loss: 0.3236, Train Acc: 89.08% | Val Loss: 0.3422, Val Acc: 88.87%
New best model found! Accuracy: 88.87%. Saving model...
Epoch 60/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.27it/s, acc=89.2, loss=0.198]
Epoch 60/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.47it/s, acc=84.2, loss=0.0626]
Epoch 60/100 | Train Loss: 0.3169, Train Acc: 89.24% | Val Loss: 0.4950, Val Acc: 84.21%
Epoch 61/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 30.01it/s, acc=92.7, loss=0.138]
Epoch 61/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 112.42it/s, acc=91.1, loss=0.0368]
Epoch 61/100 | Train Loss: 0.2211, Train Acc: 92.71% | Val Loss: 0.2910, Val Acc: 91.12%
New best model found! Accuracy: 91.12%. Saving model...
Epoch 62/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.98it/s, acc=93.6, loss=0.118]
Epoch 62/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 106.14it/s, acc=91, loss=0.0358]
Epoch 62/100 | Train Loss: 0.1887, Train Acc: 93.60% | Val Loss: 0.2835, Val Acc: 91.01%
Epoch 63/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 30.00it/s, acc=94.1, loss=0.112]
Epoch 63/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 113.39it/s, acc=91.3, loss=0.0364]
Epoch 63/100 | Train Loss: 0.1785, Train Acc: 94.07% | Val Loss: 0.2883, Val Acc: 91.35%
New best model found! Accuracy: 91.35%. Saving model...
Epoch 64/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.86it/s, acc=94.4, loss=0.105]
Epoch 64/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 113.92it/s, acc=91.3, loss=0.0368]
Epoch 64/100 | Train Loss: 0.1684, Train Acc: 94.39% | Val Loss: 0.2913, Val Acc: 91.30%
Epoch 65/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.17it/s, acc=94.7, loss=0.099]
Epoch 65/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.65it/s, acc=91.2, loss=0.0372]
Epoch 65/100 | Train Loss: 0.1583, Train Acc: 94.70% | Val Loss: 0.2940, Val Acc: 91.18%
Epoch 66/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.94it/s, acc=94.8, loss=0.0973]
Epoch 66/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.62it/s, acc=91.3, loss=0.0359]
Epoch 66/100 | Train Loss: 0.1556, Train Acc: 94.78% | Val Loss: 0.2840, Val Acc: 91.29%
Epoch 67/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 30.01it/s, acc=94.8, loss=0.0951]
Epoch 67/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 106.81it/s, acc=91.2, loss=0.0384]
Epoch 67/100 | Train Loss: 0.1521, Train Acc: 94.75% | Val Loss: 0.3035, Val Acc: 91.15%
Epoch 68/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.23it/s, acc=94.8, loss=0.0946]
Epoch 68/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.17it/s, acc=91.7, loss=0.0351]
Epoch 68/100 | Train Loss: 0.1512, Train Acc: 94.82% | Val Loss: 0.2779, Val Acc: 91.72%
New best model found! Accuracy: 91.72%. Saving model...
Epoch 69/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.92it/s, acc=95.1, loss=0.0914]
Epoch 69/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 106.23it/s, acc=91.6, loss=0.0366]
Epoch 69/100 | Train Loss: 0.1461, Train Acc: 95.06% | Val Loss: 0.2898, Val Acc: 91.57%
Epoch 70/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.20it/s, acc=95.2, loss=0.0904]
Epoch 70/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 110.66it/s, acc=91.6, loss=0.0369]
Epoch 70/100 | Train Loss: 0.1445, Train Acc: 95.19% | Val Loss: 0.2916, Val Acc: 91.56%
Epoch 71/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.89it/s, acc=95.2, loss=0.0885]
Epoch 71/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.53it/s, acc=91.3, loss=0.0376]
Epoch 71/100 | Train Loss: 0.1415, Train Acc: 95.22% | Val Loss: 0.2974, Val Acc: 91.33%
Epoch 72/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.20it/s, acc=95.3, loss=0.0878]
Epoch 72/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 110.95it/s, acc=91.5, loss=0.0371]
Epoch 72/100 | Train Loss: 0.1403, Train Acc: 95.30% | Val Loss: 0.2935, Val Acc: 91.45%
Epoch 73/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.79it/s, acc=95.4, loss=0.0852]
Epoch 73/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.00it/s, acc=91.6, loss=0.0374]
Epoch 73/100 | Train Loss: 0.1362, Train Acc: 95.44% | Val Loss: 0.2963, Val Acc: 91.60%
Epoch 74/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.97it/s, acc=95.5, loss=0.0816]
Epoch 74/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 112.71it/s, acc=91.5, loss=0.0366]
Epoch 74/100 | Train Loss: 0.1304, Train Acc: 95.50% | Val Loss: 0.2893, Val Acc: 91.45%
Epoch 75/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.87it/s, acc=95.4, loss=0.0842]
Epoch 75/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 105.24it/s, acc=91.3, loss=0.0369]
Epoch 75/100 | Train Loss: 0.1346, Train Acc: 95.38% | Val Loss: 0.2919, Val Acc: 91.33%
Epoch 76/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 30.04it/s, acc=95.6, loss=0.0825]
Epoch 76/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.74it/s, acc=91.5, loss=0.0372]
Epoch 76/100 | Train Loss: 0.1319, Train Acc: 95.57% | Val Loss: 0.2946, Val Acc: 91.55%
Epoch 77/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.15it/s, acc=95.6, loss=0.0809]
Epoch 77/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.85it/s, acc=91.6, loss=0.0378]
Epoch 77/100 | Train Loss: 0.1294, Train Acc: 95.61% | Val Loss: 0.2989, Val Acc: 91.60%
Epoch 78/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.18it/s, acc=95.6, loss=0.0827]
Epoch 78/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.98it/s, acc=91.4, loss=0.0381]
Epoch 78/100 | Train Loss: 0.1322, Train Acc: 95.57% | Val Loss: 0.3017, Val Acc: 91.38%
Epoch 79/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.94it/s, acc=95.8, loss=0.0784]
Epoch 79/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 106.29it/s, acc=91.1, loss=0.0392]
Epoch 79/100 | Train Loss: 0.1253, Train Acc: 95.77% | Val Loss: 0.3101, Val Acc: 91.14%
Epoch 80/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.95it/s, acc=95.7, loss=0.0795]
Epoch 80/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.77it/s, acc=91.6, loss=0.0373]
Epoch 80/100 | Train Loss: 0.1271, Train Acc: 95.71% | Val Loss: 0.2954, Val Acc: 91.58%
Epoch 81/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.95it/s, acc=96.4, loss=0.0673]
Epoch 81/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 106.48it/s, acc=92.3, loss=0.0347]
Epoch 81/100 | Train Loss: 0.1076, Train Acc: 96.38% | Val Loss: 0.2747, Val Acc: 92.29%
New best model found! Accuracy: 92.29%. Saving model...
Epoch 82/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 30.08it/s, acc=96.7, loss=0.0631]
Epoch 82/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.51it/s, acc=92.2, loss=0.0351]
Epoch 82/100 | Train Loss: 0.1009, Train Acc: 96.69% | Val Loss: 0.2774, Val Acc: 92.16%
Epoch 83/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.14it/s, acc=96.8, loss=0.0597]
Epoch 83/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.85it/s, acc=92.3, loss=0.0348]
Epoch 83/100 | Train Loss: 0.0955, Train Acc: 96.76% | Val Loss: 0.2750, Val Acc: 92.29%
Epoch 84/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.97it/s, acc=96.9, loss=0.0577]
Epoch 84/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.74it/s, acc=92.4, loss=0.0351]
Epoch 84/100 | Train Loss: 0.0922, Train Acc: 96.93% | Val Loss: 0.2781, Val Acc: 92.39%
New best model found! Accuracy: 92.39%. Saving model...
Epoch 85/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.80it/s, acc=97, loss=0.056]
Epoch 85/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 103.76it/s, acc=92.3, loss=0.0355]
Epoch 85/100 | Train Loss: 0.0896, Train Acc: 96.99% | Val Loss: 0.2806, Val Acc: 92.31%
Epoch 86/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.73it/s, acc=97.1, loss=0.0542]
Epoch 86/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 103.58it/s, acc=92.5, loss=0.0353]
Epoch 86/100 | Train Loss: 0.0866, Train Acc: 97.10% | Val Loss: 0.2792, Val Acc: 92.46%
New best model found! Accuracy: 92.46%. Saving model...
Epoch 87/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.81it/s, acc=97.1, loss=0.056]
Epoch 87/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.19it/s, acc=92.5, loss=0.0355]
Epoch 87/100 | Train Loss: 0.0895, Train Acc: 97.05% | Val Loss: 0.2810, Val Acc: 92.52%
New best model found! Accuracy: 92.52%. Saving model...
Epoch 88/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.83it/s, acc=97.1, loss=0.054]
Epoch 88/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 103.88it/s, acc=92.4, loss=0.0358]
Epoch 88/100 | Train Loss: 0.0863, Train Acc: 97.11% | Val Loss: 0.2829, Val Acc: 92.44%
Epoch 89/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.85it/s, acc=97.3, loss=0.0512]
Epoch 89/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.77it/s, acc=92.5, loss=0.036]
Epoch 89/100 | Train Loss: 0.0818, Train Acc: 97.25% | Val Loss: 0.2849, Val Acc: 92.47%
Epoch 90/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.94it/s, acc=97.3, loss=0.0525]
Epoch 90/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 103.60it/s, acc=92.3, loss=0.0362]
Epoch 90/100 | Train Loss: 0.0839, Train Acc: 97.30% | Val Loss: 0.2862, Val Acc: 92.26%
Epoch 91/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.70it/s, acc=97.3, loss=0.0518]
Epoch 91/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.60it/s, acc=92.4, loss=0.0365]
Epoch 91/100 | Train Loss: 0.0829, Train Acc: 97.28% | Val Loss: 0.2889, Val Acc: 92.37%
Epoch 92/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.87it/s, acc=97.2, loss=0.052]
Epoch 92/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.32it/s, acc=92.4, loss=0.036]
Epoch 92/100 | Train Loss: 0.0832, Train Acc: 97.23% | Val Loss: 0.2852, Val Acc: 92.44%
Epoch 93/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.76it/s, acc=97.3, loss=0.0513]
Epoch 93/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.92it/s, acc=92.4, loss=0.0364]
Epoch 93/100 | Train Loss: 0.0819, Train Acc: 97.28% | Val Loss: 0.2879, Val Acc: 92.41%
Epoch 94/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.80it/s, acc=97.3, loss=0.0505]
Epoch 94/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 113.89it/s, acc=92.3, loss=0.0366]
Epoch 94/100 | Train Loss: 0.0807, Train Acc: 97.30% | Val Loss: 0.2893, Val Acc: 92.34%
Epoch 95/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.75it/s, acc=97.3, loss=0.0501]
Epoch 95/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 101.79it/s, acc=92.4, loss=0.0362]
Epoch 95/100 | Train Loss: 0.0801, Train Acc: 97.33% | Val Loss: 0.2862, Val Acc: 92.42%
Epoch 96/100 [Train]: 100%|██████████| 391/391 [00:12<00:00, 30.12it/s, acc=97.4, loss=0.0498]
Epoch 96/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.56it/s, acc=92.4, loss=0.0367]
Epoch 96/100 | Train Loss: 0.0797, Train Acc: 97.39% | Val Loss: 0.2901, Val Acc: 92.39%
Epoch 97/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.39it/s, acc=97.3, loss=0.0498]
Epoch 97/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 102.87it/s, acc=92.4, loss=0.0361]
Epoch 97/100 | Train Loss: 0.0796, Train Acc: 97.31% | Val Loss: 0.2852, Val Acc: 92.42%
Epoch 98/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.88it/s, acc=97.5, loss=0.0475]
Epoch 98/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 106.08it/s, acc=92.3, loss=0.0363]
Epoch 98/100 | Train Loss: 0.0760, Train Acc: 97.49% | Val Loss: 0.2868, Val Acc: 92.32%
Epoch 99/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.86it/s, acc=97.4, loss=0.0495]
Epoch 99/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.80it/s, acc=92.5, loss=0.0358]
Epoch 99/100 | Train Loss: 0.0790, Train Acc: 97.43% | Val Loss: 0.2833, Val Acc: 92.49%
Epoch 100/100 [Train]: 100%|██████████| 391/391 [00:13<00:00, 29.89it/s, acc=97.6, loss=0.0466]
Epoch 100/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 110.30it/s, acc=92.4, loss=0.0362]
Epoch 100/100 | Train Loss: 0.0745, Train Acc: 97.58% | Val Loss: 0.2863, Val Acc: 92.44%

Training finished.
Best validation accuracy: 92.52%