Skip to content

Instantly share code, notes, and snippets.

@0xDaksh
Created August 21, 2017 12:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 0xDaksh/a70327c779e0239ed2ef12379f302a37 to your computer and use it in GitHub Desktop.
Save 0xDaksh/a70327c779e0239ed2ef12379f302a37 to your computer and use it in GitHub Desktop.
Pytorch Cifar10
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import torch\n",
"import torchvision\n",
"import torchvision.transforms as transforms"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Files already downloaded and verified\n",
"Files already downloaded and verified\n"
]
}
],
"source": [
"transform = transforms.Compose(\n",
" [transforms.ToTensor(),\n",
" transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])\n",
"\n",
"trainset = torchvision.datasets.CIFAR10(root='./data', train=True,\n",
" download=True, transform=transform)\n",
"trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,\n",
" shuffle=True, num_workers=2)\n",
"\n",
"testset = torchvision.datasets.CIFAR10(root='./data', train=False,\n",
" download=True, transform=transform)\n",
"testloader = torch.utils.data.DataLoader(testset, batch_size=4,\n",
" shuffle=False, num_workers=2)\n",
"\n",
"classes = ('plane', 'car', 'bird', 'cat',\n",
" 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(50000, 32, 32, 3)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"trainset.train_data.shape"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" frog dog cat dog\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fd76c2de0f0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"# functions to show an image\n",
"\n",
"\n",
"def imshow(img):\n",
" img = img / 2 + 0.5 # unnormalize\n",
" npimg = img.numpy()\n",
" plt.imshow(np.transpose(npimg, (1, 2, 0)))\n",
"\n",
"\n",
"# get some random training images\n",
"dataiter = iter(trainloader)\n",
"images, labels = dataiter.next()\n",
"\n",
"# show images\n",
"imshow(torchvision.utils.make_grid(images))\n",
"# print labels\n",
"print(' '.join('%5s' % classes[labels[j]] for j in range(4)))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from torch.autograd import Variable\n",
"import torch.nn as nn\n",
"import torch.nn.functional as F"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"class Net(nn.Module):\n",
" def __init__(self):\n",
" super(Net, self).__init__()\n",
" self.conv1 = nn.Conv2d(3, 16, 5)\n",
" self.pool = nn.MaxPool2d(2, 2)\n",
" self.conv2 = nn.Conv2d(16, 32, 5)\n",
" self.conv3 = nn.Conv2d(32, 64, 4)\n",
" self.conv4 = nn.Conv2d(64, 32, 4)\n",
" self.conv4_drop = nn.Dropout2d()\n",
" self.conv4 = nn.Conv2d(32, 16, 4)\n",
" self.conv5 = nn.Conv2d(16, 32, 4)\n",
" self.conv6 = nn.Conv2d(32, 64, 4)\n",
" self.fc1 = nn.Linear(64 * 4 * 4, 512)\n",
" self.fc2 = nn.Linear(512, 256)\n",
" self.fc3 = nn.Linear(256, 128)\n",
" self.fc4 = nn.Linear(128, 64)\n",
" self.fc4d = nn.Dropout2d()\n",
" self.fc5 = nn.Linear(64, 32)\n",
" self.fc6 = nn.Linear(32, 10)\n",
" def forward(self, x):\n",
" x = self.pool(F.relu(self.conv1(x)))\n",
" x = F.relu(self.conv2(x))\n",
" x = F.relu(self.conv3(x))\n",
" x = self.pool(F.relu(self.conv4_drop(self.conv4(x))))\n",
" x = F.relu(self.conv5(x))\n",
" x = F.relu(self.conv6(x))\n",
" x = x.view(-1, 64 * 4 * 4)\n",
" x = F.relu(self.fc1(x))\n",
" x = F.relu(self.fc2(x))\n",
" x = F.relu(self.fc3(x))\n",
" x = F.relu(self.fc4d(self.fc4(x)))\n",
" x = F.relu(self.fc5(x))\n",
" x = self.fc6(x)\n",
" return x"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"net = Net()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Net (\n",
" (conv1): Conv2d(3, 16, kernel_size=(5, 5), stride=(1, 1))\n",
" (pool): MaxPool2d (size=(2, 2), stride=(2, 2), dilation=(1, 1))\n",
" (conv2): Conv2d(16, 32, kernel_size=(5, 5), stride=(1, 1))\n",
" (conv3): Conv2d(32, 64, kernel_size=(4, 4), stride=(1, 1))\n",
" (conv4): Conv2d(32, 16, kernel_size=(4, 4), stride=(1, 1))\n",
" (conv4_drop): Dropout2d (p=0.5)\n",
" (conv5): Conv2d(16, 32, kernel_size=(4, 4), stride=(1, 1))\n",
" (conv6): Conv2d(32, 64, kernel_size=(4, 4), stride=(1, 1))\n",
" (fc1): Linear (1024 -> 512)\n",
" (fc2): Linear (512 -> 256)\n",
" (fc3): Linear (256 -> 128)\n",
" (fc4): Linear (128 -> 64)\n",
" (fc4d): Dropout2d (p=0.5)\n",
" (fc5): Linear (64 -> 32)\n",
" (fc6): Linear (32 -> 10)\n",
")"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# enable cuda \n",
"net.cuda()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"import torch.optim as optim\n",
"\n",
"criterion = nn.CrossEntropyLoss()\n",
"optimizer = optim.Adam(net.parameters(), lr=0.001)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"ename": "RuntimeError",
"evalue": "Need input.size[1] == 32 but got 64 instead.",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-11-c7716b839ae4>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;31m# forward + backward + optimize\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0minput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnet\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 15\u001b[0m \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0mloss\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbackward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.conda/envs/ai/lib/python3.5/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 222\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_pre_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 223\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 224\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 225\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 226\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-7-cb7f944e7056>\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpool\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mF\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrelu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconv2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrelu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconv3\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 24\u001b[0;31m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrelu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconv4_drop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconv4\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 25\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpool\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mF\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrelu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconv5\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrelu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconv6\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.conda/envs/ai/lib/python3.5/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 222\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_pre_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 223\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 224\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 225\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 226\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.conda/envs/ai/lib/python3.5/site-packages/torch/nn/modules/conv.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m 252\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 253\u001b[0m return F.conv2d(input, self.weight, self.bias, self.stride,\n\u001b[0;32m--> 254\u001b[0;31m self.padding, self.dilation, self.groups)\n\u001b[0m\u001b[1;32m 255\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 256\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.conda/envs/ai/lib/python3.5/site-packages/torch/nn/functional.py\u001b[0m in \u001b[0;36mconv2d\u001b[0;34m(input, weight, bias, stride, padding, dilation, groups)\u001b[0m\n\u001b[1;32m 50\u001b[0m f = ConvNd(_pair(stride), _pair(padding), _pair(dilation), False,\n\u001b[1;32m 51\u001b[0m _pair(0), groups, torch.backends.cudnn.benchmark, torch.backends.cudnn.enabled)\n\u001b[0;32m---> 52\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbias\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 53\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mRuntimeError\u001b[0m: Need input.size[1] == 32 but got 64 instead."
]
}
],
"source": [
"for epoch in range(2): # loop over the dataset multiple times\n",
"\n",
" running_loss = 0.0\n",
" for i, data in enumerate(trainloader, 0):\n",
" # get the inputs\n",
" inputs, labels = data\n",
" \n",
" # wrap them in Variable\n",
" inputs, labels = Variable(inputs.cuda()), Variable(labels.cuda())\n",
" # zero the parameter gradients\n",
" optimizer.zero_grad()\n",
" # forward + backward + optimize\n",
" input = inputs\n",
" outputs = net(inputs)\n",
" loss = criterion(outputs, labels)\n",
" loss.backward()\n",
" optimizer.step()\n",
"\n",
" # print statistics\n",
" running_loss += loss.data[0]\n",
" if i % 2000 == 1999: # print every 2000 mini-batches\n",
" print('[%d, %5d] loss: %.3f' %\n",
" (epoch + 1, i + 1, running_loss / 2000))\n",
" running_loss = 0.0\n",
"\n",
"print('Finished Training')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dataiter = iter(testloader)\n",
"images, labels = dataiter.next()\n",
"\n",
"# print images\n",
"imshow(torchvision.utils.make_grid(images))\n",
"print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"outputs = net(Variable(images.cuda()))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"_, predicted = torch.max(outputs.data, 1)\n",
"\n",
"print('Predicted: ', ' '.join('%5s' % classes[predicted[j]]\n",
" for j in range(4)))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"correct = 0\n",
"total = 0\n",
"for data in testloader:\n",
" images, labels = data\n",
" outputs = net(Variable(images.cuda()))\n",
" _, predicted = torch.max(outputs.data, 1)\n",
" total += labels.size(0)\n",
" correct += (predicted.cpu() == labels).sum()\n",
"\n",
"print('Accuracy of the network on the 10000 test images: %d %%' % (\n",
" 100 * correct / total))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"class_correct = list(0. for i in range(10))\n",
"class_total = list(0. for i in range(10))\n",
"for data in testloader:\n",
" images, labels = data\n",
" outputs = net(Variable(images.cuda()))\n",
" _, predicted = torch.max(outputs.data, 1)\n",
" c = (predicted.cpu() == labels).squeeze()\n",
" for i in range(4):\n",
" label = labels[i]\n",
" class_correct[label] += c[i]\n",
" class_total[label] += 1\n",
"\n",
"\n",
"for i in range(10):\n",
" print('Accuracy of %5s : %2d %%' % (\n",
" classes[i], 100 * class_correct[i] / class_total[i]))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment