{ "cells": [ { "cell_type": "code", "execution_count": 17, "metadata": { "ExecuteTime": { "end_time": "2019-06-11T15:13:14.783671Z", "start_time": "2019-06-11T15:13:14.322919Z" }, "collapsed": true }, "outputs": [], "source": [ "import os\n", "import argparse\n", "import logging\n", "import time\n", "import numpy as np\n", "import torch\n", "import torch.nn as nn\n", "from torch.utils.data import DataLoader\n", "from torchdiffeq import odeint\n", "import torchvision.datasets as datasets\n", "import torchvision.transforms as transforms\n", "\n", "from matplotlib import pyplot as plt\n", "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": true }, "outputs": [], "source": [ "sns.set()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def conv3x3(in_planes, out_planes, stride=1):\n", " \"\"\"3x3 convolution with padding\"\"\"\n", " return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=False)\n", "\n", "\n", "def conv1x1(in_planes, out_planes, stride=1):\n", " \"\"\"1x1 convolution\"\"\"\n", " return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False)\n", "\n", "\n", "def norm(dim):\n", " return nn.GroupNorm(min(32, dim), dim)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class ResBlock(nn.Module):\n", " def __init__(self, inplanes, planes, stride=1, downsample=None):\n", " super(ResBlock, self).__init__()\n", " self.norm1 = norm(inplanes)\n", " self.relu = nn.ReLU(inplace=True)\n", " self.downsample = downsample\n", " self.conv1 = conv3x3(inplanes, planes, stride)\n", " self.norm2 = norm(planes)\n", " self.conv2 = conv3x3(planes, planes)\n", "\n", " def forward(self, x):\n", " shortcut = x\n", "\n", " out = self.relu(self.norm1(x))\n", "\n", " if self.downsample is not None:\n", " shortcut = self.downsample(out)\n", "\n", " out = self.conv1(out)\n", " out = self.norm2(out)\n", " out = self.relu(out)\n", " out = self.conv2(out)\n", "\n", " return out + shortcut" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class ConcatConv2d(nn.Module):\n", "\n", " def __init__(self, dim_in, dim_out, ksize=3, stride=1, padding=0, dilation=1, groups=1, bias=True, transpose=False):\n", " super(ConcatConv2d, self).__init__()\n", " module = nn.ConvTranspose2d if transpose else nn.Conv2d\n", " self._layer = module(\n", " dim_in + 1, dim_out, kernel_size=ksize, stride=stride, padding=padding, dilation=dilation, groups=groups,\n", " bias=bias\n", " )\n", "\n", " def forward(self, t, x):\n", " tt = torch.ones_like(x[:, :1, :, :]) * t\n", " ttx = torch.cat([tt, x], 1)\n", " return self._layer(ttx)\n", "\n", "\n", "class ODEfunc_compl(nn.Module):\n", "\n", " def __init__(self, dim):\n", " super(ODEfunc, self).__init__()\n", " self.norm1 = norm(dim)\n", " self.relu = nn.ReLU(inplace=True)\n", " self.conv1 = ConcatConv2d(dim, dim, 3, 1, 1)\n", " self.norm2 = norm(dim)\n", " self.conv2 = ConcatConv2d(dim, dim, 3, 1, 1)\n", " self.norm3 = norm(dim)\n", " self.conv3 = ConcatConv2d(dim, dim, 3, 1, 1)\n", " self.norm4 = norm(dim)\n", " self.conv4 = ConcatConv2d(dim, dim, 3, 1, 1)\n", " self.norm5 = norm(dim)\n", " self.nfe = 0\n", "\n", " def forward(self, t, x):\n", " self.nfe += 1\n", " out = self.norm1(x)\n", " out = self.relu(out)\n", " out = self.conv1(t, out)\n", " out = self.norm2(out)\n", " out = self.relu(out)\n", " out = self.conv2(t, out)\n", " out = self.norm3(out)\n", " out = self.relu(out)\n", " out = self.conv3(t, out)\n", " out = self.norm4(out)\n", " out = self.relu(out)\n", " out = self.conv4(t, out)\n", " out = self.norm5(out)\n", " return out\n", "\n", " \n", "class ODEfunc(nn.Module):\n", "\n", " def __init__(self, dim):\n", " super(ODEfunc, self).__init__()\n", " self.norm1 = norm(dim)\n", " self.relu = nn.ReLU(inplace=True)\n", " self.conv1 = ConcatConv2d(dim, dim, 3, 1, 1)\n", " self.norm2 = norm(dim)\n", " self.conv2 = ConcatConv2d(dim, dim, 3, 1, 1)\n", " self.norm3 = norm(dim)\n", " self.nfe = 0\n", "\n", " def forward(self, t, x):\n", " self.nfe += 1\n", " out = self.norm1(x)\n", " out = self.relu(out)\n", " out = self.conv1(t, out)\n", " out = self.norm2(out)\n", " out = self.relu(out)\n", " out = self.conv2(t, out)\n", " out = self.norm3(out)\n", " return out\n", "\n", "\n", "class ODEBlock(nn.Module):\n", "\n", " def __init__(self, odefunc):\n", " super(ODEBlock, self).__init__()\n", " self.odefunc = odefunc\n", " self.integration_time = torch.tensor([0, 1]).float()\n", "\n", " def forward(self, x):\n", " self.integration_time = self.integration_time.type_as(x)\n", " out = odeint(self.odefunc, x, self.integration_time, rtol=tol, atol=tol)\n", " return out[1]\n", "\n", " @property\n", " def nfe(self):\n", " return self.odefunc.nfe\n", "\n", " @nfe.setter\n", " def nfe(self, value):\n", " self.odefunc.nfe = value" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class Flatten(nn.Module):\n", "\n", " def __init__(self):\n", " super(Flatten, self).__init__()\n", "\n", " def forward(self, x):\n", " shape = torch.prod(torch.tensor(x.shape[1:])).item()\n", " return x.view(-1, shape)\n", "\n", "\n", "class RunningAverageMeter(object):\n", " \"\"\"Computes and stores the average and current value\"\"\"\n", "\n", " def __init__(self, momentum=0.99):\n", " self.momentum = momentum\n", " self.reset()\n", "\n", " def reset(self):\n", " self.val = None\n", " self.avg = 0\n", "\n", " def update(self, val):\n", " if self.val is None:\n", " self.avg = val\n", " else:\n", " self.avg = self.avg * self.momentum + val * (1 - self.momentum)\n", " self.val = val" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def get_mnist_loaders(data_aug=False, batch_size=128, test_batch_size=1000, perc=1.0):\n", " if data_aug:\n", " transform_train = transforms.Compose([\n", " transforms.RandomCrop(28, padding=4),\n", " transforms.ToTensor(),\n", " ])\n", " else:\n", " transform_train = transforms.Compose([\n", " transforms.ToTensor(),\n", " ])\n", "\n", " transform_test = transforms.Compose([\n", " transforms.ToTensor(),\n", " ])\n", "\n", " train_loader = DataLoader(\n", " datasets.MNIST(root='.data/mnist', train=True, download=True, transform=transform_train), batch_size=batch_size,\n", " shuffle=True, num_workers=2, drop_last=True\n", " )\n", "\n", " train_eval_loader = DataLoader(\n", " datasets.MNIST(root='.data/mnist', train=True, download=True, transform=transform_test),\n", " batch_size=test_batch_size, shuffle=False, num_workers=2, drop_last=True\n", " )\n", "\n", " test_loader = DataLoader(\n", " datasets.MNIST(root='.data/mnist', train=False, download=True, transform=transform_test),\n", " batch_size=test_batch_size, shuffle=False, num_workers=2, drop_last=True\n", " )\n", "\n", " return train_loader, test_loader, train_eval_loader\n", "\n", "\n", "def inf_generator(iterable):\n", " \"\"\"Allows training with DataLoaders in a single infinite loop:\n", " for i, (x, y) in enumerate(inf_generator(train_loader)):\n", " \"\"\"\n", " iterator = iterable.__iter__()\n", " while True:\n", " try:\n", " yield iterator.__next__()\n", " except StopIteration:\n", " iterator = iterable.__iter__()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def learning_rate_with_decay(lr, batch_size, batch_denom, batches_per_epoch, boundary_epochs, decay_rates):\n", " initial_learning_rate = lr * batch_size / batch_denom\n", "\n", " boundaries = [int(batches_per_epoch * epoch) for epoch in boundary_epochs]\n", " vals = [initial_learning_rate * decay for decay in decay_rates]\n", "\n", " def learning_rate_fn(itr):\n", " lt = [itr < b for b in boundaries] + [True]\n", " i = np.argmax(lt)\n", " return vals[i]\n", "\n", " return learning_rate_fn\n", "\n", "\n", "def one_hot(x, K):\n", " return np.array(x[:, None] == np.arange(K)[None, :], dtype=int)\n", "\n", "\n", "def accuracy(model, dataset_loader):\n", " total_correct = 0\n", " for x, y in dataset_loader:\n", " x = x.to(device)\n", " y = one_hot(np.array(y.numpy()), 10)\n", "\n", " target_class = np.argmax(y, axis=1)\n", " predicted_class = np.argmax(model(x).cpu().detach().numpy(), axis=1)\n", " total_correct += np.sum(predicted_class == target_class)\n", " return total_correct / len(dataset_loader.dataset)\n", "\n", "\n", "def count_parameters(model):\n", " return sum(p.numel() for p in model.parameters() if p.requires_grad)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def makedirs(dirname):\n", " if not os.path.exists(dirname):\n", " os.makedirs(dirname)\n", "\n", "\n", "def get_logger(logpath, filepath, package_files=[], displaying=True, saving=True, debug=False):\n", " logger = logging.getLogger()\n", " if debug:\n", " level = logging.DEBUG\n", " else:\n", " level = logging.INFO\n", " logger.setLevel(level)\n", " if saving:\n", " info_file_handler = logging.FileHandler(logpath, mode=\"a\")\n", " info_file_handler.setLevel(level)\n", " logger.addHandler(info_file_handler)\n", " if displaying:\n", " console_handler = logging.StreamHandler()\n", " console_handler.setLevel(level)\n", " logger.addHandler(console_handler)\n", " #logger.info(filepath)\n", " #with open(filepath, \"r\") as f:\n", " # logger.info(f.read())\n", "\n", " for f in package_files:\n", " logger.info(f)\n", " with open(f, \"r\") as package_f:\n", " logger.info(package_f.read())\n", "\n", " return logger" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "tol = 1e-3\n", "downsampling_method = 'res'\n", "epochs=100\n", "data_aug = True\n", "lr = 1e-3\n", "batch_size = 128\n", "test_bs = 1024 #??\n", "\n", "save_dir = './exp1' " ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#from torchdiffeq import odeint_adjoint as odeint\n", "from torchdiffeq import odeint" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sequential(\n", " (0): Conv2d(1, 64, kernel_size=(3, 3), stride=(1, 1))\n", " (1): ResBlock(\n", " (norm1): GroupNorm(32, 64, eps=1e-05, affine=True)\n", " (relu): ReLU(inplace)\n", " (downsample): Conv2d(64, 64, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (norm2): GroupNorm(32, 64, eps=1e-05, affine=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " )\n", " (2): ResBlock(\n", " (norm1): GroupNorm(32, 64, eps=1e-05, affine=True)\n", " (relu): ReLU(inplace)\n", " (downsample): Conv2d(64, 64, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", " (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n", " (norm2): GroupNorm(32, 64, eps=1e-05, affine=True)\n", " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " )\n", " (3): ODEBlock(\n", " (odefunc): ODEfunc(\n", " (norm1): GroupNorm(32, 64, eps=1e-05, affine=True)\n", " (relu): ReLU(inplace)\n", " (conv1): ConcatConv2d(\n", " (_layer): Conv2d(65, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", " )\n", " (norm2): GroupNorm(32, 64, eps=1e-05, affine=True)\n", " (conv2): ConcatConv2d(\n", " (_layer): Conv2d(65, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", " )\n", " (norm3): GroupNorm(32, 64, eps=1e-05, affine=True)\n", " )\n", " )\n", " (4): GroupNorm(32, 64, eps=1e-05, affine=True)\n", " (5): ReLU(inplace)\n", " (6): AdaptiveAvgPool2d(output_size=(1, 1))\n", " (7): Flatten()\n", " (8): Linear(in_features=64, out_features=10, bias=True)\n", ")\n", "Number of parameters: 232970\n", "Epoch 0 | Time 1.166 (1.166) | NFE-F 26.0 | NFE-B 0.0 | Train_Acc 0.0978 | Test_Acc 0.0897 | Total_Time 1.166\n", "Epoch 1 | Time 1.124 (0.352) | NFE-F 26.1 | NFE-B 0.0 | Train_Acc 0.9630 | Test_Acc 0.8998 | Total_Time 151.212\n", "Epoch 2 | Time 1.169 (0.356) | NFE-F 26.2 | NFE-B 0.0 | Train_Acc 0.9720 | Test_Acc 0.9077 | Total_Time 159.991\n", "Epoch 3 | Time 1.162 (0.354) | NFE-F 26.2 | NFE-B 0.0 | Train_Acc 0.9730 | Test_Acc 0.9052 | Total_Time 160.550\n", "Epoch 4 | Time 1.203 (0.341) | NFE-F 25.0 | NFE-B 0.0 | Train_Acc 0.9805 | Test_Acc 0.9138 | Total_Time 157.097\n", "Epoch 5 | Time 1.123 (0.320) | NFE-F 22.9 | NFE-B 0.0 | Train_Acc 0.9821 | Test_Acc 0.9130 | Total_Time 147.981\n", "Epoch 6 | Time 1.177 (0.295) | NFE-F 20.9 | NFE-B 0.0 | Train_Acc 0.9808 | Test_Acc 0.9129 | Total_Time 135.925\n", "Epoch 7 | Time 1.094 (0.286) | NFE-F 20.2 | NFE-B 0.0 | Train_Acc 0.9808 | Test_Acc 0.9141 | Total_Time 128.339\n", "Epoch 8 | Time 1.158 (0.285) | NFE-F 20.2 | NFE-B 0.0 | Train_Acc 0.9823 | Test_Acc 0.9148 | Total_Time 128.412\n", "Epoch 9 | Time 1.123 (0.286) | NFE-F 20.1 | NFE-B 0.0 | Train_Acc 0.9827 | Test_Acc 0.9146 | Total_Time 128.836\n", "Epoch 10 | Time 1.143 (0.289) | NFE-F 20.2 | NFE-B 0.0 | Train_Acc 0.9813 | Test_Acc 0.9134 | Total_Time 130.564\n", "Epoch 11 | Time 1.171 (0.296) | NFE-F 20.1 | NFE-B 0.0 | Train_Acc 0.9812 | Test_Acc 0.9130 | Total_Time 131.606\n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 69\u001b[0m \u001b[0mx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mto\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 70\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mto\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 71\u001b[1;33m \u001b[0mlogits\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 72\u001b[0m \u001b[0mloss\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlogits\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 73\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\torch\\nn\\modules\\module.py\u001b[0m in \u001b[0;36m__call__\u001b[1;34m(self, *input, **kwargs)\u001b[0m\n\u001b[0;32m 491\u001b[0m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 492\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 493\u001b[1;33m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 494\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 495\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0minput\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\torch\\nn\\modules\\container.py\u001b[0m in \u001b[0;36mforward\u001b[1;34m(self, input)\u001b[0m\n\u001b[0;32m 90\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mforward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0minput\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 91\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mmodule\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_modules\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 92\u001b[1;33m \u001b[0minput\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmodule\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 93\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0minput\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 94\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\torch\\nn\\modules\\module.py\u001b[0m in \u001b[0;36m__call__\u001b[1;34m(self, *input, **kwargs)\u001b[0m\n\u001b[0;32m 491\u001b[0m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 492\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 493\u001b[1;33m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 494\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 495\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0minput\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m\u001b[0m in \u001b[0;36mforward\u001b[1;34m(self, x)\u001b[0m\n\u001b[0;32m 17\u001b[0m \u001b[0mshortcut\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdownsample\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mout\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 18\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 19\u001b[1;33m \u001b[0mout\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconv1\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mout\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 20\u001b[0m \u001b[0mout\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mnorm2\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mout\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 21\u001b[0m \u001b[0mout\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrelu\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mout\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\torch\\nn\\modules\\module.py\u001b[0m in \u001b[0;36m__call__\u001b[1;34m(self, *input, **kwargs)\u001b[0m\n\u001b[0;32m 491\u001b[0m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 492\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 493\u001b[1;33m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 494\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 495\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0minput\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\torch\\nn\\modules\\conv.py\u001b[0m in \u001b[0;36mforward\u001b[1;34m(self, input)\u001b[0m\n\u001b[0;32m 336\u001b[0m _pair(0), self.dilation, self.groups)\n\u001b[0;32m 337\u001b[0m return F.conv2d(input, self.weight, self.bias, self.stride,\n\u001b[1;32m--> 338\u001b[1;33m self.padding, self.dilation, self.groups)\n\u001b[0m\u001b[0;32m 339\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 340\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "makedirs(save_dir)\n", "logger = get_logger(logpath=os.path.join(save_dir, 'logs'), filepath=os.path.abspath('.'))\n", "\n", "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n", "\n", "is_odenet = True\n", "\n", "if downsampling_method == 'conv':\n", " downsampling_layers = [\n", " nn.Conv2d(1, 64, 3, 1),\n", " norm(64),\n", " nn.ReLU(inplace=True),\n", " nn.Conv2d(64, 64, 4, 2, 1),\n", " norm(64),\n", " nn.ReLU(inplace=True),\n", " nn.Conv2d(64, 64, 4, 2, 1),\n", " ]\n", "elif downsampling_method == 'res':\n", " downsampling_layers = [\n", " nn.Conv2d(1, 64, 3, 1),\n", " ResBlock(64, 64, stride=2, downsample=conv1x1(64, 64, 2)),\n", " ResBlock(64, 64, stride=2, downsample=conv1x1(64, 64, 2)),\n", " ]\n", "\n", "#feature_layers = [ODEBlock(ODEfunc(64)) for _ in range(2)] if is_odenet else [ResBlock(64, 64) for _ in range(6)]\n", "#feature_layers = [ODEBlock(ODEfunc_compl(64))] if is_odenet else [ResBlock(64, 64) for _ in range(6)]\n", "feature_layers = [ODEBlock(ODEfunc(64))] if is_odenet else [ResBlock(64, 64) for _ in range(6)]\n", "\n", "fc_layers = [norm(64), nn.ReLU(inplace=True), nn.AdaptiveAvgPool2d((1, 1)), Flatten(), nn.Linear(64, 10)]\n", "\n", "model = nn.Sequential(*downsampling_layers, *feature_layers, *fc_layers).to(device)\n", "\n", "#logger.info\n", "print(model)\n", "#logger.info\n", "print('Number of parameters: {}'.format(count_parameters(model)))\n", "\n", "criterion = nn.CrossEntropyLoss().to(device)\n", "\n", "train_loader, test_loader, train_eval_loader = get_mnist_loaders(data_aug, batch_size, test_bs)\n", "\n", "data_gen = inf_generator(train_loader)\n", "batches_per_epoch = len(train_loader)\n", "\n", "lr_fn = learning_rate_with_decay( lr, batch_size, batch_denom=128, batches_per_epoch=batches_per_epoch,\n", " boundary_epochs=[20, 40, 60],decay_rates=[1, 0.1, 0.01, 0.001])\n", "\n", "optimizer = torch.optim.Adam(model.parameters(), lr=lr)\n", "\n", "best_acc = 0\n", "field_names = list(map(lambda l:l.strip().split()[0],\n", " \"Epoch {:4d} | Time {:.3f} ({:.3f}) | NFE-F {:.1f} | NFE-B {:.1f} |\"\n", " \"Train_Acc {:.4f} | Test_Acc {:.4f} | Total_Time {:.3f}\".split('|')))\n", "logs_1 = []\n", "\n", "batch_time_meter = RunningAverageMeter()\n", "f_nfe_meter = RunningAverageMeter()\n", "b_nfe_meter = RunningAverageMeter()\n", "end = time.time()\n", "start = time.time()\n", "\n", "for itr in range(epochs * batches_per_epoch):\n", "\n", " for param_group in optimizer.param_groups:\n", " param_group['lr'] = lr_fn(itr)\n", "\n", " optimizer.zero_grad()\n", " x, y = data_gen.__next__()\n", " x = x.to(device)\n", " y = y.to(device)\n", " logits = model(x)\n", " loss = criterion(logits, y)\n", "\n", " if is_odenet:\n", " nfe_forward = feature_layers[0].nfe\n", " feature_layers[0].nfe = 0\n", "\n", " loss.backward()\n", " optimizer.step()\n", "\n", " if is_odenet:\n", " nfe_backward = feature_layers[0].nfe\n", " feature_layers[0].nfe = 0\n", "\n", " batch_time_meter.update(time.time() - end)\n", " if is_odenet:\n", " f_nfe_meter.update(nfe_forward)\n", " b_nfe_meter.update(nfe_backward)\n", " end = time.time()\n", "\n", " if itr % batches_per_epoch == 0:\n", " finish = time.time()\n", " with torch.no_grad():\n", " train_acc = accuracy(model, train_eval_loader)\n", " val_acc = accuracy(model, test_loader)\n", " if val_acc > best_acc:\n", " torch.save({'state_dict': model.state_dict()}, os.path.join(save_dir, 'model.pth'))\n", " best_acc = val_acc\n", " #logger.info\n", " print(\n", " \"Epoch {:4d} | Time {:.3f} ({:.3f}) | NFE-F {:.1f} | NFE-B {:.1f} | \"\n", " \"Train_Acc {:.4f} | Test_Acc {:.4f} | Total_Time {:.3f}\".format(\n", " itr // batches_per_epoch, batch_time_meter.val, batch_time_meter.avg, f_nfe_meter.avg,\n", " b_nfe_meter.avg, train_acc, val_acc, finish - start\n", " )\n", " )\n", " logs_1.append(dict(zip(field_names, [ itr // batches_per_epoch, batch_time_meter.val, batch_time_meter.avg, f_nfe_meter.avg,\n", " b_nfe_meter.avg, train_acc, val_acc, finish - start])))\n", " start = time.time()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[{'Epoch': 0,\n", " 'Time': 1.1663413047790527,\n", " 'NFE-F': 1.1663413047790527,\n", " 'NFE-B': 26,\n", " 'Train_Acc': 0,\n", " 'Test_Acc': 0.09775,\n", " 'Total_Time': 0.0897},\n", " {'Epoch': 1,\n", " 'Time': 1.1237423419952393,\n", " 'NFE-F': 0.3518146520107296,\n", " 'NFE-B': 26.113337826255613,\n", " 'Train_Acc': 0.0,\n", " 'Test_Acc': 0.9629833333333333,\n", " 'Total_Time': 0.8998},\n", " {'Epoch': 2,\n", " 'Time': 1.1690211296081543,\n", " 'NFE-F': 0.35646780732408767,\n", " 'NFE-B': 26.160499026848903,\n", " 'Train_Acc': 0.0,\n", " 'Test_Acc': 0.972,\n", " 'Total_Time': 0.9077},\n", " {'Epoch': 3,\n", " 'Time': 1.1619246006011963,\n", " 'NFE-F': 0.3541097996338256,\n", " 'NFE-B': 26.160926447915926,\n", " 'Train_Acc': 0.0,\n", " 'Test_Acc': 0.9729833333333333,\n", " 'Total_Time': 0.9052},\n", " {'Epoch': 4,\n", " 'Time': 1.202782154083252,\n", " 'NFE-F': 0.34110854730643125,\n", " 'NFE-B': 24.95415771513177,\n", " 'Train_Acc': 0.0,\n", " 'Test_Acc': 0.9805,\n", " 'Total_Time': 0.9138},\n", " {'Epoch': 5,\n", " 'Time': 1.12302827835083,\n", " 'NFE-F': 0.3201531668305314,\n", " 'NFE-B': 22.928928317852208,\n", " 'Train_Acc': 0.0,\n", " 'Test_Acc': 0.9820666666666666,\n", " 'Total_Time': 0.913},\n", " {'Epoch': 6,\n", " 'Time': 1.177217721939087,\n", " 'NFE-F': 0.2949909653493132,\n", " 'NFE-B': 20.920042885241745,\n", " 'Train_Acc': 0.0,\n", " 'Test_Acc': 0.9807833333333333,\n", " 'Total_Time': 0.9129},\n", " {'Epoch': 7,\n", " 'Time': 1.0944006443023682,\n", " 'NFE-F': 0.28566477432615045,\n", " 'NFE-B': 20.216727656597406,\n", " 'Train_Acc': 0.0,\n", " 'Test_Acc': 0.9808,\n", " 'Total_Time': 0.9141},\n", " {'Epoch': 8,\n", " 'Time': 1.1575982570648193,\n", " 'NFE-F': 0.28541028713199734,\n", " 'NFE-B': 20.184034851164867,\n", " 'Train_Acc': 0.0,\n", " 'Test_Acc': 0.9823,\n", " 'Total_Time': 0.9148},\n", " {'Epoch': 9,\n", " 'Time': 1.1227002143859863,\n", " 'NFE-F': 0.28647260674155234,\n", " 'NFE-B': 20.125482535545512,\n", " 'Train_Acc': 0.0,\n", " 'Test_Acc': 0.9827333333333333,\n", " 'Total_Time': 0.9146},\n", " {'Epoch': 10,\n", " 'Time': 1.1429314613342285,\n", " 'NFE-F': 0.28855354211729095,\n", " 'NFE-B': 20.15380365074734,\n", " 'Train_Acc': 0.0,\n", " 'Test_Acc': 0.9812666666666666,\n", " 'Total_Time': 0.9134},\n", " {'Epoch': 11,\n", " 'Time': 1.1712427139282227,\n", " 'NFE-F': 0.29551518088596457,\n", " 'NFE-B': 20.124064572092596,\n", " 'Train_Acc': 0.0,\n", " 'Test_Acc': 0.9812,\n", " 'Total_Time': 0.913}]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "logs_1" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(15, 10))\n", "plt.xlabel('epoch number')\n", "plt.ylabel('accuracy')\n", "plt.title('ODENET complex block')\n", "plt.plot(np.arange(len(train_ac_3[1:])) + 1, train_ac_3[1:], label='Accuracy on training set', marker='v')\n", "plt.plot(np.arange(len(test_ac_3[1:])) + 1, test_ac_3[1:], label='Accuracy on test set', marker='o')\n", "plt.legend()\n", "plt.savefig('odenet_3.pdf', bbox_inches='tight')" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "test_ac_3 = [elem['Total_Time'] for elem in logs_3]\n", "train_ac_3 = [elem['Test_Acc'] for elem in logs_3]\n" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": true }, "outputs": [], "source": [ "test_ac_1 = [elem['Total_Time'] for elem in logs_1]\n", "train_ac_1 = [elem['Test_Acc'] for elem in logs_1]\n" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4YAAAJdCAYAAABu/WlVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xd8U/X+x/F3RtM9aBllr1KWLBEsUxAVL1pARHFcUFH54dXrRr0qiiAqDnDgYjiuigNBARkiKCICXlABRdl7taUtXXQlOb8/WkJDWyjQNG3zej4ujyZnflJPc/POdxyTYRiGAAAAAAA+y+ztAgAAAAAA3kUwBAAAAAAfRzAEAAAAAB9HMAQAAAAAH0cwBAAAAAAfRzAEAAAAAB9n9XYBAIDq6dNPP9Wnn34qu90uk8mkNm3a6IEHHlC9evUkScOHD9fBgwcVGhoqSbLb7brkkkv0r3/9SyEhIZKkli1bKjY2Vmaz+/eYb775piSpX79+evbZZ3Xddde51s2cOVPbt2/XCy+8oLlz52rixIlq0KCB2/4tW7bUk08+qeHDh0uSjh8/roSEBDVt2lSS1L17dz366KNn9XqXL1+uNWvW6Mknn9SKFSu0ceNG3XfffZo7d66+/fZbvfvuu2d1vPLWsmVLrVmzRpGRkW7Lz6e+AwcOKD4+Xr///nt5lQkA8BKCIQCg3E2aNElbtmzRu+++q7p168rpdGr+/PkaNmyYZs+erejoaEnSI488oiuvvFKSlJ+fr2effVYPP/yw3nnnHdexPvzww2JhRioIJWazWZMmTVLnzp3VrFmzEmu56KKLSg098+bNkyT98ssvmjBhguv5uejXr5/69esnSfrjjz+UlpZ2zscCAKCi0ZUUAFCujhw5os8++0yvvvqq6tatK0kym80aPHiw+vfvX2pI8/Pz03/+8x+tW7dOO3fuLNO5AgICdNttt+nhhx9WXl5eub2GU02cOFGvvvqqJCkxMVEtW7bU2rVrJRWEy/vvv19z587V//3f/2njxo367LPPtGjRIk2ZMkWSlJSUpFGjRik+Pl6DBw8u9fW9+eabGjBggOLj43XvvfcqKSlJUkHr6iuvvKKbb75Zl156qZ544gk5nU5J0m+//aabbrpJ11xzja699lr98MMPpb6OV199Vddcc40GDRpU4nZHjhzR6NGjFR8fr6uvvlozZsxwrfvhhx80aNAgxcfHa9iwYdqyZYvbvjt37tSll16q7777rqy/VgBAJUIwBACUq40bN6pZs2YKDw8vtq579+769ddfS903ICBATZo00bZt21zLbrnlFg0aNMj17+6773bb56677lJQUJArhJ1q/fr1bvsPGjRIc+bMOavXdMUVV2jlypWSpJ9++km1atXS6tWrJUnff/+9rrjiCte2HTp00A033KABAwbogQcekCTt379fTzzxhBYsWKCLLrpIM2fOLHaOOXPm6KefftKXX36pBQsWqEWLFnrsscdc6/ft26ePPvpI8+fP18qVK/W///1PaWlp+s9//qMXX3xRX331ld566y2NGzdOhw4dKvF1NGjQQF999ZVeeuklPfbYY0pJSXFb//DDD+viiy/WggUL9Omnn2r+/PlauHChjh49qjFjxuj555/XggULdPvtt+vll1927bdt2zaNHj1aEydO1OWXX35Wv1sAQOVAV1IAQLmz2+0lLs/Ly5PJZDrtviaTSYGBga7npXUlPcFsNuull17S4MGD1bNnz2LrT9eVtKw6d+6shIQEHT16VD/99JPuuusuzZ07V/fcc4/WrVun5557Tt9++22p+7dv316NGzeWJLVu3brEVrWVK1dqyJAhCgoKkiSNGDFC77zzjqsltG/fvjKbzQoJCVHjxo2VlpamDRs2KCkpyS0sm0wmbd261TWWs6gbb7xRkhQbG6vmzZu7jQ08fvy4fvvtN7333nuSpNDQUA0ZMkQrV66Un5+fWrRooTZt2kgqCMpXXHGFDhw4oLy8PI0YMUJdu3ZVt27dzur3CgCoPGgxBACUq44dO2rv3r2ubpBF/fLLL+rUqVOp+2ZnZ2vnzp2KiYk5q3PWrVtXzzzzjB599FGlpqaedc1nYjab1adPH/3444/atGmTrrvuOiUlJWnJkiXq1KmTgoODT7u/1Xrye1iTySTDMIpt43Q63UKz0+l0C9gBAQHFjuFwONS8eXPNmzfP9e/zzz8vMSCfeB1Fj1+0LqfTWayuEzVYLBa32gzDcOtK+uabb2rz5s2nDccAgMqNYAgAKFd16tTR8OHD9eCDDyohIcG1fM6cOVq6dKnuvPPOEvfLycnRc889p969exebRbQsrrzySvXu3VsffvjhOdd+OldccYVmzJih2NhY2Ww2xcXFafLk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fLiKioocrg6tiWCINqW4uFhLlizR7Nmz9eabb+rzzz/Xu+++63RZSDHLli3T7NmznS4DKWbDhg168MEH9dRTT+mtt97SF198oUWLFjldFlJITU2NHn74Yb344ouaM2eOVq1apeLiYqfLQju2evVqXXvttSotLZUk1dbW6t5779VTTz2lefPmac2aNfwecxGCIdqUnJwcTZkyRX6/Xz6fT8cff7w2bdrkdFlIITt27FBRUZFuvfVWp0tBinn33Xc1cuRI5eXlyefzqaioSAMHDnS6LKSQWCwmy7JUU1OjaDSqaDSqQCDgdFlox1599VU9+OCDys3NlSSVlJSod+/e6tmzp7xer8aMGaMFCxY4XCVai9fpAoD6+vfvn/i+tLRU8+fP19///ncHK0KqeeCBB3TXXXdp8+bNTpeCFLN+/Xr5fD7deuut2rx5s84//3zdeeedTpeFFJKZmak77rhDl1xyidLS0jR48GANGjTI6bLQjj388MMNlsvLy5WTk5NYzs3NVVlZWWuXBYfQY4g2ad26dZowYYJ+97vfqU+fPk6XgxTx2muvqXv37iooKHC6FKSgWCymZcuW6ZFHHtErr7yikpIShiyjRa1du1azZs3Sv/71Ly1evFimaepvf/ub02UhhViWJcMwEsu2bTdYRmojGKLN+fjjjzV+/HhNnjxZV1xxhdPlIIXMmzdPS5cu1WWXXaYnnnhCCxcu1COPPOJ0WUgRXbt2VUFBgbp06aJgMKiLLrpIJSUlTpeFFLJkyRIVFBQoOztbfr9fV155pVasWOF0WUgheXl5qqioSCxXVFQkhpki9TGUFG3K5s2bddttt6moqIheHbS4559/PvH9G2+8oRUrVujee+91sCKkkmHDhumee+7Rrl27lJGRocWLF+vCCy90uiykkPz8fP35z39WdXW10tLStHDhQp166qlOl4UUMnDgQH3//fdav369jj32WL399tsaO3as02WhlRAM0ab87W9/UygU0qOPPppYd8011+jaa691sCoAOLyBAwdq0qRJ+vnPf65IJKKzzz6bD1RoUUOHDtUXX3yhK6+8Uj6fT6eeeqpuueUWp8tCCgkEAnr00Uf161//WqFQSOedd55GjBjhdFloJYZt27bTRQAAAAAAnMM1hgAAAADgcgRDAAAAAHA5giEAAAAAuBzBEAAAAABcjmAIAAAAAC5HMAQA4DCWL1+u0aNHO12GLrjgAn322WdOlwEASEEEQwAAAABwOW5wDwBo1xYuXKinn35akUhEwWBQ99xzj37yk5/oySef1Pr167VlyxZVVFQoPz9fDz/8sDIzM7Vu3TpNnTpVO3bskGEYmjBhgi6//HJJ0uuvv67nn39epmmqc+fOmjZtmiSpurpad911l7777juFQiE99NBDOuOMMxrUsnz5chUVFalnz55at26dotGo/vCHP+j000/XlClT1L9/f02cOFGSGixfcMEFGj16tD766CPt3LlTkyZN0ieffKLPP/9cXq9XTz/9tLp16yZJmjlzptauXatwOKybbrpJ48aNO+zr8Omnn6q8vFwnnniiHnvssdb60QAA2hGCIQCg3SotLVVRUZFmzJihzp07a926dbrpppv0zjvvSJJWrlypWbNmqUuXLrr77rv1P//zP5o8ebJ++ctf6ne/+52GDx+usrIyXXXVVerdu7fS0tL02GOPafbs2erevbumT5+up59+WqNGjdKWLVtUVFSkgQMHavr06XryySf1wgsvHFBTSUmJHnzwQZ100kl67rnnVFRUpJdeeumwzyUUCunVV1/VvHnzNHnyZM2ePVv5+fm67bbbNHv2bN16662SpEAgoNmzZ6usrExXXHGFBg4cKJ/Pd8jXYePGjXr77bfl9fK2DwBoHO8QAIB2a+nSpSovL9f48eMT6wzD0A8//CBJGjFihLp27SpJGjdunB555BGNHTtWoVBIw4cPlyR169ZNw4cP1+LFi5WVlaWhQ4eqe/fukpQ47/Lly9WzZ08NHDhQkpSfn69Zs2Y1WlOPHj100kknSZJOPvlkzZ49u0nPZW89PXv2VNeuXZWfny9J6tWrl3bu3JnY75prrknUffbZZ2vZsmXyeDyHfB1OO+00QiEA4JB4lwAAtFuWZamgoECPP/54Yt3mzZuVm5urd999Vx6Pp8G+pmkqFovJMIwG57FtW9FoVB6Pp8G22tpabdy4UZLk8/kS6w3DkG3bjdYUDAYb3W//YyKRSIPj/H5/4vv6j7U/09w3PYBlWfJ6vYrFYod8HdLT0w96PgAAJCafAQC0YwUFBVq6dKm+/fZbSdKiRYt06aWXqra2VpL0/vvva/fu3bIsS6+++qqGDRumvn37yuv1JoZZlpWV6Z///KcKCwt11llnadmyZSovL5ck/eMf/9Cf//znFqm1c+fOWrNmTeIxV6xYcUTn2dsDuWnTJi1btkwFBQWHfR0AADgcegwBAO1Wv379NHXqVP3mN7+RbduJiVoyMjIkSV27dtXNN9+s7du3a/Dgwbr11lvl8/n01FNP6aGHHtKTTz6pWCym2267TUOGDJEk3X333Zo0aZIkKScnR4888ohKS0uPutbrr79ev/3tb3XxxRfr2GOPTTxec4VCIV1xxRWKRCK67777dNxxx0nSIV8HAAAOx7APNhYGAIB27Mknn9T27dv1wAMPOF0KAABtHkNJAQAAAMDl6DEEAAAAAJejxxAAAAAAXI5gCAAAAAAuRzAEAAAAAJcjGAIAAACAyxEMAQAAAMDlCIYAAAAA4HL/D2VyFY2G4yfrAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(15, 10))\n", "plt.xlabel('epoch number')\n", "plt.ylabel('accuracy')\n", "plt.title('ODENET with one block')\n", "plt.plot(np.arange(len(train_ac_1[1:])) + 1, train_ac_1[1:], label='Accuracy on training set', marker='v')\n", "plt.plot(np.arange(len(test_ac_1[1:])) + 1, test_ac_1[1:], label='Accuracy on test set', marker='o')\n", "plt.legend()\n", "plt.savefig('odenet_1.pdf', bbox_inches='tight')" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [default]", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1" } }, "nbformat": 4, "nbformat_minor": 2 }