From f117210da3b46b71d8db5be3011544045c9c1b36 Mon Sep 17 00:00:00 2001 From: Lanka Naga Sai Deep <cb.en.p2aid19019@cb.students.amrita.edu> Date: Mon, 15 Nov 2021 14:30:40 +0530 Subject: [PATCH] Update ConfusionMatrix.png, inceptionv3.ipynb, acc_train.txt, acc_valid.txt, helper_evaluation.py, helper_plotting.py, loss_train.txt, loss_valid.txt, stats.txt --- ConfusionMatrix.png | Bin 0 -> 7639 bytes acc_train.txt | 1 + acc_valid.txt | 1 + helper_evaluation.py | 78 ++ helper_plotting.py | 190 +++++ inceptionv3.ipynb | 1889 ++++++++++++++++++++++++++++++++++++++++++ loss_train.txt | 1 + loss_valid.txt | 1 + stats.txt | 346 ++++++++ 9 files changed, 2507 insertions(+) create mode 100644 ConfusionMatrix.png create mode 100644 acc_train.txt create mode 100644 acc_valid.txt create mode 100644 helper_evaluation.py create mode 100644 helper_plotting.py create mode 100644 inceptionv3.ipynb create mode 100644 loss_train.txt create mode 100644 loss_valid.txt create mode 100644 stats.txt diff --git a/ConfusionMatrix.png b/ConfusionMatrix.png new file mode 100644 index 0000000000000000000000000000000000000000..a227f0868f21b1f380b529c087cef4cf05451413 GIT binary patch literal 7639 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 D&`M~S literal 0 HcmV?d00001 diff --git a/acc_train.txt b/acc_train.txt new file mode 100644 index 0000000..3a8f066 --- /dev/null +++ b/acc_train.txt @@ -0,0 +1 @@ +60.59137725830078,71.66165161132812,76.8459701538086,81.20057678222656,84.1463394165039,85.36028289794922,87.16448974609375,88.48980712890625,89.44759368896484,90.41095733642578,91.26294708251953,91.27407836914062,91.45783996582031,92.3432388305664,92.52700805664062,93.01703643798828,93.25091552734375,93.71310424804688,93.8578872680664,93.65184783935547,94.06949615478516,94.53168487548828,94.26995849609375,94.40917205810547,94.62635040283203,94.77669525146484,94.9883041381836,95.22775268554688,95.1776351928711,95.48390197753906,95.51174926757812,95.52288055419922,95.62311553955078,95.84585571289062,95.82915496826172,95.84585571289062,95.95166015625,96.10201263427734,96.24679565429688,96.35816955566406,96.18553924560547,96.21895599365234,96.28577423095703,96.62545776367188,96.50294494628906,96.7646713256836,96.80364990234375,96.90388488769531,96.90388488769531,96.93729400634766,96.53636169433594,96.73126220703125,96.88160705566406,96.7646713256836,96.63102722167969,96.74796295166016,96.88160705566406,97.0263900756836,97.13219451904297,96.97627258300781,97.06536865234375,97.11548614501953,97.34379577636719,97.13776397705078,97.43846130371094,97.26026916503906,97.42733001708984,97.44403076171875,97.51085662841797,97.6556396484375,97.42176055908203,97.65007019042969,97.60552215576172,97.61109161376953,97.50528717041016,97.7837142944336,97.74473571777344,97.80599212646484,97.80042266845703,97.7892837524414,97.96190643310547,97.93963623046875,98.01202392578125,98.1623764038086,98.1623764038086,97.90621948242188,98.28488159179688,98.29045104980469,97.94520568847656,98.28488159179688,98.26818084716797,98.46864318847656,98.37954711914062,98.39625549316406,98.31272888183594,98.2960205078125,98.40739440917969,98.53546905517578,98.32386016845703,98.53546905517578, \ No newline at end of file diff --git a/acc_valid.txt b/acc_valid.txt new file mode 100644 index 0000000..b1603cd --- /dev/null +++ b/acc_valid.txt @@ -0,0 +1 @@ +72.81468963623047,74.82518005371094,54.16666793823242,53.263404846191406,42.16200637817383,88.5489501953125,57.7214469909668,30.09906768798828,86.85897827148438,84.73193359375,88.92774200439453,89.7727279663086,89.51049041748047,69.87179565429688,88.78205108642578,86.21794891357422,91.20046997070312,91.52098083496094,88.92774200439453,92.97785949707031,61.188812255859375,89.07342529296875,89.13170623779297,93.0361328125,82.22611236572266,91.89977264404297,82.10955810546875,92.22028350830078,93.85198211669922,92.22028350830078,94.2599105834961,93.26923370361328,91.05477905273438,93.06526947021484,92.62820434570312,94.11421966552734,93.4149169921875,93.9102554321289,93.61888122558594,94.34732055664062,94.49301147460938,92.5407943725586,93.4149169921875,94.2599105834961,94.46387481689453,94.28904724121094,94.93006896972656,94.05594635009766,94.2016372680664,94.72611236572266,94.23077392578125,94.37645721435547,93.79370880126953,94.43473052978516,95.10489654541016,93.96853637695312,94.90093231201172,94.43473052978516,95.10489654541016,93.47319793701172,94.23077392578125,94.60955810546875,93.18182373046875,94.28904724121094,95.22145080566406,94.46387481689453,93.50233459472656,93.706298828125,94.55128479003906,94.34732055664062,94.31818389892578,94.72611236572266,93.24009704589844,94.78438568115234,94.69696807861328,94.84265899658203,94.81352233886719,92.89044189453125,94.81352233886719,94.66783142089844,94.55128479003906,94.6386947631836,94.81352233886719,94.55128479003906,94.28904724121094,95.22145080566406,94.93006896972656,94.98834991455078,94.5804214477539,95.01748657226562,94.37645721435547,95.16316986083984,95.134033203125,94.93006896972656,94.6386947631836,93.76457214355469,94.49301147460938,95.04662322998047,94.52214813232422,94.60955810546875, \ No newline at end of file diff --git a/helper_evaluation.py b/helper_evaluation.py new file mode 100644 index 0000000..7c98054 --- /dev/null +++ b/helper_evaluation.py @@ -0,0 +1,78 @@ +# imports from installed libraries +import os +import numpy as np +import random +import torch +from distutils.version import LooseVersion as Version +from itertools import product +from tqdm import tqdm + +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) + + +def set_deterministic(): + if torch.cuda.is_available(): + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + + if torch.__version__ <= Version("1.7"): + torch.set_deterministic(True) + else: + torch.use_deterministic_algorithms(True) + + +def compute_accuracy(model, data_loader, device): + + with torch.no_grad(): + + correct_pred, num_examples = 0, 0 + + for i, (features, targets) in enumerate(tqdm(data_loader)): + + features = features.to(device) + targets = targets.float().to(device) + + logits = model(features) + _, predicted_labels = torch.max(logits, 1) + + num_examples += targets.size(0) + correct_pred += (predicted_labels == targets).sum() + return correct_pred.float()/num_examples * 100 + + +def compute_confusion_matrix(model, data_loader, device): + + all_targets, all_predictions = [], [] + with torch.no_grad(): + + for i, (features, targets) in enumerate(data_loader): + + features = features.to(device) + targets = targets + logits = model(features) + _, predicted_labels = torch.max(logits, 1) + all_targets.extend(targets.to('cpu')) + all_predictions.extend(predicted_labels.to('cpu')) + + all_predictions = all_predictions + all_predictions = np.array(all_predictions) + all_targets = np.array(all_targets) + + class_labels = np.unique(np.concatenate((all_targets, all_predictions))) + if class_labels.shape[0] == 1: + if class_labels[0] != 0: + class_labels = np.array([0, class_labels[0]]) + else: + class_labels = np.array([class_labels[0], 1]) + n_labels = class_labels.shape[0] + lst = [] + z = list(zip(all_targets, all_predictions)) + for combi in product(class_labels, repeat=2): + lst.append(z.count(combi)) + mat = np.asarray(lst)[:, None].reshape(n_labels, n_labels) + return mat \ No newline at end of file diff --git a/helper_plotting.py b/helper_plotting.py new file mode 100644 index 0000000..5498f50 --- /dev/null +++ b/helper_plotting.py @@ -0,0 +1,190 @@ +# imports from installed libraries +import os +import matplotlib.pyplot as plt +import numpy as np +import torch + + +def plot_training_loss(minibatch_loss_list, num_epochs, iter_per_epoch, + results_dir=None, averaging_iterations=100): + + plt.figure() + ax1 = plt.subplot(1, 1, 1) + ax1.plot(range(len(minibatch_loss_list)), + (minibatch_loss_list), label='Minibatch Loss') + + if len(minibatch_loss_list) > 1000: + ax1.set_ylim([ + 0, np.max(minibatch_loss_list[1000:])*1.5 + ]) + ax1.set_xlabel('Iterations') + ax1.set_ylabel('Loss') + + ax1.plot(np.convolve(minibatch_loss_list, + np.ones(averaging_iterations,)/averaging_iterations, + mode='valid'), + label='Running Average') + ax1.legend() + + ################### + # Set scond x-axis + ax2 = ax1.twiny() + newlabel = list(range(num_epochs+1)) + + newpos = [e*iter_per_epoch for e in newlabel] + + ax2.set_xticks(newpos[::10]) + ax2.set_xticklabels(newlabel[::10]) + + ax2.xaxis.set_ticks_position('bottom') + ax2.xaxis.set_label_position('bottom') + ax2.spines['bottom'].set_position(('outward', 45)) + ax2.set_xlabel('Epochs') + ax2.set_xlim(ax1.get_xlim()) + ################### + + plt.tight_layout() + + if results_dir is not None: + image_path = os.path.join(results_dir, 'plot_training_loss.pdf') + plt.savefig(image_path) + + +def plot_accuracy(train_acc_list, valid_acc_list, results_dir): + + num_epochs = len(train_acc_list) + + plt.plot(np.arange(1, num_epochs+1), + train_acc_list, label='Training') + plt.plot(np.arange(1, num_epochs+1), + valid_acc_list, label='Validation') + + plt.xlabel('Epoch') + plt.ylabel('Accuracy') + plt.legend() + + plt.tight_layout() + + if results_dir is not None: + image_path = os.path.join( + results_dir, 'plot_acc_training_validation.pdf') + plt.savefig(image_path) + + +def show_examples(model, data_loader, unnormalizer=None, class_dict=None): + + + for batch_idx, (features, targets) in enumerate(data_loader): + + with torch.no_grad(): + features = features + targets = targets + logits = model(features) + predictions = torch.argmax(logits, dim=1) + break + + fig, axes = plt.subplots(nrows=3, ncols=5, + sharex=True, sharey=True) + + if unnormalizer is not None: + for idx in range(features.shape[0]): + features[idx] = unnormalizer(features[idx]) + nhwc_img = np.transpose(features, axes=(0, 2, 3, 1)) + + if nhwc_img.shape[-1] == 1: + nhw_img = np.squeeze(nhwc_img.numpy(), axis=3) + + for idx, ax in enumerate(axes.ravel()): + ax.imshow(nhw_img[idx], cmap='binary') + if class_dict is not None: + ax.title.set_text(f'P: {class_dict[predictions[idx].item()]}' + f'\nT: {class_dict[targets[idx].item()]}') + else: + ax.title.set_text(f'P: {predictions[idx]} | T: {targets[idx]}') + ax.axison = False + + else: + + for idx, ax in enumerate(axes.ravel()): + ax.imshow(nhwc_img[idx]) + if class_dict is not None: + ax.title.set_text(f'P: {class_dict[predictions[idx].item()]}' + f'\nT: {class_dict[targets[idx].item()]}') + else: + ax.title.set_text(f'P: {predictions[idx]} | T: {targets[idx]}') + ax.axison = False + plt.tight_layout() + plt.show() + + +def plot_confusion_matrix(conf_mat, + hide_spines=False, + hide_ticks=False, + figsize=None, + cmap=None, + colorbar=False, + show_absolute=True, + show_normed=False, + class_names=None): + + if not (show_absolute or show_normed): + raise AssertionError('Both show_absolute and show_normed are False') + if class_names is not None and len(class_names) != len(conf_mat): + raise AssertionError('len(class_names) should be equal to number of' + 'classes in the dataset') + + total_samples = conf_mat.sum(axis=1)[:, np.newaxis] + normed_conf_mat = conf_mat.astype('float') / total_samples + + fig, ax = plt.subplots(figsize=figsize) + ax.grid(False) + if cmap is None: + cmap = plt.cm.Blues + + if figsize is None: + figsize = (len(conf_mat)*1.25, len(conf_mat)*1.25) + + if show_normed: + matshow = ax.matshow(normed_conf_mat, cmap=cmap) + else: + matshow = ax.matshow(conf_mat, cmap=cmap) + + if colorbar: + fig.colorbar(matshow) + + for i in range(conf_mat.shape[0]): + for j in range(conf_mat.shape[1]): + cell_text = "" + if show_absolute: + cell_text += format(conf_mat[i, j], 'd') + if show_normed: + cell_text += "\n" + '(' + cell_text += format(normed_conf_mat[i, j], '.2f') + ')' + else: + cell_text += format(normed_conf_mat[i, j], '.2f') + ax.text(x=j, + y=i, + s=cell_text, + va='center', + ha='center', + color="white" if normed_conf_mat[i, j] > 0.5 else "black") + + if class_names is not None: + tick_marks = np.arange(len(class_names)) + plt.xticks(tick_marks, class_names, rotation=90) + plt.yticks(tick_marks, class_names) + + if hide_spines: + ax.spines['right'].set_visible(False) + ax.spines['top'].set_visible(False) + ax.spines['left'].set_visible(False) + ax.spines['bottom'].set_visible(False) + ax.yaxis.set_ticks_position('left') + ax.xaxis.set_ticks_position('bottom') + if hide_ticks: + ax.axes.get_yaxis().set_ticks([]) + ax.axes.get_xaxis().set_ticks([]) + + plt.xlabel('predicted label') + plt.ylabel('true label') + return fig, ax \ No newline at end of file diff --git a/inceptionv3.ipynb b/inceptionv3.ipynb new file mode 100644 index 0000000..4654a2a --- /dev/null +++ b/inceptionv3.ipynb @@ -0,0 +1,1889 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "17767f9b", + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "import torchvision\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import torch.optim as optim\n", + "import os\n", + "from distutils.version import LooseVersion as Version\n", + "from itertools import product\n", + "from helper_evaluation import set_all_seeds, set_deterministic, compute_confusion_matrix\n", + "from helper_plotting import plot_training_loss, plot_accuracy, show_examples, plot_confusion_matrix" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d01df462", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/user/anaconda3/lib/python3.8/site-packages/torchvision/models/inception.py:80: FutureWarning: The default weight initialization of inception_v3 will be changed in future releases of torchvision. If you wish to keep the old behavior (which leads to long initialization times due to scipy/scipy#11299), please set init_weights=True.\n", + " warnings.warn('The default weight initialization of inception_v3 will be changed in future releases of '\n" + ] + } + ], + "source": [ + "import torchvision.models as models\n", + "net = models.inception_v3()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "754cb9a3", + "metadata": {}, + "outputs": [], + "source": [ + "net.Conv2d_1a_3x3.conv = nn.Conv2d(1, 32, kernel_size=(3, 3), stride=(2, 2), bias=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0d2b4c59", + "metadata": {}, + "outputs": [], + "source": [ + "net.fc = nn.Linear(in_features=2048, out_features=3, bias=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f0f91921", + "metadata": {}, + "outputs": [], + "source": [ + "net.aux_logits=False" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "fd36529f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Inception3(\n", + " (Conv2d_1a_3x3): BasicConv2d(\n", + " (conv): Conv2d(1, 32, kernel_size=(3, 3), stride=(2, 2), bias=False)\n", + " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (Conv2d_2a_3x3): BasicConv2d(\n", + " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (Conv2d_2b_3x3): BasicConv2d(\n", + " (conv): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (maxpool1): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)\n", + " (Conv2d_3b_1x1): BasicConv2d(\n", + " (conv): Conv2d(64, 80, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(80, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (Conv2d_4a_3x3): BasicConv2d(\n", + " (conv): Conv2d(80, 192, kernel_size=(3, 3), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (maxpool2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)\n", + " (Mixed_5b): InceptionA(\n", + " (branch1x1): BasicConv2d(\n", + " (conv): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch5x5_1): BasicConv2d(\n", + " (conv): Conv2d(192, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(48, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch5x5_2): BasicConv2d(\n", + " (conv): Conv2d(48, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), bias=False)\n", + " (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_1): BasicConv2d(\n", + " (conv): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_2): BasicConv2d(\n", + " (conv): Conv2d(64, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_3): BasicConv2d(\n", + " (conv): Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch_pool): BasicConv2d(\n", + " (conv): Conv2d(192, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (Mixed_5c): InceptionA(\n", + " (branch1x1): BasicConv2d(\n", + " (conv): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch5x5_1): BasicConv2d(\n", + " (conv): Conv2d(256, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(48, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch5x5_2): BasicConv2d(\n", + " (conv): Conv2d(48, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), bias=False)\n", + " (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_1): BasicConv2d(\n", + " (conv): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_2): BasicConv2d(\n", + " (conv): Conv2d(64, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_3): BasicConv2d(\n", + " (conv): Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch_pool): BasicConv2d(\n", + " (conv): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (Mixed_5d): InceptionA(\n", + " (branch1x1): BasicConv2d(\n", + " (conv): Conv2d(288, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch5x5_1): BasicConv2d(\n", + " (conv): Conv2d(288, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(48, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch5x5_2): BasicConv2d(\n", + " (conv): Conv2d(48, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), bias=False)\n", + " (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_1): BasicConv2d(\n", + " (conv): Conv2d(288, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_2): BasicConv2d(\n", + " (conv): Conv2d(64, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_3): BasicConv2d(\n", + " (conv): Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch_pool): BasicConv2d(\n", + " (conv): Conv2d(288, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (Mixed_6a): InceptionB(\n", + " (branch3x3): BasicConv2d(\n", + " (conv): Conv2d(288, 384, kernel_size=(3, 3), stride=(2, 2), bias=False)\n", + " (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_1): BasicConv2d(\n", + " (conv): Conv2d(288, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_2): BasicConv2d(\n", + " (conv): Conv2d(64, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_3): BasicConv2d(\n", + " (conv): Conv2d(96, 96, kernel_size=(3, 3), stride=(2, 2), bias=False)\n", + " (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (Mixed_6b): InceptionC(\n", + " (branch1x1): BasicConv2d(\n", + " (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7_1): BasicConv2d(\n", + " (conv): Conv2d(768, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7_2): BasicConv2d(\n", + " (conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", + " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7_3): BasicConv2d(\n", + " (conv): Conv2d(128, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_1): BasicConv2d(\n", + " (conv): Conv2d(768, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_2): BasicConv2d(\n", + " (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", + " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_3): BasicConv2d(\n", + " (conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", + " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_4): BasicConv2d(\n", + " (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", + " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_5): BasicConv2d(\n", + " (conv): Conv2d(128, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch_pool): BasicConv2d(\n", + " (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (Mixed_6c): InceptionC(\n", + " (branch1x1): BasicConv2d(\n", + " (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7_1): BasicConv2d(\n", + " (conv): Conv2d(768, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7_2): BasicConv2d(\n", + " (conv): Conv2d(160, 160, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", + " (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7_3): BasicConv2d(\n", + " (conv): Conv2d(160, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_1): BasicConv2d(\n", + " (conv): Conv2d(768, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_2): BasicConv2d(\n", + " (conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", + " (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_3): BasicConv2d(\n", + " (conv): Conv2d(160, 160, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", + " (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_4): BasicConv2d(\n", + " (conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", + " (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_5): BasicConv2d(\n", + " (conv): Conv2d(160, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch_pool): BasicConv2d(\n", + " (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (Mixed_6d): InceptionC(\n", + " (branch1x1): BasicConv2d(\n", + " (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7_1): BasicConv2d(\n", + " (conv): Conv2d(768, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7_2): BasicConv2d(\n", + " (conv): Conv2d(160, 160, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", + " (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7_3): BasicConv2d(\n", + " (conv): Conv2d(160, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_1): BasicConv2d(\n", + " (conv): Conv2d(768, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_2): BasicConv2d(\n", + " (conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", + " (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_3): BasicConv2d(\n", + " (conv): Conv2d(160, 160, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", + " (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_4): BasicConv2d(\n", + " (conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", + " (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_5): BasicConv2d(\n", + " (conv): Conv2d(160, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch_pool): BasicConv2d(\n", + " (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (Mixed_6e): InceptionC(\n", + " (branch1x1): BasicConv2d(\n", + " (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7_1): BasicConv2d(\n", + " (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7_2): BasicConv2d(\n", + " (conv): Conv2d(192, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7_3): BasicConv2d(\n", + " (conv): Conv2d(192, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_1): BasicConv2d(\n", + " (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_2): BasicConv2d(\n", + " (conv): Conv2d(192, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_3): BasicConv2d(\n", + " (conv): Conv2d(192, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_4): BasicConv2d(\n", + " (conv): Conv2d(192, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7dbl_5): BasicConv2d(\n", + " (conv): Conv2d(192, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch_pool): BasicConv2d(\n", + " (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (AuxLogits): InceptionAux(\n", + " (conv0): BasicConv2d(\n", + " (conv): Conv2d(768, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (conv1): BasicConv2d(\n", + " (conv): Conv2d(128, 768, kernel_size=(5, 5), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(768, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (fc): Linear(in_features=768, out_features=1000, bias=True)\n", + " )\n", + " (Mixed_7a): InceptionD(\n", + " (branch3x3_1): BasicConv2d(\n", + " (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3_2): BasicConv2d(\n", + " (conv): Conv2d(192, 320, kernel_size=(3, 3), stride=(2, 2), bias=False)\n", + " (bn): BatchNorm2d(320, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7x3_1): BasicConv2d(\n", + " (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7x3_2): BasicConv2d(\n", + " (conv): Conv2d(192, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7x3_3): BasicConv2d(\n", + " (conv): Conv2d(192, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch7x7x3_4): BasicConv2d(\n", + " (conv): Conv2d(192, 192, kernel_size=(3, 3), stride=(2, 2), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (Mixed_7b): InceptionE(\n", + " (branch1x1): BasicConv2d(\n", + " (conv): Conv2d(1280, 320, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(320, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3_1): BasicConv2d(\n", + " (conv): Conv2d(1280, 384, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3_2a): BasicConv2d(\n", + " (conv): Conv2d(384, 384, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)\n", + " (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3_2b): BasicConv2d(\n", + " (conv): Conv2d(384, 384, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)\n", + " (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_1): BasicConv2d(\n", + " (conv): Conv2d(1280, 448, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(448, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_2): BasicConv2d(\n", + " (conv): Conv2d(448, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_3a): BasicConv2d(\n", + " (conv): Conv2d(384, 384, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)\n", + " (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_3b): BasicConv2d(\n", + " (conv): Conv2d(384, 384, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)\n", + " (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch_pool): BasicConv2d(\n", + " (conv): Conv2d(1280, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (Mixed_7c): InceptionE(\n", + " (branch1x1): BasicConv2d(\n", + " (conv): Conv2d(2048, 320, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(320, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3_1): BasicConv2d(\n", + " (conv): Conv2d(2048, 384, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3_2a): BasicConv2d(\n", + " (conv): Conv2d(384, 384, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)\n", + " (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3_2b): BasicConv2d(\n", + " (conv): Conv2d(384, 384, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)\n", + " (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_1): BasicConv2d(\n", + " (conv): Conv2d(2048, 448, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(448, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_2): BasicConv2d(\n", + " (conv): Conv2d(448, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_3a): BasicConv2d(\n", + " (conv): Conv2d(384, 384, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)\n", + " (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch3x3dbl_3b): BasicConv2d(\n", + " (conv): Conv2d(384, 384, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)\n", + " (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " (branch_pool): BasicConv2d(\n", + " (conv): Conv2d(2048, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n", + " (dropout): Dropout(p=0.5, inplace=False)\n", + " (fc): Linear(in_features=2048, out_features=3, bias=True)\n", + ")" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "net" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "35ed82d4", + "metadata": {}, + "outputs": [], + "source": [ + "if torch.cuda.is_available():\n", + " net = net.cuda()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "9039d0ba", + "metadata": {}, + "outputs": [], + "source": [ + "criterion = nn.CrossEntropyLoss()\n", + "optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "82f5a0c9", + "metadata": {}, + "outputs": [], + "source": [ + "from torchvision import datasets, transforms\n", + "from torch.utils.data import DataLoader, random_split" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "25136ecd", + "metadata": {}, + "outputs": [], + "source": [ + "def UploadData(path, train):\n", + " #set up transforms for train and test datasets\n", + " train_transforms = transforms.Compose([transforms.Grayscale(num_output_channels=1), transforms.Resize(512), transforms.CenterCrop(511), transforms.RandomRotation(30),transforms.RandomHorizontalFlip(), transforms.transforms.ToTensor()]) \n", + " valid_transforms = transforms.Compose([transforms.Grayscale(num_output_channels=1), transforms.Resize(512), transforms.CenterCrop(511), transforms.transforms.ToTensor()]) \n", + " #test_transforms = transforms.Compose([transforms.Grayscale(num_output_channels=1), transforms.Resize(512), transforms.CenterCrop(511), transforms.ToTensor()])\n", + " \n", + " #set up datasets from Image Folders\n", + " train_dataset = datasets.ImageFolder(path + '/train', transform=train_transforms)\n", + " valid_dataset = datasets.ImageFolder(path + '/validation', transform=valid_transforms)\n", + " #test_dataset = datasets.ImageFolder(path + '/test', transform=test_transforms)\n", + "\n", + " #set up dataloaders with batch size of 32\n", + " trainloader = torch.utils.data.DataLoader(train_dataset, batch_size=10, shuffle=True)\n", + " validloader = torch.utils.data.DataLoader(valid_dataset, batch_size=3, shuffle=True)\n", + " #testloader = torch.utils.data.DataLoader(test_dataset, batch_size=32, shuffle=True)\n", + " \n", + " return trainloader, validloader #, testloader" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "36c1e09d", + "metadata": {}, + "outputs": [], + "source": [ + "trainloader, validloader = UploadData(\"/home/user/research/CXR_Covid-19_Challenge\", True) #, testloader" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "291f8643", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'covid': 0, 'normal': 1, 'pneumonia': 2}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "trainloader.dataset.class_to_idx" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "8955b17d", + "metadata": {}, + "outputs": [], + "source": [ + "class_dict = {0: 'covid',\n", + " 1: 'normal',\n", + " 2: 'pneumonia',\n", + " }\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "b1234549", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "playsound is relying on another python subprocess. Please use `pip install pygobject` if you want playsound to run more efficiently.\n" + ] + } + ], + "source": [ + "import time\n", + "from tqdm import tqdm\n", + "from playsound import playsound\n", + "def convert(seconds):\n", + " return time.strftime(\"%H:%M:%S\", time.gmtime(seconds))" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "9e3b169f", + "metadata": {}, + "outputs": [], + "source": [ + "#net.load_state_dict(torch.load(\"/home/user/research/resnet18/resent_model_100_e.pth\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "c0cb959e", + "metadata": {}, + "outputs": [], + "source": [ + "f1 = open(\"loss_train.txt\",\"r\")\n", + "f2 = open(\"loss_valid.txt\",\"r\")\n", + "f3 = open(\"acc_train.txt\",\"r\")\n", + "f4 = open(\"acc_valid.txt\",\"r\")\n", + "loss_train_list = list(map(float,f1.read().split(\",\")[:-1]))\n", + "loss_valid_list = list(map(float,f2.read().split(\",\")[:-1]))\n", + "acc_train_list = list(map(float,f3.read().split(\",\")[:-1]))\n", + "acc_valid_list = list(map(float,f4.read().split(\",\")[:-1]))\n", + "f1.close()\n", + "f2.close()\n", + "f3.close()\n", + "f4.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "ec8191c8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "50\n", + "50\n", + "50\n", + "50\n" + ] + } + ], + "source": [ + "print(len(loss_train_list))\n", + "print(len(loss_valid_list))\n", + "print(len(acc_train_list))\n", + "print(len(acc_valid_list))" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "dbc639ac", + "metadata": {}, + "outputs": [], + "source": [ + "min_valid_loss = 176.70111268254743 #np.inf " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "f4740bf5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<All keys matched successfully>" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "net.load_state_dict(torch.load(\"/home/user/research/inception/inception_model_weights.pth\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "4de4f21c", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/1796 [00:00<?, ?it/s]/home/user/anaconda3/lib/python3.8/site-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at /pytorch/c10/core/TensorImpl.h:1156.)\n", + " return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)\n", + "100%|██████████| 1796/1796 [26:58<00:00, 1.11it/s]\n", + "100%|██████████| 1144/1144 [01:33<00:00, 12.19it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 51 \tTraining Loss: 0.09165445734263657 \tValidation Loss: 0.17152209940613636 \t time: 00:28:32\n", + "Train Accuracy : 96.53636169433594 \tValidation Accuracy : 94.23077392578125\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [21:22<00:00, 1.40it/s]\n", + "100%|██████████| 1144/1144 [01:37<00:00, 11.72it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 52 \tTraining Loss: 0.09221583802063996 \tValidation Loss: 0.16037222628516629 \t time: 00:23:00\n", + "Train Accuracy : 96.73126220703125 \tValidation Accuracy : 94.37645721435547\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [22:16<00:00, 1.34it/s]\n", + "100%|██████████| 1144/1144 [01:42<00:00, 11.19it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 53 \tTraining Loss: 0.08847045124473309 \tValidation Loss: 0.2036763697891736 \t time: 00:23:58\n", + "Train Accuracy : 96.88160705566406 \tValidation Accuracy : 93.79370880126953\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [22:47<00:00, 1.31it/s]\n", + "100%|██████████| 1144/1144 [01:44<00:00, 10.99it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 54 \tTraining Loss: 0.08789863544174668 \tValidation Loss: 0.1687593689412151 \t time: 00:24:31\n", + "Train Accuracy : 96.7646713256836 \tValidation Accuracy : 94.43473052978516\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [22:57<00:00, 1.30it/s]\n", + "100%|██████████| 1144/1144 [01:43<00:00, 11.02it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 55 \tTraining Loss: 0.09500338172477096 \tValidation Loss: 0.14177400080895142 \t time: 00:24:41\n", + "Train Accuracy : 96.63102722167969 \tValidation Accuracy : 95.10489654541016\n", + "Validation Loss Decreased( 176.70111268254743 ---> 162.18945692544042 ) \t Saving The Model\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [23:07<00:00, 1.29it/s]\n", + "100%|██████████| 1144/1144 [01:42<00:00, 11.19it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 56 \tTraining Loss: 0.09031265778825509 \tValidation Loss: 0.18278716804204703 \t time: 00:24:49\n", + "Train Accuracy : 96.74796295166016 \tValidation Accuracy : 93.96853637695312\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [23:03<00:00, 1.30it/s]\n", + "100%|██████████| 1144/1144 [01:44<00:00, 10.96it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 57 \tTraining Loss: 0.08620208682385942 \tValidation Loss: 0.14799000272867793 \t time: 00:24:48\n", + "Train Accuracy : 96.88160705566406 \tValidation Accuracy : 94.90093231201172\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [23:10<00:00, 1.29it/s]\n", + "100%|██████████| 1144/1144 [01:44<00:00, 10.92it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 58 \tTraining Loss: 0.08300438247726585 \tValidation Loss: 0.1600002346522127 \t time: 00:24:55\n", + "Train Accuracy : 97.0263900756836 \tValidation Accuracy : 94.43473052978516\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [23:09<00:00, 1.29it/s]\n", + "100%|██████████| 1144/1144 [01:46<00:00, 10.77it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 59 \tTraining Loss: 0.08226122751776815 \tValidation Loss: 0.14605365284565963 \t time: 00:24:55\n", + "Train Accuracy : 97.13219451904297 \tValidation Accuracy : 95.10489654541016\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [23:07<00:00, 1.29it/s]\n", + "100%|██████████| 1144/1144 [01:45<00:00, 10.85it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 60 \tTraining Loss: 0.08579505991390575 \tValidation Loss: 0.18423723773755435 \t time: 00:24:52\n", + "Train Accuracy : 96.97627258300781 \tValidation Accuracy : 93.47319793701172\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:58<00:00, 1.20it/s]\n", + "100%|██████████| 1144/1144 [02:00<00:00, 9.47it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 61 \tTraining Loss: 0.08214815120575526 \tValidation Loss: 0.17847097962048566 \t time: 00:26:59\n", + "Train Accuracy : 97.06536865234375 \tValidation Accuracy : 94.23077392578125\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [23:48<00:00, 1.26it/s]\n", + "100%|██████████| 1144/1144 [01:40<00:00, 11.39it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 62 \tTraining Loss: 0.07662939100897298 \tValidation Loss: 0.16315428260541065 \t time: 00:25:29\n", + "Train Accuracy : 97.11548614501953 \tValidation Accuracy : 94.60955810546875\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [21:46<00:00, 1.37it/s]\n", + "100%|██████████| 1144/1144 [01:37<00:00, 11.78it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 63 \tTraining Loss: 0.07747971859184274 \tValidation Loss: 0.22504110104722083 \t time: 00:23:24\n", + "Train Accuracy : 97.34379577636719 \tValidation Accuracy : 93.18182373046875\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [21:54<00:00, 1.37it/s]\n", + "100%|██████████| 1144/1144 [01:41<00:00, 11.24it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 64 \tTraining Loss: 0.07793970416078122 \tValidation Loss: 0.1685476378482461 \t time: 00:23:36\n", + "Train Accuracy : 97.13776397705078 \tValidation Accuracy : 94.28904724121094\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [22:23<00:00, 1.34it/s]\n", + "100%|██████████| 1144/1144 [01:36<00:00, 11.81it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 65 \tTraining Loss: 0.07176851012418552 \tValidation Loss: 0.1624539961414715 \t time: 00:24:00\n", + "Train Accuracy : 97.43846130371094 \tValidation Accuracy : 95.22145080566406\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [21:45<00:00, 1.38it/s]\n", + "100%|██████████| 1144/1144 [01:39<00:00, 11.44it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 66 \tTraining Loss: 0.07633045756118612 \tValidation Loss: 0.16267618834170236 \t time: 00:23:25\n", + "Train Accuracy : 97.26026916503906 \tValidation Accuracy : 94.46387481689453\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [22:27<00:00, 1.33it/s]\n", + "100%|██████████| 1144/1144 [01:42<00:00, 11.16it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 67 \tTraining Loss: 0.07321558582663341 \tValidation Loss: 0.21929416910379954 \t time: 00:24:09\n", + "Train Accuracy : 97.42733001708984 \tValidation Accuracy : 93.50233459472656\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [21:46<00:00, 1.37it/s]\n", + "100%|██████████| 1144/1144 [01:37<00:00, 11.78it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 68 \tTraining Loss: 0.07049886439466706 \tValidation Loss: 0.20767059386729905 \t time: 00:23:23\n", + "Train Accuracy : 97.44403076171875 \tValidation Accuracy : 93.706298828125\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [22:08<00:00, 1.35it/s]\n", + "100%|██████████| 1144/1144 [01:40<00:00, 11.42it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 69 \tTraining Loss: 0.06958261082941226 \tValidation Loss: 0.20314688874566306 \t time: 00:23:48\n", + "Train Accuracy : 97.51085662841797 \tValidation Accuracy : 94.55128479003906\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [22:12<00:00, 1.35it/s]\n", + "100%|██████████| 1144/1144 [01:37<00:00, 11.77it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 70 \tTraining Loss: 0.06615839365227791 \tValidation Loss: 0.21894106984455217 \t time: 00:23:49\n", + "Train Accuracy : 97.6556396484375 \tValidation Accuracy : 94.34732055664062\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [22:12<00:00, 1.35it/s]\n", + "100%|██████████| 1144/1144 [01:42<00:00, 11.16it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 71 \tTraining Loss: 0.07073798872735443 \tValidation Loss: 0.1854989590078617 \t time: 00:23:55\n", + "Train Accuracy : 97.42176055908203 \tValidation Accuracy : 94.31818389892578\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [22:02<00:00, 1.36it/s]\n", + "100%|██████████| 1144/1144 [01:41<00:00, 11.27it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 72 \tTraining Loss: 0.06759932948314919 \tValidation Loss: 0.16438417145409634 \t time: 00:23:44\n", + "Train Accuracy : 97.65007019042969 \tValidation Accuracy : 94.72611236572266\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [22:45<00:00, 1.32it/s]\n", + "100%|██████████| 1144/1144 [01:42<00:00, 11.19it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 73 \tTraining Loss: 0.06808185780105781 \tValidation Loss: 0.20492887748025262 \t time: 00:24:27\n", + "Train Accuracy : 97.60552215576172 \tValidation Accuracy : 93.24009704589844\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [22:49<00:00, 1.31it/s]\n", + "100%|██████████| 1144/1144 [01:38<00:00, 11.64it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 74 \tTraining Loss: 0.0662040773194995 \tValidation Loss: 0.15864856163937738 \t time: 00:24:27\n", + "Train Accuracy : 97.61109161376953 \tValidation Accuracy : 94.78438568115234\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [23:54<00:00, 1.25it/s]\n", + "100%|██████████| 1144/1144 [01:57<00:00, 9.71it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 75 \tTraining Loss: 0.06631172326392323 \tValidation Loss: 0.17424752525398982 \t time: 00:25:52\n", + "Train Accuracy : 97.50528717041016 \tValidation Accuracy : 94.69696807861328\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [25:56<00:00, 1.15it/s]\n", + "100%|██████████| 1144/1144 [01:59<00:00, 9.60it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 76 \tTraining Loss: 0.060300969062300605 \tValidation Loss: 0.1800764260328554 \t time: 00:27:55\n", + "Train Accuracy : 97.7837142944336 \tValidation Accuracy : 94.84265899658203\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [26:14<00:00, 1.14it/s]\n", + "100%|██████████| 1144/1144 [02:06<00:00, 9.06it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 77 \tTraining Loss: 0.0631895532683778 \tValidation Loss: 0.17779819888212697 \t time: 00:28:20\n", + "Train Accuracy : 97.74473571777344 \tValidation Accuracy : 94.81352233886719\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [26:40<00:00, 1.12it/s]\n", + "100%|██████████| 1144/1144 [02:00<00:00, 9.48it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 78 \tTraining Loss: 0.06198645626303477 \tValidation Loss: 0.22541044369261604 \t time: 00:28:41\n", + "Train Accuracy : 97.80599212646484 \tValidation Accuracy : 92.89044189453125\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [26:45<00:00, 1.12it/s]\n", + "100%|██████████| 1144/1144 [01:59<00:00, 9.59it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 79 \tTraining Loss: 0.06146746539060868 \tValidation Loss: 0.16276436379049866 \t time: 00:28:44\n", + "Train Accuracy : 97.80042266845703 \tValidation Accuracy : 94.81352233886719\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [26:38<00:00, 1.12it/s]\n", + "100%|██████████| 1144/1144 [02:01<00:00, 9.39it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 80 \tTraining Loss: 0.061250413641016646 \tValidation Loss: 0.185863304678096 \t time: 00:28:40\n", + "Train Accuracy : 97.7892837524414 \tValidation Accuracy : 94.66783142089844\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [26:28<00:00, 1.13it/s]\n", + "100%|██████████| 1144/1144 [02:00<00:00, 9.48it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 81 \tTraining Loss: 0.055994985836952726 \tValidation Loss: 0.19503489832381585 \t time: 00:28:28\n", + "Train Accuracy : 97.96190643310547 \tValidation Accuracy : 94.55128479003906\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:30<00:00, 1.22it/s]\n", + "100%|██████████| 1144/1144 [01:50<00:00, 10.40it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 82 \tTraining Loss: 0.05786731395727391 \tValidation Loss: 0.1772332505598556 \t time: 00:26:20\n", + "Train Accuracy : 97.93963623046875 \tValidation Accuracy : 94.6386947631836\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:25<00:00, 1.23it/s]\n", + "100%|██████████| 1144/1144 [01:50<00:00, 10.34it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 83 \tTraining Loss: 0.05508038126183864 \tValidation Loss: 0.17212355645936103 \t time: 00:26:16\n", + "Train Accuracy : 98.01202392578125 \tValidation Accuracy : 94.81352233886719\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:29<00:00, 1.22it/s]\n", + "100%|██████████| 1144/1144 [01:50<00:00, 10.38it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 84 \tTraining Loss: 0.05333144986953854 \tValidation Loss: 0.18769453135639058 \t time: 00:26:19\n", + "Train Accuracy : 98.1623764038086 \tValidation Accuracy : 94.55128479003906\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:27<00:00, 1.22it/s]\n", + "100%|██████████| 1144/1144 [01:50<00:00, 10.32it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 85 \tTraining Loss: 0.05195518812915562 \tValidation Loss: 0.2188312843085706 \t time: 00:26:18\n", + "Train Accuracy : 98.1623764038086 \tValidation Accuracy : 94.28904724121094\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:26<00:00, 1.22it/s]\n", + "100%|██████████| 1144/1144 [01:51<00:00, 10.27it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 86 \tTraining Loss: 0.05557021407121344 \tValidation Loss: 0.16567276273672485 \t time: 00:26:18\n", + "Train Accuracy : 97.90621948242188 \tValidation Accuracy : 95.22145080566406\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:25<00:00, 1.23it/s]\n", + "100%|██████████| 1144/1144 [01:51<00:00, 10.30it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 87 \tTraining Loss: 0.04761978305685298 \tValidation Loss: 0.17063623352618648 \t time: 00:26:16\n", + "Train Accuracy : 98.28488159179688 \tValidation Accuracy : 94.93006896972656\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:30<00:00, 1.22it/s]\n", + "100%|██████████| 1144/1144 [01:51<00:00, 10.24it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 88 \tTraining Loss: 0.04825140143763275 \tValidation Loss: 0.20191060677620382 \t time: 00:26:21\n", + "Train Accuracy : 98.29045104980469 \tValidation Accuracy : 94.98834991455078\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:35<00:00, 1.22it/s]\n", + "100%|██████████| 1144/1144 [01:51<00:00, 10.24it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 89 \tTraining Loss: 0.05780107012915506 \tValidation Loss: 0.174123426197158 \t time: 00:26:26\n", + "Train Accuracy : 97.94520568847656 \tValidation Accuracy : 94.5804214477539\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:50<00:00, 1.21it/s]\n", + "100%|██████████| 1144/1144 [01:53<00:00, 10.11it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 90 \tTraining Loss: 0.0488213468202301 \tValidation Loss: 0.1821983714126591 \t time: 00:26:43\n", + "Train Accuracy : 98.28488159179688 \tValidation Accuracy : 95.01748657226562\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:34<00:00, 1.22it/s]\n", + "100%|██████████| 1144/1144 [01:49<00:00, 10.48it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 91 \tTraining Loss: 0.04786794898898365 \tValidation Loss: 0.21106482365035026 \t time: 00:26:24\n", + "Train Accuracy : 98.26818084716797 \tValidation Accuracy : 94.37645721435547\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:37<00:00, 1.22it/s]\n", + "100%|██████████| 1144/1144 [01:52<00:00, 10.19it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 92 \tTraining Loss: 0.04460614188660565 \tValidation Loss: 0.18981046517962916 \t time: 00:26:29\n", + "Train Accuracy : 98.46864318847656 \tValidation Accuracy : 95.16316986083984\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:37<00:00, 1.22it/s]\n", + "100%|██████████| 1144/1144 [01:53<00:00, 10.12it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 93 \tTraining Loss: 0.04528368343457531 \tValidation Loss: 0.19061526675608978 \t time: 00:26:30\n", + "Train Accuracy : 98.37954711914062 \tValidation Accuracy : 95.134033203125\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:40<00:00, 1.21it/s]\n", + "100%|██████████| 1144/1144 [01:53<00:00, 10.11it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 94 \tTraining Loss: 0.04315999560623736 \tValidation Loss: 0.18479735974127254 \t time: 00:26:34\n", + "Train Accuracy : 98.39625549316406 \tValidation Accuracy : 94.93006896972656\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:45<00:00, 1.21it/s]\n", + "100%|██████████| 1144/1144 [01:51<00:00, 10.22it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 95 \tTraining Loss: 0.045449965668429 \tValidation Loss: 0.21741512184906572 \t time: 00:26:37\n", + "Train Accuracy : 98.31272888183594 \tValidation Accuracy : 94.6386947631836\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:46<00:00, 1.21it/s]\n", + "100%|██████████| 1144/1144 [01:51<00:00, 10.30it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 96 \tTraining Loss: 0.04930824305741191 \tValidation Loss: 0.22110039089647493 \t time: 00:26:37\n", + "Train Accuracy : 98.2960205078125 \tValidation Accuracy : 93.76457214355469\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:44<00:00, 1.21it/s]\n", + "100%|██████████| 1144/1144 [01:51<00:00, 10.30it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 97 \tTraining Loss: 0.04283826560632438 \tValidation Loss: 0.20986085644259478 \t time: 00:26:35\n", + "Train Accuracy : 98.40739440917969 \tValidation Accuracy : 94.49301147460938\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:38<00:00, 1.22it/s]\n", + "100%|██████████| 1144/1144 [01:51<00:00, 10.29it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 98 \tTraining Loss: 0.04108247859154013 \tValidation Loss: 0.2100832273115594 \t time: 00:26:29\n", + "Train Accuracy : 98.53546905517578 \tValidation Accuracy : 95.04662322998047\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:46<00:00, 1.21it/s]\n", + "100%|██████████| 1144/1144 [01:53<00:00, 10.12it/s]\n", + " 0%| | 0/1796 [00:00<?, ?it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 99 \tTraining Loss: 0.04423610125145301 \tValidation Loss: 0.20389257205650918 \t time: 00:26:39\n", + "Train Accuracy : 98.32386016845703 \tValidation Accuracy : 94.52214813232422\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1796/1796 [24:53<00:00, 1.20it/s]\n", + "100%|██████████| 1144/1144 [01:54<00:00, 9.97it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 100 \tTraining Loss: 0.04032945076981576 \tValidation Loss: 0.19798582192817635 \t time: 00:26:48\n", + "Train Accuracy : 98.53546905517578 \tValidation Accuracy : 94.60955810546875\n", + "total time : 21:27:42\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# loss_train_list = []\n", + "# loss_valid_list = []\n", + "# acc_train_list = []\n", + "# acc_valid_list = []\n", + "\n", + "epochs = 50\n", + "total_time = time.time()\n", + "for e in range(epochs):\n", + " start_time=time.time()\n", + " train_loss = 0.0\n", + " right_train = 0\n", + " total_train = 0\n", + " for data, labels in tqdm(trainloader):\n", + " # Transfer Data to GPU if available\n", + " if torch.cuda.is_available():\n", + " data, labels = data.cuda(), labels.cuda()\n", + " \n", + " # Clear the gradients\n", + " optimizer.zero_grad()\n", + " net.train()\n", + " # Forward Pass\n", + " target = net(data)\n", + " _, predicted = torch.max(target, 1)\n", + " # Find the Loss\n", + " loss = criterion(target,labels)\n", + " # Calculate gradients\n", + " loss.backward()\n", + " # Update Weights\n", + " optimizer.step()\n", + " # Calculate Loss\n", + " train_loss += loss.item()\n", + " correct = (predicted == labels).float().sum()\n", + " right_train+=correct.float()\n", + " total_train+=len(predicted)\n", + " \n", + " valid_loss = 0.0\n", + " right_valid = 0\n", + " total_valid = 0\n", + " net.eval() # Optional when not using Model Specific layer\n", + " all_targets, all_predictions = [], []\n", + " for data, labels in tqdm(validloader):\n", + " # Transfer Data to GPU if available\n", + " if torch.cuda.is_available():\n", + " data, labels = data.cuda(), labels.cuda()\n", + " \n", + " # Forward Pass\n", + " target = net(data)\n", + " _, predicted = torch.max(target, 1)\n", + " # Find the Loss\n", + " loss = criterion(target,labels)\n", + " # Calculate Loss\n", + " valid_loss += loss.item()\n", + " correct = (predicted == labels).float().sum()\n", + " right_valid+=correct.float()\n", + " total_valid+=len(predicted)\n", + " all_targets.extend(labels.to('cpu'))\n", + " all_predictions.extend(predicted.to('cpu'))\n", + " ftloss = train_loss / len(trainloader)\n", + " fvloss = valid_loss / len(validloader)\n", + " ftacc = float(right_train*100/total_train)\n", + " fvacc = float(right_valid*100/total_valid)\n", + " loss_train_list.append(ftloss)\n", + " loss_valid_list.append(fvloss)\n", + " acc_train_list.append(ftacc)\n", + " acc_valid_list.append(fvacc)\n", + " print('Epoch',e+51, '\\tTraining Loss:',ftloss,'\\tValidation Loss:',fvloss,\"\\t time:\",convert(time.time()-start_time))\n", + " print(\"Train Accuracy :\",ftacc,\"\\tValidation Accuracy :\",fvacc)\n", + " if min_valid_loss > valid_loss:\n", + " print(\"Validation Loss Decreased(\",min_valid_loss,\"--->\",valid_loss,\") \\t Saving The Model\")\n", + " min_valid_loss = valid_loss\n", + " all_predictions = np.array(all_predictions)\n", + " all_targets = np.array(all_targets)\n", + " class_labels = np.unique(np.concatenate((all_targets, all_predictions)))\n", + " if class_labels.shape[0] == 1:\n", + " if class_labels[0] != 0:\n", + " class_labels = np.array([0, class_labels[0]])\n", + " else:\n", + " class_labels = np.array([class_labels[0], 1])\n", + " n_labels = class_labels.shape[0]\n", + " lst = []\n", + " z = list(zip(all_targets, all_predictions))\n", + " for combi in product(class_labels, repeat=2):\n", + " lst.append(z.count(combi))\n", + " mat = np.asarray(lst)[:, None].reshape(n_labels, n_labels)\n", + " plot_confusion_matrix(mat, class_names=class_dict.values())\n", + " plt.savefig(\"ConfusionMatrix.png\")\n", + " # Saving State Dict\n", + " torch.save(net.state_dict(), '/home/user/research/inception/inception_model_weights.pth')\n", + " torch.save(net,\"/home/user/research/inception/inception_model.pt\")\n", + "print(\"total time : \",convert(time.time()-total_time))\n", + "playsound('/home/user/research/audio')" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "13786d1d", + "metadata": {}, + "outputs": [], + "source": [ + "torch.save(net.state_dict(), '/home/user/research/inception/inception_model_100e_weights.pth')\n", + "torch.save(net,\"/home/user/research/inception/inception_model_100e.pt\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7292be62", + "metadata": {}, + "outputs": [], + "source": [ + "# loss_train_list = []\n", + "# loss_valid_list = []\n", + "# acc_train_list = []\n", + "# acc_valid_list = []\n", + "# f = open(\"stats.txt\",\"r\")\n", + "# for i in f.readlines():\n", + "# if \"Loss\" in i and \"Epoch\" in i:\n", + "# e,t,v,time = i.split(\"\\t\")\n", + "# train_acc = t.split(\" \")[-2]\n", + "# valid_acc = v.split(\" \")[-2]\n", + "# loss_train_list.append(float(train_acc))\n", + "# loss_valid_list.append(float(valid_acc))\n", + "# if \"Accuracy\" in i:\n", + "# t,v = i.split(\"\\t\")\n", + "# train_acc = t.split(\" \")[-2]\n", + "# valid_acc = v.split(\" \")[-1]\n", + "# acc_train_list.append(float(train_acc))\n", + "# acc_valid_list.append(float(valid_acc))" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "166cc6e2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "y_v = min(loss_valid_list)\n", + "x_v = loss_valid_list.index(y_v)+1\n", + "plt.plot(loss_train_list)\n", + "plt.plot(loss_valid_list)\n", + "plt.annotate(\"min validation loss\",(x_v,y_v))\n", + "plt.title('Training and Validation Loss during Model Training')\n", + "plt.ylabel('loss')\n", + "plt.xlabel('epoch')\n", + "plt.legend(['train', 'valid','minimum'], loc='upper left')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "76657782", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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LnLSU8hJ93SxPsCK1/qqRgqzUsnPTO3V/Q9nY3YqaSkuxuZncO7pp/T4PDU1Ndx8883t4jB27NhBJww+n4+UlP5tvoe0OMR7wh8osrKy2t+/8sorvPDCC7z99ttkZmYyd+7ciGMV0tI6/Ilut5vm5uYBKetgJ9jbo7bZy/jCTHLTo48eb27z89qaSv67aisvf1GB2yWMzbcN9IaqRr7c1vXpMzPVzaicNEblpFOQldo+QMftEtI8btJSXHxd2ch1//mc/332C/YYlc267Y20hgQSi7LTGJWTxuryOirrW2P6wgHyMz2U5GcweUwO86eNZkJBFsX56YzOSWdkThr1LV7WVzXydWUjAWMozEqjIDuVvAwP2WkpZKa6KcxKIyO1qwskEDC4XB1dovebWABY6/fII4/k4IMP5p133mHvvffmnHPO4eqrr6aiooL77ruP2bNn895773HZZZfR3NxMRkYGd955J5MnT+bGG29k1apV3HHHHXzyySecdtppvPfee2RmZrZfa//99+eOO+5g2jT7P507dy5/+tOf8Pv9Ec8Zyl133cXy5cu56aabWLduHaeffjo+n48jj+zI2NPQ0MAJJ5xAdXU1Xq+X3//+95xwwgmd3L7z58/n4osvbrf0W1pauPDCC1m+fDkpKSnceOONfOtb3+Kuu+7iiSeeoKmpibVr13LiiSdyww03dLmfv/3tb3nyySdpbm7moIMO4tZbb0VE+Oqrr/jhD39IZWUlbrebhx9+mN12240bbriBe+65B5fLxVFHHcX111/P3Llz+eMf/0hpaSnbt2+ntLSU9evXc9ddd/H000/T0tJCY2MjTzzxRMT6Adx999388Y9/RESYMWMGN998MzNmzODLL78MZlRwich67HzUEX15Q1ockkVOTg719fURP6utrWXEiBFkZmby+eef884770TcT4mMMYbKhlY2VDWxfnsjG6qa2LCjiY1VjZRVN1MV1ttjdG4aEwutOLf4ArR6/dS3+Khr8dLQ6sMYyMvwMG/KKNI8LrbUtLChqpExeRmcMLOEA3YtYEJhlg2Qprg6+aFj8VVFPQ+vKOPz8noO3r2IKcW5TBmTw8SiLLLTOv52Pn+AbfWtbK62FsLWuhZGZKYyJi+d4rx0xuZnxBQ4gJE5aew6MpvDpnTzZkInYehSh6++4uGHH+a2225jv/324/777+eN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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "y_a = max(acc_valid_list)\n", + "x_a = acc_valid_list.index(y_a)+1\n", + "plt.plot(acc_train_list)\n", + "plt.plot(acc_valid_list)\n", + "plt.annotate(\"max validation accuracy\",(x_a,y_a))\n", + "plt.title('Training and Validation Loss during Model Training')\n", + "plt.ylabel('loss')\n", + "plt.xlabel('epoch')\n", + "plt.legend(['train', 'valid'], loc='upper left')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "d4c563a6", + "metadata": {}, + "outputs": [], + "source": [ + "f1 = open(\"loss_train.txt\",\"w\")\n", + "f2 = open(\"loss_valid.txt\",\"w\")\n", + "f3 = open(\"acc_train.txt\",\"w\")\n", + "f4 = open(\"acc_valid.txt\",\"w\")\n", + "for i in range(len(loss_train_list)):\n", + " f1.write(str(loss_train_list[i]))\n", + " f1.write(\",\")\n", + " f2.write(str(loss_valid_list[i]))\n", + " f2.write(\",\")\n", + " f3.write(str(acc_train_list[i]))\n", + " f3.write(\",\")\n", + " f4.write(str(acc_valid_list[i]))\n", + " f4.write(\",\")\n", + "f1.close()\n", + "f2.close()\n", + "f3.close()\n", + "f4.close()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e9084525", + "metadata": {}, + "outputs": [], + "source": [ + "net.load_state_dict(torch.load(\"/home/user/research/inception/inception_model_weights.pth\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "3b6a2220", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1144/1144 [01:06<00:00, 17.25it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "94.60955810546875\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "right = 0\n", + "total = 0\n", + "net.eval()\n", + "for data, labels in tqdm(validloader):\n", + " if torch.cuda.is_available():\n", + " data, labels = data.cuda(), labels.cuda()\n", + " outputs = net(data)\n", + " _, predicted = torch.max(outputs, 1)\n", + " correct = (predicted == labels).float().sum()\n", + " right+=correct.float()\n", + " total = total+len(predicted)0 \\ol\n", + "print(float(right*100/total))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/loss_train.txt b/loss_train.txt new file mode 100644 index 0000000..d389222 --- /dev/null +++ b/loss_train.txt @@ -0,0 +1 @@ +1.1035438804806341,0.7226075545878446,0.5927857020558719,0.4855417087383751,0.42466082714937775,0.3899900257610249,0.33965107956475976,0.3088414678495286,0.2893916949011927,0.26239258625865075,0.24367613917504974,0.236287816383571,0.23417071717115065,0.21140513792742907,0.20538419038578473,0.19501896397021903,0.18287320016237196,0.17879659134323164,0.171295881071395,0.17367128944810054,0.16889888298814962,0.15593305252522763,0.16150809311312375,0.14889712126819024,0.14728439946149172,0.14183516678818942,0.14214308556186903,0.13260898183909905,0.13150178402533158,0.12626396362086523,0.1243195203532862,0.12209497421210111,0.12278669627672056,0.11644445447141527,0.11643929763509502,0.11314545146687183,0.11227715401390395,0.1071929339383833,0.10536505841217854,0.1025733296694737,0.1052557724369013,0.10263119807659637,0.10232017596648244,0.09797717922651777,0.0962465678795243,0.09185824797468396,0.08947356818272058,0.09256357114334521,0.08656281119721079,0.08749571777711337,0.09165445734263657,0.09221583802063996,0.08847045124473309,0.08789863544174668,0.09500338172477096,0.09031265778825509,0.08620208682385942,0.08300438247726585,0.08226122751776815,0.08579505991390575,0.08214815120575526,0.07662939100897298,0.07747971859184274,0.07793970416078122,0.07176851012418552,0.07633045756118612,0.07321558582663341,0.07049886439466706,0.06958261082941226,0.06615839365227791,0.07073798872735443,0.06759932948314919,0.06808185780105781,0.0662040773194995,0.06631172326392323,0.060300969062300605,0.0631895532683778,0.06198645626303477,0.06146746539060868,0.061250413641016646,0.055994985836952726,0.05786731395727391,0.05508038126183864,0.05333144986953854,0.05195518812915562,0.05557021407121344,0.04761978305685298,0.04825140143763275,0.05780107012915506,0.0488213468202301,0.04786794898898365,0.04460614188660565,0.04528368343457531,0.04315999560623736,0.045449965668429,0.04930824305741191,0.04283826560632438,0.04108247859154013,0.04423610125145301,0.04032945076981576, \ No newline at end of file diff --git a/loss_valid.txt b/loss_valid.txt new file mode 100644 index 0000000..8d422d1 --- /dev/null +++ b/loss_valid.txt @@ -0,0 +1 @@ +0.7362933201909512,0.6163856863236329,1.3273141826035384,1.5671682171401458,3.5975048998270522,0.3208140740501673,1.60716543938882,3.7727238974062614,0.3727143925575459,0.39486539538513027,0.30012787602620505,0.2645583272986157,0.28670598589140556,0.877864682356586,0.31970177022714447,0.3537218891526128,0.23517900836004693,0.23142625330760383,0.29114914753153515,0.19204040009411208,1.383013668015098,0.29187787832020173,0.30029773062818627,0.20152319045968844,0.5768455127529731,0.23056407164745374,0.5357079009287545,0.2149459716328706,0.1735658104628493,0.22748694864047736,0.15573396021900965,0.19751328618058758,0.25568632156248966,0.19130310058533873,0.21698788530739277,0.17937653658909178,0.1841336501966603,0.17111435995329394,0.17860585031031706,0.16341808670263447,0.1674421660797369,0.20584173513718435,0.19133936254487285,0.17769178415356504,0.15445901458264635,0.17249739720020704,0.16489796243608087,0.18674146796817262,0.18428602356302096,0.15860075746543972,0.17152209940613636,0.16037222628516629,0.2036763697891736,0.1687593689412151,0.14177400080895142,0.18278716804204703,0.14799000272867793,0.1600002346522127,0.14605365284565963,0.18423723773755435,0.17847097962048566,0.16315428260541065,0.22504110104722083,0.1685476378482461,0.1624539961414715,0.16267618834170236,0.21929416910379954,0.20767059386729905,0.20314688874566306,0.21894106984455217,0.1854989590078617,0.16438417145409634,0.20492887748025262,0.15864856163937738,0.17424752525398982,0.1800764260328554,0.17779819888212697,0.22541044369261604,0.16276436379049866,0.185863304678096,0.19503489832381585,0.1772332505598556,0.17212355645936103,0.18769453135639058,0.2188312843085706,0.16567276273672485,0.17063623352618648,0.20191060677620382,0.174123426197158,0.1821983714126591,0.21106482365035026,0.18981046517962916,0.19061526675608978,0.18479735974127254,0.21741512184906572,0.22110039089647493,0.20986085644259478,0.2100832273115594,0.20389257205650918,0.19798582192817635, \ No newline at end of file diff --git a/stats.txt b/stats.txt new file mode 100644 index 0000000..f93af39 --- /dev/null +++ b/stats.txt @@ -0,0 +1,346 @@ +Epoch 1 Training Loss: 1.1035438804806341 Validation Loss: 0.7362933201909512 time: 00:28:19 +Train Accuracy : 60.59137725830078 Validation Accuracy : 72.81468963623047 +Validation Loss Decreased( inf ---> 842.3195582984481 ) Saving The Model + +100%|██████████| 1796/1796 [23:55<00:00, 1.25it/s] +100%|██████████| 1144/1144 [01:36<00:00, 11.89it/s] + +Epoch 2 Training Loss: 0.7226075545878446 Validation Loss: 0.6163856863236329 time: 00:25:31 +Train Accuracy : 71.66165161132812 Validation Accuracy : 74.82518005371094 +Validation Loss Decreased( 842.3195582984481 ---> 705.145225154236 ) Saving The Model + +100%|██████████| 1796/1796 [21:41<00:00, 1.38it/s] +100%|██████████| 1144/1144 [01:40<00:00, 11.41it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 3 Training Loss: 0.5927857020558719 Validation Loss: 1.3273141826035384 time: 00:23:21 +Train Accuracy : 76.8459701538086 Validation Accuracy : 54.16666793823242 + +100%|██████████| 1796/1796 [22:25<00:00, 1.33it/s] +100%|██████████| 1144/1144 [01:44<00:00, 10.94it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 4 Training Loss: 0.4855417087383751 Validation Loss: 1.5671682171401458 time: 00:24:10 +Train Accuracy : 81.20057678222656 Validation Accuracy : 53.263404846191406 + +100%|██████████| 1796/1796 [28:16<00:00, 1.06it/s] +100%|██████████| 1144/1144 [02:02<00:00, 9.31it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 5 Training Loss: 0.42466082714937775 Validation Loss: 3.5975048998270522 time: 00:30:19 +Train Accuracy : 84.1463394165039 Validation Accuracy : 42.16200637817383 + +100%|██████████| 1796/1796 [27:13<00:00, 1.10it/s] +100%|██████████| 1144/1144 [01:59<00:00, 9.55it/s] + +Epoch 6 Training Loss: 0.3899900257610249 Validation Loss: 0.3208140740501673 time: 00:29:13 +Train Accuracy : 85.36028289794922 Validation Accuracy : 88.5489501953125 +Validation Loss Decreased( 705.145225154236 ---> 367.0113007133914 ) Saving The Model + +100%|██████████| 1796/1796 [28:05<00:00, 1.07it/s] +100%|██████████| 1144/1144 [02:03<00:00, 9.25it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 7 Training Loss: 0.33965107956475976 Validation Loss: 1.60716543938882 time: 00:30:09 +Train Accuracy : 87.16448974609375 Validation Accuracy : 57.7214469909668 + +100%|██████████| 1796/1796 [28:21<00:00, 1.06it/s] +100%|██████████| 1144/1144 [02:05<00:00, 9.15it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 8 Training Loss: 0.3088414678495286 Validation Loss: 3.7727238974062614 time: 00:30:26 +Train Accuracy : 88.48980712890625 Validation Accuracy : 30.09906768798828 + +100%|██████████| 1796/1796 [29:04<00:00, 1.03it/s] +100%|██████████| 1144/1144 [02:08<00:00, 8.92it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 9 Training Loss: 0.2893916949011927 Validation Loss: 0.3727143925575459 time: 00:31:12 +Train Accuracy : 89.44759368896484 Validation Accuracy : 86.85897827148438 + +100%|██████████| 1796/1796 [28:35<00:00, 1.05it/s] +100%|██████████| 1144/1144 [02:06<00:00, 9.05it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 10 Training Loss: 0.26239258625865075 Validation Loss: 0.39486539538513027 time: 00:30:42 +Train Accuracy : 90.41095733642578 Validation Accuracy : 84.73193359375 + +100%|██████████| 1796/1796 [27:55<00:00, 1.07it/s] +100%|██████████| 1144/1144 [01:46<00:00, 10.72it/s] + +Epoch 11 Training Loss: 0.24367613917504974 Validation Loss: 0.30012787602620505 time: 00:29:41 +Train Accuracy : 91.26294708251953 Validation Accuracy : 88.92774200439453 +Validation Loss Decreased( 367.0113007133914 ---> 343.34629017397856 ) Saving The Model + +100%|██████████| 1796/1796 [22:31<00:00, 1.33it/s] +100%|██████████| 1144/1144 [01:41<00:00, 11.28it/s] + +Epoch 12 Training Loss: 0.236287816383571 Validation Loss: 0.2645583272986157 time: 00:24:12 +Train Accuracy : 91.27407836914062 Validation Accuracy : 89.7727279663086 +Validation Loss Decreased( 343.34629017397856 ---> 302.6547264296164 ) Saving The Model + +100%|██████████| 1796/1796 [23:48<00:00, 1.26it/s] +100%|██████████| 1144/1144 [02:04<00:00, 9.19it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 13 Training Loss: 0.23417071717115065 Validation Loss: 0.28670598589140556 time: 00:25:53 +Train Accuracy : 91.45783996582031 Validation Accuracy : 89.51049041748047 + +100%|██████████| 1796/1796 [31:12<00:00, 1.04s/it] +100%|██████████| 1144/1144 [02:15<00:00, 8.45it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 14 Training Loss: 0.21140513792742907 Validation Loss: 0.877864682356586 time: 00:33:27 +Train Accuracy : 92.3432388305664 Validation Accuracy : 69.87179565429688 + +100%|██████████| 1796/1796 [33:27<00:00, 1.12s/it] +100%|██████████| 1144/1144 [02:01<00:00, 9.45it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 15 Training Loss: 0.20538419038578473 Validation Loss: 0.31970177022714447 time: 00:35:28 +Train Accuracy : 92.52700805664062 Validation Accuracy : 88.78205108642578 + +100%|██████████| 1796/1796 [25:01<00:00, 1.20it/s] +100%|██████████| 1144/1144 [01:51<00:00, 10.29it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 16 Training Loss: 0.19501896397021903 Validation Loss: 0.3537218891526128 time: 00:26:52 +Train Accuracy : 93.01703643798828 Validation Accuracy : 86.21794891357422 + +100%|██████████| 1796/1796 [25:14<00:00, 1.19it/s] +100%|██████████| 1144/1144 [01:59<00:00, 9.54it/s] + +Epoch 17 Training Loss: 0.18287320016237196 Validation Loss: 0.23517900836004693 time: 00:27:14 +Train Accuracy : 93.25091552734375 Validation Accuracy : 91.20046997070312 +Validation Loss Decreased( 302.6547264296164 ---> 269.0447855638937 ) Saving The Model + +100%|██████████| 1796/1796 [27:46<00:00, 1.08it/s] +100%|██████████| 1144/1144 [02:08<00:00, 8.88it/s] + +Epoch 18 Training Loss: 0.17879659134323164 Validation Loss: 0.23142625330760383 time: 00:29:55 +Train Accuracy : 93.71310424804688 Validation Accuracy : 91.52098083496094 +Validation Loss Decreased( 269.0447855638937 ---> 264.7516337838988 ) Saving The Model + +100%|██████████| 1796/1796 [28:18<00:00, 1.06it/s] +100%|██████████| 1144/1144 [02:06<00:00, 9.08it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 19 Training Loss: 0.171295881071395 Validation Loss: 0.29114914753153515 time: 00:30:24 +Train Accuracy : 93.8578872680664 Validation Accuracy : 88.92774200439453 + +100%|██████████| 1796/1796 [28:28<00:00, 1.05it/s] +100%|██████████| 1144/1144 [02:06<00:00, 9.02it/s] + +Epoch 20 Training Loss: 0.17367128944810054 Validation Loss: 0.19204040009411208 time: 00:30:35 +Train Accuracy : 93.65184783935547 Validation Accuracy : 92.97785949707031 +Validation Loss Decreased( 264.7516337838988 ---> 219.69421770766422 ) Saving The Model + +100%|██████████| 1796/1796 [25:03<00:00, 1.19it/s] +100%|██████████| 1144/1144 [01:36<00:00, 11.83it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 21 Training Loss: 0.16889888298814962 Validation Loss: 1.383013668015098 time: 00:26:40 +Train Accuracy : 94.06949615478516 Validation Accuracy : 61.188812255859375 + +100%|██████████| 1796/1796 [21:21<00:00, 1.40it/s] +100%|██████████| 1144/1144 [01:37<00:00, 11.72it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 22 Training Loss: 0.15593305252522763 Validation Loss: 0.29187787832020173 time: 00:22:59 +Train Accuracy : 94.53168487548828 Validation Accuracy : 89.07342529296875 + +100%|██████████| 1796/1796 [21:11<00:00, 1.41it/s] +100%|██████████| 1144/1144 [01:34<00:00, 12.09it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 23 Training Loss: 0.16150809311312375 Validation Loss: 0.30029773062818627 time: 00:22:46 +Train Accuracy : 94.26995849609375 Validation Accuracy : 89.13170623779297 + +100%|██████████| 1796/1796 [21:04<00:00, 1.42it/s] +100%|██████████| 1144/1144 [01:35<00:00, 11.97it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 24 Training Loss: 0.14889712126819024 Validation Loss: 0.20152319045968844 time: 00:22:40 +Train Accuracy : 94.40917205810547 Validation Accuracy : 93.0361328125 + +100%|██████████| 1796/1796 [21:27<00:00, 1.40it/s] +100%|██████████| 1144/1144 [01:38<00:00, 11.60it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 25 Training Loss: 0.14728439946149172 Validation Loss: 0.5768455127529731 time: 00:23:05 +Train Accuracy : 94.62635040283203 Validation Accuracy : 82.22611236572266 + +100%|██████████| 1796/1796 [21:50<00:00, 1.37it/s] +100%|██████████| 1144/1144 [01:39<00:00, 11.49it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 26 Training Loss: 0.14183516678818942 Validation Loss: 0.23056407164745374 time: 00:23:30 +Train Accuracy : 94.77669525146484 Validation Accuracy : 91.89977264404297 + +100%|██████████| 1796/1796 [22:00<00:00, 1.36it/s] +100%|██████████| 1144/1144 [01:39<00:00, 11.53it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 27 Training Loss: 0.14214308556186903 Validation Loss: 0.5357079009287545 time: 00:23:39 +Train Accuracy : 94.9883041381836 Validation Accuracy : 82.10955810546875 + +100%|██████████| 1796/1796 [21:53<00:00, 1.37it/s] +100%|██████████| 1144/1144 [01:38<00:00, 11.67it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 28 Training Loss: 0.13260898183909905 Validation Loss: 0.2149459716328706 time: 00:23:31 +Train Accuracy : 95.22775268554688 Validation Accuracy : 92.22028350830078 + +100%|██████████| 1796/1796 [21:31<00:00, 1.39it/s] +100%|██████████| 1144/1144 [01:35<00:00, 11.93it/s] + +Epoch 29 Training Loss: 0.13150178402533158 Validation Loss: 0.1735658104628493 time: 00:23:07 +Train Accuracy : 95.1776351928711 Validation Accuracy : 93.85198211669922 +Validation Loss Decreased( 219.69421770766422 ---> 198.5592871694996 ) Saving The Model + +100%|██████████| 1796/1796 [21:33<00:00, 1.39it/s] +100%|██████████| 1144/1144 [01:38<00:00, 11.62it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 30 Training Loss: 0.12626396362086523 Validation Loss: 0.22748694864047736 time: 00:23:12 +Train Accuracy : 95.48390197753906 Validation Accuracy : 92.22028350830078 + +100%|██████████| 1796/1796 [21:39<00:00, 1.38it/s] +100%|██████████| 1144/1144 [01:36<00:00, 11.89it/s] + +Epoch 31 Training Loss: 0.1243195203532862 Validation Loss: 0.15573396021900965 time: 00:23:15 +Train Accuracy : 95.51174926757812 Validation Accuracy : 94.2599105834961 +Validation Loss Decreased( 198.5592871694996 ---> 178.15965049054705 ) Saving The Model + +100%|██████████| 1796/1796 [22:13<00:00, 1.35it/s] +100%|██████████| 1144/1144 [01:38<00:00, 11.56it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 32 Training Loss: 0.12209497421210111 Validation Loss: 0.19751328618058758 time: 00:23:52 +Train Accuracy : 95.52288055419922 Validation Accuracy : 93.26923370361328 + +100%|██████████| 1796/1796 [21:36<00:00, 1.39it/s] +100%|██████████| 1144/1144 [01:36<00:00, 11.83it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 33 Training Loss: 0.12278669627672056 Validation Loss: 0.25568632156248966 time: 00:23:13 +Train Accuracy : 95.62311553955078 Validation Accuracy : 91.05477905273438 + +100%|██████████| 1796/1796 [21:38<00:00, 1.38it/s] +100%|██████████| 1144/1144 [01:38<00:00, 11.62it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 34 Training Loss: 0.11644445447141527 Validation Loss: 0.19130310058533873 time: 00:23:17 +Train Accuracy : 95.84585571289062 Validation Accuracy : 93.06526947021484 + +100%|██████████| 1796/1796 [21:47<00:00, 1.37it/s] +100%|██████████| 1144/1144 [01:38<00:00, 11.57it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 35 Training Loss: 0.11643929763509502 Validation Loss: 0.21698788530739277 time: 00:23:26 +Train Accuracy : 95.82915496826172 Validation Accuracy : 92.62820434570312 + +100%|██████████| 1796/1796 [22:49<00:00, 1.31it/s] +100%|██████████| 1144/1144 [02:00<00:00, 9.53it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 36 Training Loss: 0.11314545146687183 Validation Loss: 0.17937653658909178 time: 00:24:49 +Train Accuracy : 95.84585571289062 Validation Accuracy : 94.11421966552734 + +100%|██████████| 1796/1796 [28:41<00:00, 1.04it/s] +100%|██████████| 1144/1144 [02:09<00:00, 8.87it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 37 Training Loss: 0.11227715401390395 Validation Loss: 0.1841336501966603 time: 00:30:50 +Train Accuracy : 95.95166015625 Validation Accuracy : 93.4149169921875 + +100%|██████████| 1796/1796 [30:40<00:00, 1.02s/it] +100%|██████████| 1144/1144 [02:10<00:00, 8.78it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 38 Training Loss: 0.1071929339383833 Validation Loss: 0.17111435995329394 time: 00:32:50 +Train Accuracy : 96.10201263427734 Validation Accuracy : 93.9102554321289 + +100%|██████████| 1796/1796 [30:58<00:00, 1.04s/it] +100%|██████████| 1144/1144 [02:10<00:00, 8.74it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 39 Training Loss: 0.10536505841217854 Validation Loss: 0.17860585031031706 time: 00:33:09 +Train Accuracy : 96.24679565429688 Validation Accuracy : 93.61888122558594 + +100%|██████████| 1796/1796 [31:15<00:00, 1.04s/it] +100%|██████████| 1144/1144 [02:11<00:00, 8.73it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 40 Training Loss: 0.1025733296694737 Validation Loss: 0.16341808670263447 time: 00:33:26 +Train Accuracy : 96.35816955566406 Validation Accuracy : 94.34732055664062 + +100%|██████████| 1796/1796 [31:21<00:00, 1.05s/it] +100%|██████████| 1144/1144 [02:12<00:00, 8.66it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 41 Training Loss: 0.1052557724369013 Validation Loss: 0.1674421660797369 time: 00:33:34 +Train Accuracy : 96.18553924560547 Validation Accuracy : 94.49301147460938 + +100%|██████████| 1796/1796 [26:26<00:00, 1.13it/s] +100%|██████████| 1144/1144 [02:00<00:00, 9.52it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 42 Training Loss: 0.10263119807659637 Validation Loss: 0.20584173513718435 time: 00:28:26 +Train Accuracy : 96.21895599365234 Validation Accuracy : 92.5407943725586 + +100%|██████████| 1796/1796 [25:43<00:00, 1.16it/s] +100%|██████████| 1144/1144 [01:59<00:00, 9.55it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 43 Training Loss: 0.10232017596648244 Validation Loss: 0.19133936254487285 time: 00:27:43 +Train Accuracy : 96.28577423095703 Validation Accuracy : 93.4149169921875 + +100%|██████████| 1796/1796 [22:16<00:00, 1.34it/s] +100%|██████████| 1144/1144 [01:33<00:00, 12.29it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 44 Training Loss: 0.09797717922651777 Validation Loss: 0.17769178415356504 time: 00:23:49 +Train Accuracy : 96.62545776367188 Validation Accuracy : 94.2599105834961 + +100%|██████████| 1796/1796 [20:36<00:00, 1.45it/s] +100%|██████████| 1144/1144 [01:32<00:00, 12.39it/s] + +Epoch 45 Training Loss: 0.0962465678795243 Validation Loss: 0.15445901458264635 time: 00:22:08 +Train Accuracy : 96.50294494628906 Validation Accuracy : 94.46387481689453 +Validation Loss Decreased( 178.15965049054705 ---> 176.70111268254743 ) Saving The Model + +100%|██████████| 1796/1796 [20:28<00:00, 1.46it/s] +100%|██████████| 1144/1144 [01:33<00:00, 12.22it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 46 Training Loss: 0.09185824797468396 Validation Loss: 0.17249739720020704 time: 00:22:01 +Train Accuracy : 96.7646713256836 Validation Accuracy : 94.28904724121094 + +100%|██████████| 1796/1796 [20:34<00:00, 1.45it/s] +100%|██████████| 1144/1144 [01:34<00:00, 12.11it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 47 Training Loss: 0.08947356818272058 Validation Loss: 0.16489796243608087 time: 00:22:09 +Train Accuracy : 96.80364990234375 Validation Accuracy : 94.93006896972656 + +100%|██████████| 1796/1796 [21:01<00:00, 1.42it/s] +100%|██████████| 1144/1144 [01:35<00:00, 11.96it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 48 Training Loss: 0.09256357114334521 Validation Loss: 0.18674146796817262 time: 00:22:37 +Train Accuracy : 96.90388488769531 Validation Accuracy : 94.05594635009766 + +100%|██████████| 1796/1796 [20:33<00:00, 1.46it/s] +100%|██████████| 1144/1144 [01:34<00:00, 12.05it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 49 Training Loss: 0.08656281119721079 Validation Loss: 0.18428602356302096 time: 00:22:08 +Train Accuracy : 96.90388488769531 Validation Accuracy : 94.2016372680664 + +100%|██████████| 1796/1796 [21:04<00:00, 1.42it/s] +100%|██████████| 1144/1144 [01:38<00:00, 11.61it/s] + 0%| | 0/1796 [00:00<?, ?it/s] + +Epoch 50 Training Loss: 0.08749571777711337 Validation Loss: 0.15860075746543972 time: 00:22:43 +Train Accuracy : 96.93729400634766 Validation Accuracy : 94.72611236572266 -- GitLab