diff --git a/week11/week11.ipynb b/week11/week11.ipynb
new file mode 100644
index 0000000..5b175ec
--- /dev/null
+++ b/week11/week11.ipynb
@@ -0,0 +1,2798 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# Continual learning: Overcoming catastophic forgetting with memory replay\n",
+ "\n",
+ "In this exercise class we'll implement an experiment to measure catastrophic forgetting in a neural network trained on MNIST. We will then fix/reduce the catastrophic forgetting by implementing a simple memory replay strategy."
+ ],
+ "metadata": {
+ "id": "lDTvzuBtNg1X"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Mzy1CzlGQvAk"
+ },
+ "source": [
+ "The following figure highlights the setup of the dataset and is taken from [van den Ven & Tolias, 2019](https://arxiv.org/pdf/1904.07734.pdf):\n",
+ "\n",
+ "![image.png](data:image/png;base64,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9uuvv7a2th40aJCtrS0dBXbu3JmuiNZp88ePHwf3SSqVbtu27UndJ0LIn3/+eeTIER6P99lnn0FcK9JcWbhw4cKFC6urqx/XhNImiM7yEEJAz9ZgMHz22WcCgaB37952dnbUyPv169evX7/HfaJer9+9e/ecOXMUCoW9vf3+/fv79+//RN+5srLS3t6ez+eD9wVRiICTk9Pq1atbt24Nk7DHjx+/dOkSLFg1D9CD+h+odep0uvLy8tLS0qKiopSUlOjoaBoeoNfrqQfl5+c3cODA8PDwysrKRYsWrVmzpmvXroMGDerfvz8IUdTzWUlJSa+//npaWhohxNLScty4ceg+If8KnZdSq9VlZWWlpaX5+fmJiYnXr1+/cuUKtV56fVhY2Pr16zMyMjIyMsaMGePh4dGjR48hQ4Z069bN09OzftmcY8eO3bhxAwYTbdq0eVyi8ScCIm2mT5+enJzMMEyvXr127txZQ1YIadLAvjuDwVBVVVVaWlpaWpqRkQHJHm7cuFHDRAUCwdSpU6Ojo7Va7b59+44cORIcHNynT5+hQ4cGBQU5OzvX3yrOnDkT3DaGYcaOHfvsOe+7devWrVs3OP7000937Njx0UcflZSU/PDDD35+fu+99x6+36YObfQ0Gk1ZWVlZWVlBQUFiYuKtW7euXLkCA1PjJnTo0KGenp4pKSm5ublTpkxxdXXt1q1baGho3759PTw8INrncURGRv7222+QocTb2/tJx6aEkPv373/xxRcGgyEsLGzGjBn4+loCdJKU9vIFBQUPHz68efMmbKqvYaJjxoxZuXJlXl5eamrqhAkTPDw8unfvPnTo0O7du3t4eDxu9R44efLk3bt3QdrX39//cUup9WBnZ3f//v3S0lKtVuvg4FD7gmnTpv39998nT55UKBT//PMPelDNFoVCERkZeerUqXv37hUWFspkspKSktrhT8aG/sMPP7z99tu3b9/W6/VFRUUnT548efKkWCz28/MbNGjQK6+80qVLlzpXLePj4+lxYWHhl19++fvvv5uSAAppyRQVFUVERISHhyclJRUVFclksvLy8noy0/v4+GzYsGH+/PnZ2dl6vT4tLS0tLW337t02NjaBgYFjxowZNWqUn59fnePUs2fP0uPLly9v3779/ffff5Yvr9fr//nnnw8++ABSPw0cOHDbtm1PmjMNaeTcv3//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Xbvm7OyM+6ZkI6iioiLcESfblYQztKWlJYvFwstslJSUXL16FU93pjMon8/H6/SvX79eKpW+evXq0KFDssPWhULhrl278PK+zfFjlXYeFB6JW3se1Lp16zw9Pf/44w+5COrdu3cMBoPH48nFoklJSRoaGvQaMjk5OWfPnpVdCEEikbx+/RqvSX337l2xWHzv3r0TJ07I3lmrqqqmTp2KEOrevbsyPOMfPnx4nfOgFi5c6OXlhZfNlY2gbt++raqqqq2tLRcp4a1azM3NceJkZmaePn0aDx6g8/DLly/pJTprampw4siepLq6eujQoQihoUOHNvkvVdoIqqam5nPzoHr16hUQEPDs2TO5CGrbtm0EQfj6+so949y1axeOUfFYvjdv3hw9epRePh5XAgcOHOByufr6+iKRqKSk5MqVK7LTnfEMKz8/P4SQMgT5paWlLi4ubDZbbh6UUCiMjIz09/fH80lkI6ilS5cihIKCguSmJq5atQohFBERgZvdz58/P3HihGziCASCnTt34uW8SktLi4qK4uLiZD9XKpVmZ2e7uroSBEHP121CShtBvXnzRkdHR0tLS26qA56R269fv5KSErkIqlevXggh2e1JsL59+yKEZs+ejRP8wYMHJ0+elA2Eqqurx44dSxAEXlglPT391KlTsj0qYrH44cOHurq6TCazOeLYhnr48KGKioqtra3cJJm3b996enriZTZkIyiRSIS3dvzll19kE0cikYSHhyOEVq5cidPh9u3b58+fl02c8vLyQYMGIYTwEp2pqanHjx+XfaKHt4fS0tJSUVFpjiaQ0kZQeFGNyMhIudfPnj3r4uKCW4yyEVRhYaGVlRVC6Ny5c7LHSyQSHo/H4XBwLwqfz798+fLNmzdlKwG80hJBEHg81IsXLw4ePChb2wgEgt9++w03h5ThUT5eEK/2PKg///zT3d0dR+yyEVR6erqxsTGLxZILGXJycoyMjJhMJl5iqqCgIC4uDq9cSqcefrrHYDCOHz8uFoufPHly/Phx2e4mgUCwZMkSkiR9fX2b/JcqHkEpy1QWb29vY2Pj169fX79+nX5RKpXireXwJjOyxwuFwuLiYgaDITdI9NGjR8+ePUMfJ6WkpqaGhoaOHDmysLCQPkZDQ8PGxoYgCNyxOGvWrF69ev3555/0AXihT9xRqAyzfQICArS0tB49ehQf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)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "id": "MN_GMVuyPD9D"
+ },
+ "outputs": [],
+ "source": [
+ "\"\"\"\n",
+ "Code adapted from the torchvision MNIST example:\n",
+ "https://github.com/pytorch/examples/blob/main/mnist/main.py\n",
+ "\n",
+ "BSD 3-Clause License\n",
+ "\n",
+ "Copyright (c) 2017, \n",
+ "All rights reserved.\n",
+ "\n",
+ "Redistribution and use in source and binary forms, with or without\n",
+ "modification, are permitted provided that the following conditions are met:\n",
+ "\n",
+ "* Redistributions of source code must retain the above copyright notice, this\n",
+ " list of conditions and the following disclaimer.\n",
+ "\n",
+ "* Redistributions in binary form must reproduce the above copyright notice,\n",
+ " this list of conditions and the following disclaimer in the documentation\n",
+ " and/or other materials provided with the distribution.\n",
+ "\n",
+ "* Neither the name of the copyright holder nor the names of its\n",
+ " contributors may be used to endorse or promote products derived from\n",
+ " this software without specific prior written permission.\n",
+ "\n",
+ "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n",
+ "AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n",
+ "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n",
+ "DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n",
+ "FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n",
+ "DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n",
+ "SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n",
+ "CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n",
+ "OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n",
+ "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n",
+ "\"\"\"\n",
+ "\n",
+ "import argparse\n",
+ "import torch\n",
+ "import torch.nn as nn\n",
+ "import torch.nn.functional as F\n",
+ "import torch.optim as optim\n",
+ "from torchvision import datasets, transforms\n",
+ "from torch.optim.lr_scheduler import StepLR"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "id": "Bu5GtxDyPMW5"
+ },
+ "outputs": [],
+ "source": [
+ "# Network implementation -- bonus exercise: Modify the network architecture,\n",
+ "# and study the effect on the training results.\n",
+ "\n",
+ "class Net(nn.Module):\n",
+ "\n",
+ " def __init__(self):\n",
+ " super(Net, self).__init__()\n",
+ " self.conv1 = nn.Conv2d(1, 32, 3, 1)\n",
+ " self.conv2 = nn.Conv2d(32, 64, 3, 1)\n",
+ " self.dropout1 = nn.Dropout(0.25)\n",
+ " self.dropout2 = nn.Dropout(0.5)\n",
+ " self.fc1 = nn.Linear(9216, 128)\n",
+ " self.fc2 = nn.Linear(128, 10)\n",
+ "\n",
+ " def forward(self, x):\n",
+ " x = self.conv1(x)\n",
+ " x = F.relu(x)\n",
+ " x = self.conv2(x)\n",
+ " x = F.relu(x)\n",
+ " x = F.max_pool2d(x, 2)\n",
+ " x = self.dropout1(x)\n",
+ " x = torch.flatten(x, 1)\n",
+ " x = self.fc1(x)\n",
+ " x = F.relu(x)\n",
+ " x = self.dropout2(x)\n",
+ " x = self.fc2(x)\n",
+ " output = F.log_softmax(x, dim=1)\n",
+ " return output"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "id": "FljvS0QcPPTg"
+ },
+ "outputs": [],
+ "source": [
+ "# Exercise: Adapt the following function and store part of the images\n",
+ "# presented during training in a replay buffer. Replay these images\n",
+ "# during the training step.\n",
+ "\n",
+ "def train(args, model, device, train_loader, optimizer, epoch, buffer = None):\n",
+ " model.train()\n",
+ "\n",
+ " for batch_idx, (data, target) in enumerate(train_loader):\n",
+ "\n",
+ " ### START SOLUTION ###\n",
+ " # We append images and labels from the first training batch\n",
+ " # to our buffer. You can extend this strategy based on how\n",
+ " # many images you choose to store in the buffer.\n",
+ " if buffer is not None and batch_idx == 0:\n",
+ " if buffer is not None:\n",
+ " images, targets = next(iter(train_loader))\n",
+ " buffer.add(images, targets)\n",
+ " ### END SOLUTION ###\n",
+ "\n",
+ "\n",
+ " data, target = data.to(device), target.to(device)\n",
+ "\n",
+ " optimizer.zero_grad()\n",
+ " output = model(data)\n",
+ " loss = F.nll_loss(output, target)\n",
+ " loss.backward()\n",
+ " optimizer.step()\n",
+ "\n",
+ " ### START SOLUTION ###\n",
+ " # A simple strategy for overcoming forgetting is to retrieve images\n",
+ " # from the buffer (here: one image per class) and perform a gradient\n",
+ " # step on these images along with every incoming new batch.\n",
+ " if buffer is not None and len(buffer) > 0:\n",
+ " replayed_images, replayed_targets = buffer.get()\n",
+ " replayed_images = replayed_images.to(device)\n",
+ " replayed_targets = replayed_targets.to(device)\n",
+ " optimizer.zero_grad()\n",
+ " output = model(replayed_images)\n",
+ " loss = F.nll_loss(output, replayed_targets)\n",
+ " loss.backward()\n",
+ " optimizer.step()\n",
+ " ### END SOLUTION ###\n",
+ "\n",
+ " if batch_idx % args.log_interval == 0:\n",
+ " print('Train Epoch: {} [{}/{} ({:.0f}%)]\\tLoss: {:.6f}'.format(\n",
+ " epoch, batch_idx * len(data), len(train_loader.dataset),\n",
+ " 100. * batch_idx / len(train_loader), loss.item()))\n",
+ " if args.dry_run:\n",
+ " break"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "id": "QXPgWNCRPRd4"
+ },
+ "outputs": [],
+ "source": [
+ "# The test routine was adapted from the original implementation and now computes\n",
+ "# the classification probabilities per class instead of an average. This allows to\n",
+ "# later assess the effect of catastrophic forgetting. No adaptations in this function\n",
+ "# are required for the exercise.\n",
+ "\n",
+ "import collections\n",
+ "\n",
+ "def test(model, device, test_loader):\n",
+ " model.eval()\n",
+ " test_loss = 0\n",
+ " correct_by_class = collections.Counter()\n",
+ " count_by_class = collections.Counter()\n",
+ " with torch.no_grad():\n",
+ " for data, target in test_loader:\n",
+ " data, target = data.to(device), target.to(device)\n",
+ " output = model(data)\n",
+ " test_loss += F.nll_loss(output, target, reduction='sum').item() # sum up batch loss\n",
+ " pred = output.argmax(dim=1, keepdim=True) # get the index of the max log-probability\n",
+ " correct = pred.eq(target.view_as(pred)).float()\n",
+ " for class_ in range(10):\n",
+ " idc = (target == class_)\n",
+ " correct_by_class[class_] += correct[idc].sum().item()\n",
+ " count_by_class[class_] += idc.sum().item()\n",
+ "\n",
+ " test_loss /= len(test_loader.dataset)\n",
+ " test_acc = correct / len(test_loader.dataset)\n",
+ "\n",
+ " print(f'\\nTest set: Average loss: {test_loss:.4f}')\n",
+ " result = {}\n",
+ " for class_ in range(10):\n",
+ " acc = correct_by_class[class_] / count_by_class[class_]\n",
+ " result[class_] = acc\n",
+ " print(\n",
+ " f\"Class {class_} accuracy: \"\n",
+ " f\"{correct_by_class[class_]}/{count_by_class[class_]}\"\n",
+ " f\"({acc*100:.0f}%)\"\n",
+ " )\n",
+ "\n",
+ " return result"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "id": "UsdJlkLkRRbp"
+ },
+ "outputs": [],
+ "source": [
+ "# Exercise: Adapt the dataset class \"MNISTContinualLearning\" for the experiment\n",
+ "# outlined in the introduction text. The class needs to support indexing of the\n",
+ "# dataset based on the provided list of classes.\n",
+ "\n",
+ "def identity(x):\n",
+ " return\n",
+ "\n",
+ "class MNISTContinualLearning(datasets.MNIST):\n",
+ "\n",
+ " def __init__(self, *args, classes=list(range(10)), **kwargs):\n",
+ "\n",
+ " # This inherits from the base dataset\n",
+ " super().__init__(*args, **kwargs)\n",
+ "\n",
+ " if len(classes) < 2:\n",
+ " raise ValueError(f\"Need at least two classes, but got {len(classes)}\")\n",
+ "\n",
+ " # Add code for filtering the dataset here. You need to adapt\n",
+ " # the \"data\" and \"targets\" attribute of the dataset. The \"data\"\n",
+ " # attribute stores the images as a numpy array, while the \"targets\"\n",
+ " # attributes stores the labels as a numpy array.\n",
+ " # You can override the existing attributes.\n",
+ " #\n",
+ " # self.data = ...\n",
+ " # self.targets = ...\n",
+ " \n",
+ " ### START SOLUTION ###\n",
+ " idc = None\n",
+ " for class_ in classes:\n",
+ " if idc is None:\n",
+ " idc = self.targets == class_\n",
+ " idc |= self.targets == class_\n",
+ "\n",
+ " self.data = self.data[idc]\n",
+ " self.targets = self.targets[idc]\n",
+ " ### END SOLUTION ###\n",
+ "\n",
+ "\n",
+ "def test_dataset():\n",
+ " transform=transforms.Compose([\n",
+ " transforms.ToTensor(),\n",
+ " transforms.Normalize((0.1307,), (0.3081,))\n",
+ " ])\n",
+ " dataset1 = MNISTContinualLearning('../data', train=True, download=True, transform=transform, classes = [0, 5])\n",
+ " assert len(dataset1) == 11344\n",
+ "\n",
+ "test_dataset()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "id": "EDwtthksNUpw"
+ },
+ "outputs": [],
+ "source": [
+ "# To implement memory replay, add additional code (functions or classes)\n",
+ "# to this cell. One possible solution is to implement a \"Buffer\" class\n",
+ "# that allows to add images into memory, and allows to retrieve the stored\n",
+ "# images and labels for training the model.\n",
+ "#\n",
+ "# The buffer is typically memory constrained, and there are multiple ways\n",
+ "# to efficiently compress the individual elements present in the buffer.\n",
+ "# Think about different ways of reducing the storage required by your buffer\n",
+ "# class, and explore which of them is most effective at mitigating catastophic\n",
+ "# forgetting.\n",
+ "\n",
+ "\n",
+ "### START SOLUTION ###\n",
+ "\n",
+ "class Buffer(nn.Module):\n",
+ "\n",
+ " def __init__(self):\n",
+ " self.buffer = {}\n",
+ " \n",
+ " def add(self, images, targets):\n",
+ " for class_ in targets.unique():\n",
+ " idc = targets == class_\n",
+ " self.buffer[class_] = images[idc][0]\n",
+ "\n",
+ " def get(self):\n",
+ " assert len(self) > 0\n",
+ " keys = list(self.buffer.keys())\n",
+ " targets = torch.tensor(keys)\n",
+ " images = torch.stack([self.buffer[k] for k in keys], dim = 0)\n",
+ " assert len(targets) == len(images)\n",
+ " return images, targets\n",
+ "\n",
+ " def __len__(self):\n",
+ " return sum(len(v) if v is not None else 0 for v in self.buffer.values())\n",
+ " \n",
+ "### END SOLUTION ###"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "id": "u2xvlBoZPTyx"
+ },
+ "outputs": [],
+ "source": [
+ "# Adapt the main training loop to work with the functions you defined above.\n",
+ "\n",
+ "def train_model(args, model, phase, replay_buffer = [], history = [], buffer = None):\n",
+ " use_cuda = not args.no_cuda and torch.cuda.is_available()\n",
+ " device = torch.device(\"cuda\" if use_cuda else \"cpu\")\n",
+ "\n",
+ " torch.manual_seed(args.seed)\n",
+ "\n",
+ " train_kwargs = {'batch_size': args.batch_size}\n",
+ " test_kwargs = {'batch_size': args.test_batch_size}\n",
+ " if use_cuda:\n",
+ " cuda_kwargs = {'num_workers': 1,\n",
+ " 'pin_memory': True,\n",
+ " 'shuffle': True}\n",
+ " train_kwargs.update(cuda_kwargs)\n",
+ " test_kwargs.update(cuda_kwargs)\n",
+ "\n",
+ " transform=transforms.Compose([\n",
+ " transforms.ToTensor(),\n",
+ " transforms.Normalize((0.1307,), (0.3081,))\n",
+ " ])\n",
+ " \n",
+ " # You need to replace the original MNIST dataset here by the continual\n",
+ " # learning dataset we implemented in the previous cell. Make sure to\n",
+ " # pass the list of classes selected for training in args.train_classes.\n",
+ " \n",
+ " ### START SOLUTION ###\n",
+ " # We added the revised MNIST class here, which takes the same arguments\n",
+ " # as the original class, but additionally takes a \"classes\" argument which\n",
+ " # specifies the subselection of classes to consider during this training\n",
+ " # phase.\n",
+ " dataset1 = MNISTContinualLearning('../data', train=True, download=True,\n",
+ " transform=transform, classes=args.train_classes)\n",
+ " ### END SOLUTION ###\n",
+ " dataset2 = datasets.MNIST('../data', train=False, download=True,\n",
+ " transform=transform)\n",
+ " train_loader = torch.utils.data.DataLoader(dataset1,**train_kwargs)\n",
+ " test_loader = torch.utils.data.DataLoader(dataset2, **test_kwargs)\n",
+ "\n",
+ " model = model.to(device)\n",
+ " optimizer = optim.Adadelta(model.parameters(), lr=args.lr)\n",
+ " scheduler = StepLR(optimizer, step_size=1, gamma=args.gamma)\n",
+ "\n",
+ " for epoch in range(1, args.epochs + 1):\n",
+ " ### START SOLUTION ###\n",
+ " # We additionally pass the \"buffer\" class here to collect training\n",
+ " # images for later memory replay.\n",
+ " # \n",
+ " # Original content:\n",
+ " # train(args, model, device, train_loader, optimizer, epoch)\n",
+ " train(args, model, device, train_loader, optimizer, epoch, buffer)\n",
+ " ### END SOLUTION ###\n",
+ " test_results = test(model, device, test_loader)\n",
+ " test_results[\"phase\"] = phase\n",
+ " history.append(test_results)\n",
+ " scheduler.step()\n",
+ "\n",
+ " return history\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# We now define the experiment setup.\n",
+ "# Without modifications to the code, the following will simply train an MNIST\n",
+ "# network multiple times, and reach an accuracy of >99% on the test set.\n",
+ "#\n",
+ "# The result will be modified in two steps:\n",
+ "#\n",
+ "# -- first, after implementing the MNISTContinualLearning dataset, you will be\n",
+ "# able to observe catastrophic forgetting: Training on a new task (specified)\n",
+ "# by the \"phase\" and \"config.train_classes\" variables will make the network\n",
+ "# forget the previously learned tasks, and you will observe a performance drop.\n",
+ "#\n",
+ "# -- second, after implementing the catastrophic forgetting network, you will\n",
+ "# fix the catastrophic forgetting my implementing a simple memory buffer. This\n",
+ "# buffer will keep some of the images seen in each individual training phase,\n",
+ "# and add them to the training in each subsequent phase. This task is open-ended\n",
+ "# and different strategies exist. They will differ in terms of memory efficiency\n",
+ "# and performance.\n",
+ "\n",
+ "# You should adapt the train config to each experiment setup and especially test the\n",
+ "# effects of taking different values for the number of epochs (per phase of the training)\n",
+ "# and the learning rate used.\n",
+ "config = argparse.Namespace(\n",
+ " batch_size=64, \n",
+ " test_batch_size=1000, \n",
+ " epochs=3, \n",
+ " lr=0.01,\n",
+ " gamma=0.7,\n",
+ " no_cuda=False,\n",
+ " dry_run=False,\n",
+ " seed=1,\n",
+ " log_interval=10,\n",
+ " save_model=False\n",
+ ")\n",
+ "\n",
+ "def train_regular_mnist():\n",
+ " model = Net()\n",
+ " history = []\n",
+ "\n",
+ " config.train_classes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n",
+ " train_model(config, model, phase = \"baseline\", history = history)\n",
+ " return history\n",
+ "\n",
+ "# Uncomment to train\n",
+ "#history_regular_mnist = train_regular_mnist()\n",
+ "#history_regular_mnist"
+ ],
+ "metadata": {
+ "id": "SK-GNifLPN2S"
+ },
+ "execution_count": 18,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# Exercise 1: Implement an experiment setup that measures catastrophic forgetting while\n",
+ "# training in a task-incremental way on digits (0,1), (2,3), ..., (8, 9). After finishing\n",
+ "# training, measure the performance on the first task again.\n",
+ "#\n",
+ "# Implementation requires to fill in code further up in this notebook. You can visualize\n",
+ "# the result using the code further below.\n",
+ "\n",
+ "### START SOLUTION ###\n",
+ "# In this first part, we implement an experiment setup to measure catastrophic forgetting.\n",
+ "# We will subsequently train on pairs of classes, (0,1), then (2,3), etc., and in the end\n",
+ "# revisit the first task to measure if there was any forward transfer while training on the\n",
+ "# other tasks.\n",
+ "\n",
+ "def train_catastrophic_forgetting():\n",
+ " model = Net()\n",
+ " history = []\n",
+ "\n",
+ " config.train_classes = [0, 1]\n",
+ " train_model(config, model, phase = \"0_1\", history = history)\n",
+ " \n",
+ " config.train_classes = [2, 3]\n",
+ " train_model(config, model, phase = \"2_3\", history = history)\n",
+ "\n",
+ " config.train_classes = [4, 5]\n",
+ " train_model(config, model, phase = \"4_5\", history = history)\n",
+ "\n",
+ " config.train_classes = [6, 7]\n",
+ " train_model(config, model, phase = \"6_7\", history = history)\n",
+ "\n",
+ " config.train_classes = [8, 9]\n",
+ " train_model(config, model, phase = \"8_9\", history = history)\n",
+ " \n",
+ " config.train_classes = [0, 1]\n",
+ " train_model(config, model, phase = \"0_1_again\", history = history)\n",
+ "\n",
+ " return history\n",
+ "\n",
+ "### END SOLUTION ###\n",
+ " \n",
+ "history_catastrophic_forgetting = train_catastrophic_forgetting()\n",
+ "history_catastrophic_forgetting"
+ ],
+ "metadata": {
+ "id": "OnATcaveP3Fi",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "6e9bc36f-8e10-405a-8297-e104141e58cc"
+ },
+ "execution_count": 19,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Train Epoch: 1 [0/12665 (0%)]\tLoss: 2.295613\n",
+ "Train Epoch: 1 [640/12665 (5%)]\tLoss: 1.647854\n",
+ "Train Epoch: 1 [1280/12665 (10%)]\tLoss: 1.039609\n",
+ "Train Epoch: 1 [1920/12665 (15%)]\tLoss: 0.593714\n",
+ "Train Epoch: 1 [2560/12665 (20%)]\tLoss: 0.321345\n",
+ "Train Epoch: 1 [3200/12665 (25%)]\tLoss: 0.211062\n",
+ "Train Epoch: 1 [3840/12665 (30%)]\tLoss: 0.124204\n",
+ "Train Epoch: 1 [4480/12665 (35%)]\tLoss: 0.082856\n",
+ "Train Epoch: 1 [5120/12665 (40%)]\tLoss: 0.075962\n",
+ "Train Epoch: 1 [5760/12665 (45%)]\tLoss: 0.071156\n",
+ "Train Epoch: 1 [6400/12665 (51%)]\tLoss: 0.117059\n",
+ "Train Epoch: 1 [7040/12665 (56%)]\tLoss: 0.059726\n",
+ "Train Epoch: 1 [7680/12665 (61%)]\tLoss: 0.032035\n",
+ "Train Epoch: 1 [8320/12665 (66%)]\tLoss: 0.033078\n",
+ "Train Epoch: 1 [8960/12665 (71%)]\tLoss: 0.030728\n",
+ "Train Epoch: 1 [9600/12665 (76%)]\tLoss: 0.039060\n",
+ "Train Epoch: 1 [10240/12665 (81%)]\tLoss: 0.035301\n",
+ "Train Epoch: 1 [10880/12665 (86%)]\tLoss: 0.041941\n",
+ "Train Epoch: 1 [11520/12665 (91%)]\tLoss: 0.040506\n",
+ "Train Epoch: 1 [12160/12665 (96%)]\tLoss: 0.014235\n",
+ "\n",
+ "Test set: Average loss: 7.1276\n",
+ "Class 0 accuracy: 977.0/980(100%)\n",
+ "Class 1 accuracy: 1134.0/1135(100%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 2 [0/12665 (0%)]\tLoss: 0.007759\n",
+ "Train Epoch: 2 [640/12665 (5%)]\tLoss: 0.029978\n",
+ "Train Epoch: 2 [1280/12665 (10%)]\tLoss: 0.017544\n",
+ "Train Epoch: 2 [1920/12665 (15%)]\tLoss: 0.022188\n",
+ "Train Epoch: 2 [2560/12665 (20%)]\tLoss: 0.009434\n",
+ "Train Epoch: 2 [3200/12665 (25%)]\tLoss: 0.024381\n",
+ "Train Epoch: 2 [3840/12665 (30%)]\tLoss: 0.086738\n",
+ "Train Epoch: 2 [4480/12665 (35%)]\tLoss: 0.020443\n",
+ "Train Epoch: 2 [5120/12665 (40%)]\tLoss: 0.015766\n",
+ "Train Epoch: 2 [5760/12665 (45%)]\tLoss: 0.006633\n",
+ "Train Epoch: 2 [6400/12665 (51%)]\tLoss: 0.007944\n",
+ "Train Epoch: 2 [7040/12665 (56%)]\tLoss: 0.008917\n",
+ "Train Epoch: 2 [7680/12665 (61%)]\tLoss: 0.004392\n",
+ "Train Epoch: 2 [8320/12665 (66%)]\tLoss: 0.008756\n",
+ "Train Epoch: 2 [8960/12665 (71%)]\tLoss: 0.056707\n",
+ "Train Epoch: 2 [9600/12665 (76%)]\tLoss: 0.005973\n",
+ "Train Epoch: 2 [10240/12665 (81%)]\tLoss: 0.008020\n",
+ "Train Epoch: 2 [10880/12665 (86%)]\tLoss: 0.009416\n",
+ "Train Epoch: 2 [11520/12665 (91%)]\tLoss: 0.017660\n",
+ "Train Epoch: 2 [12160/12665 (96%)]\tLoss: 0.010692\n",
+ "\n",
+ "Test set: Average loss: 8.1468\n",
+ "Class 0 accuracy: 977.0/980(100%)\n",
+ "Class 1 accuracy: 1134.0/1135(100%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 3 [0/12665 (0%)]\tLoss: 0.016127\n",
+ "Train Epoch: 3 [640/12665 (5%)]\tLoss: 0.018997\n",
+ "Train Epoch: 3 [1280/12665 (10%)]\tLoss: 0.004281\n",
+ "Train Epoch: 3 [1920/12665 (15%)]\tLoss: 0.004884\n",
+ "Train Epoch: 3 [2560/12665 (20%)]\tLoss: 0.006038\n",
+ "Train Epoch: 3 [3200/12665 (25%)]\tLoss: 0.012006\n",
+ "Train Epoch: 3 [3840/12665 (30%)]\tLoss: 0.009289\n",
+ "Train Epoch: 3 [4480/12665 (35%)]\tLoss: 0.002473\n",
+ "Train Epoch: 3 [5120/12665 (40%)]\tLoss: 0.002702\n",
+ "Train Epoch: 3 [5760/12665 (45%)]\tLoss: 0.012154\n",
+ "Train Epoch: 3 [6400/12665 (51%)]\tLoss: 0.018935\n",
+ "Train Epoch: 3 [7040/12665 (56%)]\tLoss: 0.004237\n",
+ "Train Epoch: 3 [7680/12665 (61%)]\tLoss: 0.003406\n",
+ "Train Epoch: 3 [8320/12665 (66%)]\tLoss: 0.008378\n",
+ "Train Epoch: 3 [8960/12665 (71%)]\tLoss: 0.003461\n",
+ "Train Epoch: 3 [9600/12665 (76%)]\tLoss: 0.018804\n",
+ "Train Epoch: 3 [10240/12665 (81%)]\tLoss: 0.015821\n",
+ "Train Epoch: 3 [10880/12665 (86%)]\tLoss: 0.003116\n",
+ "Train Epoch: 3 [11520/12665 (91%)]\tLoss: 0.002931\n",
+ "Train Epoch: 3 [12160/12665 (96%)]\tLoss: 0.004047\n",
+ "\n",
+ "Test set: Average loss: 8.5887\n",
+ "Class 0 accuracy: 977.0/980(100%)\n",
+ "Class 1 accuracy: 1134.0/1135(100%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 1 [0/12089 (0%)]\tLoss: 10.857133\n",
+ "Train Epoch: 1 [640/12089 (5%)]\tLoss: 6.280286\n",
+ "Train Epoch: 1 [1280/12089 (11%)]\tLoss: 2.301530\n",
+ "Train Epoch: 1 [1920/12089 (16%)]\tLoss: 0.905669\n",
+ "Train Epoch: 1 [2560/12089 (21%)]\tLoss: 0.688727\n",
+ "Train Epoch: 1 [3200/12089 (26%)]\tLoss: 0.598405\n",
+ "Train Epoch: 1 [3840/12089 (32%)]\tLoss: 0.462726\n",
+ "Train Epoch: 1 [4480/12089 (37%)]\tLoss: 0.345897\n",
+ "Train Epoch: 1 [5120/12089 (42%)]\tLoss: 0.380626\n",
+ "Train Epoch: 1 [5760/12089 (48%)]\tLoss: 0.280428\n",
+ "Train Epoch: 1 [6400/12089 (53%)]\tLoss: 0.216660\n",
+ "Train Epoch: 1 [7040/12089 (58%)]\tLoss: 0.167003\n",
+ "Train Epoch: 1 [7680/12089 (63%)]\tLoss: 0.275916\n",
+ "Train Epoch: 1 [8320/12089 (69%)]\tLoss: 0.326823\n",
+ "Train Epoch: 1 [8960/12089 (74%)]\tLoss: 0.258519\n",
+ "Train Epoch: 1 [9600/12089 (79%)]\tLoss: 0.233105\n",
+ "Train Epoch: 1 [10240/12089 (85%)]\tLoss: 0.235713\n",
+ "Train Epoch: 1 [10880/12089 (90%)]\tLoss: 0.265890\n",
+ "Train Epoch: 1 [11520/12089 (95%)]\tLoss: 0.262226\n",
+ "\n",
+ "Test set: Average loss: 6.2382\n",
+ "Class 0 accuracy: 0.0/980(0%)\n",
+ "Class 1 accuracy: 0.0/1135(0%)\n",
+ "Class 2 accuracy: 992.0/1032(96%)\n",
+ "Class 3 accuracy: 987.0/1010(98%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 2 [0/12089 (0%)]\tLoss: 0.099378\n",
+ "Train Epoch: 2 [640/12089 (5%)]\tLoss: 0.116401\n",
+ "Train Epoch: 2 [1280/12089 (11%)]\tLoss: 0.155221\n",
+ "Train Epoch: 2 [1920/12089 (16%)]\tLoss: 0.109446\n",
+ "Train Epoch: 2 [2560/12089 (21%)]\tLoss: 0.104514\n",
+ "Train Epoch: 2 [3200/12089 (26%)]\tLoss: 0.219575\n",
+ "Train Epoch: 2 [3840/12089 (32%)]\tLoss: 0.151700\n",
+ "Train Epoch: 2 [4480/12089 (37%)]\tLoss: 0.162770\n",
+ "Train Epoch: 2 [5120/12089 (42%)]\tLoss: 0.152628\n",
+ "Train Epoch: 2 [5760/12089 (48%)]\tLoss: 0.186006\n",
+ "Train Epoch: 2 [6400/12089 (53%)]\tLoss: 0.095261\n",
+ "Train Epoch: 2 [7040/12089 (58%)]\tLoss: 0.152865\n",
+ "Train Epoch: 2 [7680/12089 (63%)]\tLoss: 0.046197\n",
+ "Train Epoch: 2 [8320/12089 (69%)]\tLoss: 0.068629\n",
+ "Train Epoch: 2 [8960/12089 (74%)]\tLoss: 0.133037\n",
+ "Train Epoch: 2 [9600/12089 (79%)]\tLoss: 0.106119\n",
+ "Train Epoch: 2 [10240/12089 (85%)]\tLoss: 0.073823\n",
+ "Train Epoch: 2 [10880/12089 (90%)]\tLoss: 0.117314\n",
+ "Train Epoch: 2 [11520/12089 (95%)]\tLoss: 0.144778\n",
+ "\n",
+ "Test set: Average loss: 7.2467\n",
+ "Class 0 accuracy: 0.0/980(0%)\n",
+ "Class 1 accuracy: 0.0/1135(0%)\n",
+ "Class 2 accuracy: 998.0/1032(97%)\n",
+ "Class 3 accuracy: 994.0/1010(98%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 3 [0/12089 (0%)]\tLoss: 0.102792\n",
+ "Train Epoch: 3 [640/12089 (5%)]\tLoss: 0.209812\n",
+ "Train Epoch: 3 [1280/12089 (11%)]\tLoss: 0.079453\n",
+ "Train Epoch: 3 [1920/12089 (16%)]\tLoss: 0.146311\n",
+ "Train Epoch: 3 [2560/12089 (21%)]\tLoss: 0.057011\n",
+ "Train Epoch: 3 [3200/12089 (26%)]\tLoss: 0.062497\n",
+ "Train Epoch: 3 [3840/12089 (32%)]\tLoss: 0.114005\n",
+ "Train Epoch: 3 [4480/12089 (37%)]\tLoss: 0.089880\n",
+ "Train Epoch: 3 [5120/12089 (42%)]\tLoss: 0.057159\n",
+ "Train Epoch: 3 [5760/12089 (48%)]\tLoss: 0.117361\n",
+ "Train Epoch: 3 [6400/12089 (53%)]\tLoss: 0.098925\n",
+ "Train Epoch: 3 [7040/12089 (58%)]\tLoss: 0.069072\n",
+ "Train Epoch: 3 [7680/12089 (63%)]\tLoss: 0.111345\n",
+ "Train Epoch: 3 [8320/12089 (69%)]\tLoss: 0.131783\n",
+ "Train Epoch: 3 [8960/12089 (74%)]\tLoss: 0.150885\n",
+ "Train Epoch: 3 [9600/12089 (79%)]\tLoss: 0.079096\n",
+ "Train Epoch: 3 [10240/12089 (85%)]\tLoss: 0.082054\n",
+ "Train Epoch: 3 [10880/12089 (90%)]\tLoss: 0.129982\n",
+ "Train Epoch: 3 [11520/12089 (95%)]\tLoss: 0.066340\n",
+ "\n",
+ "Test set: Average loss: 7.6576\n",
+ "Class 0 accuracy: 0.0/980(0%)\n",
+ "Class 1 accuracy: 0.0/1135(0%)\n",
+ "Class 2 accuracy: 1007.0/1032(98%)\n",
+ "Class 3 accuracy: 985.0/1010(98%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 1 [0/11263 (0%)]\tLoss: 10.835564\n",
+ "Train Epoch: 1 [640/11263 (6%)]\tLoss: 5.729345\n",
+ "Train Epoch: 1 [1280/11263 (11%)]\tLoss: 2.635014\n",
+ "Train Epoch: 1 [1920/11263 (17%)]\tLoss: 1.219099\n",
+ "Train Epoch: 1 [2560/11263 (23%)]\tLoss: 0.913658\n",
+ "Train Epoch: 1 [3200/11263 (28%)]\tLoss: 0.655098\n",
+ "Train Epoch: 1 [3840/11263 (34%)]\tLoss: 0.466011\n",
+ "Train Epoch: 1 [4480/11263 (40%)]\tLoss: 0.539344\n",
+ "Train Epoch: 1 [5120/11263 (45%)]\tLoss: 0.249651\n",
+ "Train Epoch: 1 [5760/11263 (51%)]\tLoss: 0.209131\n",
+ "Train Epoch: 1 [6400/11263 (57%)]\tLoss: 0.223062\n",
+ "Train Epoch: 1 [7040/11263 (62%)]\tLoss: 0.228752\n",
+ "Train Epoch: 1 [7680/11263 (68%)]\tLoss: 0.198413\n",
+ "Train Epoch: 1 [8320/11263 (74%)]\tLoss: 0.215570\n",
+ "Train Epoch: 1 [8960/11263 (80%)]\tLoss: 0.272983\n",
+ "Train Epoch: 1 [9600/11263 (85%)]\tLoss: 0.155609\n",
+ "Train Epoch: 1 [10240/11263 (91%)]\tLoss: 0.087590\n",
+ "Train Epoch: 1 [10880/11263 (97%)]\tLoss: 0.132957\n",
+ "\n",
+ "Test set: Average loss: 7.1306\n",
+ "Class 0 accuracy: 0.0/980(0%)\n",
+ "Class 1 accuracy: 0.0/1135(0%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 977.0/982(99%)\n",
+ "Class 5 accuracy: 866.0/892(97%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 2 [0/11263 (0%)]\tLoss: 0.130704\n",
+ "Train Epoch: 2 [640/11263 (6%)]\tLoss: 0.123305\n",
+ "Train Epoch: 2 [1280/11263 (11%)]\tLoss: 0.092606\n",
+ "Train Epoch: 2 [1920/11263 (17%)]\tLoss: 0.108018\n",
+ "Train Epoch: 2 [2560/11263 (23%)]\tLoss: 0.059542\n",
+ "Train Epoch: 2 [3200/11263 (28%)]\tLoss: 0.051525\n",
+ "Train Epoch: 2 [3840/11263 (34%)]\tLoss: 0.105634\n",
+ "Train Epoch: 2 [4480/11263 (40%)]\tLoss: 0.075492\n",
+ "Train Epoch: 2 [5120/11263 (45%)]\tLoss: 0.056117\n",
+ "Train Epoch: 2 [5760/11263 (51%)]\tLoss: 0.119122\n",
+ "Train Epoch: 2 [6400/11263 (57%)]\tLoss: 0.098337\n",
+ "Train Epoch: 2 [7040/11263 (62%)]\tLoss: 0.049512\n",
+ "Train Epoch: 2 [7680/11263 (68%)]\tLoss: 0.070381\n",
+ "Train Epoch: 2 [8320/11263 (74%)]\tLoss: 0.070122\n",
+ "Train Epoch: 2 [8960/11263 (80%)]\tLoss: 0.074574\n",
+ "Train Epoch: 2 [9600/11263 (85%)]\tLoss: 0.085832\n",
+ "Train Epoch: 2 [10240/11263 (91%)]\tLoss: 0.194243\n",
+ "Train Epoch: 2 [10880/11263 (97%)]\tLoss: 0.052719\n",
+ "\n",
+ "Test set: Average loss: 8.4438\n",
+ "Class 0 accuracy: 0.0/980(0%)\n",
+ "Class 1 accuracy: 0.0/1135(0%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 978.0/982(100%)\n",
+ "Class 5 accuracy: 872.0/892(98%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 3 [0/11263 (0%)]\tLoss: 0.031168\n",
+ "Train Epoch: 3 [640/11263 (6%)]\tLoss: 0.133256\n",
+ "Train Epoch: 3 [1280/11263 (11%)]\tLoss: 0.064342\n",
+ "Train Epoch: 3 [1920/11263 (17%)]\tLoss: 0.081790\n",
+ "Train Epoch: 3 [2560/11263 (23%)]\tLoss: 0.055577\n",
+ "Train Epoch: 3 [3200/11263 (28%)]\tLoss: 0.031944\n",
+ "Train Epoch: 3 [3840/11263 (34%)]\tLoss: 0.079894\n",
+ "Train Epoch: 3 [4480/11263 (40%)]\tLoss: 0.054432\n",
+ "Train Epoch: 3 [5120/11263 (45%)]\tLoss: 0.032932\n",
+ "Train Epoch: 3 [5760/11263 (51%)]\tLoss: 0.054515\n",
+ "Train Epoch: 3 [6400/11263 (57%)]\tLoss: 0.015534\n",
+ "Train Epoch: 3 [7040/11263 (62%)]\tLoss: 0.073943\n",
+ "Train Epoch: 3 [7680/11263 (68%)]\tLoss: 0.051291\n",
+ "Train Epoch: 3 [8320/11263 (74%)]\tLoss: 0.071271\n",
+ "Train Epoch: 3 [8960/11263 (80%)]\tLoss: 0.078468\n",
+ "Train Epoch: 3 [9600/11263 (85%)]\tLoss: 0.074505\n",
+ "Train Epoch: 3 [10240/11263 (91%)]\tLoss: 0.041854\n",
+ "Train Epoch: 3 [10880/11263 (97%)]\tLoss: 0.051243\n",
+ "\n",
+ "Test set: Average loss: 9.0650\n",
+ "Class 0 accuracy: 0.0/980(0%)\n",
+ "Class 1 accuracy: 0.0/1135(0%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 978.0/982(100%)\n",
+ "Class 5 accuracy: 879.0/892(99%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 1 [0/12183 (0%)]\tLoss: 12.640953\n",
+ "Train Epoch: 1 [640/12183 (5%)]\tLoss: 6.948784\n",
+ "Train Epoch: 1 [1280/12183 (10%)]\tLoss: 2.239110\n",
+ "Train Epoch: 1 [1920/12183 (16%)]\tLoss: 0.789898\n",
+ "Train Epoch: 1 [2560/12183 (21%)]\tLoss: 0.433876\n",
+ "Train Epoch: 1 [3200/12183 (26%)]\tLoss: 0.327010\n",
+ "Train Epoch: 1 [3840/12183 (31%)]\tLoss: 0.240610\n",
+ "Train Epoch: 1 [4480/12183 (37%)]\tLoss: 0.189328\n",
+ "Train Epoch: 1 [5120/12183 (42%)]\tLoss: 0.189419\n",
+ "Train Epoch: 1 [5760/12183 (47%)]\tLoss: 0.063147\n",
+ "Train Epoch: 1 [6400/12183 (52%)]\tLoss: 0.061185\n",
+ "Train Epoch: 1 [7040/12183 (58%)]\tLoss: 0.115183\n",
+ "Train Epoch: 1 [7680/12183 (63%)]\tLoss: 0.030512\n",
+ "Train Epoch: 1 [8320/12183 (68%)]\tLoss: 0.037145\n",
+ "Train Epoch: 1 [8960/12183 (73%)]\tLoss: 0.089052\n",
+ "Train Epoch: 1 [9600/12183 (79%)]\tLoss: 0.044766\n",
+ "Train Epoch: 1 [10240/12183 (84%)]\tLoss: 0.027388\n",
+ "Train Epoch: 1 [10880/12183 (89%)]\tLoss: 0.041345\n",
+ "Train Epoch: 1 [11520/12183 (94%)]\tLoss: 0.022225\n",
+ "Train Epoch: 1 [4370/12183 (99%)]\tLoss: 0.004926\n",
+ "\n",
+ "Test set: Average loss: 7.6796\n",
+ "Class 0 accuracy: 0.0/980(0%)\n",
+ "Class 1 accuracy: 0.0/1135(0%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 955.0/958(100%)\n",
+ "Class 7 accuracy: 1017.0/1028(99%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 2 [0/12183 (0%)]\tLoss: 0.056296\n",
+ "Train Epoch: 2 [640/12183 (5%)]\tLoss: 0.026770\n",
+ "Train Epoch: 2 [1280/12183 (10%)]\tLoss: 0.014056\n",
+ "Train Epoch: 2 [1920/12183 (16%)]\tLoss: 0.026122\n",
+ "Train Epoch: 2 [2560/12183 (21%)]\tLoss: 0.025161\n",
+ "Train Epoch: 2 [3200/12183 (26%)]\tLoss: 0.033366\n",
+ "Train Epoch: 2 [3840/12183 (31%)]\tLoss: 0.011129\n",
+ "Train Epoch: 2 [4480/12183 (37%)]\tLoss: 0.034492\n",
+ "Train Epoch: 2 [5120/12183 (42%)]\tLoss: 0.009984\n",
+ "Train Epoch: 2 [5760/12183 (47%)]\tLoss: 0.035312\n",
+ "Train Epoch: 2 [6400/12183 (52%)]\tLoss: 0.028434\n",
+ "Train Epoch: 2 [7040/12183 (58%)]\tLoss: 0.012921\n",
+ "Train Epoch: 2 [7680/12183 (63%)]\tLoss: 0.009203\n",
+ "Train Epoch: 2 [8320/12183 (68%)]\tLoss: 0.034064\n",
+ "Train Epoch: 2 [8960/12183 (73%)]\tLoss: 0.018005\n",
+ "Train Epoch: 2 [9600/12183 (79%)]\tLoss: 0.007107\n",
+ "Train Epoch: 2 [10240/12183 (84%)]\tLoss: 0.003789\n",
+ "Train Epoch: 2 [10880/12183 (89%)]\tLoss: 0.056796\n",
+ "Train Epoch: 2 [11520/12183 (94%)]\tLoss: 0.008388\n",
+ "Train Epoch: 2 [4370/12183 (99%)]\tLoss: 0.008049\n",
+ "\n",
+ "Test set: Average loss: 8.7098\n",
+ "Class 0 accuracy: 0.0/980(0%)\n",
+ "Class 1 accuracy: 0.0/1135(0%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 955.0/958(100%)\n",
+ "Class 7 accuracy: 1021.0/1028(99%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 3 [0/12183 (0%)]\tLoss: 0.031829\n",
+ "Train Epoch: 3 [640/12183 (5%)]\tLoss: 0.026151\n",
+ "Train Epoch: 3 [1280/12183 (10%)]\tLoss: 0.013025\n",
+ "Train Epoch: 3 [1920/12183 (16%)]\tLoss: 0.015742\n",
+ "Train Epoch: 3 [2560/12183 (21%)]\tLoss: 0.036039\n",
+ "Train Epoch: 3 [3200/12183 (26%)]\tLoss: 0.019850\n",
+ "Train Epoch: 3 [3840/12183 (31%)]\tLoss: 0.021591\n",
+ "Train Epoch: 3 [4480/12183 (37%)]\tLoss: 0.011566\n",
+ "Train Epoch: 3 [5120/12183 (42%)]\tLoss: 0.012161\n",
+ "Train Epoch: 3 [5760/12183 (47%)]\tLoss: 0.005265\n",
+ "Train Epoch: 3 [6400/12183 (52%)]\tLoss: 0.005189\n",
+ "Train Epoch: 3 [7040/12183 (58%)]\tLoss: 0.023125\n",
+ "Train Epoch: 3 [7680/12183 (63%)]\tLoss: 0.058819\n",
+ "Train Epoch: 3 [8320/12183 (68%)]\tLoss: 0.027194\n",
+ "Train Epoch: 3 [8960/12183 (73%)]\tLoss: 0.010728\n",
+ "Train Epoch: 3 [9600/12183 (79%)]\tLoss: 0.002767\n",
+ "Train Epoch: 3 [10240/12183 (84%)]\tLoss: 0.006029\n",
+ "Train Epoch: 3 [10880/12183 (89%)]\tLoss: 0.090709\n",
+ "Train Epoch: 3 [11520/12183 (94%)]\tLoss: 0.003533\n",
+ "Train Epoch: 3 [4370/12183 (99%)]\tLoss: 0.005167\n",
+ "\n",
+ "Test set: Average loss: 9.1796\n",
+ "Class 0 accuracy: 0.0/980(0%)\n",
+ "Class 1 accuracy: 0.0/1135(0%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 955.0/958(100%)\n",
+ "Class 7 accuracy: 1021.0/1028(99%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 1 [0/11800 (0%)]\tLoss: 14.120369\n",
+ "Train Epoch: 1 [640/11800 (5%)]\tLoss: 7.705572\n",
+ "Train Epoch: 1 [1280/11800 (11%)]\tLoss: 2.772657\n",
+ "Train Epoch: 1 [1920/11800 (16%)]\tLoss: 1.523421\n",
+ "Train Epoch: 1 [2560/11800 (22%)]\tLoss: 0.632249\n",
+ "Train Epoch: 1 [3200/11800 (27%)]\tLoss: 0.823988\n",
+ "Train Epoch: 1 [3840/11800 (32%)]\tLoss: 0.649929\n",
+ "Train Epoch: 1 [4480/11800 (38%)]\tLoss: 0.382820\n",
+ "Train Epoch: 1 [5120/11800 (43%)]\tLoss: 0.287871\n",
+ "Train Epoch: 1 [5760/11800 (49%)]\tLoss: 0.270225\n",
+ "Train Epoch: 1 [6400/11800 (54%)]\tLoss: 0.250052\n",
+ "Train Epoch: 1 [7040/11800 (59%)]\tLoss: 0.436681\n",
+ "Train Epoch: 1 [7680/11800 (65%)]\tLoss: 0.205961\n",
+ "Train Epoch: 1 [8320/11800 (70%)]\tLoss: 0.226867\n",
+ "Train Epoch: 1 [8960/11800 (76%)]\tLoss: 0.178260\n",
+ "Train Epoch: 1 [9600/11800 (81%)]\tLoss: 0.159317\n",
+ "Train Epoch: 1 [10240/11800 (86%)]\tLoss: 0.402756\n",
+ "Train Epoch: 1 [10880/11800 (92%)]\tLoss: 0.158059\n",
+ "Train Epoch: 1 [11520/11800 (97%)]\tLoss: 0.195788\n",
+ "\n",
+ "Test set: Average loss: 5.9943\n",
+ "Class 0 accuracy: 0.0/980(0%)\n",
+ "Class 1 accuracy: 0.0/1135(0%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 943.0/974(97%)\n",
+ "Class 9 accuracy: 974.0/1009(97%)\n",
+ "Train Epoch: 2 [0/11800 (0%)]\tLoss: 0.157916\n",
+ "Train Epoch: 2 [640/11800 (5%)]\tLoss: 0.187881\n",
+ "Train Epoch: 2 [1280/11800 (11%)]\tLoss: 0.283773\n",
+ "Train Epoch: 2 [1920/11800 (16%)]\tLoss: 0.135888\n",
+ "Train Epoch: 2 [2560/11800 (22%)]\tLoss: 0.211785\n",
+ "Train Epoch: 2 [3200/11800 (27%)]\tLoss: 0.238753\n",
+ "Train Epoch: 2 [3840/11800 (32%)]\tLoss: 0.121974\n",
+ "Train Epoch: 2 [4480/11800 (38%)]\tLoss: 0.074522\n",
+ "Train Epoch: 2 [5120/11800 (43%)]\tLoss: 0.239114\n",
+ "Train Epoch: 2 [5760/11800 (49%)]\tLoss: 0.129581\n",
+ "Train Epoch: 2 [6400/11800 (54%)]\tLoss: 0.055795\n",
+ "Train Epoch: 2 [7040/11800 (59%)]\tLoss: 0.349395\n",
+ "Train Epoch: 2 [7680/11800 (65%)]\tLoss: 0.076350\n",
+ "Train Epoch: 2 [8320/11800 (70%)]\tLoss: 0.072271\n",
+ "Train Epoch: 2 [8960/11800 (76%)]\tLoss: 0.103121\n",
+ "Train Epoch: 2 [9600/11800 (81%)]\tLoss: 0.343085\n",
+ "Train Epoch: 2 [10240/11800 (86%)]\tLoss: 0.095953\n",
+ "Train Epoch: 2 [10880/11800 (92%)]\tLoss: 0.095618\n",
+ "Train Epoch: 2 [11520/11800 (97%)]\tLoss: 0.114838\n",
+ "\n",
+ "Test set: Average loss: 6.6632\n",
+ "Class 0 accuracy: 0.0/980(0%)\n",
+ "Class 1 accuracy: 0.0/1135(0%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 967.0/974(99%)\n",
+ "Class 9 accuracy: 965.0/1009(96%)\n",
+ "Train Epoch: 3 [0/11800 (0%)]\tLoss: 0.126834\n",
+ "Train Epoch: 3 [640/11800 (5%)]\tLoss: 0.187850\n",
+ "Train Epoch: 3 [1280/11800 (11%)]\tLoss: 0.102141\n",
+ "Train Epoch: 3 [1920/11800 (16%)]\tLoss: 0.036415\n",
+ "Train Epoch: 3 [2560/11800 (22%)]\tLoss: 0.165435\n",
+ "Train Epoch: 3 [3200/11800 (27%)]\tLoss: 0.109672\n",
+ "Train Epoch: 3 [3840/11800 (32%)]\tLoss: 0.070627\n",
+ "Train Epoch: 3 [4480/11800 (38%)]\tLoss: 0.047646\n",
+ "Train Epoch: 3 [5120/11800 (43%)]\tLoss: 0.051905\n",
+ "Train Epoch: 3 [5760/11800 (49%)]\tLoss: 0.264070\n",
+ "Train Epoch: 3 [6400/11800 (54%)]\tLoss: 0.211393\n",
+ "Train Epoch: 3 [7040/11800 (59%)]\tLoss: 0.062177\n",
+ "Train Epoch: 3 [7680/11800 (65%)]\tLoss: 0.033032\n",
+ "Train Epoch: 3 [8320/11800 (70%)]\tLoss: 0.068230\n",
+ "Train Epoch: 3 [8960/11800 (76%)]\tLoss: 0.071904\n",
+ "Train Epoch: 3 [9600/11800 (81%)]\tLoss: 0.102863\n",
+ "Train Epoch: 3 [10240/11800 (86%)]\tLoss: 0.046137\n",
+ "Train Epoch: 3 [10880/11800 (92%)]\tLoss: 0.120950\n",
+ "Train Epoch: 3 [11520/11800 (97%)]\tLoss: 0.101907\n",
+ "\n",
+ "Test set: Average loss: 6.9242\n",
+ "Class 0 accuracy: 0.0/980(0%)\n",
+ "Class 1 accuracy: 0.0/1135(0%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 952.0/974(98%)\n",
+ "Class 9 accuracy: 978.0/1009(97%)\n",
+ "Train Epoch: 1 [0/12665 (0%)]\tLoss: 8.722752\n",
+ "Train Epoch: 1 [640/12665 (5%)]\tLoss: 3.160372\n",
+ "Train Epoch: 1 [1280/12665 (10%)]\tLoss: 0.653003\n",
+ "Train Epoch: 1 [1920/12665 (15%)]\tLoss: 0.256268\n",
+ "Train Epoch: 1 [2560/12665 (20%)]\tLoss: 0.064630\n",
+ "Train Epoch: 1 [3200/12665 (25%)]\tLoss: 0.089074\n",
+ "Train Epoch: 1 [3840/12665 (30%)]\tLoss: 0.022682\n",
+ "Train Epoch: 1 [4480/12665 (35%)]\tLoss: 0.014132\n",
+ "Train Epoch: 1 [5120/12665 (40%)]\tLoss: 0.011369\n",
+ "Train Epoch: 1 [5760/12665 (45%)]\tLoss: 0.032196\n",
+ "Train Epoch: 1 [6400/12665 (51%)]\tLoss: 0.087249\n",
+ "Train Epoch: 1 [7040/12665 (56%)]\tLoss: 0.010759\n",
+ "Train Epoch: 1 [7680/12665 (61%)]\tLoss: 0.009488\n",
+ "Train Epoch: 1 [8320/12665 (66%)]\tLoss: 0.009431\n",
+ "Train Epoch: 1 [8960/12665 (71%)]\tLoss: 0.017381\n",
+ "Train Epoch: 1 [9600/12665 (76%)]\tLoss: 0.014684\n",
+ "Train Epoch: 1 [10240/12665 (81%)]\tLoss: 0.007916\n",
+ "Train Epoch: 1 [10880/12665 (86%)]\tLoss: 0.008834\n",
+ "Train Epoch: 1 [11520/12665 (91%)]\tLoss: 0.082196\n",
+ "Train Epoch: 1 [12160/12665 (96%)]\tLoss: 0.002452\n",
+ "\n",
+ "Test set: Average loss: 7.1540\n",
+ "Class 0 accuracy: 977.0/980(100%)\n",
+ "Class 1 accuracy: 1134.0/1135(100%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 2 [0/12665 (0%)]\tLoss: 0.000673\n",
+ "Train Epoch: 2 [640/12665 (5%)]\tLoss: 0.029478\n",
+ "Train Epoch: 2 [1280/12665 (10%)]\tLoss: 0.002406\n",
+ "Train Epoch: 2 [1920/12665 (15%)]\tLoss: 0.008619\n",
+ "Train Epoch: 2 [2560/12665 (20%)]\tLoss: 0.001777\n",
+ "Train Epoch: 2 [3200/12665 (25%)]\tLoss: 0.031666\n",
+ "Train Epoch: 2 [3840/12665 (30%)]\tLoss: 0.133443\n",
+ "Train Epoch: 2 [4480/12665 (35%)]\tLoss: 0.006141\n",
+ "Train Epoch: 2 [5120/12665 (40%)]\tLoss: 0.006000\n",
+ "Train Epoch: 2 [5760/12665 (45%)]\tLoss: 0.003495\n",
+ "Train Epoch: 2 [6400/12665 (51%)]\tLoss: 0.000851\n",
+ "Train Epoch: 2 [7040/12665 (56%)]\tLoss: 0.001280\n",
+ "Train Epoch: 2 [7680/12665 (61%)]\tLoss: 0.000972\n",
+ "Train Epoch: 2 [8320/12665 (66%)]\tLoss: 0.001776\n",
+ "Train Epoch: 2 [8960/12665 (71%)]\tLoss: 0.067486\n",
+ "Train Epoch: 2 [9600/12665 (76%)]\tLoss: 0.001030\n",
+ "Train Epoch: 2 [10240/12665 (81%)]\tLoss: 0.001892\n",
+ "Train Epoch: 2 [10880/12665 (86%)]\tLoss: 0.001493\n",
+ "Train Epoch: 2 [11520/12665 (91%)]\tLoss: 0.047196\n",
+ "Train Epoch: 2 [12160/12665 (96%)]\tLoss: 0.004952\n",
+ "\n",
+ "Test set: Average loss: 7.8296\n",
+ "Class 0 accuracy: 977.0/980(100%)\n",
+ "Class 1 accuracy: 1134.0/1135(100%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 3 [0/12665 (0%)]\tLoss: 0.007902\n",
+ "Train Epoch: 3 [640/12665 (5%)]\tLoss: 0.003385\n",
+ "Train Epoch: 3 [1280/12665 (10%)]\tLoss: 0.001230\n",
+ "Train Epoch: 3 [1920/12665 (15%)]\tLoss: 0.001810\n",
+ "Train Epoch: 3 [2560/12665 (20%)]\tLoss: 0.001579\n",
+ "Train Epoch: 3 [3200/12665 (25%)]\tLoss: 0.028920\n",
+ "Train Epoch: 3 [3840/12665 (30%)]\tLoss: 0.004439\n",
+ "Train Epoch: 3 [4480/12665 (35%)]\tLoss: 0.001913\n",
+ "Train Epoch: 3 [5120/12665 (40%)]\tLoss: 0.000407\n",
+ "Train Epoch: 3 [5760/12665 (45%)]\tLoss: 0.004402\n",
+ "Train Epoch: 3 [6400/12665 (51%)]\tLoss: 0.009100\n",
+ "Train Epoch: 3 [7040/12665 (56%)]\tLoss: 0.000980\n",
+ "Train Epoch: 3 [7680/12665 (61%)]\tLoss: 0.000387\n",
+ "Train Epoch: 3 [8320/12665 (66%)]\tLoss: 0.004606\n",
+ "Train Epoch: 3 [8960/12665 (71%)]\tLoss: 0.001144\n",
+ "Train Epoch: 3 [9600/12665 (76%)]\tLoss: 0.007978\n",
+ "Train Epoch: 3 [10240/12665 (81%)]\tLoss: 0.011006\n",
+ "Train Epoch: 3 [10880/12665 (86%)]\tLoss: 0.001300\n",
+ "Train Epoch: 3 [11520/12665 (91%)]\tLoss: 0.000758\n",
+ "Train Epoch: 3 [12160/12665 (96%)]\tLoss: 0.001379\n",
+ "\n",
+ "Test set: Average loss: 8.1397\n",
+ "Class 0 accuracy: 978.0/980(100%)\n",
+ "Class 1 accuracy: 1134.0/1135(100%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n"
+ ]
+ },
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "[{0: 0.996938775510204,\n",
+ " 1: 0.9991189427312775,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '0_1'},\n",
+ " {0: 0.996938775510204,\n",
+ " 1: 0.9991189427312775,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '0_1'},\n",
+ " {0: 0.996938775510204,\n",
+ " 1: 0.9991189427312775,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '0_1'},\n",
+ " {0: 0.0,\n",
+ " 1: 0.0,\n",
+ " 2: 0.9612403100775194,\n",
+ " 3: 0.9772277227722772,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '2_3'},\n",
+ " {0: 0.0,\n",
+ " 1: 0.0,\n",
+ " 2: 0.9670542635658915,\n",
+ " 3: 0.9841584158415841,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '2_3'},\n",
+ " {0: 0.0,\n",
+ " 1: 0.0,\n",
+ " 2: 0.9757751937984496,\n",
+ " 3: 0.9752475247524752,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '2_3'},\n",
+ " {0: 0.0,\n",
+ " 1: 0.0,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.994908350305499,\n",
+ " 5: 0.9708520179372198,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '4_5'},\n",
+ " {0: 0.0,\n",
+ " 1: 0.0,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.9959266802443992,\n",
+ " 5: 0.9775784753363229,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '4_5'},\n",
+ " {0: 0.0,\n",
+ " 1: 0.0,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.9959266802443992,\n",
+ " 5: 0.9854260089686099,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '4_5'},\n",
+ " {0: 0.0,\n",
+ " 1: 0.0,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.9968684759916493,\n",
+ " 7: 0.9892996108949417,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '6_7'},\n",
+ " {0: 0.0,\n",
+ " 1: 0.0,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.9968684759916493,\n",
+ " 7: 0.9931906614785992,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '6_7'},\n",
+ " {0: 0.0,\n",
+ " 1: 0.0,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.9968684759916493,\n",
+ " 7: 0.9931906614785992,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '6_7'},\n",
+ " {0: 0.0,\n",
+ " 1: 0.0,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.9681724845995893,\n",
+ " 9: 0.9653121902874133,\n",
+ " 'phase': '8_9'},\n",
+ " {0: 0.0,\n",
+ " 1: 0.0,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.9928131416837782,\n",
+ " 9: 0.956392467789891,\n",
+ " 'phase': '8_9'},\n",
+ " {0: 0.0,\n",
+ " 1: 0.0,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.9774127310061602,\n",
+ " 9: 0.9692765113974232,\n",
+ " 'phase': '8_9'},\n",
+ " {0: 0.996938775510204,\n",
+ " 1: 0.9991189427312775,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '0_1_again'},\n",
+ " {0: 0.996938775510204,\n",
+ " 1: 0.9991189427312775,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '0_1_again'},\n",
+ " {0: 0.9979591836734694,\n",
+ " 1: 0.9991189427312775,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '0_1_again'}]"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 19
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# Exercise 2: Implementing the previous exercise should have shown that the network\n",
+ "# suffers from catastrophic forgetting. To fix this, implement a memory replay buffer\n",
+ "# and use this buffer to counteract the catastrophic forgetting.\n",
+ "#\n",
+ "# Implementation requires adaptation of the cells above, plus the addition of a new\n",
+ "# experiment setup below.\n",
+ "\n",
+ "\n",
+ "### START SOLUTION ###\n",
+ "# The experiment setup is identical to the one above, but now we initialize and use\n",
+ "# a replay buffer. Right now, the buffer only stores a single image for each class.\n",
+ "# As a bonus exercise, explore how different variants of the replay buffer affect the\n",
+ "# resulting model performance.\n",
+ "\n",
+ "def train_memory_replay():\n",
+ " model = Net()\n",
+ " history = []\n",
+ " buffer = Buffer()\n",
+ "\n",
+ " config.train_classes = [0, 1]\n",
+ " train_model(config, model, phase = \"0_1\", history = history, buffer = buffer)\n",
+ " \n",
+ " config.train_classes = [2, 3]\n",
+ " train_model(config, model, phase = \"2_3\", history = history, buffer = buffer)\n",
+ "\n",
+ " config.train_classes = [4, 5]\n",
+ " train_model(config, model, phase = \"4_5\", history = history, buffer = buffer)\n",
+ "\n",
+ " config.train_classes = [6, 7]\n",
+ " train_model(config, model, phase = \"6_7\", history = history, buffer = buffer)\n",
+ "\n",
+ " config.train_classes = [8, 9]\n",
+ " train_model(config, model, phase = \"8_9\", history = history, buffer = buffer)\n",
+ " \n",
+ " config.train_classes = [0, 1]\n",
+ " train_model(config, model, phase = \"0_1_again\", history = history, buffer = buffer)\n",
+ "\n",
+ " return history\n",
+ "\n",
+ "### END SOLUTION ###\n",
+ "\n",
+ "history_memory_replay = train_memory_replay()\n",
+ "history_memory_replay"
+ ],
+ "metadata": {
+ "id": "LtWvHl_tQCpg",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "6705c5fe-9838-4da5-a562-77d7c9a8c6d8"
+ },
+ "execution_count": 20,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Train Epoch: 1 [0/12665 (0%)]\tLoss: 2.196357\n",
+ "Train Epoch: 1 [640/12665 (5%)]\tLoss: 1.335955\n",
+ "Train Epoch: 1 [1280/12665 (10%)]\tLoss: 0.555878\n",
+ "Train Epoch: 1 [1920/12665 (15%)]\tLoss: 0.146986\n",
+ "Train Epoch: 1 [2560/12665 (20%)]\tLoss: 0.082966\n",
+ "Train Epoch: 1 [3200/12665 (25%)]\tLoss: 0.054255\n",
+ "Train Epoch: 1 [3840/12665 (30%)]\tLoss: 0.011100\n",
+ "Train Epoch: 1 [4480/12665 (35%)]\tLoss: 0.078007\n",
+ "Train Epoch: 1 [5120/12665 (40%)]\tLoss: 0.005687\n",
+ "Train Epoch: 1 [5760/12665 (45%)]\tLoss: 0.004260\n",
+ "Train Epoch: 1 [6400/12665 (51%)]\tLoss: 0.002415\n",
+ "Train Epoch: 1 [7040/12665 (56%)]\tLoss: 0.005845\n",
+ "Train Epoch: 1 [7680/12665 (61%)]\tLoss: 0.005518\n",
+ "Train Epoch: 1 [8320/12665 (66%)]\tLoss: 0.001475\n",
+ "Train Epoch: 1 [8960/12665 (71%)]\tLoss: 0.002208\n",
+ "Train Epoch: 1 [9600/12665 (76%)]\tLoss: 0.000701\n",
+ "Train Epoch: 1 [10240/12665 (81%)]\tLoss: 0.000352\n",
+ "Train Epoch: 1 [10880/12665 (86%)]\tLoss: 0.000833\n",
+ "Train Epoch: 1 [11520/12665 (91%)]\tLoss: 0.002580\n",
+ "Train Epoch: 1 [12160/12665 (96%)]\tLoss: 0.002562\n",
+ "\n",
+ "Test set: Average loss: 7.8370\n",
+ "Class 0 accuracy: 976.0/980(100%)\n",
+ "Class 1 accuracy: 1134.0/1135(100%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 2 [0/12665 (0%)]\tLoss: 0.221930\n",
+ "Train Epoch: 2 [640/12665 (5%)]\tLoss: 0.027592\n",
+ "Train Epoch: 2 [1280/12665 (10%)]\tLoss: 0.065451\n",
+ "Train Epoch: 2 [1920/12665 (15%)]\tLoss: 0.015034\n",
+ "Train Epoch: 2 [2560/12665 (20%)]\tLoss: 0.046994\n",
+ "Train Epoch: 2 [3200/12665 (25%)]\tLoss: 0.008316\n",
+ "Train Epoch: 2 [3840/12665 (30%)]\tLoss: 0.021686\n",
+ "Train Epoch: 2 [4480/12665 (35%)]\tLoss: 0.024137\n",
+ "Train Epoch: 2 [5120/12665 (40%)]\tLoss: 0.002627\n",
+ "Train Epoch: 2 [5760/12665 (45%)]\tLoss: 0.042552\n",
+ "Train Epoch: 2 [6400/12665 (51%)]\tLoss: 0.026033\n",
+ "Train Epoch: 2 [7040/12665 (56%)]\tLoss: 0.002244\n",
+ "Train Epoch: 2 [7680/12665 (61%)]\tLoss: 0.003471\n",
+ "Train Epoch: 2 [8320/12665 (66%)]\tLoss: 0.041315\n",
+ "Train Epoch: 2 [8960/12665 (71%)]\tLoss: 0.008438\n",
+ "Train Epoch: 2 [9600/12665 (76%)]\tLoss: 0.000700\n",
+ "Train Epoch: 2 [10240/12665 (81%)]\tLoss: 0.000417\n",
+ "Train Epoch: 2 [10880/12665 (86%)]\tLoss: 0.002115\n",
+ "Train Epoch: 2 [11520/12665 (91%)]\tLoss: 0.008961\n",
+ "Train Epoch: 2 [12160/12665 (96%)]\tLoss: 0.002133\n",
+ "\n",
+ "Test set: Average loss: 8.7829\n",
+ "Class 0 accuracy: 976.0/980(100%)\n",
+ "Class 1 accuracy: 1135.0/1135(100%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 3 [0/12665 (0%)]\tLoss: 0.000570\n",
+ "Train Epoch: 3 [640/12665 (5%)]\tLoss: 0.011992\n",
+ "Train Epoch: 3 [1280/12665 (10%)]\tLoss: 0.000725\n",
+ "Train Epoch: 3 [1920/12665 (15%)]\tLoss: 0.000835\n",
+ "Train Epoch: 3 [2560/12665 (20%)]\tLoss: 0.000185\n",
+ "Train Epoch: 3 [3200/12665 (25%)]\tLoss: 0.001194\n",
+ "Train Epoch: 3 [3840/12665 (30%)]\tLoss: 0.000802\n",
+ "Train Epoch: 3 [4480/12665 (35%)]\tLoss: 0.001044\n",
+ "Train Epoch: 3 [5120/12665 (40%)]\tLoss: 0.001886\n",
+ "Train Epoch: 3 [5760/12665 (45%)]\tLoss: 0.001518\n",
+ "Train Epoch: 3 [6400/12665 (51%)]\tLoss: 0.001240\n",
+ "Train Epoch: 3 [7040/12665 (56%)]\tLoss: 0.005406\n",
+ "Train Epoch: 3 [7680/12665 (61%)]\tLoss: 0.004714\n",
+ "Train Epoch: 3 [8320/12665 (66%)]\tLoss: 0.000870\n",
+ "Train Epoch: 3 [8960/12665 (71%)]\tLoss: 0.001174\n",
+ "Train Epoch: 3 [9600/12665 (76%)]\tLoss: 0.000833\n",
+ "Train Epoch: 3 [10240/12665 (81%)]\tLoss: 0.006711\n",
+ "Train Epoch: 3 [10880/12665 (86%)]\tLoss: 0.006384\n",
+ "Train Epoch: 3 [11520/12665 (91%)]\tLoss: 0.006488\n",
+ "Train Epoch: 3 [12160/12665 (96%)]\tLoss: 0.000901\n",
+ "\n",
+ "Test set: Average loss: 9.2011\n",
+ "Class 0 accuracy: 977.0/980(100%)\n",
+ "Class 1 accuracy: 1135.0/1135(100%)\n",
+ "Class 2 accuracy: 0.0/1032(0%)\n",
+ "Class 3 accuracy: 0.0/1010(0%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 1 [0/12089 (0%)]\tLoss: 2.805099\n",
+ "Train Epoch: 1 [640/12089 (5%)]\tLoss: 1.660801\n",
+ "Train Epoch: 1 [1280/12089 (11%)]\tLoss: 0.437137\n",
+ "Train Epoch: 1 [1920/12089 (16%)]\tLoss: 0.808282\n",
+ "Train Epoch: 1 [2560/12089 (21%)]\tLoss: 0.285198\n",
+ "Train Epoch: 1 [3200/12089 (26%)]\tLoss: 0.129722\n",
+ "Train Epoch: 1 [3840/12089 (32%)]\tLoss: 0.145888\n",
+ "Train Epoch: 1 [4480/12089 (37%)]\tLoss: 0.343596\n",
+ "Train Epoch: 1 [5120/12089 (42%)]\tLoss: 0.078071\n",
+ "Train Epoch: 1 [5760/12089 (48%)]\tLoss: 0.098522\n",
+ "Train Epoch: 1 [6400/12089 (53%)]\tLoss: 0.089895\n",
+ "Train Epoch: 1 [7040/12089 (58%)]\tLoss: 0.067733\n",
+ "Train Epoch: 1 [7680/12089 (63%)]\tLoss: 0.046314\n",
+ "Train Epoch: 1 [8320/12089 (69%)]\tLoss: 0.028943\n",
+ "Train Epoch: 1 [8960/12089 (74%)]\tLoss: 0.082591\n",
+ "Train Epoch: 1 [9600/12089 (79%)]\tLoss: 0.024760\n",
+ "Train Epoch: 1 [10240/12089 (85%)]\tLoss: 0.050374\n",
+ "Train Epoch: 1 [10880/12089 (90%)]\tLoss: 0.020318\n",
+ "Train Epoch: 1 [11520/12089 (95%)]\tLoss: 0.025210\n",
+ "\n",
+ "Test set: Average loss: 5.2845\n",
+ "Class 0 accuracy: 829.0/980(85%)\n",
+ "Class 1 accuracy: 1046.0/1135(92%)\n",
+ "Class 2 accuracy: 991.0/1032(96%)\n",
+ "Class 3 accuracy: 983.0/1010(97%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 2 [0/12089 (0%)]\tLoss: 0.091748\n",
+ "Train Epoch: 2 [640/12089 (5%)]\tLoss: 0.038480\n",
+ "Train Epoch: 2 [1280/12089 (11%)]\tLoss: 0.027258\n",
+ "Train Epoch: 2 [1920/12089 (16%)]\tLoss: 0.040072\n",
+ "Train Epoch: 2 [2560/12089 (21%)]\tLoss: 0.024616\n",
+ "Train Epoch: 2 [3200/12089 (26%)]\tLoss: 0.021542\n",
+ "Train Epoch: 2 [3840/12089 (32%)]\tLoss: 0.016757\n",
+ "Train Epoch: 2 [4480/12089 (37%)]\tLoss: 0.029563\n",
+ "Train Epoch: 2 [5120/12089 (42%)]\tLoss: 0.010378\n",
+ "Train Epoch: 2 [5760/12089 (48%)]\tLoss: 0.020319\n",
+ "Train Epoch: 2 [6400/12089 (53%)]\tLoss: 0.019660\n",
+ "Train Epoch: 2 [7040/12089 (58%)]\tLoss: 0.006761\n",
+ "Train Epoch: 2 [7680/12089 (63%)]\tLoss: 0.026263\n",
+ "Train Epoch: 2 [8320/12089 (69%)]\tLoss: 0.008666\n",
+ "Train Epoch: 2 [8960/12089 (74%)]\tLoss: 0.013218\n",
+ "Train Epoch: 2 [9600/12089 (79%)]\tLoss: 0.002491\n",
+ "Train Epoch: 2 [10240/12089 (85%)]\tLoss: 0.010161\n",
+ "Train Epoch: 2 [10880/12089 (90%)]\tLoss: 0.019670\n",
+ "Train Epoch: 2 [11520/12089 (95%)]\tLoss: 0.012468\n",
+ "\n",
+ "Test set: Average loss: 6.1435\n",
+ "Class 0 accuracy: 764.0/980(78%)\n",
+ "Class 1 accuracy: 999.0/1135(88%)\n",
+ "Class 2 accuracy: 1000.0/1032(97%)\n",
+ "Class 3 accuracy: 988.0/1010(98%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 3 [0/12089 (0%)]\tLoss: 0.028908\n",
+ "Train Epoch: 3 [640/12089 (5%)]\tLoss: 0.017523\n",
+ "Train Epoch: 3 [1280/12089 (11%)]\tLoss: 0.012286\n",
+ "Train Epoch: 3 [1920/12089 (16%)]\tLoss: 0.029993\n",
+ "Train Epoch: 3 [2560/12089 (21%)]\tLoss: 0.014532\n",
+ "Train Epoch: 3 [3200/12089 (26%)]\tLoss: 0.023068\n",
+ "Train Epoch: 3 [3840/12089 (32%)]\tLoss: 0.007645\n",
+ "Train Epoch: 3 [4480/12089 (37%)]\tLoss: 0.016837\n",
+ "Train Epoch: 3 [5120/12089 (42%)]\tLoss: 0.004771\n",
+ "Train Epoch: 3 [5760/12089 (48%)]\tLoss: 0.004505\n",
+ "Train Epoch: 3 [6400/12089 (53%)]\tLoss: 0.085267\n",
+ "Train Epoch: 3 [7040/12089 (58%)]\tLoss: 0.007249\n",
+ "Train Epoch: 3 [7680/12089 (63%)]\tLoss: 0.005857\n",
+ "Train Epoch: 3 [8320/12089 (69%)]\tLoss: 0.036750\n",
+ "Train Epoch: 3 [8960/12089 (74%)]\tLoss: 0.035684\n",
+ "Train Epoch: 3 [9600/12089 (79%)]\tLoss: 0.005433\n",
+ "Train Epoch: 3 [10240/12089 (85%)]\tLoss: 0.006491\n",
+ "Train Epoch: 3 [10880/12089 (90%)]\tLoss: 0.026140\n",
+ "Train Epoch: 3 [11520/12089 (95%)]\tLoss: 0.007269\n",
+ "\n",
+ "Test set: Average loss: 6.5537\n",
+ "Class 0 accuracy: 723.0/980(74%)\n",
+ "Class 1 accuracy: 968.0/1135(85%)\n",
+ "Class 2 accuracy: 999.0/1032(97%)\n",
+ "Class 3 accuracy: 992.0/1010(98%)\n",
+ "Class 4 accuracy: 0.0/982(0%)\n",
+ "Class 5 accuracy: 0.0/892(0%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 1 [0/11263 (0%)]\tLoss: 1.635322\n",
+ "Train Epoch: 1 [640/11263 (6%)]\tLoss: 0.442154\n",
+ "Train Epoch: 1 [1280/11263 (11%)]\tLoss: 0.249078\n",
+ "Train Epoch: 1 [1920/11263 (17%)]\tLoss: 0.270407\n",
+ "Train Epoch: 1 [2560/11263 (23%)]\tLoss: 0.180369\n",
+ "Train Epoch: 1 [3200/11263 (28%)]\tLoss: 0.088140\n",
+ "Train Epoch: 1 [3840/11263 (34%)]\tLoss: 0.171120\n",
+ "Train Epoch: 1 [4480/11263 (40%)]\tLoss: 0.263797\n",
+ "Train Epoch: 1 [5120/11263 (45%)]\tLoss: 0.111911\n",
+ "Train Epoch: 1 [5760/11263 (51%)]\tLoss: 0.117878\n",
+ "Train Epoch: 1 [6400/11263 (57%)]\tLoss: 0.033867\n",
+ "Train Epoch: 1 [7040/11263 (62%)]\tLoss: 0.058040\n",
+ "Train Epoch: 1 [7680/11263 (68%)]\tLoss: 0.034263\n",
+ "Train Epoch: 1 [8320/11263 (74%)]\tLoss: 0.082758\n",
+ "Train Epoch: 1 [8960/11263 (80%)]\tLoss: 0.041592\n",
+ "Train Epoch: 1 [9600/11263 (85%)]\tLoss: 0.035437\n",
+ "Train Epoch: 1 [10240/11263 (91%)]\tLoss: 0.015268\n",
+ "Train Epoch: 1 [10880/11263 (97%)]\tLoss: 0.029453\n",
+ "\n",
+ "Test set: Average loss: 4.5940\n",
+ "Class 0 accuracy: 760.0/980(78%)\n",
+ "Class 1 accuracy: 986.0/1135(87%)\n",
+ "Class 2 accuracy: 664.0/1032(64%)\n",
+ "Class 3 accuracy: 367.0/1010(36%)\n",
+ "Class 4 accuracy: 979.0/982(100%)\n",
+ "Class 5 accuracy: 864.0/892(97%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 2 [0/11263 (0%)]\tLoss: 0.008444\n",
+ "Train Epoch: 2 [640/11263 (6%)]\tLoss: 0.020623\n",
+ "Train Epoch: 2 [1280/11263 (11%)]\tLoss: 0.028893\n",
+ "Train Epoch: 2 [1920/11263 (17%)]\tLoss: 0.025949\n",
+ "Train Epoch: 2 [2560/11263 (23%)]\tLoss: 0.027629\n",
+ "Train Epoch: 2 [3200/11263 (28%)]\tLoss: 0.012673\n",
+ "Train Epoch: 2 [3840/11263 (34%)]\tLoss: 0.132138\n",
+ "Train Epoch: 2 [4480/11263 (40%)]\tLoss: 0.019918\n",
+ "Train Epoch: 2 [5120/11263 (45%)]\tLoss: 0.040663\n",
+ "Train Epoch: 2 [5760/11263 (51%)]\tLoss: 0.072586\n",
+ "Train Epoch: 2 [6400/11263 (57%)]\tLoss: 0.027573\n",
+ "Train Epoch: 2 [7040/11263 (62%)]\tLoss: 0.010655\n",
+ "Train Epoch: 2 [7680/11263 (68%)]\tLoss: 0.007804\n",
+ "Train Epoch: 2 [8320/11263 (74%)]\tLoss: 0.021280\n",
+ "Train Epoch: 2 [8960/11263 (80%)]\tLoss: 0.038740\n",
+ "Train Epoch: 2 [9600/11263 (85%)]\tLoss: 0.005795\n",
+ "Train Epoch: 2 [10240/11263 (91%)]\tLoss: 0.005783\n",
+ "Train Epoch: 2 [10880/11263 (97%)]\tLoss: 0.049235\n",
+ "\n",
+ "Test set: Average loss: 5.5267\n",
+ "Class 0 accuracy: 647.0/980(66%)\n",
+ "Class 1 accuracy: 970.0/1135(85%)\n",
+ "Class 2 accuracy: 616.0/1032(60%)\n",
+ "Class 3 accuracy: 240.0/1010(24%)\n",
+ "Class 4 accuracy: 979.0/982(100%)\n",
+ "Class 5 accuracy: 876.0/892(98%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 3 [0/11263 (0%)]\tLoss: 0.060683\n",
+ "Train Epoch: 3 [640/11263 (6%)]\tLoss: 0.049512\n",
+ "Train Epoch: 3 [1280/11263 (11%)]\tLoss: 0.034698\n",
+ "Train Epoch: 3 [1920/11263 (17%)]\tLoss: 0.015581\n",
+ "Train Epoch: 3 [2560/11263 (23%)]\tLoss: 0.097252\n",
+ "Train Epoch: 3 [3200/11263 (28%)]\tLoss: 0.022429\n",
+ "Train Epoch: 3 [3840/11263 (34%)]\tLoss: 0.021434\n",
+ "Train Epoch: 3 [4480/11263 (40%)]\tLoss: 0.030935\n",
+ "Train Epoch: 3 [5120/11263 (45%)]\tLoss: 0.055945\n",
+ "Train Epoch: 3 [5760/11263 (51%)]\tLoss: 0.032630\n",
+ "Train Epoch: 3 [6400/11263 (57%)]\tLoss: 0.010632\n",
+ "Train Epoch: 3 [7040/11263 (62%)]\tLoss: 0.014181\n",
+ "Train Epoch: 3 [7680/11263 (68%)]\tLoss: 0.011640\n",
+ "Train Epoch: 3 [8320/11263 (74%)]\tLoss: 0.022853\n",
+ "Train Epoch: 3 [8960/11263 (80%)]\tLoss: 0.011952\n",
+ "Train Epoch: 3 [9600/11263 (85%)]\tLoss: 0.029158\n",
+ "Train Epoch: 3 [10240/11263 (91%)]\tLoss: 0.005775\n",
+ "Train Epoch: 3 [10880/11263 (97%)]\tLoss: 0.044570\n",
+ "\n",
+ "Test set: Average loss: 6.0346\n",
+ "Class 0 accuracy: 662.0/980(68%)\n",
+ "Class 1 accuracy: 972.0/1135(86%)\n",
+ "Class 2 accuracy: 558.0/1032(54%)\n",
+ "Class 3 accuracy: 228.0/1010(23%)\n",
+ "Class 4 accuracy: 978.0/982(100%)\n",
+ "Class 5 accuracy: 883.0/892(99%)\n",
+ "Class 6 accuracy: 0.0/958(0%)\n",
+ "Class 7 accuracy: 0.0/1028(0%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 1 [0/12183 (0%)]\tLoss: 1.379911\n",
+ "Train Epoch: 1 [640/12183 (5%)]\tLoss: 0.125989\n",
+ "Train Epoch: 1 [1280/12183 (10%)]\tLoss: 0.938824\n",
+ "Train Epoch: 1 [1920/12183 (16%)]\tLoss: 0.376103\n",
+ "Train Epoch: 1 [2560/12183 (21%)]\tLoss: 0.235958\n",
+ "Train Epoch: 1 [3200/12183 (26%)]\tLoss: 0.146971\n",
+ "Train Epoch: 1 [3840/12183 (31%)]\tLoss: 0.261188\n",
+ "Train Epoch: 1 [4480/12183 (37%)]\tLoss: 0.162076\n",
+ "Train Epoch: 1 [5120/12183 (42%)]\tLoss: 0.064259\n",
+ "Train Epoch: 1 [5760/12183 (47%)]\tLoss: 0.127866\n",
+ "Train Epoch: 1 [6400/12183 (52%)]\tLoss: 0.153409\n",
+ "Train Epoch: 1 [7040/12183 (58%)]\tLoss: 0.117668\n",
+ "Train Epoch: 1 [7680/12183 (63%)]\tLoss: 0.058572\n",
+ "Train Epoch: 1 [8320/12183 (68%)]\tLoss: 0.084697\n",
+ "Train Epoch: 1 [8960/12183 (73%)]\tLoss: 0.034420\n",
+ "Train Epoch: 1 [9600/12183 (79%)]\tLoss: 0.017252\n",
+ "Train Epoch: 1 [10240/12183 (84%)]\tLoss: 0.020837\n",
+ "Train Epoch: 1 [10880/12183 (89%)]\tLoss: 0.022506\n",
+ "Train Epoch: 1 [11520/12183 (94%)]\tLoss: 0.073931\n",
+ "Train Epoch: 1 [4370/12183 (99%)]\tLoss: 0.032285\n",
+ "\n",
+ "Test set: Average loss: 2.6226\n",
+ "Class 0 accuracy: 668.0/980(68%)\n",
+ "Class 1 accuracy: 975.0/1135(86%)\n",
+ "Class 2 accuracy: 475.0/1032(46%)\n",
+ "Class 3 accuracy: 489.0/1010(48%)\n",
+ "Class 4 accuracy: 691.0/982(70%)\n",
+ "Class 5 accuracy: 564.0/892(63%)\n",
+ "Class 6 accuracy: 948.0/958(99%)\n",
+ "Class 7 accuracy: 1003.0/1028(98%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 2 [0/12183 (0%)]\tLoss: 0.045590\n",
+ "Train Epoch: 2 [640/12183 (5%)]\tLoss: 0.091010\n",
+ "Train Epoch: 2 [1280/12183 (10%)]\tLoss: 0.021004\n",
+ "Train Epoch: 2 [1920/12183 (16%)]\tLoss: 0.036341\n",
+ "Train Epoch: 2 [2560/12183 (21%)]\tLoss: 0.021020\n",
+ "Train Epoch: 2 [3200/12183 (26%)]\tLoss: 0.036480\n",
+ "Train Epoch: 2 [3840/12183 (31%)]\tLoss: 0.043549\n",
+ "Train Epoch: 2 [4480/12183 (37%)]\tLoss: 0.029598\n",
+ "Train Epoch: 2 [5120/12183 (42%)]\tLoss: 0.053440\n",
+ "Train Epoch: 2 [5760/12183 (47%)]\tLoss: 0.016025\n",
+ "Train Epoch: 2 [6400/12183 (52%)]\tLoss: 0.022595\n",
+ "Train Epoch: 2 [7040/12183 (58%)]\tLoss: 0.008219\n",
+ "Train Epoch: 2 [7680/12183 (63%)]\tLoss: 0.047070\n",
+ "Train Epoch: 2 [8320/12183 (68%)]\tLoss: 0.021060\n",
+ "Train Epoch: 2 [8960/12183 (73%)]\tLoss: 0.024627\n",
+ "Train Epoch: 2 [9600/12183 (79%)]\tLoss: 0.031155\n",
+ "Train Epoch: 2 [10240/12183 (84%)]\tLoss: 0.045095\n",
+ "Train Epoch: 2 [10880/12183 (89%)]\tLoss: 0.015965\n",
+ "Train Epoch: 2 [11520/12183 (94%)]\tLoss: 0.025968\n",
+ "Train Epoch: 2 [4370/12183 (99%)]\tLoss: 0.043935\n",
+ "\n",
+ "Test set: Average loss: 3.1688\n",
+ "Class 0 accuracy: 682.0/980(70%)\n",
+ "Class 1 accuracy: 969.0/1135(85%)\n",
+ "Class 2 accuracy: 480.0/1032(47%)\n",
+ "Class 3 accuracy: 471.0/1010(47%)\n",
+ "Class 4 accuracy: 635.0/982(65%)\n",
+ "Class 5 accuracy: 484.0/892(54%)\n",
+ "Class 6 accuracy: 950.0/958(99%)\n",
+ "Class 7 accuracy: 1013.0/1028(99%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 3 [0/12183 (0%)]\tLoss: 0.019614\n",
+ "Train Epoch: 3 [640/12183 (5%)]\tLoss: 0.059921\n",
+ "Train Epoch: 3 [1280/12183 (10%)]\tLoss: 0.018621\n",
+ "Train Epoch: 3 [1920/12183 (16%)]\tLoss: 0.011714\n",
+ "Train Epoch: 3 [2560/12183 (21%)]\tLoss: 0.014679\n",
+ "Train Epoch: 3 [3200/12183 (26%)]\tLoss: 0.012920\n",
+ "Train Epoch: 3 [3840/12183 (31%)]\tLoss: 0.022788\n",
+ "Train Epoch: 3 [4480/12183 (37%)]\tLoss: 0.016748\n",
+ "Train Epoch: 3 [5120/12183 (42%)]\tLoss: 0.028296\n",
+ "Train Epoch: 3 [5760/12183 (47%)]\tLoss: 0.021148\n",
+ "Train Epoch: 3 [6400/12183 (52%)]\tLoss: 0.008148\n",
+ "Train Epoch: 3 [7040/12183 (58%)]\tLoss: 0.011808\n",
+ "Train Epoch: 3 [7680/12183 (63%)]\tLoss: 0.009274\n",
+ "Train Epoch: 3 [8320/12183 (68%)]\tLoss: 0.011613\n",
+ "Train Epoch: 3 [8960/12183 (73%)]\tLoss: 0.013502\n",
+ "Train Epoch: 3 [9600/12183 (79%)]\tLoss: 0.022795\n",
+ "Train Epoch: 3 [10240/12183 (84%)]\tLoss: 0.013261\n",
+ "Train Epoch: 3 [10880/12183 (89%)]\tLoss: 0.026117\n",
+ "Train Epoch: 3 [11520/12183 (94%)]\tLoss: 0.004542\n",
+ "Train Epoch: 3 [4370/12183 (99%)]\tLoss: 0.002898\n",
+ "\n",
+ "Test set: Average loss: 3.5287\n",
+ "Class 0 accuracy: 636.0/980(65%)\n",
+ "Class 1 accuracy: 955.0/1135(84%)\n",
+ "Class 2 accuracy: 451.0/1032(44%)\n",
+ "Class 3 accuracy: 432.0/1010(43%)\n",
+ "Class 4 accuracy: 562.0/982(57%)\n",
+ "Class 5 accuracy: 458.0/892(51%)\n",
+ "Class 6 accuracy: 952.0/958(99%)\n",
+ "Class 7 accuracy: 1018.0/1028(99%)\n",
+ "Class 8 accuracy: 0.0/974(0%)\n",
+ "Class 9 accuracy: 0.0/1009(0%)\n",
+ "Train Epoch: 1 [0/11800 (0%)]\tLoss: 0.473740\n",
+ "Train Epoch: 1 [640/11800 (5%)]\tLoss: 0.210103\n",
+ "Train Epoch: 1 [1280/11800 (11%)]\tLoss: 0.418402\n",
+ "Train Epoch: 1 [1920/11800 (16%)]\tLoss: 0.530582\n",
+ "Train Epoch: 1 [2560/11800 (22%)]\tLoss: 0.304206\n",
+ "Train Epoch: 1 [3200/11800 (27%)]\tLoss: 0.122092\n",
+ "Train Epoch: 1 [3840/11800 (32%)]\tLoss: 0.183575\n",
+ "Train Epoch: 1 [4480/11800 (38%)]\tLoss: 0.260152\n",
+ "Train Epoch: 1 [5120/11800 (43%)]\tLoss: 0.277376\n",
+ "Train Epoch: 1 [5760/11800 (49%)]\tLoss: 0.212683\n",
+ "Train Epoch: 1 [6400/11800 (54%)]\tLoss: 0.163834\n",
+ "Train Epoch: 1 [7040/11800 (59%)]\tLoss: 0.088070\n",
+ "Train Epoch: 1 [7680/11800 (65%)]\tLoss: 0.092493\n",
+ "Train Epoch: 1 [8320/11800 (70%)]\tLoss: 0.169504\n",
+ "Train Epoch: 1 [8960/11800 (76%)]\tLoss: 0.130592\n",
+ "Train Epoch: 1 [9600/11800 (81%)]\tLoss: 0.043165\n",
+ "Train Epoch: 1 [10240/11800 (86%)]\tLoss: 0.051642\n",
+ "Train Epoch: 1 [10880/11800 (92%)]\tLoss: 0.081378\n",
+ "Train Epoch: 1 [11520/11800 (97%)]\tLoss: 0.073074\n",
+ "\n",
+ "Test set: Average loss: 1.1909\n",
+ "Class 0 accuracy: 710.0/980(72%)\n",
+ "Class 1 accuracy: 937.0/1135(83%)\n",
+ "Class 2 accuracy: 525.0/1032(51%)\n",
+ "Class 3 accuracy: 409.0/1010(40%)\n",
+ "Class 4 accuracy: 368.0/982(37%)\n",
+ "Class 5 accuracy: 359.0/892(40%)\n",
+ "Class 6 accuracy: 782.0/958(82%)\n",
+ "Class 7 accuracy: 587.0/1028(57%)\n",
+ "Class 8 accuracy: 945.0/974(97%)\n",
+ "Class 9 accuracy: 974.0/1009(97%)\n",
+ "Train Epoch: 2 [0/11800 (0%)]\tLoss: 0.106367\n",
+ "Train Epoch: 2 [640/11800 (5%)]\tLoss: 0.110765\n",
+ "Train Epoch: 2 [1280/11800 (11%)]\tLoss: 0.168906\n",
+ "Train Epoch: 2 [1920/11800 (16%)]\tLoss: 0.130259\n",
+ "Train Epoch: 2 [2560/11800 (22%)]\tLoss: 0.099700\n",
+ "Train Epoch: 2 [3200/11800 (27%)]\tLoss: 0.045566\n",
+ "Train Epoch: 2 [3840/11800 (32%)]\tLoss: 0.032498\n",
+ "Train Epoch: 2 [4480/11800 (38%)]\tLoss: 0.127420\n",
+ "Train Epoch: 2 [5120/11800 (43%)]\tLoss: 0.127244\n",
+ "Train Epoch: 2 [5760/11800 (49%)]\tLoss: 0.123305\n",
+ "Train Epoch: 2 [6400/11800 (54%)]\tLoss: 0.033301\n",
+ "Train Epoch: 2 [7040/11800 (59%)]\tLoss: 0.050663\n",
+ "Train Epoch: 2 [7680/11800 (65%)]\tLoss: 0.029956\n",
+ "Train Epoch: 2 [8320/11800 (70%)]\tLoss: 0.016801\n",
+ "Train Epoch: 2 [8960/11800 (76%)]\tLoss: 0.067689\n",
+ "Train Epoch: 2 [9600/11800 (81%)]\tLoss: 0.044518\n",
+ "Train Epoch: 2 [10240/11800 (86%)]\tLoss: 0.073524\n",
+ "Train Epoch: 2 [10880/11800 (92%)]\tLoss: 0.035689\n",
+ "Train Epoch: 2 [11520/11800 (97%)]\tLoss: 0.084134\n",
+ "\n",
+ "Test set: Average loss: 1.5479\n",
+ "Class 0 accuracy: 684.0/980(70%)\n",
+ "Class 1 accuracy: 893.0/1135(79%)\n",
+ "Class 2 accuracy: 470.0/1032(46%)\n",
+ "Class 3 accuracy: 346.0/1010(34%)\n",
+ "Class 4 accuracy: 312.0/982(32%)\n",
+ "Class 5 accuracy: 298.0/892(33%)\n",
+ "Class 6 accuracy: 758.0/958(79%)\n",
+ "Class 7 accuracy: 583.0/1028(57%)\n",
+ "Class 8 accuracy: 953.0/974(98%)\n",
+ "Class 9 accuracy: 977.0/1009(97%)\n",
+ "Train Epoch: 3 [0/11800 (0%)]\tLoss: 0.106828\n",
+ "Train Epoch: 3 [640/11800 (5%)]\tLoss: 0.064151\n",
+ "Train Epoch: 3 [1280/11800 (11%)]\tLoss: 0.064141\n",
+ "Train Epoch: 3 [1920/11800 (16%)]\tLoss: 0.046738\n",
+ "Train Epoch: 3 [2560/11800 (22%)]\tLoss: 0.060965\n",
+ "Train Epoch: 3 [3200/11800 (27%)]\tLoss: 0.041177\n",
+ "Train Epoch: 3 [3840/11800 (32%)]\tLoss: 0.015125\n",
+ "Train Epoch: 3 [4480/11800 (38%)]\tLoss: 0.036628\n",
+ "Train Epoch: 3 [5120/11800 (43%)]\tLoss: 0.040213\n",
+ "Train Epoch: 3 [5760/11800 (49%)]\tLoss: 0.038948\n",
+ "Train Epoch: 3 [6400/11800 (54%)]\tLoss: 0.065069\n",
+ "Train Epoch: 3 [7040/11800 (59%)]\tLoss: 0.060684\n",
+ "Train Epoch: 3 [7680/11800 (65%)]\tLoss: 0.051811\n",
+ "Train Epoch: 3 [8320/11800 (70%)]\tLoss: 0.096974\n",
+ "Train Epoch: 3 [8960/11800 (76%)]\tLoss: 0.014142\n",
+ "Train Epoch: 3 [9600/11800 (81%)]\tLoss: 0.068916\n",
+ "Train Epoch: 3 [10240/11800 (86%)]\tLoss: 0.047880\n",
+ "Train Epoch: 3 [10880/11800 (92%)]\tLoss: 0.007572\n",
+ "Train Epoch: 3 [11520/11800 (97%)]\tLoss: 0.025779\n",
+ "\n",
+ "Test set: Average loss: 1.6151\n",
+ "Class 0 accuracy: 647.0/980(66%)\n",
+ "Class 1 accuracy: 885.0/1135(78%)\n",
+ "Class 2 accuracy: 492.0/1032(48%)\n",
+ "Class 3 accuracy: 379.0/1010(38%)\n",
+ "Class 4 accuracy: 323.0/982(33%)\n",
+ "Class 5 accuracy: 310.0/892(35%)\n",
+ "Class 6 accuracy: 736.0/958(77%)\n",
+ "Class 7 accuracy: 546.0/1028(53%)\n",
+ "Class 8 accuracy: 961.0/974(99%)\n",
+ "Class 9 accuracy: 976.0/1009(97%)\n",
+ "Train Epoch: 1 [0/12665 (0%)]\tLoss: 0.030852\n",
+ "Train Epoch: 1 [640/12665 (5%)]\tLoss: 0.051628\n",
+ "Train Epoch: 1 [1280/12665 (10%)]\tLoss: 0.097404\n",
+ "Train Epoch: 1 [1920/12665 (15%)]\tLoss: 0.066156\n",
+ "Train Epoch: 1 [2560/12665 (20%)]\tLoss: 0.085003\n",
+ "Train Epoch: 1 [3200/12665 (25%)]\tLoss: 0.022351\n",
+ "Train Epoch: 1 [3840/12665 (30%)]\tLoss: 0.047033\n",
+ "Train Epoch: 1 [4480/12665 (35%)]\tLoss: 0.021085\n",
+ "Train Epoch: 1 [5120/12665 (40%)]\tLoss: 0.038875\n",
+ "Train Epoch: 1 [5760/12665 (45%)]\tLoss: 0.035716\n",
+ "Train Epoch: 1 [6400/12665 (51%)]\tLoss: 0.033066\n",
+ "Train Epoch: 1 [7040/12665 (56%)]\tLoss: 0.020775\n",
+ "Train Epoch: 1 [7680/12665 (61%)]\tLoss: 0.027079\n",
+ "Train Epoch: 1 [8320/12665 (66%)]\tLoss: 0.071041\n",
+ "Train Epoch: 1 [8960/12665 (71%)]\tLoss: 0.030695\n",
+ "Train Epoch: 1 [9600/12665 (76%)]\tLoss: 0.038757\n",
+ "Train Epoch: 1 [10240/12665 (81%)]\tLoss: 0.003501\n",
+ "Train Epoch: 1 [10880/12665 (86%)]\tLoss: 0.011310\n",
+ "Train Epoch: 1 [11520/12665 (91%)]\tLoss: 0.057821\n",
+ "Train Epoch: 1 [12160/12665 (96%)]\tLoss: 0.016945\n",
+ "\n",
+ "Test set: Average loss: 1.3637\n",
+ "Class 0 accuracy: 977.0/980(100%)\n",
+ "Class 1 accuracy: 1133.0/1135(100%)\n",
+ "Class 2 accuracy: 574.0/1032(56%)\n",
+ "Class 3 accuracy: 561.0/1010(56%)\n",
+ "Class 4 accuracy: 494.0/982(50%)\n",
+ "Class 5 accuracy: 328.0/892(37%)\n",
+ "Class 6 accuracy: 656.0/958(68%)\n",
+ "Class 7 accuracy: 753.0/1028(73%)\n",
+ "Class 8 accuracy: 701.0/974(72%)\n",
+ "Class 9 accuracy: 866.0/1009(86%)\n",
+ "Train Epoch: 2 [0/12665 (0%)]\tLoss: 0.016473\n",
+ "Train Epoch: 2 [640/12665 (5%)]\tLoss: 0.007508\n",
+ "Train Epoch: 2 [1280/12665 (10%)]\tLoss: 0.037633\n",
+ "Train Epoch: 2 [1920/12665 (15%)]\tLoss: 0.026398\n",
+ "Train Epoch: 2 [2560/12665 (20%)]\tLoss: 0.004491\n",
+ "Train Epoch: 2 [3200/12665 (25%)]\tLoss: 0.002447\n",
+ "Train Epoch: 2 [3840/12665 (30%)]\tLoss: 0.007396\n",
+ "Train Epoch: 2 [4480/12665 (35%)]\tLoss: 0.022243\n",
+ "Train Epoch: 2 [5120/12665 (40%)]\tLoss: 0.032471\n",
+ "Train Epoch: 2 [5760/12665 (45%)]\tLoss: 0.012960\n",
+ "Train Epoch: 2 [6400/12665 (51%)]\tLoss: 0.009143\n",
+ "Train Epoch: 2 [7040/12665 (56%)]\tLoss: 0.005618\n",
+ "Train Epoch: 2 [7680/12665 (61%)]\tLoss: 0.016858\n",
+ "Train Epoch: 2 [8320/12665 (66%)]\tLoss: 0.015019\n",
+ "Train Epoch: 2 [8960/12665 (71%)]\tLoss: 0.042326\n",
+ "Train Epoch: 2 [9600/12665 (76%)]\tLoss: 0.005700\n",
+ "Train Epoch: 2 [10240/12665 (81%)]\tLoss: 0.020611\n",
+ "Train Epoch: 2 [10880/12665 (86%)]\tLoss: 0.011131\n",
+ "Train Epoch: 2 [11520/12665 (91%)]\tLoss: 0.019555\n",
+ "Train Epoch: 2 [12160/12665 (96%)]\tLoss: 0.015460\n",
+ "\n",
+ "Test set: Average loss: 1.5375\n",
+ "Class 0 accuracy: 977.0/980(100%)\n",
+ "Class 1 accuracy: 1133.0/1135(100%)\n",
+ "Class 2 accuracy: 500.0/1032(48%)\n",
+ "Class 3 accuracy: 503.0/1010(50%)\n",
+ "Class 4 accuracy: 489.0/982(50%)\n",
+ "Class 5 accuracy: 362.0/892(41%)\n",
+ "Class 6 accuracy: 639.0/958(67%)\n",
+ "Class 7 accuracy: 746.0/1028(73%)\n",
+ "Class 8 accuracy: 657.0/974(67%)\n",
+ "Class 9 accuracy: 847.0/1009(84%)\n",
+ "Train Epoch: 3 [0/12665 (0%)]\tLoss: 0.003884\n",
+ "Train Epoch: 3 [640/12665 (5%)]\tLoss: 0.024282\n",
+ "Train Epoch: 3 [1280/12665 (10%)]\tLoss: 0.007995\n",
+ "Train Epoch: 3 [1920/12665 (15%)]\tLoss: 0.006038\n",
+ "Train Epoch: 3 [2560/12665 (20%)]\tLoss: 0.007882\n",
+ "Train Epoch: 3 [3200/12665 (25%)]\tLoss: 0.008968\n",
+ "Train Epoch: 3 [3840/12665 (30%)]\tLoss: 0.007985\n",
+ "Train Epoch: 3 [4480/12665 (35%)]\tLoss: 0.017382\n",
+ "Train Epoch: 3 [5120/12665 (40%)]\tLoss: 0.006549\n",
+ "Train Epoch: 3 [5760/12665 (45%)]\tLoss: 0.006111\n",
+ "Train Epoch: 3 [6400/12665 (51%)]\tLoss: 0.016712\n",
+ "Train Epoch: 3 [7040/12665 (56%)]\tLoss: 0.009508\n",
+ "Train Epoch: 3 [7680/12665 (61%)]\tLoss: 0.013591\n",
+ "Train Epoch: 3 [8320/12665 (66%)]\tLoss: 0.002323\n",
+ "Train Epoch: 3 [8960/12665 (71%)]\tLoss: 0.003972\n",
+ "Train Epoch: 3 [9600/12665 (76%)]\tLoss: 0.002240\n",
+ "Train Epoch: 3 [10240/12665 (81%)]\tLoss: 0.012233\n",
+ "Train Epoch: 3 [10880/12665 (86%)]\tLoss: 0.046749\n",
+ "Train Epoch: 3 [11520/12665 (91%)]\tLoss: 0.006683\n",
+ "Train Epoch: 3 [12160/12665 (96%)]\tLoss: 0.006137\n",
+ "\n",
+ "Test set: Average loss: 1.5670\n",
+ "Class 0 accuracy: 976.0/980(100%)\n",
+ "Class 1 accuracy: 1134.0/1135(100%)\n",
+ "Class 2 accuracy: 509.0/1032(49%)\n",
+ "Class 3 accuracy: 520.0/1010(51%)\n",
+ "Class 4 accuracy: 496.0/982(51%)\n",
+ "Class 5 accuracy: 355.0/892(40%)\n",
+ "Class 6 accuracy: 625.0/958(65%)\n",
+ "Class 7 accuracy: 743.0/1028(72%)\n",
+ "Class 8 accuracy: 654.0/974(67%)\n",
+ "Class 9 accuracy: 854.0/1009(85%)\n"
+ ]
+ },
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "[{0: 0.9959183673469387,\n",
+ " 1: 0.9991189427312775,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '0_1'},\n",
+ " {0: 0.9959183673469387,\n",
+ " 1: 1.0,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '0_1'},\n",
+ " {0: 0.996938775510204,\n",
+ " 1: 1.0,\n",
+ " 2: 0.0,\n",
+ " 3: 0.0,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '0_1'},\n",
+ " {0: 0.8459183673469388,\n",
+ " 1: 0.9215859030837005,\n",
+ " 2: 0.9602713178294574,\n",
+ " 3: 0.9732673267326732,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '2_3'},\n",
+ " {0: 0.7795918367346939,\n",
+ " 1: 0.8801762114537445,\n",
+ " 2: 0.9689922480620154,\n",
+ " 3: 0.9782178217821782,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '2_3'},\n",
+ " {0: 0.7377551020408163,\n",
+ " 1: 0.852863436123348,\n",
+ " 2: 0.9680232558139535,\n",
+ " 3: 0.9821782178217822,\n",
+ " 4: 0.0,\n",
+ " 5: 0.0,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '2_3'},\n",
+ " {0: 0.7755102040816326,\n",
+ " 1: 0.8687224669603524,\n",
+ " 2: 0.6434108527131783,\n",
+ " 3: 0.36336633663366336,\n",
+ " 4: 0.9969450101832994,\n",
+ " 5: 0.968609865470852,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '4_5'},\n",
+ " {0: 0.6602040816326531,\n",
+ " 1: 0.8546255506607929,\n",
+ " 2: 0.5968992248062015,\n",
+ " 3: 0.2376237623762376,\n",
+ " 4: 0.9969450101832994,\n",
+ " 5: 0.9820627802690582,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '4_5'},\n",
+ " {0: 0.6755102040816326,\n",
+ " 1: 0.8563876651982378,\n",
+ " 2: 0.5406976744186046,\n",
+ " 3: 0.22574257425742575,\n",
+ " 4: 0.9959266802443992,\n",
+ " 5: 0.9899103139013453,\n",
+ " 6: 0.0,\n",
+ " 7: 0.0,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '4_5'},\n",
+ " {0: 0.6816326530612244,\n",
+ " 1: 0.8590308370044053,\n",
+ " 2: 0.46027131782945735,\n",
+ " 3: 0.48415841584158414,\n",
+ " 4: 0.7036659877800407,\n",
+ " 5: 0.6322869955156951,\n",
+ " 6: 0.9895615866388309,\n",
+ " 7: 0.97568093385214,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '6_7'},\n",
+ " {0: 0.6959183673469388,\n",
+ " 1: 0.8537444933920705,\n",
+ " 2: 0.46511627906976744,\n",
+ " 3: 0.46633663366336636,\n",
+ " 4: 0.6466395112016293,\n",
+ " 5: 0.5426008968609866,\n",
+ " 6: 0.9916492693110647,\n",
+ " 7: 0.9854085603112841,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '6_7'},\n",
+ " {0: 0.6489795918367347,\n",
+ " 1: 0.8414096916299559,\n",
+ " 2: 0.437015503875969,\n",
+ " 3: 0.4277227722772277,\n",
+ " 4: 0.5723014256619144,\n",
+ " 5: 0.5134529147982063,\n",
+ " 6: 0.9937369519832986,\n",
+ " 7: 0.9902723735408561,\n",
+ " 8: 0.0,\n",
+ " 9: 0.0,\n",
+ " 'phase': '6_7'},\n",
+ " {0: 0.7244897959183674,\n",
+ " 1: 0.8255506607929516,\n",
+ " 2: 0.5087209302325582,\n",
+ " 3: 0.404950495049505,\n",
+ " 4: 0.37474541751527496,\n",
+ " 5: 0.4024663677130045,\n",
+ " 6: 0.8162839248434238,\n",
+ " 7: 0.5710116731517509,\n",
+ " 8: 0.9702258726899384,\n",
+ " 9: 0.9653121902874133,\n",
+ " 'phase': '8_9'},\n",
+ " {0: 0.6979591836734694,\n",
+ " 1: 0.786784140969163,\n",
+ " 2: 0.45542635658914726,\n",
+ " 3: 0.3425742574257426,\n",
+ " 4: 0.31771894093686354,\n",
+ " 5: 0.33408071748878926,\n",
+ " 6: 0.791231732776618,\n",
+ " 7: 0.5671206225680934,\n",
+ " 8: 0.9784394250513347,\n",
+ " 9: 0.9682854311199207,\n",
+ " 'phase': '8_9'},\n",
+ " {0: 0.6602040816326531,\n",
+ " 1: 0.7797356828193832,\n",
+ " 2: 0.47674418604651164,\n",
+ " 3: 0.37524752475247525,\n",
+ " 4: 0.3289205702647658,\n",
+ " 5: 0.3475336322869955,\n",
+ " 6: 0.7682672233820459,\n",
+ " 7: 0.5311284046692607,\n",
+ " 8: 0.9866529774127311,\n",
+ " 9: 0.9672943508424182,\n",
+ " 'phase': '8_9'},\n",
+ " {0: 0.996938775510204,\n",
+ " 1: 0.9982378854625551,\n",
+ " 2: 0.5562015503875969,\n",
+ " 3: 0.5554455445544555,\n",
+ " 4: 0.5030549898167006,\n",
+ " 5: 0.36771300448430494,\n",
+ " 6: 0.6847599164926931,\n",
+ " 7: 0.7324902723735408,\n",
+ " 8: 0.7197125256673511,\n",
+ " 9: 0.8582755203171457,\n",
+ " 'phase': '0_1_again'},\n",
+ " {0: 0.996938775510204,\n",
+ " 1: 0.9982378854625551,\n",
+ " 2: 0.4844961240310077,\n",
+ " 3: 0.498019801980198,\n",
+ " 4: 0.4979633401221996,\n",
+ " 5: 0.40582959641255606,\n",
+ " 6: 0.6670146137787056,\n",
+ " 7: 0.72568093385214,\n",
+ " 8: 0.6745379876796714,\n",
+ " 9: 0.8394449950445986,\n",
+ " 'phase': '0_1_again'},\n",
+ " {0: 0.9959183673469387,\n",
+ " 1: 0.9991189427312775,\n",
+ " 2: 0.4932170542635659,\n",
+ " 3: 0.5148514851485149,\n",
+ " 4: 0.505091649694501,\n",
+ " 5: 0.39798206278026904,\n",
+ " 6: 0.6524008350730689,\n",
+ " 7: 0.7227626459143969,\n",
+ " 8: 0.6714579055441479,\n",
+ " 9: 0.846382556987116,\n",
+ " 'phase': '0_1_again'}]"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 20
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "8Yad6wstNUpx"
+ },
+ "source": [
+ "# Analysis of the results"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "id": "gimHfUXdW4_K",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 459
+ },
+ "outputId": "3a07ff95-27df-468d-f571-414c99f1ca1e"
+ },
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ " epoch 0 1 2 3 4 5 6 7 8 9 phase\n",
+ "0 0 0.96 0.97 0.82 0.85 0.59 0.35 0.86 0.85 0.52 0.82 baseline"
+ ],
+ "text/html": [
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " epoch | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 2 | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " 5 | \n",
+ " 6 | \n",
+ " 7 | \n",
+ " 8 | \n",
+ " 9 | \n",
+ " phase | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 0.96 | \n",
+ " 0.97 | \n",
+ " 0.82 | \n",
+ " 0.85 | \n",
+ " 0.59 | \n",
+ " 0.35 | \n",
+ " 0.86 | \n",
+ " 0.85 | \n",
+ " 0.52 | \n",
+ " 0.82 | \n",
+ " baseline | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ "
\n",
+ "
\n",
+ " "
+ ]
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ " epoch 0 1 2 3 4 5 6 7 8 9 phase\n",
+ "0 0 1.0 1.0 0.00 0.0 0.00 0.00 0.0 0.00 0.0 0.00 0_1\n",
+ "1 1 0.0 0.0 0.14 1.0 0.00 0.00 0.0 0.00 0.0 0.00 2_3\n",
+ "2 2 0.0 0.0 0.00 0.0 0.99 0.89 0.0 0.00 0.0 0.00 4_5\n",
+ "3 3 0.0 0.0 0.00 0.0 0.00 0.00 1.0 0.93 0.0 0.00 6_7\n",
+ "4 4 0.0 0.0 0.00 0.0 0.00 0.00 0.0 0.00 1.0 0.52 8_9"
+ ],
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " epoch | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 2 | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " 5 | \n",
+ " 6 | \n",
+ " 7 | \n",
+ " 8 | \n",
+ " 9 | \n",
+ " phase | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1.0 | \n",
+ " 1.0 | \n",
+ " 0.00 | \n",
+ " 0.0 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.0 | \n",
+ " 0.00 | \n",
+ " 0.0 | \n",
+ " 0.00 | \n",
+ " 0_1 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.14 | \n",
+ " 1.0 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.0 | \n",
+ " 0.00 | \n",
+ " 0.0 | \n",
+ " 0.00 | \n",
+ " 2_3 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 2 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.00 | \n",
+ " 0.0 | \n",
+ " 0.99 | \n",
+ " 0.89 | \n",
+ " 0.0 | \n",
+ " 0.00 | \n",
+ " 0.0 | \n",
+ " 0.00 | \n",
+ " 4_5 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.00 | \n",
+ " 0.0 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 1.0 | \n",
+ " 0.93 | \n",
+ " 0.0 | \n",
+ " 0.00 | \n",
+ " 6_7 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 4 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.00 | \n",
+ " 0.0 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.0 | \n",
+ " 0.00 | \n",
+ " 1.0 | \n",
+ " 0.52 | \n",
+ " 8_9 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ "
\n",
+ "
\n",
+ " "
+ ]
+ },
+ "metadata": {}
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ " epoch 0 1 2 3 4 5 6 7 8 9 phase\n",
+ "0 0 1.00 0.99 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0_1\n",
+ "1 1 0.04 0.51 0.23 1.00 0.00 0.00 0.00 0.00 0.00 0.00 2_3\n",
+ "2 2 0.71 0.64 0.06 0.00 0.98 0.85 0.00 0.00 0.00 0.00 4_5\n",
+ "3 3 0.23 0.53 0.00 0.01 0.00 0.00 0.99 0.96 0.00 0.00 6_7\n",
+ "4 4 0.44 0.55 0.00 0.00 0.00 0.00 0.19 0.00 0.98 0.88 8_9"
+ ],
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " epoch | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 2 | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " 5 | \n",
+ " 6 | \n",
+ " 7 | \n",
+ " 8 | \n",
+ " 9 | \n",
+ " phase | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1.00 | \n",
+ " 0.99 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0_1 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 0.04 | \n",
+ " 0.51 | \n",
+ " 0.23 | \n",
+ " 1.00 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 2_3 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 2 | \n",
+ " 0.71 | \n",
+ " 0.64 | \n",
+ " 0.06 | \n",
+ " 0.00 | \n",
+ " 0.98 | \n",
+ " 0.85 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 4_5 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 0.23 | \n",
+ " 0.53 | \n",
+ " 0.00 | \n",
+ " 0.01 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.99 | \n",
+ " 0.96 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 6_7 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 4 | \n",
+ " 0.44 | \n",
+ " 0.55 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.00 | \n",
+ " 0.19 | \n",
+ " 0.00 | \n",
+ " 0.98 | \n",
+ " 0.88 | \n",
+ " 8_9 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ "
\n",
+ "
\n",
+ " "
+ ]
+ },
+ "metadata": {}
+ }
+ ],
+ "source": [
+ "# The following helper code takes the logs and converts them into a dataframe\n",
+ "# for easier reading. You can also store the result as a CSV or HDF file by\n",
+ "# using the .to_csv and .to_hdf methods from pandas for later reading.\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "import pandas as pd\n",
+ "\n",
+ "def format_results(history):\n",
+ " logs = pd.DataFrame(history).round(2)\n",
+ " logs.index.name = 'epoch'\n",
+ " logs = logs.reset_index(drop = False)\n",
+ " return logs\n",
+ "\n",
+ "#display(format_results(history_regular_mnist).head())\n",
+ "display(format_results(history_catastrophic_forgetting).head())\n",
+ "display(format_results(history_memory_replay).head())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {
+ "id": "jR6eRKn4WguU",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 807
+ },
+ "outputId": "a20c835b-1f62-4b6c-cd45-745f122a0041"
+ },
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ "