Deep Learning Models -- A collection of various deep learning architectures, models, and tips for TensorFlow and PyTorch in Jupyter Notebooks.
%load_ext watermark
%watermark -a 'Sebastian Raschka' -v -p torch
Sebastian Raschka CPython 3.7.3 IPython 7.9.0 torch 1.7.0
References
import os
import time
import random
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import DataLoader
from torch.utils.data.dataset import Subset
from torchvision import datasets
from torchvision import transforms
import matplotlib.pyplot as plt
from PIL import Image
if torch.cuda.is_available():
torch.backends.cudnn.deterministic = True
I recommend using a function like the following one prior to using dataset loaders and initializing a model if you want to ensure the data is shuffled in the same manner if you rerun this notebook and the model gets the same initial random weights:
def set_all_seeds(seed):
os.environ["PL_GLOBAL_SEED"] = str(seed)
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
Similar to the set_all_seeds
function above, I recommend setting the behavior of PyTorch and cuDNN to deterministic (this is particulary relevant when using GPUs). We can also define a function for that:
def set_deterministic():
if torch.cuda.is_available():
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.deterministic = True
torch.set_deterministic(True)
##########################
### SETTINGS
##########################
# Hyperparameters
RANDOM_SEED = 1
LEARNING_RATE = 0.0001
BATCH_SIZE = 256
NUM_EPOCHS = 40
# Architecture
NUM_CLASSES = 10
# Other
DEVICE = "cuda:0"
set_all_seeds(RANDOM_SEED)
# Deterministic behavior not yet supported by AdaptiveAvgPool2d
#set_deterministic()
import sys
sys.path.insert(0, "..") # to include ../helper_evaluate.py etc.
from helper_evaluate import compute_accuracy
from helper_data import get_dataloaders_cifar10
from helper_train import train_classifier_simple_v1
### Set random seed ###
set_all_seeds(RANDOM_SEED)
##########################
### Dataset
##########################
train_transforms = transforms.Compose([transforms.Resize((70, 70)),
transforms.RandomCrop((64, 64)),
transforms.ToTensor()])
test_transforms = transforms.Compose([transforms.Resize((70, 70)),
transforms.CenterCrop((64, 64)),
transforms.ToTensor()])
train_loader, valid_loader, test_loader = get_dataloaders_cifar10(
batch_size=BATCH_SIZE,
num_workers=2,
train_transforms=train_transforms,
test_transforms=test_transforms,
validation_fraction=0.1)
Files already downloaded and verified
# Checking the dataset
print('Training Set:\n')
for images, labels in train_loader:
print('Image batch dimensions:', images.size())
print('Image label dimensions:', labels.size())
print(labels[:10])
break
# Checking the dataset
print('\nValidation Set:')
for images, labels in valid_loader:
print('Image batch dimensions:', images.size())
print('Image label dimensions:', labels.size())
print(labels[:10])
break
# Checking the dataset
print('\nTesting Set:')
for images, labels in train_loader:
print('Image batch dimensions:', images.size())
print('Image label dimensions:', labels.size())
print(labels[:10])
break
Training Set: Image batch dimensions: torch.Size([256, 3, 64, 64]) Image label dimensions: torch.Size([256]) tensor([6, 9, 9, 4, 1, 1, 2, 7, 8, 3]) Validation Set: Image batch dimensions: torch.Size([256, 3, 64, 64]) Image label dimensions: torch.Size([256]) tensor([7, 1, 4, 1, 0, 2, 2, 5, 9, 6]) Testing Set: Image batch dimensions: torch.Size([256, 3, 64, 64]) Image label dimensions: torch.Size([256]) tensor([6, 9, 9, 4, 1, 1, 2, 7, 8, 3])
##########################
### MODEL
##########################
class AlexNet(nn.Module):
def __init__(self, num_classes):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(64, 192, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(192, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
)
self.avgpool = nn.AdaptiveAvgPool2d((6, 6))
self.classifier = nn.Sequential(
nn.Dropout(0.5),
nn.Linear(256 * 6 * 6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(0.5),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, num_classes)
)
def forward(self, x):
x = self.features(x)
x = self.avgpool(x)
x = x.view(x.size(0), 256 * 6 * 6)
logits = self.classifier(x)
probas = F.softmax(logits, dim=1)
return logits
torch.manual_seed(RANDOM_SEED)
model = AlexNet(NUM_CLASSES)
model.to(DEVICE)
optimizer = torch.optim.Adam(model.parameters(), lr=LEARNING_RATE)
log_dict = train_classifier_simple_v1(num_epochs=NUM_EPOCHS, model=model,
optimizer=optimizer, device=DEVICE,
train_loader=train_loader, valid_loader=valid_loader,
logging_interval=50)
Epoch: 001/040 | Batch 0000/0176 | Loss: 2.3030 Epoch: 001/040 | Batch 0050/0176 | Loss: 1.9805 Epoch: 001/040 | Batch 0100/0176 | Loss: 1.8457 Epoch: 001/040 | Batch 0150/0176 | Loss: 1.7629 Epoch: 001/040 | Train Acc.: 33.087% | Loss: 1.697 Epoch: 001/040 | Validation Acc.: 34.160% | Loss: 1.671 Time elapsed: 0.44 min Epoch: 002/040 | Batch 0000/0176 | Loss: 1.7060 Epoch: 002/040 | Batch 0050/0176 | Loss: 1.5886 Epoch: 002/040 | Batch 0100/0176 | Loss: 1.6655 Epoch: 002/040 | Batch 0150/0176 | Loss: 1.4965 Epoch: 002/040 | Train Acc.: 41.529% | Loss: 1.521 Epoch: 002/040 | Validation Acc.: 41.880% | Loss: 1.511 Time elapsed: 0.88 min Epoch: 003/040 | Batch 0000/0176 | Loss: 1.4985 Epoch: 003/040 | Batch 0050/0176 | Loss: 1.4119 Epoch: 003/040 | Batch 0100/0176 | Loss: 1.3107 Epoch: 003/040 | Batch 0150/0176 | Loss: 1.2836 Epoch: 003/040 | Train Acc.: 47.098% | Loss: 1.406 Epoch: 003/040 | Validation Acc.: 47.520% | Loss: 1.400 Time elapsed: 1.32 min Epoch: 004/040 | Batch 0000/0176 | Loss: 1.4325 Epoch: 004/040 | Batch 0050/0176 | Loss: 1.2214 Epoch: 004/040 | Batch 0100/0176 | Loss: 1.1575 Epoch: 004/040 | Batch 0150/0176 | Loss: 1.2118 Epoch: 004/040 | Train Acc.: 55.071% | Loss: 1.224 Epoch: 004/040 | Validation Acc.: 54.980% | Loss: 1.229 Time elapsed: 1.77 min Epoch: 005/040 | Batch 0000/0176 | Loss: 1.1903 Epoch: 005/040 | Batch 0050/0176 | Loss: 1.1410 Epoch: 005/040 | Batch 0100/0176 | Loss: 1.0611 Epoch: 005/040 | Batch 0150/0176 | Loss: 1.0817 Epoch: 005/040 | Train Acc.: 57.938% | Loss: 1.144 Epoch: 005/040 | Validation Acc.: 57.640% | Loss: 1.147 Time elapsed: 2.21 min Epoch: 006/040 | Batch 0000/0176 | Loss: 1.1344 Epoch: 006/040 | Batch 0050/0176 | Loss: 1.0903 Epoch: 006/040 | Batch 0100/0176 | Loss: 0.9820 Epoch: 006/040 | Batch 0150/0176 | Loss: 1.0716 Epoch: 006/040 | Train Acc.: 60.222% | Loss: 1.104 Epoch: 006/040 | Validation Acc.: 58.700% | Loss: 1.120 Time elapsed: 2.65 min Epoch: 007/040 | Batch 0000/0176 | Loss: 1.0856 Epoch: 007/040 | Batch 0050/0176 | Loss: 0.9864 Epoch: 007/040 | Batch 0100/0176 | Loss: 0.9559 Epoch: 007/040 | Batch 0150/0176 | Loss: 0.9611 Epoch: 007/040 | Train Acc.: 63.953% | Loss: 1.008 Epoch: 007/040 | Validation Acc.: 61.700% | Loss: 1.055 Time elapsed: 3.09 min Epoch: 008/040 | Batch 0000/0176 | Loss: 0.9608 Epoch: 008/040 | Batch 0050/0176 | Loss: 0.9866 Epoch: 008/040 | Batch 0100/0176 | Loss: 0.9418 Epoch: 008/040 | Batch 0150/0176 | Loss: 0.9364 Epoch: 008/040 | Train Acc.: 65.887% | Loss: 0.946 Epoch: 008/040 | Validation Acc.: 63.220% | Loss: 1.006 Time elapsed: 3.53 min Epoch: 009/040 | Batch 0000/0176 | Loss: 0.9465 Epoch: 009/040 | Batch 0050/0176 | Loss: 0.9415 Epoch: 009/040 | Batch 0100/0176 | Loss: 0.9320 Epoch: 009/040 | Batch 0150/0176 | Loss: 0.8411 Epoch: 009/040 | Train Acc.: 67.782% | Loss: 0.908 Epoch: 009/040 | Validation Acc.: 64.740% | Loss: 0.995 Time elapsed: 3.97 min Epoch: 010/040 | Batch 0000/0176 | Loss: 0.8873 Epoch: 010/040 | Batch 0050/0176 | Loss: 0.9821 Epoch: 010/040 | Batch 0100/0176 | Loss: 0.8360 Epoch: 010/040 | Batch 0150/0176 | Loss: 0.7949 Epoch: 010/040 | Train Acc.: 71.416% | Loss: 0.806 Epoch: 010/040 | Validation Acc.: 67.360% | Loss: 0.912 Time elapsed: 4.41 min Epoch: 011/040 | Batch 0000/0176 | Loss: 0.7469 Epoch: 011/040 | Batch 0050/0176 | Loss: 0.8446 Epoch: 011/040 | Batch 0100/0176 | Loss: 0.7797 Epoch: 011/040 | Batch 0150/0176 | Loss: 0.7813 Epoch: 011/040 | Train Acc.: 72.213% | Loss: 0.779 Epoch: 011/040 | Validation Acc.: 67.640% | Loss: 0.913 Time elapsed: 4.85 min Epoch: 012/040 | Batch 0000/0176 | Loss: 0.7076 Epoch: 012/040 | Batch 0050/0176 | Loss: 0.8669 Epoch: 012/040 | Batch 0100/0176 | Loss: 0.7664 Epoch: 012/040 | Batch 0150/0176 | Loss: 0.7205 Epoch: 012/040 | Train Acc.: 73.053% | Loss: 0.762 Epoch: 012/040 | Validation Acc.: 67.440% | Loss: 0.918 Time elapsed: 5.29 min Epoch: 013/040 | Batch 0000/0176 | Loss: 0.6941 Epoch: 013/040 | Batch 0050/0176 | Loss: 0.7947 Epoch: 013/040 | Batch 0100/0176 | Loss: 0.7407 Epoch: 013/040 | Batch 0150/0176 | Loss: 0.6998 Epoch: 013/040 | Train Acc.: 75.658% | Loss: 0.686 Epoch: 013/040 | Validation Acc.: 69.320% | Loss: 0.883 Time elapsed: 5.74 min Epoch: 014/040 | Batch 0000/0176 | Loss: 0.6040 Epoch: 014/040 | Batch 0050/0176 | Loss: 0.7107 Epoch: 014/040 | Batch 0100/0176 | Loss: 0.6712 Epoch: 014/040 | Batch 0150/0176 | Loss: 0.6610 Epoch: 014/040 | Train Acc.: 74.813% | Loss: 0.725 Epoch: 014/040 | Validation Acc.: 68.140% | Loss: 0.937 Time elapsed: 6.18 min Epoch: 015/040 | Batch 0000/0176 | Loss: 0.7104 Epoch: 015/040 | Batch 0050/0176 | Loss: 0.6965 Epoch: 015/040 | Batch 0100/0176 | Loss: 0.6800 Epoch: 015/040 | Batch 0150/0176 | Loss: 0.6326 Epoch: 015/040 | Train Acc.: 76.784% | Loss: 0.660 Epoch: 015/040 | Validation Acc.: 69.560% | Loss: 0.926 Time elapsed: 6.62 min Epoch: 016/040 | Batch 0000/0176 | Loss: 0.5889 Epoch: 016/040 | Batch 0050/0176 | Loss: 0.6394 Epoch: 016/040 | Batch 0100/0176 | Loss: 0.5344 Epoch: 016/040 | Batch 0150/0176 | Loss: 0.5194 Epoch: 016/040 | Train Acc.: 78.216% | Loss: 0.620 Epoch: 016/040 | Validation Acc.: 69.060% | Loss: 0.925 Time elapsed: 7.06 min Epoch: 017/040 | Batch 0000/0176 | Loss: 0.4660 Epoch: 017/040 | Batch 0050/0176 | Loss: 0.6028 Epoch: 017/040 | Batch 0100/0176 | Loss: 0.5386 Epoch: 017/040 | Batch 0150/0176 | Loss: 0.5476 Epoch: 017/040 | Train Acc.: 79.882% | Loss: 0.563 Epoch: 017/040 | Validation Acc.: 70.940% | Loss: 0.900 Time elapsed: 7.50 min Epoch: 018/040 | Batch 0000/0176 | Loss: 0.4768 Epoch: 018/040 | Batch 0050/0176 | Loss: 0.6519 Epoch: 018/040 | Batch 0100/0176 | Loss: 0.5177 Epoch: 018/040 | Batch 0150/0176 | Loss: 0.5190 Epoch: 018/040 | Train Acc.: 79.673% | Loss: 0.575 Epoch: 018/040 | Validation Acc.: 69.540% | Loss: 0.961 Time elapsed: 7.94 min Epoch: 019/040 | Batch 0000/0176 | Loss: 0.4714 Epoch: 019/040 | Batch 0050/0176 | Loss: 0.5929 Epoch: 019/040 | Batch 0100/0176 | Loss: 0.5053 Epoch: 019/040 | Batch 0150/0176 | Loss: 0.5581 Epoch: 019/040 | Train Acc.: 81.029% | Loss: 0.535 Epoch: 019/040 | Validation Acc.: 70.120% | Loss: 0.971 Time elapsed: 8.38 min Epoch: 020/040 | Batch 0000/0176 | Loss: 0.3960 Epoch: 020/040 | Batch 0050/0176 | Loss: 0.5640 Epoch: 020/040 | Batch 0100/0176 | Loss: 0.5285 Epoch: 020/040 | Batch 0150/0176 | Loss: 0.4373 Epoch: 020/040 | Train Acc.: 83.053% | Loss: 0.497 Epoch: 020/040 | Validation Acc.: 71.060% | Loss: 0.936 Time elapsed: 8.82 min Epoch: 021/040 | Batch 0000/0176 | Loss: 0.3562 Epoch: 021/040 | Batch 0050/0176 | Loss: 0.4917 Epoch: 021/040 | Batch 0100/0176 | Loss: 0.5012 Epoch: 021/040 | Batch 0150/0176 | Loss: 0.5080 Epoch: 021/040 | Train Acc.: 82.573% | Loss: 0.489 Epoch: 021/040 | Validation Acc.: 70.460% | Loss: 0.943 Time elapsed: 9.26 min Epoch: 022/040 | Batch 0000/0176 | Loss: 0.4068 Epoch: 022/040 | Batch 0050/0176 | Loss: 0.4859 Epoch: 022/040 | Batch 0100/0176 | Loss: 0.4582 Epoch: 022/040 | Batch 0150/0176 | Loss: 0.4259 Epoch: 022/040 | Train Acc.: 83.702% | Loss: 0.468 Epoch: 022/040 | Validation Acc.: 71.920% | Loss: 0.940 Time elapsed: 9.70 min Epoch: 023/040 | Batch 0000/0176 | Loss: 0.4236 Epoch: 023/040 | Batch 0050/0176 | Loss: 0.4781 Epoch: 023/040 | Batch 0100/0176 | Loss: 0.4485 Epoch: 023/040 | Batch 0150/0176 | Loss: 0.3734 Epoch: 023/040 | Train Acc.: 83.813% | Loss: 0.461 Epoch: 023/040 | Validation Acc.: 70.860% | Loss: 0.958 Time elapsed: 10.14 min Epoch: 024/040 | Batch 0000/0176 | Loss: 0.3325 Epoch: 024/040 | Batch 0050/0176 | Loss: 0.3642 Epoch: 024/040 | Batch 0100/0176 | Loss: 0.3749 Epoch: 024/040 | Batch 0150/0176 | Loss: 0.3309 Epoch: 024/040 | Train Acc.: 85.018% | Loss: 0.425 Epoch: 024/040 | Validation Acc.: 71.560% | Loss: 0.965 Time elapsed: 10.58 min Epoch: 025/040 | Batch 0000/0176 | Loss: 0.3156 Epoch: 025/040 | Batch 0050/0176 | Loss: 0.3344 Epoch: 025/040 | Batch 0100/0176 | Loss: 0.3945 Epoch: 025/040 | Batch 0150/0176 | Loss: 0.3581 Epoch: 025/040 | Train Acc.: 84.291% | Loss: 0.450 Epoch: 025/040 | Validation Acc.: 69.320% | Loss: 1.077 Time elapsed: 11.02 min Epoch: 026/040 | Batch 0000/0176 | Loss: 0.3812 Epoch: 026/040 | Batch 0050/0176 | Loss: 0.3231 Epoch: 026/040 | Batch 0100/0176 | Loss: 0.4320 Epoch: 026/040 | Batch 0150/0176 | Loss: 0.3551 Epoch: 026/040 | Train Acc.: 83.344% | Loss: 0.467 Epoch: 026/040 | Validation Acc.: 69.180% | Loss: 1.108 Time elapsed: 11.45 min Epoch: 027/040 | Batch 0000/0176 | Loss: 0.3591 Epoch: 027/040 | Batch 0050/0176 | Loss: 0.3114 Epoch: 027/040 | Batch 0100/0176 | Loss: 0.2481 Epoch: 027/040 | Batch 0150/0176 | Loss: 0.3428 Epoch: 027/040 | Train Acc.: 84.931% | Loss: 0.433 Epoch: 027/040 | Validation Acc.: 69.600% | Loss: 1.126 Time elapsed: 11.90 min Epoch: 028/040 | Batch 0000/0176 | Loss: 0.3464 Epoch: 028/040 | Batch 0050/0176 | Loss: 0.2866 Epoch: 028/040 | Batch 0100/0176 | Loss: 0.2776 Epoch: 028/040 | Batch 0150/0176 | Loss: 0.3536 Epoch: 028/040 | Train Acc.: 86.289% | Loss: 0.399 Epoch: 028/040 | Validation Acc.: 70.460% | Loss: 1.114 Time elapsed: 12.34 min Epoch: 029/040 | Batch 0000/0176 | Loss: 0.3019 Epoch: 029/040 | Batch 0050/0176 | Loss: 0.3655 Epoch: 029/040 | Batch 0100/0176 | Loss: 0.2486 Epoch: 029/040 | Batch 0150/0176 | Loss: 0.4025 Epoch: 029/040 | Train Acc.: 89.231% | Loss: 0.308 Epoch: 029/040 | Validation Acc.: 71.820% | Loss: 1.050 Time elapsed: 12.78 min Epoch: 030/040 | Batch 0000/0176 | Loss: 0.2827 Epoch: 030/040 | Batch 0050/0176 | Loss: 0.3269 Epoch: 030/040 | Batch 0100/0176 | Loss: 0.2699 Epoch: 030/040 | Batch 0150/0176 | Loss: 0.3385 Epoch: 030/040 | Train Acc.: 89.320% | Loss: 0.308 Epoch: 030/040 | Validation Acc.: 71.940% | Loss: 1.063 Time elapsed: 13.22 min Epoch: 031/040 | Batch 0000/0176 | Loss: 0.2108 Epoch: 031/040 | Batch 0050/0176 | Loss: 0.2322 Epoch: 031/040 | Batch 0100/0176 | Loss: 0.2662 Epoch: 031/040 | Batch 0150/0176 | Loss: 0.1860 Epoch: 031/040 | Train Acc.: 88.807% | Loss: 0.316 Epoch: 031/040 | Validation Acc.: 71.720% | Loss: 1.073 Time elapsed: 13.66 min Epoch: 032/040 | Batch 0000/0176 | Loss: 0.2714 Epoch: 032/040 | Batch 0050/0176 | Loss: 0.3018 Epoch: 032/040 | Batch 0100/0176 | Loss: 0.2323 Epoch: 032/040 | Batch 0150/0176 | Loss: 0.2668 Epoch: 032/040 | Train Acc.: 91.173% | Loss: 0.249 Epoch: 032/040 | Validation Acc.: 71.980% | Loss: 1.025 Time elapsed: 14.10 min Epoch: 033/040 | Batch 0000/0176 | Loss: 0.1913 Epoch: 033/040 | Batch 0050/0176 | Loss: 0.3458 Epoch: 033/040 | Batch 0100/0176 | Loss: 0.1746 Epoch: 033/040 | Batch 0150/0176 | Loss: 0.2072 Epoch: 033/040 | Train Acc.: 91.171% | Loss: 0.245 Epoch: 033/040 | Validation Acc.: 72.680% | Loss: 1.060 Time elapsed: 14.54 min Epoch: 034/040 | Batch 0000/0176 | Loss: 0.2103 Epoch: 034/040 | Batch 0050/0176 | Loss: 0.2894 Epoch: 034/040 | Batch 0100/0176 | Loss: 0.2032 Epoch: 034/040 | Batch 0150/0176 | Loss: 0.2118 Epoch: 034/040 | Train Acc.: 91.756% | Loss: 0.239 Epoch: 034/040 | Validation Acc.: 73.200% | Loss: 1.038 Time elapsed: 14.98 min Epoch: 035/040 | Batch 0000/0176 | Loss: 0.2010 Epoch: 035/040 | Batch 0050/0176 | Loss: 0.2106 Epoch: 035/040 | Batch 0100/0176 | Loss: 0.1802 Epoch: 035/040 | Batch 0150/0176 | Loss: 0.2216 Epoch: 035/040 | Train Acc.: 91.060% | Loss: 0.264 Epoch: 035/040 | Validation Acc.: 71.280% | Loss: 1.146 Time elapsed: 15.42 min Epoch: 036/040 | Batch 0000/0176 | Loss: 0.1478 Epoch: 036/040 | Batch 0050/0176 | Loss: 0.1735 Epoch: 036/040 | Batch 0100/0176 | Loss: 0.1186 Epoch: 036/040 | Batch 0150/0176 | Loss: 0.1835 Epoch: 036/040 | Train Acc.: 91.376% | Loss: 0.254 Epoch: 036/040 | Validation Acc.: 72.160% | Loss: 1.181 Time elapsed: 15.86 min Epoch: 037/040 | Batch 0000/0176 | Loss: 0.1154 Epoch: 037/040 | Batch 0050/0176 | Loss: 0.1817 Epoch: 037/040 | Batch 0100/0176 | Loss: 0.1166 Epoch: 037/040 | Batch 0150/0176 | Loss: 0.1973 Epoch: 037/040 | Train Acc.: 91.278% | Loss: 0.259 Epoch: 037/040 | Validation Acc.: 71.480% | Loss: 1.241 Time elapsed: 16.31 min Epoch: 038/040 | Batch 0000/0176 | Loss: 0.1402 Epoch: 038/040 | Batch 0050/0176 | Loss: 0.1672 Epoch: 038/040 | Batch 0100/0176 | Loss: 0.1366 Epoch: 038/040 | Batch 0150/0176 | Loss: 0.1037 Epoch: 038/040 | Train Acc.: 91.447% | Loss: 0.256 Epoch: 038/040 | Validation Acc.: 71.260% | Loss: 1.256 Time elapsed: 16.75 min Epoch: 039/040 | Batch 0000/0176 | Loss: 0.1505 Epoch: 039/040 | Batch 0050/0176 | Loss: 0.1537 Epoch: 039/040 | Batch 0100/0176 | Loss: 0.1592 Epoch: 039/040 | Batch 0150/0176 | Loss: 0.1947 Epoch: 039/040 | Train Acc.: 92.571% | Loss: 0.223 Epoch: 039/040 | Validation Acc.: 72.040% | Loss: 1.266 Time elapsed: 17.19 min Epoch: 040/040 | Batch 0000/0176 | Loss: 0.1707 Epoch: 040/040 | Batch 0050/0176 | Loss: 0.1500 Epoch: 040/040 | Batch 0100/0176 | Loss: 0.1422 Epoch: 040/040 | Batch 0150/0176 | Loss: 0.1099 Epoch: 040/040 | Train Acc.: 95.191% | Loss: 0.139 Epoch: 040/040 | Validation Acc.: 72.740% | Loss: 1.201 Time elapsed: 17.63 min Total Training Time: 17.63 min
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(log_dict['train_loss_per_batch'], label='Minibatch cost')
plt.plot(np.convolve(cost_list,
np.ones(200,)/200, mode='valid'),
label='Running average')
plt.ylabel('Cross Entropy')
plt.xlabel('Iteration')
plt.legend()
plt.show()
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-13-550123761591> in <module> 1 plt.plot(log_dict['train_loss_per_batch'], label='Minibatch cost') ----> 2 plt.plot(np.convolve(cost_list, 3 np.ones(200,)/200, mode='valid'), 4 label='Running average') 5 NameError: name 'cost_list' is not defined
plt.plot(np.arange(1, NUM_EPOCHS+1), log_dict['train_acc_per_batch'], label='Training')
plt.plot(np.arange(1, NUM_EPOCHS+1), log_dict['valid_acc_per_batch'], label='Validation')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
with torch.set_grad_enabled(False):
train_acc = compute_accuracy(model=model,
data_loader=test_loader,
device=DEVICE)
test_acc = compute_accuracy(model=model,
data_loader=test_loader,
device=DEVICE)
valid_acc = compute_accuracy(model=model,
data_loader=valid_loader,
device=DEVICE)
print(f'Train ACC: {valid_acc:.2f}%')
print(f'Validation ACC: {valid_acc:.2f}%')
print(f'Test ACC: {test_acc:.2f}%')
%watermark -iv