{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from fastai import *\n", "from fastai.vision import *\n", "from fastai.utils.ipython import *\n", "from fastai.callbacks.tracker import SaveModelCallback\n", "from sklearn.model_selection import StratifiedKFold\n", "import matplotlib.pyplot as plt\n", "from functools import partial\n", "import pretrainedmodels" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[PosixPath('../../../Dataset/Herlev Dataset/best-base-vgg19-herlev-multiclass-5fold.pkl'),\n", " PosixPath('../../../Dataset/Herlev Dataset/abnormal_moderate-dysplastic'),\n", " PosixPath('../../../Dataset/Herlev Dataset/normal_superficiel'),\n", " PosixPath('../../../Dataset/Herlev Dataset/abnormal_light-dysplastic'),\n", " PosixPath('../../../Dataset/Herlev Dataset/abnormal_severe-dysplastic'),\n", " PosixPath('../../../Dataset/Herlev Dataset/normal_columnar'),\n", " PosixPath('../../../Dataset/Herlev Dataset/normal_intermediate'),\n", " PosixPath('../../../Dataset/Herlev Dataset/abnormal_carcinoma-in-situ'),\n", " PosixPath('../../../Dataset/Herlev Dataset/models')]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "path = Path(\".\")\n", "data_path = path / \"..\" / \"..\" / \"..\" / \"Dataset\" / \"Herlev Dataset\"\n", "data_path.ls()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "LabelLists;\n", "\n", "Train: LabelList (917 items)\n", "x: ImageList\n", "Image (3, 83, 146),Image (3, 106, 116),Image (3, 129, 119),Image (3, 108, 110),Image (3, 209, 173)\n", "y: CategoryList\n", "abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic\n", "Path: ../../../Dataset/Herlev Dataset;\n", "\n", "Valid: LabelList (0 items)\n", "x: ImageList\n", "\n", "y: CategoryList\n", "\n", "Path: ../../../Dataset/Herlev Dataset;\n", "\n", "Test: None" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_init = (ImageList.from_folder(data_path)\n", " .split_none()\n", " .label_from_folder())\n", "data_init" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "StratifiedKFold(n_splits=5, random_state=0, shuffle=True)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)\n", "skf" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "tfms = get_transforms(flip_vert=True, max_warp=0.0, max_rotate=30.0)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[ .new_type at 0x7f163c07f6a8>>,\n", " Precision(average='macro', pos_label=1, eps=1e-09),\n", " Recall(average='macro', pos_label=1, eps=1e-09),\n", " FBeta(average='macro', pos_label=1, eps=1e-09, beta=2),\n", " KappaScore(weights='quadratic')]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "our_metrics = [accuracy, Precision(average=\"macro\"), Recall(average=\"macro\"), FBeta(average=\"macro\"), KappaScore(weights=\"quadratic\")]\n", "our_metrics" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "idxs = [[train_idx, val_idx] for train_idx, val_idx in skf.split(data_init.x.items, data_init.y.items)]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def model_callback(model, model_name):\n", " return [SaveModelCallback(model, every=\"improvement\", monitor=\"accuracy\", name=model_name)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Fold-1" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ImageDataBunch;\n", "\n", "Train: LabelList (733 items)\n", "x: ImageList\n", "Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64)\n", "y: CategoryList\n", "abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic\n", "Path: ../../../Dataset/Herlev Dataset;\n", "\n", "Valid: LabelList (184 items)\n", "x: ImageList\n", "Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64)\n", "y: CategoryList\n", "abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic\n", "Path: ../../../Dataset/Herlev Dataset;\n", "\n", "Test: None" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fold_idxs = idxs[0]\n", "fold_data = (ImageList.from_folder(data_path)\n", " .split_by_idxs(fold_idxs[0], fold_idxs[1])\n", " .label_from_folder()\n", " .transform(tfms, size=64)\n", " .databunch(bs=64)\n", " .normalize(imagenet_stats))\n", "fold_data" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "model_name = 'resnet34' # could be fbresnet152 or inceptionresnetv2\n", "model_cadene = pretrainedmodels.__dict__[model_name](num_classes=1000, pretrained='imagenet')" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ResNet(\n", " (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n", " (layer1): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (2): BasicBlock(\n", " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (layer2): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (2): BasicBlock(\n", " (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (3): BasicBlock(\n", " (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (layer3): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (2): BasicBlock(\n", " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (3): BasicBlock(\n", " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (4): BasicBlock(\n", " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (5): BasicBlock(\n", " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (layer4): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (2): BasicBlock(\n", " (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n", " (fc): None\n", " (last_linear): Linear(in_features=512, out_features=7, bias=True)\n", ")" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model_cadene.last_linear = torch.nn.Linear(model_cadene.last_linear.in_features, int(fold_data.c))\n", "model_cadene.input_size = [3, 64, 64]\n", "model_cadene" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Learner(data=ImageDataBunch;\n", "\n", "Train: LabelList (733 items)\n", "x: ImageList\n", "Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64)\n", "y: CategoryList\n", "abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic\n", "Path: ../../../Dataset/Herlev Dataset;\n", "\n", "Valid: LabelList (184 items)\n", "x: ImageList\n", "Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64)\n", "y: CategoryList\n", "abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic\n", "Path: ../../../Dataset/Herlev Dataset;\n", "\n", "Test: None, model=ResNet(\n", " (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n", " (layer1): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (2): BasicBlock(\n", " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (layer2): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (2): BasicBlock(\n", " (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (3): BasicBlock(\n", " (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (layer3): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (2): BasicBlock(\n", " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (3): BasicBlock(\n", " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (4): BasicBlock(\n", " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (5): BasicBlock(\n", " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (layer4): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (2): BasicBlock(\n", " (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n", " (fc): None\n", " (last_linear): Linear(in_features=512, out_features=7, bias=True)\n", "), opt_func=functools.partial(, betas=(0.9, 0.99)), loss_func=FlattenedLoss of CrossEntropyLoss(), metrics=[, Precision(average='macro', pos_label=1, eps=1e-09), Recall(average='macro', pos_label=1, eps=1e-09), FBeta(average='macro', pos_label=1, eps=1e-09, beta=2), KappaScore(weights='quadratic')], true_wd=True, bn_wd=True, wd=0.01, train_bn=True, path=PosixPath('../../../Dataset/Herlev Dataset'), model_dir='models', callback_fns=[functools.partial(, add_time=True, silent=False)], callbacks=[MixedPrecision\n", "learn: Learner(data=ImageDataBunch;\n", "\n", "Train: LabelList (733 items)\n", "x: ImageList\n", "Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64)\n", "y: CategoryList\n", "abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic\n", "Path: ../../../Dataset/Herlev Dataset;\n", "\n", "Valid: LabelList (184 items)\n", "x: ImageList\n", "Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64)\n", "y: CategoryList\n", "abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic\n", "Path: ../../../Dataset/Herlev Dataset;\n", "\n", "Test: None, model=ResNet(\n", " (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n", " (layer1): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (2): BasicBlock(\n", " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (layer2): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (2): BasicBlock(\n", " (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (3): BasicBlock(\n", " (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (layer3): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (2): BasicBlock(\n", " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (3): BasicBlock(\n", " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (4): BasicBlock(\n", " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (5): BasicBlock(\n", " (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (layer4): Sequential(\n", " (0): BasicBlock(\n", " (conv1): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (downsample): Sequential(\n", " (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (1): BasicBlock(\n", " (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " (2): BasicBlock(\n", " (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU(inplace=True)\n", " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " )\n", " )\n", " (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n", " (fc): None\n", " (last_linear): Linear(in_features=512, out_features=7, bias=True)\n", "), opt_func=functools.partial(, betas=(0.9, 0.99)), loss_func=FlattenedLoss of CrossEntropyLoss(), metrics=[, Precision(average='macro', pos_label=1, eps=1e-09), Recall(average='macro', pos_label=1, eps=1e-09), FBeta(average='macro', pos_label=1, eps=1e-09, beta=2), KappaScore(weights='quadratic')], true_wd=True, bn_wd=True, wd=0.01, train_bn=True, path=PosixPath('../../../Dataset/Herlev Dataset'), model_dir='models', callback_fns=[functools.partial(, add_time=True, silent=False)], callbacks=[...], layer_groups=[Sequential(\n", " (0): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n", " (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU(inplace=True)\n", " (3): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n", " (4): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (5): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (6): ReLU(inplace=True)\n", " (7): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (8): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (9): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (10): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (11): ReLU(inplace=True)\n", " (12): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (13): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (14): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (15): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (16): ReLU(inplace=True)\n", " (17): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (18): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (19): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (20): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (21): ReLU(inplace=True)\n", " (22): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (23): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (24): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (25): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (26): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (27): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (28): ReLU(inplace=True)\n", " (29): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (30): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (31): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (32): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (33): ReLU(inplace=True)\n", " (34): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (35): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (36): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (37): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (38): ReLU(inplace=True)\n", " (39): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (40): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (41): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (42): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (43): ReLU(inplace=True)\n", " (44): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (45): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (46): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (47): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (48): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (49): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (50): ReLU(inplace=True)\n", " (51): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (52): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (53): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (54): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (55): ReLU(inplace=True)\n", " (56): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (57): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (58): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (59): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (60): ReLU(inplace=True)\n", " (61): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (62): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (63): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (64): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (65): ReLU(inplace=True)\n", " (66): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (67): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (68): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (69): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (70): ReLU(inplace=True)\n", " (71): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (72): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (73): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (74): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (75): ReLU(inplace=True)\n", " (76): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (77): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (78): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (79): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (80): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (81): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (82): ReLU(inplace=True)\n", " (83): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (84): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (85): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (86): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (87): ReLU(inplace=True)\n", " (88): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (89): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (90): AdaptiveAvgPool2d(output_size=(1, 1))\n", " (91): Linear(in_features=512, out_features=7, bias=True)\n", ")], add_time=True, silent=False)\n", "loss_scale: 65536\n", "max_noskip: 1000\n", "dynamic: True\n", "clip: None\n", "flat_master: False\n", "max_scale: 16777216\n", "loss_fp32: True], layer_groups=[Sequential(\n", " (0): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n", " (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (2): ReLU(inplace=True)\n", " (3): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n", " (4): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (5): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (6): ReLU(inplace=True)\n", " (7): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (8): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (9): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (10): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (11): ReLU(inplace=True)\n", " (12): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (13): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (14): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (15): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (16): ReLU(inplace=True)\n", " (17): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (18): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (19): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (20): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (21): ReLU(inplace=True)\n", " (22): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (23): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (24): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (25): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (26): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (27): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (28): ReLU(inplace=True)\n", " (29): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (30): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (31): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (32): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (33): ReLU(inplace=True)\n", " (34): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (35): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (36): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (37): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (38): ReLU(inplace=True)\n", " (39): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (40): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (41): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (42): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (43): ReLU(inplace=True)\n", " (44): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (45): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (46): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (47): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (48): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (49): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (50): ReLU(inplace=True)\n", " (51): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (52): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (53): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (54): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (55): ReLU(inplace=True)\n", " (56): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (57): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (58): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (59): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (60): ReLU(inplace=True)\n", " (61): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (62): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (63): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (64): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (65): ReLU(inplace=True)\n", " (66): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (67): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (68): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (69): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (70): ReLU(inplace=True)\n", " (71): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (72): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (73): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (74): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (75): ReLU(inplace=True)\n", " (76): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (77): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (78): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (79): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (80): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (81): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (82): ReLU(inplace=True)\n", " (83): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (84): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (85): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (86): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (87): ReLU(inplace=True)\n", " (88): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (89): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (90): AdaptiveAvgPool2d(output_size=(1, 1))\n", " (91): Linear(in_features=512, out_features=7, bias=True)\n", ")], add_time=True, silent=False)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learner = Learner(fold_data, model_cadene, metrics=our_metrics).to_fp16()\n", "learner" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ResNet\n", "======================================================================\n", "Layer (type) Output Shape Param # Trainable \n", "======================================================================\n", "Conv2d [64, 32, 32] 9,408 True \n", "______________________________________________________________________\n", "BatchNorm2d [64, 32, 32] 128 True \n", "______________________________________________________________________\n", "ReLU [64, 32, 32] 0 False \n", "______________________________________________________________________\n", "MaxPool2d [64, 16, 16] 0 False \n", "______________________________________________________________________\n", "Conv2d [64, 16, 16] 36,864 True \n", "______________________________________________________________________\n", "BatchNorm2d [64, 16, 16] 128 True \n", "______________________________________________________________________\n", "ReLU [64, 16, 16] 0 False \n", "______________________________________________________________________\n", "Conv2d [64, 16, 16] 36,864 True \n", "______________________________________________________________________\n", "BatchNorm2d [64, 16, 16] 128 True \n", "______________________________________________________________________\n", "Conv2d [64, 16, 16] 36,864 True \n", "______________________________________________________________________\n", "BatchNorm2d [64, 16, 16] 128 True \n", "______________________________________________________________________\n", "ReLU [64, 16, 16] 0 False \n", "______________________________________________________________________\n", "Conv2d [64, 16, 16] 36,864 True \n", "______________________________________________________________________\n", "BatchNorm2d [64, 16, 16] 128 True \n", "______________________________________________________________________\n", "Conv2d [64, 16, 16] 36,864 True \n", "______________________________________________________________________\n", "BatchNorm2d [64, 16, 16] 128 True \n", "______________________________________________________________________\n", "ReLU [64, 16, 16] 0 False \n", "______________________________________________________________________\n", "Conv2d [64, 16, 16] 36,864 True \n", "______________________________________________________________________\n", "BatchNorm2d [64, 16, 16] 128 True \n", "______________________________________________________________________\n", "Conv2d [128, 8, 8] 73,728 True \n", "______________________________________________________________________\n", "BatchNorm2d [128, 8, 8] 256 True \n", "______________________________________________________________________\n", "ReLU [128, 8, 8] 0 False \n", "______________________________________________________________________\n", "Conv2d [128, 8, 8] 147,456 True \n", "______________________________________________________________________\n", "BatchNorm2d [128, 8, 8] 256 True \n", "______________________________________________________________________\n", "Conv2d [128, 8, 8] 8,192 True \n", "______________________________________________________________________\n", "BatchNorm2d [128, 8, 8] 256 True \n", "______________________________________________________________________\n", "Conv2d [128, 8, 8] 147,456 True \n", "______________________________________________________________________\n", "BatchNorm2d [128, 8, 8] 256 True \n", "______________________________________________________________________\n", "ReLU [128, 8, 8] 0 False \n", "______________________________________________________________________\n", "Conv2d [128, 8, 8] 147,456 True \n", "______________________________________________________________________\n", "BatchNorm2d [128, 8, 8] 256 True \n", "______________________________________________________________________\n", "Conv2d [128, 8, 8] 147,456 True \n", "______________________________________________________________________\n", "BatchNorm2d [128, 8, 8] 256 True \n", "______________________________________________________________________\n", "ReLU [128, 8, 8] 0 False \n", "______________________________________________________________________\n", "Conv2d [128, 8, 8] 147,456 True \n", "______________________________________________________________________\n", "BatchNorm2d [128, 8, 8] 256 True \n", "______________________________________________________________________\n", "Conv2d [128, 8, 8] 147,456 True \n", "______________________________________________________________________\n", "BatchNorm2d [128, 8, 8] 256 True \n", "______________________________________________________________________\n", "ReLU [128, 8, 8] 0 False \n", "______________________________________________________________________\n", "Conv2d [128, 8, 8] 147,456 True \n", "______________________________________________________________________\n", "BatchNorm2d [128, 8, 8] 256 True \n", "______________________________________________________________________\n", "Conv2d [256, 4, 4] 294,912 True \n", "______________________________________________________________________\n", "BatchNorm2d [256, 4, 4] 512 True \n", "______________________________________________________________________\n", "ReLU [256, 4, 4] 0 False \n", "______________________________________________________________________\n", "Conv2d [256, 4, 4] 589,824 True \n", "______________________________________________________________________\n", "BatchNorm2d [256, 4, 4] 512 True \n", "______________________________________________________________________\n", "Conv2d [256, 4, 4] 32,768 True \n", "______________________________________________________________________\n", "BatchNorm2d [256, 4, 4] 512 True \n", "______________________________________________________________________\n", "Conv2d [256, 4, 4] 589,824 True \n", "______________________________________________________________________\n", "BatchNorm2d [256, 4, 4] 512 True \n", "______________________________________________________________________\n", "ReLU [256, 4, 4] 0 False \n", "______________________________________________________________________\n", "Conv2d [256, 4, 4] 589,824 True \n", "______________________________________________________________________\n", "BatchNorm2d [256, 4, 4] 512 True \n", "______________________________________________________________________\n", "Conv2d [256, 4, 4] 589,824 True \n", "______________________________________________________________________\n", "BatchNorm2d [256, 4, 4] 512 True \n", "______________________________________________________________________\n", "ReLU [256, 4, 4] 0 False \n", "______________________________________________________________________\n", "Conv2d [256, 4, 4] 589,824 True \n", "______________________________________________________________________\n", "BatchNorm2d [256, 4, 4] 512 True \n", "______________________________________________________________________\n", "Conv2d [256, 4, 4] 589,824 True \n", "______________________________________________________________________\n", "BatchNorm2d [256, 4, 4] 512 True \n", "______________________________________________________________________\n", "ReLU [256, 4, 4] 0 False \n", "______________________________________________________________________\n", "Conv2d [256, 4, 4] 589,824 True \n", "______________________________________________________________________\n", "BatchNorm2d [256, 4, 4] 512 True \n", "______________________________________________________________________\n", "Conv2d [256, 4, 4] 589,824 True \n", "______________________________________________________________________\n", "BatchNorm2d [256, 4, 4] 512 True \n", "______________________________________________________________________\n", "ReLU [256, 4, 4] 0 False \n", "______________________________________________________________________\n", "Conv2d [256, 4, 4] 589,824 True \n", "______________________________________________________________________\n", "BatchNorm2d [256, 4, 4] 512 True \n", "______________________________________________________________________\n", "Conv2d [256, 4, 4] 589,824 True \n", "______________________________________________________________________\n", "BatchNorm2d [256, 4, 4] 512 True \n", "______________________________________________________________________\n", "ReLU [256, 4, 4] 0 False \n", "______________________________________________________________________\n", "Conv2d [256, 4, 4] 589,824 True \n", "______________________________________________________________________\n", "BatchNorm2d [256, 4, 4] 512 True \n", "______________________________________________________________________\n", "Conv2d [512, 2, 2] 1,179,648 True \n", "______________________________________________________________________\n", "BatchNorm2d [512, 2, 2] 1,024 True \n", "______________________________________________________________________\n", "ReLU [512, 2, 2] 0 False \n", "______________________________________________________________________\n", "Conv2d [512, 2, 2] 2,359,296 True \n", "______________________________________________________________________\n", "BatchNorm2d [512, 2, 2] 1,024 True \n", "______________________________________________________________________\n", "Conv2d [512, 2, 2] 131,072 True \n", "______________________________________________________________________\n", "BatchNorm2d [512, 2, 2] 1,024 True \n", "______________________________________________________________________\n", "Conv2d [512, 2, 2] 2,359,296 True \n", "______________________________________________________________________\n", "BatchNorm2d [512, 2, 2] 1,024 True \n", "______________________________________________________________________\n", "ReLU [512, 2, 2] 0 False \n", "______________________________________________________________________\n", "Conv2d [512, 2, 2] 2,359,296 True \n", "______________________________________________________________________\n", "BatchNorm2d [512, 2, 2] 1,024 True \n", "______________________________________________________________________\n", "Conv2d [512, 2, 2] 2,359,296 True \n", "______________________________________________________________________\n", "BatchNorm2d [512, 2, 2] 1,024 True \n", "______________________________________________________________________\n", "ReLU [512, 2, 2] 0 False \n", "______________________________________________________________________\n", "Conv2d [512, 2, 2] 2,359,296 True \n", "______________________________________________________________________\n", "BatchNorm2d [512, 2, 2] 1,024 True \n", "______________________________________________________________________\n", "AdaptiveAvgPool2d [512, 1, 1] 0 False \n", "______________________________________________________________________\n", "Linear [7] 3,591 True \n", "______________________________________________________________________\n", "\n", "Total params: 21,288,263\n", "Total trainable params: 21,288,263\n", "Total non-trainable params: 0\n", "Optimized with 'torch.optim.adam.Adam', betas=(0.9, 0.99)\n", "Using true weight decay as discussed in https://www.fast.ai/2018/07/02/adam-weight-decay/ \n", "Loss function : FlattenedLoss\n", "======================================================================\n", "Callbacks functions applied \n", " MixedPrecision" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learner.summary()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " \n", " 80.00% [8/10 00:12<00:03]\n", "
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracyprecisionrecallf_betakappa_scoretime
02.343531#na#00:01
12.343973#na#00:01
22.312551#na#00:01
32.084052#na#00:01
41.785297#na#00:01
51.760784#na#00:01
62.403167#na#00:01
72.676993#na#00:01

\n", "\n", "

\n", " \n", " \n", " 90.91% [10/11 00:01<00:00 4.7520]\n", "
\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "learner.lr_find()\n", "learner.recorder.plot()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracyprecisionrecallf_betakappa_scoretime
02.1187421.8297660.2826090.2705250.3007230.2767410.43547800:02
11.7767891.3996420.4945650.5138860.5200840.5121930.64274300:02
21.4879931.2442590.5108700.5257810.5305910.5258250.66406200:02
31.2864281.3020760.5434780.6012810.5714640.5722820.65453400:02
41.1433521.3608680.5163040.5301010.5409970.5221590.66325400:02
51.0692031.4726810.5108700.5620630.5532830.5477440.63175400:02
61.0151651.3199040.5652170.6497720.6270140.6081730.70757100:02
70.9709981.3804710.5597830.6193020.5734040.5743480.70390100:02
80.9249311.2724650.5597830.6221090.5909820.5705940.73556000:02
90.8888571.4991500.5815220.6791360.5802960.5878070.66503000:02
100.8488181.4883760.5597830.6174440.6267530.6074650.64732000:02
110.8001871.7572110.5108700.5835960.5120380.4956970.68394700:02
120.7660001.3106210.5815220.6403700.5774370.5739190.77412700:02
130.7302761.1076020.6521740.7062890.6855770.6850850.76663700:02
140.6928601.4060870.5760870.6674790.6062660.6096380.70442700:02
150.6598351.2927650.6304350.7038900.6501650.6456000.76685000:02
160.6242541.2569760.6358700.6904400.6647880.6685550.73758200:02
170.5873790.9226480.6684780.6798410.6824830.6778680.83184900:02
180.5441821.0393680.6739130.7244490.7093870.7080410.76330300:02
190.5071281.2816890.6195650.6703720.6197890.6197150.73202900:02
200.4828501.1995290.6358700.6817860.6752420.6722900.80388200:02
210.4443381.3552640.5923910.6507630.6126650.6104170.72566400:02
220.4217351.1750540.6576090.7306000.6856080.6910450.76636000:02
230.3851711.0214690.6847830.7402690.7181410.7199490.80971700:02
240.3543500.9946750.6956520.7269330.7181140.7189290.82590800:02
250.3247371.0406670.7010870.7482230.7172130.7215540.82663100:02
260.3001351.0963470.6847830.7315690.6925260.6973400.81526400:02
270.2809881.1156580.6793480.7282310.6888630.6929960.81631000:02
280.2603861.1091560.6630430.7098670.6700350.6749350.80588900:02
290.2436801.1207890.6684780.7298540.6865830.6922310.80438100:02
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Better model found at epoch 0 with accuracy value: 0.28260868787765503.\n", "Better model found at epoch 1 with accuracy value: 0.4945652186870575.\n", "Better model found at epoch 2 with accuracy value: 0.510869562625885.\n", "Better model found at epoch 3 with accuracy value: 0.54347825050354.\n", "Better model found at epoch 6 with accuracy value: 0.5652173757553101.\n", "Better model found at epoch 9 with accuracy value: 0.58152174949646.\n", "Better model found at epoch 13 with accuracy value: 0.6521739363670349.\n", "Better model found at epoch 17 with accuracy value: 0.66847825050354.\n", "Better model found at epoch 18 with accuracy value: 0.6739130616188049.\n", "Better model found at epoch 23 with accuracy value: 0.6847826242446899.\n", "Better model found at epoch 24 with accuracy value: 0.695652186870575.\n", "Better model found at epoch 25 with accuracy value: 0.7010869383811951.\n" ] } ], "source": [ "learner.fit_one_cycle(30, max_lr=slice(8e-04), callbacks=model_callback(learner, \"best-base-rn34-herlev-multiclass-fold1\"))\n", "learner.save(\"last-base-rn34-herlev-multiclass-fold1\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Fold-2" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ImageDataBunch;\n", "\n", "Train: LabelList (733 items)\n", "x: ImageList\n", "Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64)\n", "y: CategoryList\n", "abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic\n", "Path: ../../../Dataset/Herlev Dataset;\n", "\n", "Valid: LabelList (184 items)\n", "x: ImageList\n", "Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64)\n", "y: CategoryList\n", "abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic\n", "Path: ../../../Dataset/Herlev Dataset;\n", "\n", "Test: None" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fold_idxs = idxs[1]\n", "fold_data = (ImageList.from_folder(data_path)\n", " .split_by_idxs(fold_idxs[0], fold_idxs[1])\n", " .label_from_folder()\n", " .transform(tfms, size=64)\n", " .databunch(bs=64)\n", " .normalize(imagenet_stats))\n", "fold_data" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " \n", " 70.00% [7/10 00:11<00:04]\n", "
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracyprecisionrecallf_betakappa_scoretime
00.462626#na#00:01
10.456596#na#00:01
20.451608#na#00:01
30.424821#na#00:01
40.436560#na#00:01
50.674590#na#00:01
61.400458#na#00:01

\n", "\n", "

\n", " \n", " \n", " 90.91% [10/11 00:01<00:00 1.6361]\n", "
\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "learner.load(\"best-base-rn34-herlev-multiclass-fold1\")\n", "learner.data = fold_data\n", "learner = to_fp16(learner)\n", "learner.lr_find()\n", "learner.recorder.plot()" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracyprecisionrecallf_betakappa_scoretime
00.4487700.1051190.9619570.9680520.9717990.9706380.96005500:02
10.4626010.1070750.9673910.9753640.9765610.9758110.97317800:02
20.4466530.1184670.9510870.9607960.9644730.9630700.96161200:02
30.4264330.1413250.9456520.9483920.9479260.9465770.96124100:02
40.4135500.1714870.9293480.9360020.9367390.9344750.95894300:02
50.3895060.2115320.9184780.9313840.9353710.9324030.95046600:02
60.3596280.2308070.9076090.9261770.9278660.9258350.91877600:02
70.3439910.2200040.9130430.9274690.9283960.9277470.93297900:02
80.3434270.2454400.9021740.9127350.9178790.9153260.92943300:02
90.3484740.3175570.8695650.8927310.8900060.8880790.89076800:02
100.3344760.2490950.9021740.9225280.9249250.9240150.94119700:02
110.3231520.3481610.9076090.9270970.9275230.9267980.93356300:02
120.3177820.4118880.8478260.8728920.8694200.8688550.91397500:02
130.3039190.3673670.8641300.8938520.8821200.8838290.91133300:02
140.2833270.2977940.9021740.9128920.9176620.9154060.94848100:02
150.2650930.3878000.8804350.8978870.8980130.8964310.93481900:02
160.2595080.3635330.8586960.8814120.8899430.8872300.91799300:02
170.2412180.3955720.8532610.8719250.8858880.8803510.92933800:02
180.2223250.3508890.8858700.9050680.9103780.9072300.94598300:02
190.2068830.3813040.8423910.8718620.8683840.8660450.88362100:02
200.1909460.2858050.8858700.9040530.9093570.9080080.91140000:02
210.1820770.2838930.9021740.9192990.9214790.9206130.93558100:02
220.1715370.2908620.9021740.9225930.9229590.9227290.92767800:02
230.1604610.3008280.8858700.9070780.9074250.9067400.91355800:02
240.1499800.3018130.9076090.9226710.9244390.9237150.93619300:02
250.1359570.2992820.9130430.9271470.9326470.9311600.94896900:02
260.1240130.2896980.9184780.9316350.9363100.9351090.95617000:02
270.1199510.2891530.9130430.9271470.9326470.9311600.94896900:02
280.1158420.2931300.9130430.9271470.9326470.9311600.94896900:02
290.1092190.2916510.9184780.9316350.9363100.9351090.95617000:02
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Better model found at epoch 0 with accuracy value: 0.9619565010070801.\n", "Better model found at epoch 1 with accuracy value: 0.967391312122345.\n" ] } ], "source": [ "learner.fit_one_cycle(30, max_lr=slice(2e-04), callbacks=model_callback(learner, \"best-base-rn34-herlev-multiclass-fold2\"))\n", "learner.save(\"last-base-rn34-herlev-multiclass-fold2\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Fold-3" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ImageDataBunch;\n", "\n", "Train: LabelList (734 items)\n", "x: ImageList\n", "Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64)\n", "y: CategoryList\n", "abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic\n", "Path: ../../../Dataset/Herlev Dataset;\n", "\n", "Valid: LabelList (183 items)\n", "x: ImageList\n", "Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64)\n", "y: CategoryList\n", "abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic\n", "Path: ../../../Dataset/Herlev Dataset;\n", "\n", "Test: None" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fold_idxs = idxs[2]\n", "fold_data = (ImageList.from_folder(data_path)\n", " .split_by_idxs(fold_idxs[0], fold_idxs[1])\n", " .label_from_folder()\n", " .transform(tfms, size=64)\n", " .databunch(bs=64)\n", " .normalize(imagenet_stats))\n", "fold_data" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " \n", " 70.00% [7/10 00:11<00:04]\n", "
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracyprecisionrecallf_betakappa_scoretime
00.379454#na#00:01
10.425238#na#00:01
20.421274#na#00:01
30.422423#na#00:01
40.460228#na#00:01
50.702370#na#00:01
61.127052#na#00:01

\n", "\n", "

\n", " \n", " \n", " 9.09% [1/11 00:00<00:08 1.3272]\n", "
\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "learner.load(\"best-base-rn34-herlev-multiclass-fold2\")\n", "learner.data = fold_data\n", "learner = to_fp16(learner)\n", "learner.lr_find()\n", "learner.recorder.plot()" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracyprecisionrecallf_betakappa_scoretime
00.3874960.1176030.9781420.9828480.9853170.9845320.99415100:02
10.3911930.1157880.9781420.9828480.9853170.9845320.99415100:02
20.4198480.1173280.9781420.9828480.9853170.9845320.99415100:02
30.4303570.1173020.9781420.9828480.9853170.9845320.99415100:02
40.4292390.1170750.9781420.9828480.9853170.9845320.99415100:02
50.4277680.1180720.9781420.9828480.9853170.9845320.99415100:02
60.4254870.1174010.9781420.9828480.9853170.9845320.99415100:02
70.4143540.1202190.9781420.9828480.9853170.9845320.99415100:02
80.4263010.1172480.9781420.9828480.9853170.9845320.99415100:02
90.4295080.1194080.9781420.9828480.9853170.9845320.99415100:02
100.4323990.1166170.9781420.9828480.9853170.9845320.99415100:02
110.4338850.1182520.9781420.9828480.9853170.9845320.99415100:02
120.4201700.1175770.9781420.9828480.9853170.9845320.99415100:02
130.4197590.1180530.9781420.9828480.9853170.9845320.99415100:02
140.4225320.1178470.9781420.9828480.9853170.9845320.99415100:02
150.4267310.1184860.9781420.9828480.9853170.9845320.99415100:02
160.4234010.1174730.9781420.9828480.9853170.9845320.99415100:02
170.4205960.1169910.9781420.9828480.9853170.9845320.99415100:02
180.4209820.1165720.9781420.9828480.9853170.9845320.99415100:02
190.4180060.1154020.9781420.9828480.9853170.9845320.99415100:02
200.4123850.1159870.9781420.9828480.9853170.9845320.99415100:02
210.4114740.1190180.9781420.9828480.9853170.9845320.99415100:02
220.4139050.1186030.9781420.9828480.9853170.9845320.99415100:02
230.4147550.1165440.9781420.9828480.9853170.9845320.99415100:02
240.4100300.1164980.9781420.9828480.9853170.9845320.99415100:02
250.4042710.1168430.9781420.9828480.9853170.9845320.99415100:02
260.4011660.1180060.9781420.9828480.9853170.9845320.99415100:02
270.4074250.1174380.9781420.9828480.9853170.9845320.99415100:02
280.4123380.1156210.9781420.9828480.9853170.9845320.99415100:02
290.4181660.1164360.9781420.9828480.9853170.9845320.99415100:02
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Better model found at epoch 0 with accuracy value: 0.9781420826911926.\n" ] } ], "source": [ "learner.fit_one_cycle(30, max_lr=slice(7.1e-07), callbacks=model_callback(learner, \"best-base-rn34-herlev-multiclass-fold3\"))\n", "learner.save(\"last-base-rn34-herlev-multiclass-fold3\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Fold-4" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ImageDataBunch;\n", "\n", "Train: LabelList (734 items)\n", "x: ImageList\n", "Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64)\n", "y: CategoryList\n", "abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic\n", "Path: ../../../Dataset/Herlev Dataset;\n", "\n", "Valid: LabelList (183 items)\n", "x: ImageList\n", "Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64)\n", "y: CategoryList\n", "abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic\n", "Path: ../../../Dataset/Herlev Dataset;\n", "\n", "Test: None" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fold_idxs = idxs[3]\n", "fold_data = (ImageList.from_folder(data_path)\n", " .split_by_idxs(fold_idxs[0], fold_idxs[1])\n", " .label_from_folder()\n", " .transform(tfms, size=64)\n", " .databunch(bs=64)\n", " .normalize(imagenet_stats))\n", "fold_data" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " \n", " 60.00% [6/10 00:09<00:06]\n", "
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracyprecisionrecallf_betakappa_scoretime
00.454659#na#00:01
10.451272#na#00:01
20.421267#na#00:01
30.401503#na#00:01
40.422812#na#00:01
50.727945#na#00:01

\n", "\n", "

\n", " \n", " \n", " 90.91% [10/11 00:01<00:00 1.2607]\n", "
\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "learner.load(\"best-base-rn34-herlev-multiclass-fold3\")\n", "learner.data = fold_data\n", "learner = to_fp16(learner)\n", "learner.lr_find()\n", "learner.recorder.plot()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracyprecisionrecallf_betakappa_scoretime
00.3878710.0933190.9726780.9791990.9778460.9780770.98248500:02
10.3776240.0932670.9726780.9791990.9778460.9780770.98248500:02
20.3730840.0926090.9781420.9827720.9827720.9827720.98331800:02
30.3799460.0988260.9781420.9827720.9827720.9827720.98331800:02
40.3852170.1075170.9726780.9792110.9780100.9782120.97569400:02
50.3711370.1167790.9726780.9785710.9793650.9791630.96908900:02
60.3513000.1117500.9726780.9785710.9793650.9791630.96908900:02
70.3278240.1183090.9726780.9778070.9805560.9798080.97588600:02
80.3238480.1369440.9617490.9705450.9682750.9685470.96735900:02
90.3149800.1237870.9726780.9783280.9803910.9797010.97611800:02
100.3046470.1531660.9453550.9594900.9562530.9566310.96913600:02
110.2957010.1460740.9617490.9716160.9696770.9699720.96054700:02
120.2921810.1476820.9508200.9656460.9594280.9601740.96536500:02
130.2756120.1589650.9672130.9752280.9742750.9743850.97506000:02
140.2618960.1264720.9726780.9797770.9803910.9801340.97769500:02
150.2498710.1465760.9508200.9623670.9613440.9614150.95367600:02
160.2313340.1442190.9453550.9579370.9550150.9555100.95989000:02
170.2137550.1465680.9289620.9468730.9421530.9427770.94903800:02
180.2030790.1374070.9508200.9586320.9610150.9600110.96355200:02
190.1956800.1383760.9508200.9623580.9610150.9609250.96337000:02
200.1828790.1552340.9453550.9590650.9548510.9555640.96263900:02
210.1772570.1435920.9508200.9621380.9635610.9629130.96387700:02
220.1619110.1239660.9672130.9751430.9756300.9754910.97256400:02
230.1558810.1245340.9672130.9739340.9756300.9752100.97671900:02
240.1456440.1220720.9562840.9683670.9659410.9663330.96408100:02
250.1397720.1175060.9562840.9666870.9659410.9660600.96825500:02
260.1296940.1191760.9508200.9651120.9611800.9617890.95635300:02
270.1237400.1165210.9562840.9683670.9659410.9663330.96408100:02
280.1165530.1191570.9508200.9639840.9623700.9626540.96080000:02
290.1155670.1194160.9562840.9683670.9659410.9663330.96408100:02
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Better model found at epoch 0 with accuracy value: 0.9726775884628296.\n", "Better model found at epoch 2 with accuracy value: 0.9781420826911926.\n" ] } ], "source": [ "learner.fit_one_cycle(30, max_lr=slice(1e-04), callbacks=model_callback(learner, \"best-base-rn34-herlev-multiclass-fold4\"))\n", "learner.save(\"last-base-rn34-herlev-multiclass-fold4\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Fold-5" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ImageDataBunch;\n", "\n", "Train: LabelList (734 items)\n", "x: ImageList\n", "Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64)\n", "y: CategoryList\n", "abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic\n", "Path: ../../../Dataset/Herlev Dataset;\n", "\n", "Valid: LabelList (183 items)\n", "x: ImageList\n", "Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64),Image (3, 64, 64)\n", "y: CategoryList\n", "abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic,abnormal_moderate-dysplastic\n", "Path: ../../../Dataset/Herlev Dataset;\n", "\n", "Test: None" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fold_idxs = idxs[4]\n", "fold_data = (ImageList.from_folder(data_path)\n", " .split_by_idxs(fold_idxs[0], fold_idxs[1])\n", " .label_from_folder()\n", " .transform(tfms, size=64)\n", " .databunch(bs=64)\n", " .normalize(imagenet_stats))\n", "fold_data" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " \n", " 70.00% [7/10 00:11<00:04]\n", "
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracyprecisionrecallf_betakappa_scoretime
00.396296#na#00:01
10.382338#na#00:01
20.405599#na#00:01
30.377059#na#00:01
40.403092#na#00:01
50.715034#na#00:01
61.157639#na#00:01

\n", "\n", "

\n", " \n", " \n", " 18.18% [2/11 00:00<00:04 1.2524]\n", "
\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "learner.load(\"best-base-rn34-herlev-multiclass-fold4\")\n", "learner.data = fold_data\n", "learner = to_fp16(learner)\n", "learner.lr_find()\n", "learner.recorder.plot()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracyprecisionrecallf_betakappa_scoretime
00.3741880.1045840.9672130.9742000.9744200.9741450.97653300:02
10.3651970.1048000.9672130.9755350.9731570.9733100.98318400:02
20.3766640.1047820.9617490.9704190.9704520.9702460.97313900:02
30.3756390.1060490.9672130.9744500.9752140.9749190.97406400:02
40.3679930.1193190.9617490.9702880.9702880.9702380.97327100:02
50.3593740.1234140.9726780.9788770.9787120.9786950.98830600:02
60.3350280.1383360.9672130.9752300.9739510.9740620.98742900:02
70.3227220.1347060.9562840.9606660.9625150.9615620.97649400:02
80.3132850.1480530.9453550.9596760.9567960.9568630.95684600:02
90.3001040.1896830.9289620.9516220.9401250.9409170.94719100:02
100.2930220.2145870.9234970.9415090.9393120.9394230.95360700:02
110.2875630.1525270.9344260.9537370.9496530.9495270.95431600:02
120.2797050.1605180.9562840.9684340.9642630.9647670.96146100:02
130.2692350.1990320.9180330.9387230.9343860.9349150.95023900:02
140.2529640.1701340.9344260.9483070.9396590.9404800.96421700:02
150.2358320.1728670.9289620.9479330.9405900.9413520.96642800:02
160.2233000.1813620.9234970.9410240.9394720.9396880.97574000:02
170.2117430.1894010.9016390.9276170.9155210.9158910.93968600:02
180.1992420.1950730.9289620.9540370.9418760.9428120.94702900:02
190.1836010.1901040.9234970.9460940.9380490.9389080.95508300:02
200.1678220.1852600.9234970.9428570.9388430.9392570.96452000:02
210.1626510.1922850.9180330.9368980.9340580.9344640.97322600:02
220.1551740.1915770.9234970.9415790.9366220.9372220.96968700:02
230.1499820.1925700.9234970.9436440.9367860.9374070.96265000:02
240.1430580.1915950.9180330.9341200.9272620.9276730.96160300:02
250.1319860.1867880.9234970.9369890.9320240.9323490.96943300:02
260.1311400.1820690.9234970.9369890.9320240.9323490.96943300:02
270.1255170.1737460.9234970.9369890.9320240.9323490.96943300:02
280.1198070.1758940.9234970.9369890.9320240.9323490.96943300:02
290.1174150.1756840.9234970.9369890.9320240.9323490.96943300:02
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Better model found at epoch 0 with accuracy value: 0.9672130942344666.\n", "Better model found at epoch 5 with accuracy value: 0.9726775884628296.\n" ] } ], "source": [ "learner.fit_one_cycle(30, max_lr=slice(1e-04), callbacks=model_callback(learner, \"best-base-rn34-herlev-multiclass-fold5\"))\n", "learner.save(\"last-base-rn34-herlev-multiclass-fold5\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exporting model" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "learner.load(\"best-base-rn34-herlev-multiclass-fold5\")\n", "learner.export(\"best-base-rn34-herlev-multiclass-5fold.pkl\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Results (save results.csv first)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " accuracy precision recall f_beta kappa_score\n", "0 0.701087 0.748223 0.717213 0.721554 0.826631\n", "1 0.967391 0.975364 0.976561 0.975811 0.973178\n", "2 0.978142 0.982848 0.985317 0.984532 0.994151\n", "3 0.978142 0.982772 0.982772 0.982772 0.983318\n", "4 0.972678 0.978877 0.978712 0.978695 0.988306\n", "*-**-**-**-**-**-**-**-**-**-*\n", "Results :-\n", "Accuracy : 91.9488 % | 8.7360 %\n", "Precision : 93.3617 % | 7.4158 %\n", "Recall : 92.8115 % | 8.4361 %\n", "F_beta : 92.8673 % | 8.2848 %\n", "Kappa_score : 95.3117 % | 5.0594 %\n" ] } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "\n", "def compute_results(fname):\n", " df = pd.read_csv(fname)\n", " print(df)\n", " print(\"*-*\" * 10)\n", " print(\"Results :-\")\n", " mean_df = np.mean(df, axis=0)\n", " mean_error_df = np.mean(np.abs(mean_df - df), axis=0)\n", " for col, mean, error in zip(list(df.columns), list(mean_df.values), list(mean_error_df.values)):\n", " print(f\"{col.capitalize()} : {mean * 100:.4f} % | { error * 100:.4f} %\")\n", "\n", "compute_results(\"results.csv\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.6.9" } }, "nbformat": 4, "nbformat_minor": 4 }