In [1]:
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 [21]:
CIFAR10_MEAN = [0.4914, 0.4822, 0.4465]
CIFAR10_STD = [0.2470, 0.2435, 0.2616]
transform_train = transforms.Compose([
transforms.RandomCrop(32, padding=4),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])
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
)
In [22]:
class DepthwiseSeparableConv(nn.Module):
def __init__(self, in_channels, out_channels, stride=1):
super(DepthwiseSeparableConv, self).__init__()
self.depthwise = nn.Conv2d(
in_channels,
in_channels,
kernel_size=3,
stride=stride,
padding=1,
groups=in_channels,
bias=False
)
self.bn1 = nn.BatchNorm2d(in_channels)
self.relu1 = nn.ReLU(inplace=True)
self.pointwise = nn.Conv2d(
in_channels,
out_channels,
kernel_size=1,
stride=1,
padding=0,
bias=False
)
self.bn2 = nn.BatchNorm2d(out_channels)
self.relu2 = nn.ReLU(inplace=True)
def forward(self, x):
x = self.depthwise(x)
x = self.bn1(x)
x = self.relu1(x)
x = self.pointwise(x)
x = self.bn2(x)
x = self.relu2(x)
return x
class MobileNetV1(nn.Module):
def __init__(self, num_classes=10, width_multiplier=1.0):
super(MobileNetV1, self).__init__()
self.conv1 = nn.Sequential(
nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1, bias=False),
nn.BatchNorm2d(32),
nn.ReLU(inplace=True)
)
self.features = nn.Sequential(
DepthwiseSeparableConv(32, 64, stride=1), # 32x32
DepthwiseSeparableConv(64, 128, stride=2), # 16x16
DepthwiseSeparableConv(128, 128, stride=1), # 16x16
DepthwiseSeparableConv(128, 256, stride=2), # 8x8
DepthwiseSeparableConv(256, 256, stride=1), # 8x8
DepthwiseSeparableConv(256, 512, stride=2), # 4x4
DepthwiseSeparableConv(512, 512, stride=1), # 4x4
DepthwiseSeparableConv(512, 512, stride=1), # 4x4
DepthwiseSeparableConv(512, 512, stride=1), # 4x4
)
self.avgpool = nn.AdaptiveAvgPool2d(1)
self.dropout = nn.Dropout(0.2)
self.classifier = nn.Linear(512, num_classes)
self._initialize_weights()
def forward(self, x):
x = self.conv1(x)
x = self.features(x)
x = self.avgpool(x)
x = torch.flatten(x, 1)
x = self.dropout(x)
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.zeros_(m.bias)
elif isinstance(m, nn.BatchNorm2d):
nn.init.ones_(m.weight)
nn.init.zeros_(m.bias)
elif isinstance(m, nn.Linear):
nn.init.normal_(m.weight, 0, 0.01)
nn.init.zeros_(m.bias)
In [ ]:
model = MobileNetV1().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:05<00:00, 65.91it/s, acc=40, loss=1.03] Epoch 1/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 97.53it/s, acc=55.3, loss=0.156]
Epoch 1/100 | Train Loss: 1.6462, Train Acc: 39.95% | Val Loss: 1.2343, Val Acc: 55.26% New best model found! Accuracy: 55.26%. Saving model...
Epoch 2/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.88it/s, acc=60.7, loss=0.689] Epoch 2/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.17it/s, acc=61.2, loss=0.143]
Epoch 2/100 | Train Loss: 1.1012, Train Acc: 60.69% | Val Loss: 1.1295, Val Acc: 61.21% New best model found! Accuracy: 61.21%. Saving model...
Epoch 3/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 68.95it/s, acc=68.8, loss=0.552] Epoch 3/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.18it/s, acc=65.2, loss=0.127]
Epoch 3/100 | Train Loss: 0.8829, Train Acc: 68.77% | Val Loss: 1.0030, Val Acc: 65.23% New best model found! Accuracy: 65.23%. Saving model...
Epoch 4/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.32it/s, acc=73.8, loss=0.477] Epoch 4/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.22it/s, acc=71.3, loss=0.104]
Epoch 4/100 | Train Loss: 0.7621, Train Acc: 73.80% | Val Loss: 0.8262, Val Acc: 71.27% New best model found! Accuracy: 71.27%. Saving model...
Epoch 5/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.25it/s, acc=76, loss=0.432] Epoch 5/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 101.03it/s, acc=75.3, loss=0.0912]
Epoch 5/100 | Train Loss: 0.6908, Train Acc: 76.00% | Val Loss: 0.7217, Val Acc: 75.31% New best model found! Accuracy: 75.31%. Saving model...
Epoch 6/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.17it/s, acc=77.3, loss=0.412] Epoch 6/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 110.60it/s, acc=76.6, loss=0.0864]
Epoch 6/100 | Train Loss: 0.6591, Train Acc: 77.32% | Val Loss: 0.6838, Val Acc: 76.62% New best model found! Accuracy: 76.62%. Saving model...
Epoch 7/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.71it/s, acc=77.9, loss=0.398] Epoch 7/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 106.27it/s, acc=74.8, loss=0.0945]
Epoch 7/100 | Train Loss: 0.6361, Train Acc: 77.89% | Val Loss: 0.7472, Val Acc: 74.83%
Epoch 8/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.79it/s, acc=78.7, loss=0.388] Epoch 8/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 101.04it/s, acc=75.7, loss=0.0899]
Epoch 8/100 | Train Loss: 0.6197, Train Acc: 78.68% | Val Loss: 0.7115, Val Acc: 75.65%
Epoch 9/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.35it/s, acc=79, loss=0.38] Epoch 9/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.53it/s, acc=78.5, loss=0.0815]
Epoch 9/100 | Train Loss: 0.6080, Train Acc: 79.00% | Val Loss: 0.6446, Val Acc: 78.47% New best model found! Accuracy: 78.47%. Saving model...
Epoch 10/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 68.58it/s, acc=79.8, loss=0.372] Epoch 10/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.44it/s, acc=76.1, loss=0.0889]
Epoch 10/100 | Train Loss: 0.5943, Train Acc: 79.75% | Val Loss: 0.7034, Val Acc: 76.08%
Epoch 11/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.22it/s, acc=79.6, loss=0.373] Epoch 11/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.47it/s, acc=77, loss=0.0855]
Epoch 11/100 | Train Loss: 0.5963, Train Acc: 79.56% | Val Loss: 0.6768, Val Acc: 77.01%
Epoch 12/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.54it/s, acc=80, loss=0.367] Epoch 12/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 96.97it/s, acc=69, loss=0.118]
Epoch 12/100 | Train Loss: 0.5860, Train Acc: 80.01% | Val Loss: 0.9307, Val Acc: 69.05%
Epoch 13/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.49it/s, acc=80.2, loss=0.36] Epoch 13/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.88it/s, acc=75.2, loss=0.0934]
Epoch 13/100 | Train Loss: 0.5759, Train Acc: 80.18% | Val Loss: 0.7390, Val Acc: 75.18%
Epoch 14/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.20it/s, acc=80.3, loss=0.359] Epoch 14/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.04it/s, acc=77.4, loss=0.0841]
Epoch 14/100 | Train Loss: 0.5739, Train Acc: 80.28% | Val Loss: 0.6655, Val Acc: 77.40%
Epoch 15/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.46it/s, acc=80.6, loss=0.359] Epoch 15/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.59it/s, acc=75, loss=0.0955]
Epoch 15/100 | Train Loss: 0.5744, Train Acc: 80.64% | Val Loss: 0.7556, Val Acc: 74.99%
Epoch 16/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.39it/s, acc=80.2, loss=0.36] Epoch 16/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 104.26it/s, acc=76.6, loss=0.0885]
Epoch 16/100 | Train Loss: 0.5747, Train Acc: 80.20% | Val Loss: 0.6998, Val Acc: 76.57%
Epoch 17/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.11it/s, acc=80.7, loss=0.353] Epoch 17/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 102.63it/s, acc=71.7, loss=0.115]
Epoch 17/100 | Train Loss: 0.5649, Train Acc: 80.71% | Val Loss: 0.9109, Val Acc: 71.71%
Epoch 18/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.23it/s, acc=80.6, loss=0.356] Epoch 18/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 113.75it/s, acc=77.8, loss=0.0844]
Epoch 18/100 | Train Loss: 0.5692, Train Acc: 80.64% | Val Loss: 0.6677, Val Acc: 77.78%
Epoch 19/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.89it/s, acc=80.6, loss=0.358] Epoch 19/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 97.37it/s, acc=74.4, loss=0.0982]
Epoch 19/100 | Train Loss: 0.5718, Train Acc: 80.59% | Val Loss: 0.7766, Val Acc: 74.37%
Epoch 20/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.92it/s, acc=80.4, loss=0.358] Epoch 20/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.79it/s, acc=76.1, loss=0.0915]
Epoch 20/100 | Train Loss: 0.5719, Train Acc: 80.45% | Val Loss: 0.7239, Val Acc: 76.10%
Epoch 21/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.41it/s, acc=80.5, loss=0.355] Epoch 21/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.02it/s, acc=80.3, loss=0.0745]
Epoch 21/100 | Train Loss: 0.5682, Train Acc: 80.53% | Val Loss: 0.5894, Val Acc: 80.30% New best model found! Accuracy: 80.30%. Saving model...
Epoch 22/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 68.63it/s, acc=80.7, loss=0.356] Epoch 22/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.69it/s, acc=69.1, loss=0.121]
Epoch 22/100 | Train Loss: 0.5686, Train Acc: 80.70% | Val Loss: 0.9573, Val Acc: 69.14%
Epoch 23/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.36it/s, acc=80.7, loss=0.354] Epoch 23/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 106.94it/s, acc=76.4, loss=0.087]
Epoch 23/100 | Train Loss: 0.5665, Train Acc: 80.69% | Val Loss: 0.6885, Val Acc: 76.36%
Epoch 24/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.82it/s, acc=80.8, loss=0.351] Epoch 24/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.04it/s, acc=72, loss=0.108]
Epoch 24/100 | Train Loss: 0.5612, Train Acc: 80.75% | Val Loss: 0.8573, Val Acc: 71.97%
Epoch 25/100 [Train]: 100%|██████████| 391/391 [00:06<00:00, 64.98it/s, acc=80.8, loss=0.349] Epoch 25/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 110.58it/s, acc=75.8, loss=0.09]
Epoch 25/100 | Train Loss: 0.5574, Train Acc: 80.84% | Val Loss: 0.7116, Val Acc: 75.76%
Epoch 26/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.13it/s, acc=80.9, loss=0.35] Epoch 26/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 103.80it/s, acc=74.6, loss=0.0974]
Epoch 26/100 | Train Loss: 0.5587, Train Acc: 80.94% | Val Loss: 0.7709, Val Acc: 74.64%
Epoch 27/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.57it/s, acc=80.9, loss=0.35] Epoch 27/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 106.71it/s, acc=78.1, loss=0.0819]
Epoch 27/100 | Train Loss: 0.5589, Train Acc: 80.88% | Val Loss: 0.6476, Val Acc: 78.08%
Epoch 28/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.84it/s, acc=80.7, loss=0.354] Epoch 28/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 99.09it/s, acc=77.5, loss=0.0827]
Epoch 28/100 | Train Loss: 0.5659, Train Acc: 80.73% | Val Loss: 0.6544, Val Acc: 77.52%
Epoch 29/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.49it/s, acc=81, loss=0.349] Epoch 29/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 110.44it/s, acc=76.5, loss=0.0877]
Epoch 29/100 | Train Loss: 0.5577, Train Acc: 80.95% | Val Loss: 0.6936, Val Acc: 76.46%
Epoch 30/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.08it/s, acc=80.8, loss=0.351] Epoch 30/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 96.91it/s, acc=78, loss=0.0825]
Epoch 30/100 | Train Loss: 0.5618, Train Acc: 80.76% | Val Loss: 0.6530, Val Acc: 78.05%
Epoch 31/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.80it/s, acc=86.5, loss=0.247] Epoch 31/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.57it/s, acc=87, loss=0.0482]
Epoch 31/100 | Train Loss: 0.3941, Train Acc: 86.50% | Val Loss: 0.3815, Val Acc: 87.01% New best model found! Accuracy: 87.01%. Saving model...
Epoch 32/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.01it/s, acc=88.5, loss=0.21] Epoch 32/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 106.44it/s, acc=87.8, loss=0.0466]
Epoch 32/100 | Train Loss: 0.3356, Train Acc: 88.55% | Val Loss: 0.3684, Val Acc: 87.82% New best model found! Accuracy: 87.82%. Saving model...
Epoch 33/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.83it/s, acc=89.4, loss=0.195] Epoch 33/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 101.32it/s, acc=87.6, loss=0.0464]
Epoch 33/100 | Train Loss: 0.3113, Train Acc: 89.37% | Val Loss: 0.3671, Val Acc: 87.56%
Epoch 34/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.91it/s, acc=89.3, loss=0.192] Epoch 34/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 105.54it/s, acc=87.8, loss=0.0459]
Epoch 34/100 | Train Loss: 0.3066, Train Acc: 89.35% | Val Loss: 0.3634, Val Acc: 87.85% New best model found! Accuracy: 87.85%. Saving model...
Epoch 35/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.18it/s, acc=89.9, loss=0.185] Epoch 35/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.15it/s, acc=88.2, loss=0.0442]
Epoch 35/100 | Train Loss: 0.2955, Train Acc: 89.89% | Val Loss: 0.3499, Val Acc: 88.17% New best model found! Accuracy: 88.17%. Saving model...
Epoch 36/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.31it/s, acc=90, loss=0.18] Epoch 36/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 101.82it/s, acc=88.2, loss=0.0444]
Epoch 36/100 | Train Loss: 0.2884, Train Acc: 90.03% | Val Loss: 0.3515, Val Acc: 88.19% New best model found! Accuracy: 88.19%. Saving model...
Epoch 37/100 [Train]: 100%|██████████| 391/391 [00:06<00:00, 64.26it/s, acc=89.9, loss=0.18] Epoch 37/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.61it/s, acc=87.8, loss=0.0464]
Epoch 37/100 | Train Loss: 0.2870, Train Acc: 89.94% | Val Loss: 0.3674, Val Acc: 87.81%
Epoch 38/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.49it/s, acc=90.2, loss=0.178] Epoch 38/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.27it/s, acc=87.4, loss=0.0475]
Epoch 38/100 | Train Loss: 0.2840, Train Acc: 90.18% | Val Loss: 0.3755, Val Acc: 87.41%
Epoch 39/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.34it/s, acc=90.3, loss=0.177] Epoch 39/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 106.38it/s, acc=87.2, loss=0.0492]
Epoch 39/100 | Train Loss: 0.2832, Train Acc: 90.34% | Val Loss: 0.3891, Val Acc: 87.23%
Epoch 40/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.89it/s, acc=90.2, loss=0.176] Epoch 40/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 101.85it/s, acc=87.2, loss=0.0485]
Epoch 40/100 | Train Loss: 0.2811, Train Acc: 90.19% | Val Loss: 0.3834, Val Acc: 87.24%
Epoch 41/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.41it/s, acc=90.1, loss=0.176] Epoch 41/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 101.93it/s, acc=87, loss=0.0494]
Epoch 41/100 | Train Loss: 0.2815, Train Acc: 90.13% | Val Loss: 0.3906, Val Acc: 87.02%
Epoch 42/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.41it/s, acc=90.2, loss=0.177] Epoch 42/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.54it/s, acc=87, loss=0.0497]
Epoch 42/100 | Train Loss: 0.2832, Train Acc: 90.16% | Val Loss: 0.3933, Val Acc: 86.97%
Epoch 43/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.51it/s, acc=90.2, loss=0.175] Epoch 43/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 111.41it/s, acc=87.1, loss=0.0502]
Epoch 43/100 | Train Loss: 0.2803, Train Acc: 90.22% | Val Loss: 0.3969, Val Acc: 87.11%
Epoch 44/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.85it/s, acc=90.3, loss=0.176] Epoch 44/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.92it/s, acc=86.6, loss=0.0516]
Epoch 44/100 | Train Loss: 0.2809, Train Acc: 90.30% | Val Loss: 0.4085, Val Acc: 86.63%
Epoch 45/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.93it/s, acc=90.3, loss=0.175] Epoch 45/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.70it/s, acc=86.7, loss=0.0523]
Epoch 45/100 | Train Loss: 0.2800, Train Acc: 90.26% | Val Loss: 0.4137, Val Acc: 86.72%
Epoch 46/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.93it/s, acc=90.3, loss=0.175] Epoch 46/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.01it/s, acc=86.9, loss=0.0505]
Epoch 46/100 | Train Loss: 0.2800, Train Acc: 90.28% | Val Loss: 0.3992, Val Acc: 86.88%
Epoch 47/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.71it/s, acc=90.5, loss=0.172] Epoch 47/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 97.21it/s, acc=86.1, loss=0.0536]
Epoch 47/100 | Train Loss: 0.2757, Train Acc: 90.54% | Val Loss: 0.4244, Val Acc: 86.08%
Epoch 48/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.49it/s, acc=90.4, loss=0.174] Epoch 48/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 110.47it/s, acc=83.5, loss=0.0643]
Epoch 48/100 | Train Loss: 0.2789, Train Acc: 90.43% | Val Loss: 0.5091, Val Acc: 83.45%
Epoch 49/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.47it/s, acc=90.2, loss=0.177] Epoch 49/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 105.35it/s, acc=87.5, loss=0.0474]
Epoch 49/100 | Train Loss: 0.2837, Train Acc: 90.19% | Val Loss: 0.3754, Val Acc: 87.47%
Epoch 50/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.37it/s, acc=90.6, loss=0.17] Epoch 50/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 113.34it/s, acc=86.5, loss=0.0521]
Epoch 50/100 | Train Loss: 0.2722, Train Acc: 90.61% | Val Loss: 0.4123, Val Acc: 86.50%
Epoch 51/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.88it/s, acc=90.5, loss=0.172] Epoch 51/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.96it/s, acc=86, loss=0.0543]
Epoch 51/100 | Train Loss: 0.2743, Train Acc: 90.47% | Val Loss: 0.4296, Val Acc: 85.96%
Epoch 52/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.35it/s, acc=90.2, loss=0.177] Epoch 52/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.52it/s, acc=86.4, loss=0.052]
Epoch 52/100 | Train Loss: 0.2822, Train Acc: 90.17% | Val Loss: 0.4111, Val Acc: 86.43%
Epoch 53/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.45it/s, acc=90.5, loss=0.174] Epoch 53/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 106.12it/s, acc=88.2, loss=0.0449]
Epoch 53/100 | Train Loss: 0.2776, Train Acc: 90.46% | Val Loss: 0.3554, Val Acc: 88.21% New best model found! Accuracy: 88.21%. Saving model...
Epoch 54/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.71it/s, acc=90.5, loss=0.17] Epoch 54/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 97.75it/s, acc=87.5, loss=0.0485]
Epoch 54/100 | Train Loss: 0.2720, Train Acc: 90.47% | Val Loss: 0.3839, Val Acc: 87.51%
Epoch 55/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.83it/s, acc=90.4, loss=0.172] Epoch 55/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.25it/s, acc=87.7, loss=0.0472]
Epoch 55/100 | Train Loss: 0.2750, Train Acc: 90.39% | Val Loss: 0.3738, Val Acc: 87.68%
Epoch 56/100 [Train]: 100%|██████████| 391/391 [00:06<00:00, 64.87it/s, acc=90.4, loss=0.171] Epoch 56/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 100.49it/s, acc=87, loss=0.049]
Epoch 56/100 | Train Loss: 0.2726, Train Acc: 90.39% | Val Loss: 0.3874, Val Acc: 87.00%
Epoch 57/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.56it/s, acc=90.6, loss=0.171] Epoch 57/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.30it/s, acc=87, loss=0.0496]
Epoch 57/100 | Train Loss: 0.2729, Train Acc: 90.64% | Val Loss: 0.3925, Val Acc: 87.01%
Epoch 58/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.12it/s, acc=90.5, loss=0.169] Epoch 58/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 110.51it/s, acc=86.8, loss=0.0504]
Epoch 58/100 | Train Loss: 0.2709, Train Acc: 90.46% | Val Loss: 0.3986, Val Acc: 86.82%
Epoch 59/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.99it/s, acc=90.6, loss=0.17] Epoch 59/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 103.96it/s, acc=86.3, loss=0.0531]
Epoch 59/100 | Train Loss: 0.2719, Train Acc: 90.59% | Val Loss: 0.4202, Val Acc: 86.34%
Epoch 60/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.28it/s, acc=90.7, loss=0.168] Epoch 60/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 104.98it/s, acc=87.5, loss=0.048]
Epoch 60/100 | Train Loss: 0.2691, Train Acc: 90.73% | Val Loss: 0.3794, Val Acc: 87.54%
Epoch 61/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.50it/s, acc=93.7, loss=0.117] Epoch 61/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.12it/s, acc=90.3, loss=0.0367]
Epoch 61/100 | Train Loss: 0.1877, Train Acc: 93.65% | Val Loss: 0.2903, Val Acc: 90.35% New best model found! Accuracy: 90.35%. Saving model...
Epoch 62/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.24it/s, acc=94.7, loss=0.0967] Epoch 62/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 113.49it/s, acc=90.3, loss=0.0371]
Epoch 62/100 | Train Loss: 0.1545, Train Acc: 94.72% | Val Loss: 0.2934, Val Acc: 90.30%
Epoch 63/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.52it/s, acc=95.2, loss=0.0898] Epoch 63/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.53it/s, acc=90.8, loss=0.0367]
Epoch 63/100 | Train Loss: 0.1435, Train Acc: 95.17% | Val Loss: 0.2906, Val Acc: 90.85% New best model found! Accuracy: 90.85%. Saving model...
Epoch 64/100 [Train]: 100%|██████████| 391/391 [00:06<00:00, 65.07it/s, acc=95.5, loss=0.0823] Epoch 64/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.60it/s, acc=90.8, loss=0.0371]
Epoch 64/100 | Train Loss: 0.1315, Train Acc: 95.53% | Val Loss: 0.2933, Val Acc: 90.82%
Epoch 65/100 [Train]: 100%|██████████| 391/391 [00:06<00:00, 64.74it/s, acc=95.8, loss=0.0779] Epoch 65/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 106.31it/s, acc=90.7, loss=0.0379]
Epoch 65/100 | Train Loss: 0.1245, Train Acc: 95.76% | Val Loss: 0.3002, Val Acc: 90.74%
Epoch 66/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.42it/s, acc=95.8, loss=0.0745] Epoch 66/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 98.41it/s, acc=90.9, loss=0.0381]
Epoch 66/100 | Train Loss: 0.1190, Train Acc: 95.85% | Val Loss: 0.3012, Val Acc: 90.93% New best model found! Accuracy: 90.93%. Saving model...
Epoch 67/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.91it/s, acc=96.1, loss=0.0718] Epoch 67/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 110.59it/s, acc=90.4, loss=0.0389]
Epoch 67/100 | Train Loss: 0.1147, Train Acc: 96.07% | Val Loss: 0.3075, Val Acc: 90.44%
Epoch 68/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.34it/s, acc=96.1, loss=0.0703] Epoch 68/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.87it/s, acc=90.5, loss=0.0398]
Epoch 68/100 | Train Loss: 0.1124, Train Acc: 96.12% | Val Loss: 0.3149, Val Acc: 90.49%
Epoch 69/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.68it/s, acc=96.2, loss=0.0691] Epoch 69/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 112.41it/s, acc=90.6, loss=0.0391]
Epoch 69/100 | Train Loss: 0.1104, Train Acc: 96.19% | Val Loss: 0.3093, Val Acc: 90.57%
Epoch 70/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.91it/s, acc=96.5, loss=0.0644] Epoch 70/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 100.85it/s, acc=90.6, loss=0.0395]
Epoch 70/100 | Train Loss: 0.1029, Train Acc: 96.46% | Val Loss: 0.3126, Val Acc: 90.62%
Epoch 71/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.51it/s, acc=96.5, loss=0.0634] Epoch 71/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 106.65it/s, acc=90.7, loss=0.0393]
Epoch 71/100 | Train Loss: 0.1013, Train Acc: 96.51% | Val Loss: 0.3112, Val Acc: 90.74%
Epoch 72/100 [Train]: 100%|██████████| 391/391 [00:06<00:00, 64.73it/s, acc=96.5, loss=0.0632] Epoch 72/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 103.96it/s, acc=90.4, loss=0.0409]
Epoch 72/100 | Train Loss: 0.1011, Train Acc: 96.49% | Val Loss: 0.3232, Val Acc: 90.39%
Epoch 73/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 67.29it/s, acc=96.7, loss=0.0608] Epoch 73/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 100.61it/s, acc=90.6, loss=0.0417]
Epoch 73/100 | Train Loss: 0.0973, Train Acc: 96.66% | Val Loss: 0.3301, Val Acc: 90.61%
Epoch 74/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.85it/s, acc=96.6, loss=0.061] Epoch 74/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.99it/s, acc=90.3, loss=0.0424]
Epoch 74/100 | Train Loss: 0.0975, Train Acc: 96.57% | Val Loss: 0.3353, Val Acc: 90.28%
Epoch 75/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.50it/s, acc=96.9, loss=0.0572] Epoch 75/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.25it/s, acc=90.2, loss=0.0431]
Epoch 75/100 | Train Loss: 0.0915, Train Acc: 96.88% | Val Loss: 0.3407, Val Acc: 90.19%
Epoch 76/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.93it/s, acc=96.9, loss=0.0564] Epoch 76/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 105.63it/s, acc=90.7, loss=0.0424]
Epoch 76/100 | Train Loss: 0.0901, Train Acc: 96.90% | Val Loss: 0.3354, Val Acc: 90.70%
Epoch 77/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.63it/s, acc=96.9, loss=0.0566] Epoch 77/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 106.04it/s, acc=90.2, loss=0.0431]
Epoch 77/100 | Train Loss: 0.0905, Train Acc: 96.90% | Val Loss: 0.3408, Val Acc: 90.25%
Epoch 78/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.79it/s, acc=97, loss=0.0536] Epoch 78/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 112.22it/s, acc=90.4, loss=0.0426]
Epoch 78/100 | Train Loss: 0.0857, Train Acc: 97.02% | Val Loss: 0.3370, Val Acc: 90.41%
Epoch 79/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.88it/s, acc=96.8, loss=0.0554] Epoch 79/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.64it/s, acc=90.5, loss=0.043]
Epoch 79/100 | Train Loss: 0.0886, Train Acc: 96.85% | Val Loss: 0.3405, Val Acc: 90.48%
Epoch 80/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.06it/s, acc=97.1, loss=0.0529] Epoch 80/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 97.33it/s, acc=90.5, loss=0.0424]
Epoch 80/100 | Train Loss: 0.0846, Train Acc: 97.09% | Val Loss: 0.3355, Val Acc: 90.47%
Epoch 81/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.95it/s, acc=97.7, loss=0.0431] Epoch 81/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 110.66it/s, acc=91.1, loss=0.0403]
Epoch 81/100 | Train Loss: 0.0689, Train Acc: 97.68% | Val Loss: 0.3191, Val Acc: 91.09% New best model found! Accuracy: 91.09%. Saving model...
Epoch 82/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.37it/s, acc=97.9, loss=0.0396] Epoch 82/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 103.31it/s, acc=90.8, loss=0.0408]
Epoch 82/100 | Train Loss: 0.0633, Train Acc: 97.94% | Val Loss: 0.3226, Val Acc: 90.85%
Epoch 83/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.73it/s, acc=98.2, loss=0.0353] Epoch 83/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 105.02it/s, acc=91.2, loss=0.0405]
Epoch 83/100 | Train Loss: 0.0564, Train Acc: 98.22% | Val Loss: 0.3202, Val Acc: 91.22% New best model found! Accuracy: 91.22%. Saving model...
Epoch 84/100 [Train]: 100%|██████████| 391/391 [00:06<00:00, 64.94it/s, acc=98.2, loss=0.0342] Epoch 84/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 109.69it/s, acc=91.1, loss=0.0408]
Epoch 84/100 | Train Loss: 0.0547, Train Acc: 98.21% | Val Loss: 0.3224, Val Acc: 91.13%
Epoch 85/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.60it/s, acc=98.3, loss=0.0334] Epoch 85/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 105.06it/s, acc=91.1, loss=0.0408]
Epoch 85/100 | Train Loss: 0.0533, Train Acc: 98.33% | Val Loss: 0.3230, Val Acc: 91.11%
Epoch 86/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.87it/s, acc=98.2, loss=0.034] Epoch 86/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 108.36it/s, acc=91.1, loss=0.0409]
Epoch 86/100 | Train Loss: 0.0544, Train Acc: 98.17% | Val Loss: 0.3237, Val Acc: 91.14%
Epoch 87/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.24it/s, acc=98.5, loss=0.0312] Epoch 87/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 93.84it/s, acc=91.2, loss=0.0414]
Epoch 87/100 | Train Loss: 0.0499, Train Acc: 98.47% | Val Loss: 0.3277, Val Acc: 91.16%
Epoch 88/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.06it/s, acc=98.5, loss=0.0304] Epoch 88/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 105.40it/s, acc=91.2, loss=0.0411]
Epoch 88/100 | Train Loss: 0.0485, Train Acc: 98.54% | Val Loss: 0.3252, Val Acc: 91.22%
Epoch 89/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 65.34it/s, acc=98.5, loss=0.0298] Epoch 89/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 110.00it/s, acc=90.9, loss=0.0418]
Epoch 89/100 | Train Loss: 0.0476, Train Acc: 98.52% | Val Loss: 0.3307, Val Acc: 90.94%
Epoch 90/100 [Train]: 100%|██████████| 391/391 [00:05<00:00, 66.71it/s, acc=98.6, loss=0.0291] Epoch 90/100 [Val]: 100%|██████████| 79/79 [00:00<00:00, 107.57it/s, acc=91, loss=0.042]
Epoch 90/100 | Train Loss: 0.0466, Train Acc: 98.55% | Val Loss: 0.3327, Val Acc: 90.98%
Epoch 91/100 [Train]: 77%|███████▋ | 303/391 [00:04<00:01, 67.87it/s, acc=98.7, loss=0.0454]