Skip to content

Instantly share code, notes, and snippets.

@monajalal
Created November 28, 2018 15:17
Show Gist options
  • Save monajalal/75eb4b2836ee10f59c067f89787e8889 to your computer and use it in GitHub Desktop.
Save monajalal/75eb4b2836ee10f59c067f89787e8889 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"from graphviz import Digraph\n",
"import torch\n",
"from torch.autograd import Variable\n",
"\n",
"\n",
"# make_dot was moved to https://github.com/szagoruyko/pytorchviz\n",
"from torchviz import make_dot"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"# -*- coding: utf-8 -*-\n",
"\"\"\"\n",
"Transfer Learning Tutorial\n",
"==========================\n",
"**Author**: `Sasank Chilamkurthy <https://chsasank.github.io>`_\n",
"\n",
"In this tutorial, you will learn how to train your network using\n",
"transfer learning. You can read more about the transfer learning at `cs231n\n",
"notes <http://cs231n.github.io/transfer-learning/>`__\n",
"\n",
"Quoting these notes,\n",
"\n",
" In practice, very few people train an entire Convolutional Network\n",
" from scratch (with random initialization), because it is relatively\n",
" rare to have a dataset of sufficient size. Instead, it is common to\n",
" pretrain a ConvNet on a very large dataset (e.g. ImageNet, which\n",
" contains 1.2 million images with 1000 categories), and then use the\n",
" ConvNet either as an initialization or a fixed feature extractor for\n",
" the task of interest.\n",
"\n",
"These two major transfer learning scenarios look as follows:\n",
"\n",
"- **Finetuning the convnet**: Instead of random initializaion, we\n",
" initialize the network with a pretrained network, like the one that is\n",
" trained on imagenet 1000 dataset. Rest of the training looks as\n",
" usual.\n",
"- **ConvNet as fixed feature extractor**: Here, we will freeze the weights\n",
" for all of the network except that of the final fully connected\n",
" layer. This last fully connected layer is replaced with a new one\n",
" with random weights and only this layer is trained.\n",
"\n",
"\"\"\"\n",
"# License: BSD\n",
"# Author: Sasank Chilamkurthy\n",
"\n",
"from __future__ import print_function, division\n",
"\n",
"import torch\n",
"import torch.nn as nn\n",
"import torch.optim as optim\n",
"from torch.optim import lr_scheduler\n",
"import numpy as np\n",
"import torchvision\n",
"from torchvision import datasets, models, transforms\n",
"import matplotlib.pyplot as plt\n",
"import time\n",
"import os\n",
"import copy\n",
"\n",
"plt.ion() # interactive mode"
]
},
{
"cell_type": "code",
"execution_count": 125,
"metadata": {},
"outputs": [],
"source": [
"#ADAM\n",
"######################################################################\n",
"# Load Data\n",
"# ---------\n",
"#\n",
"# We will use torchvision and torch.utils.data packages for loading the\n",
"# data.\n",
"#\n",
"# The problem we're going to solve today is to train a model to classify\n",
"# **ants** and **bees**. We have about 120 training images each for ants and bees.\n",
"# There are 75 validation images for each class. Usually, this is a very\n",
"# small dataset to generalize upon, if trained from scratch. Since we\n",
"# are using transfer learning, we should be able to generalize reasonably\n",
"# well.\n",
"#\n",
"# This dataset is a very small subset of imagenet.\n",
"#\n",
"# .. Note ::\n",
"# Download the data from\n",
"# `here <https://download.pytorch.org/tutorial/hymenoptera_data.zip>`_\n",
"# and extract it to the current directory.\n",
"\n",
"# Data augmentation and normalization for training\n",
"# Just normalization for validation\n",
"data_transforms = {\n",
" 'train': transforms.Compose([\n",
" transforms.RandomResizedCrop(224),\n",
" transforms.RandomHorizontalFlip(),\n",
" transforms.RandomRotation(20),\n",
" transforms.ColorJitter(0.3, 0.3, 0.3),\n",
" transforms.ToTensor(),\n",
" transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n",
" ]),\n",
"# 'val': transforms.Compose([\n",
"# transforms.Resize(256),\n",
"# transforms.CenterCrop(224),\n",
"# transforms.ToTensor(),\n",
"# transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n",
"# ]),\n",
" \n",
" 'test': transforms.Compose([\n",
" transforms.Resize(256),\n",
" transforms.CenterCrop(224),\n",
" transforms.ToTensor(),\n",
" transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n",
" ]),\n",
"}\n",
"\n",
"\n",
"data_dir = \"10folds/10fold_9\"\n",
"\n",
"image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x),\n",
" data_transforms[x])\n",
" for x in ['train', 'test']}\n",
"dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=4,\n",
" shuffle=True, num_workers=4)\n",
" for x in ['train', 'test']}\n",
"dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'test']}\n",
"\n",
"\n",
"class_names = image_datasets['train'].classes\n",
"\n",
"device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n"
]
},
{
"cell_type": "code",
"execution_count": 126,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f947f0cc240>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"\n",
"######################################################################\n",
"# Visualize a few images\n",
"# ^^^^^^^^^^^^^^^^^^^^^^\n",
"# Let's visualize a few training images so as to understand the data\n",
"# augmentations.\n",
"\n",
"def imshow(inp, title=None):\n",
" \"\"\"Imshow for Tensor.\"\"\"\n",
" inp = inp.numpy().transpose((1, 2, 0))\n",
" mean = np.array([0.485, 0.456, 0.406])\n",
" std = np.array([0.229, 0.224, 0.225])\n",
" inp = std * inp + mean\n",
" inp = np.clip(inp, 0, 1)\n",
" plt.imshow(inp)\n",
" if title is not None:\n",
" plt.title(title)\n",
" plt.pause(0.001) # pause a bit so that plots are updated\n",
"\n",
"\n",
"# Get a batch of training data\n",
"inputs, classes = next(iter(dataloaders['train']))\n",
"\n",
"# Make a grid from batch\n",
"out = torchvision.utils.make_grid(inputs)\n",
"\n",
"imshow(out, title=[class_names[x] for x in classes])\n"
]
},
{
"cell_type": "code",
"execution_count": 127,
"metadata": {},
"outputs": [],
"source": [
"######################################################################\n",
"# Training the model\n",
"# ------------------\n",
"#\n",
"# Now, let's write a general function to train a model. Here, we will\n",
"# illustrate:\n",
"#\n",
"# - Scheduling the learning rate\n",
"# - Saving the best model\n",
"#\n",
"# In the following, parameter ``scheduler`` is an LR scheduler object from\n",
"# ``torch.optim.lr_scheduler``.\n",
"\n",
"\n",
"def train_model(model, criterion, optimizer, scheduler, num_epochs=25):\n",
" since = time.time()\n",
"\n",
" best_model_wts = copy.deepcopy(model.state_dict())\n",
" best_acc = 0.0\n",
"\n",
" for epoch in range(num_epochs):\n",
" print('Epoch {}/{}'.format(epoch, num_epochs - 1))\n",
" print('-' * 10)\n",
"\n",
" # Each epoch has a training and validation phase\n",
" ##for phase in ['train', 'test']:\n",
" for phase in ['train']:\n",
" if phase == 'train':\n",
" scheduler.step()\n",
" model.train() # Set model to training mode\n",
" else:\n",
" model.eval() # Set model to evaluate mode\n",
"\n",
" running_loss = 0.0\n",
" running_corrects = 0\n",
"\n",
" # Iterate over data.\n",
" for inputs, labels in dataloaders[phase]:\n",
" inputs = inputs.to(device)\n",
" labels = labels.to(device)\n",
"\n",
" # zero the parameter gradients\n",
" optimizer.zero_grad()\n",
"\n",
" # forward\n",
" # track history if only in train\n",
" with torch.set_grad_enabled(phase == 'train'):\n",
" outputs = model(inputs)\n",
" _, preds = torch.max(outputs, 1)\n",
" loss = criterion(outputs, labels)\n",
"\n",
" # backward + optimize only if in training phase\n",
" if phase == 'train':\n",
" loss.backward()\n",
" optimizer.step()\n",
"\n",
" # statistics\n",
" running_loss += loss.item() * inputs.size(0)\n",
" running_corrects += torch.sum(preds == labels.data)\n",
"\n",
" epoch_loss = running_loss / dataset_sizes[phase]\n",
" epoch_acc = running_corrects.double() / dataset_sizes[phase]\n",
"\n",
" print('{} Loss: {:.4f} Acc: {:.4f}'.format(\n",
" phase, epoch_loss, epoch_acc))\n",
"\n",
" # deep copy the model\n",
" # if phase == 'val' and epoch_acc > best_acc:\n",
" # best_acc = epoch_acc\n",
" # best_model_wts = copy.deepcopy(model.state_dict())\n",
"\n",
" print()\n",
"\n",
" time_elapsed = time.time() - since\n",
" print('Training complete in {:.0f}m {:.0f}s'.format(\n",
" time_elapsed // 60, time_elapsed % 60))\n",
"# print('Best val Acc: {:4f}'.format(best_acc))\n",
"\n",
" # load best model weights\n",
"# model.load_state_dict(best_model_wts)\n",
" return model"
]
},
{
"cell_type": "code",
"execution_count": 128,
"metadata": {},
"outputs": [],
"source": [
"\n",
"######################################################################\n",
"# Visualizing the model predictions\n",
"# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
"#\n",
"# Generic function to display predictions for a few images\n",
"#\n",
"\n",
"def visualize_model(model, num_images=6):\n",
" was_training = model.training\n",
" model.eval()\n",
" images_so_far = 0\n",
" fig = plt.figure()\n",
"\n",
" with torch.no_grad():\n",
" #for i, (inputs, labels) in enumerate(dataloaders['test]):\n",
" for i, (inputs, labels) in enumerate(dataloaders['train']):\n",
"\n",
" inputs = inputs.to(device)\n",
" labels = labels.to(device)\n",
"\n",
" outputs = model(inputs)\n",
" _, preds = torch.max(outputs, 1)\n",
"\n",
" for j in range(inputs.size()[0]):\n",
" images_so_far += 1\n",
" ax = plt.subplot(num_images//2, 2, images_so_far)\n",
" ax.axis('off')\n",
" ax.set_title('predicted: {}'.format(class_names[preds[j]]))\n",
" imshow(inputs.cpu().data[j])\n",
"\n",
" if images_so_far == num_images:\n",
" model.train(mode=was_training)\n",
" return\n",
" model.train(mode=was_training)"
]
},
{
"cell_type": "code",
"execution_count": 129,
"metadata": {},
"outputs": [],
"source": [
"######################################################################\n",
"# Finetuning the convnet\n",
"# ----------------------\n",
"#\n",
"# Load a pretrained model and reset final fully connected layer.\n",
"#\n",
"\n",
"#model_ft = models.resnet18(pretrained=True)\n",
"model_ft = models.resnet50(pretrained=True)\n",
"\n",
"num_ftrs = model_ft.fc.in_features\n",
"model_ft.fc = nn.Linear(num_ftrs, 9)\n",
"\n",
"model_ft = model_ft.to(device)\n",
"\n",
"criterion = nn.CrossEntropyLoss()\n",
"\n",
"# Observe that all parameters are being optimized\n",
"optimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)\n",
"\n",
"# Decay LR by a factor of 0.1 every 7 epochs\n",
"exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)\n"
]
},
{
"cell_type": "code",
"execution_count": 130,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 0/24\n",
"----------\n",
"train Loss: 2.1206 Acc: 0.3099\n",
"\n",
"Epoch 1/24\n",
"----------\n",
"train Loss: 2.0338 Acc: 0.3188\n",
"\n",
"Epoch 2/24\n",
"----------\n",
"train Loss: 1.9403 Acc: 0.3291\n",
"\n",
"Epoch 3/24\n",
"----------\n",
"train Loss: 2.0065 Acc: 0.3496\n",
"\n",
"Epoch 4/24\n",
"----------\n",
"train Loss: 1.9442 Acc: 0.3316\n",
"\n",
"Epoch 5/24\n",
"----------\n",
"train Loss: 1.8409 Acc: 0.3713\n",
"\n",
"Epoch 6/24\n",
"----------\n",
"train Loss: 1.7708 Acc: 0.4110\n",
"\n",
"Epoch 7/24\n",
"----------\n",
"train Loss: 1.6016 Acc: 0.4571\n",
"\n",
"Epoch 8/24\n",
"----------\n",
"train Loss: 1.5667 Acc: 0.4686\n",
"\n",
"Epoch 9/24\n",
"----------\n",
"train Loss: 1.4753 Acc: 0.5134\n",
"\n",
"Epoch 10/24\n",
"----------\n",
"train Loss: 1.4763 Acc: 0.5058\n",
"\n",
"Epoch 11/24\n",
"----------\n",
"train Loss: 1.4015 Acc: 0.5134\n",
"\n",
"Epoch 12/24\n",
"----------\n",
"train Loss: 1.4210 Acc: 0.5224\n",
"\n",
"Epoch 13/24\n",
"----------\n",
"train Loss: 1.3903 Acc: 0.5250\n",
"\n",
"Epoch 14/24\n",
"----------\n",
"train Loss: 1.3189 Acc: 0.5519\n",
"\n",
"Epoch 15/24\n",
"----------\n",
"train Loss: 1.3964 Acc: 0.5467\n",
"\n",
"Epoch 16/24\n",
"----------\n",
"train Loss: 1.3757 Acc: 0.5352\n",
"\n",
"Epoch 17/24\n",
"----------\n",
"train Loss: 1.3398 Acc: 0.5608\n",
"\n",
"Epoch 18/24\n",
"----------\n",
"train Loss: 1.3365 Acc: 0.5659\n",
"\n",
"Epoch 19/24\n",
"----------\n",
"train Loss: 1.3535 Acc: 0.5621\n",
"\n",
"Epoch 20/24\n",
"----------\n",
"train Loss: 1.3501 Acc: 0.5365\n",
"\n",
"Epoch 21/24\n",
"----------\n",
"train Loss: 1.3291 Acc: 0.5429\n",
"\n",
"Epoch 22/24\n",
"----------\n",
"train Loss: 1.3449 Acc: 0.5493\n",
"\n",
"Epoch 23/24\n",
"----------\n",
"train Loss: 1.3546 Acc: 0.5467\n",
"\n",
"Epoch 24/24\n",
"----------\n",
"train Loss: 1.3232 Acc: 0.5467\n",
"\n",
"Training complete in 4m 3s\n"
]
}
],
"source": [
"model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler, num_epochs=25)"
]
},
{
"cell_type": "code",
"execution_count": 131,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"classes list: [6, 3, 6, 2]\n",
"_classes: [7, 4, 7, 3]\n",
"classes list: [2, 6, 3, 4]\n",
"_classes: [3, 7, 4, 5]\n",
"classes list: [1, 1, 2, 2]\n",
"_classes: [2, 2, 3, 3]\n",
"classes list: [6, 2, 2, 6]\n",
"_classes: [7, 3, 3, 7]\n",
"classes list: [1, 0, 6, 8]\n",
"_classes: [2, 1, 7, 9]\n",
"classes list: [2, 4, 1, 2]\n",
"_classes: [3, 5, 2, 3]\n",
"classes list: [6, 6, 5, 5]\n",
"_classes: [7, 7, 6, 6]\n",
"classes list: [8, 2, 1, 4]\n",
"_classes: [9, 3, 2, 5]\n",
"classes list: [1, 4, 2, 2]\n",
"_classes: [2, 5, 3, 3]\n",
"classes list: [5, 2, 3, 4]\n",
"_classes: [6, 3, 4, 5]\n",
"classes list: [2, 1, 5, 1]\n",
"_classes: [3, 2, 6, 2]\n",
"classes list: [6, 2, 2, 4]\n",
"_classes: [7, 3, 3, 5]\n",
"classes list: [5, 3, 6, 1]\n",
"_classes: [6, 4, 7, 2]\n",
"classes list: [2, 2, 2, 1]\n",
"_classes: [3, 3, 3, 2]\n",
"classes list: [8, 1, 2, 0]\n",
"_classes: [9, 2, 3, 1]\n",
"classes list: [1, 7, 8, 2]\n",
"_classes: [2, 8, 9, 3]\n",
"classes list: [4, 6, 2, 2]\n",
"_classes: [5, 7, 3, 3]\n",
"classes list: [4, 2, 2, 8]\n",
"_classes: [5, 3, 3, 9]\n",
"classes list: [6, 2, 1, 7]\n",
"_classes: [7, 3, 2, 8]\n",
"classes list: [8, 2, 4, 4]\n",
"_classes: [9, 3, 5, 5]\n",
"classes list: [6, 6, 6]\n",
"_classes: [7, 7, 7]\n",
"tensor([[ 0., 1., 0., 0., 0., 0., 1., 0., 0.],\n",
" [ 0., 2., 6., 0., 0., 0., 2., 0., 3.],\n",
" [ 0., 2., 21., 0., 0., 0., 3., 0., 0.],\n",
" [ 0., 0., 2., 0., 1., 0., 1., 0., 0.],\n",
" [ 0., 3., 4., 0., 2., 0., 1., 0., 0.],\n",
" [ 1., 0., 1., 0., 0., 1., 2., 0., 0.],\n",
" [ 0., 2., 2., 0., 1., 0., 8., 0., 2.],\n",
" [ 0., 1., 0., 0., 0., 0., 1., 0., 0.],\n",
" [ 0., 1., 4., 0., 1., 0., 0., 0., 0.]])\n",
"tensor([0.0000, 0.1538, 0.8077, 0.0000, 0.2000, 0.2000, 0.5333, 0.0000, 0.0000])\n"
]
},
{
"data": {
"text/plain": [
"\"cat1_acc = cat1_corr/cat1\\ncat2_acc = cat2_corr/cat2\\ncat3_acc = cat3_corr/cat3\\ncat4_acc = cat4_corr/cat4\\ncat5_acc = cat5_corr/cat5\\ncat6_acc = cat6_corr/cat6\\ncat7_acc = cat7_corr/cat7\\ncat8_acc = cat8_corr/cat8\\ncat9_acc = cat9_corr/cat9\\n\\nprint('class 1 accuracy {0}, class 1 correct classifications: {1}, class 1 images: {2}'.format(cat1_acc, cat1_corr, cat1))\\nprint('class 2 accuracy {0}, class 2 correct classifications: {1}, class 2 images: {2}'.format(cat2_acc, cat2_corr, cat2))\\nprint('class 3 accuracy {0}, class 3 correct classifications: {1}, class 3 images: {2}'.format(cat3_acc, cat3_corr, cat3))\\nprint('class 4 accuracy {0}, class 4 correct classifications: {1}, class 4 images: {2}'.format(cat4_acc, cat4_corr, cat4))\\nprint('class 5 accuracy {0}, class 5 correct classifications: {1}, class 5 images: {2}'.format(cat5_acc, cat5_corr, cat5))\\nprint('class 6 accuracy {0}, class 6 correct classifications: {1}, class 6 images: {2}'.format(cat6_acc, cat6_corr, cat6))\\nprint('class 7 accuracy {0}, class 7 correct classifications: {1}, class 7 images: {2}'.format(cat7_acc, cat7_corr, cat7))\\nprint('class 8 accuracy {0}, class 8 correct classifications: {1}, class 8 images: {2}'.format(cat8_acc, cat8_corr, cat8))\\nprint('class 9 accuracy {0}, class 9 correct classifications: {1}, class 9 images: {2}'.format(cat9_acc, cat9_corr, cat9))\\n\\n\\n\\n\\n\\nprint('1', cat1_acc)\\nprint('2', cat2_acc)\\nprint('3', cat3_acc)\\nprint('4', cat4_acc)\\nprint('5', cat5_acc)\\nprint('6', cat6_acc)\\nprint('7', cat7_acc)\\nprint('8', cat8_acc)\\nprint('9', cat9_acc)\""
]
},
"execution_count": 131,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nb_classes = 9\n",
"\n",
"\n",
"confusion_matrix = torch.zeros(nb_classes, nb_classes)\n",
"cat1_corr = 0\n",
"cat1 = 0\n",
"cat2_corr = 0\n",
"cat2 = 0\n",
"cat3_corr = 0\n",
"cat3 = 0\n",
"cat4_corr = 0\n",
"cat4 = 0\n",
"cat5_corr = 0\n",
"cat5 = 0\n",
"cat6_corr = 0\n",
"cat6 = 0\n",
"cat7_corr = 0\n",
"cat7 = 0\n",
"cat8_corr = 0\n",
"cat8 = 0\n",
"cat9_corr = 0\n",
"cat9 = 0\n",
"_classes = []\n",
"_preds = []\n",
"predicted_labels = []\n",
"with torch.no_grad():\n",
" for i, (inputs, classes) in enumerate(dataloaders['test']):\n",
" \n",
" \n",
" inputs = inputs.to(device)\n",
" tmp_labels = model_ft(inputs)\n",
" \n",
" classes = classes.to(device)\n",
" classes_list = classes.cpu().detach().numpy().tolist()\n",
" print('classes list: ', classes_list)\n",
" _classes[:]=[i+1 for i in classes_list]\n",
" print('_classes: ', _classes)\n",
" outputs = model_ft(inputs)\n",
" _, preds = torch.max(outputs, 1)\n",
" preds_list = preds.cpu().detach().numpy().tolist()\n",
" _preds[:]=[i+1 for i in preds_list]\n",
" '''for i in range(4):\n",
" if _classes[i] == 1:\n",
" cat1 += 1\n",
" if _classes[i] == _preds[i]:\n",
" cat1_corr += 1\n",
" elif _classes[i] == 2:\n",
" cat2 += 1\n",
" if _classes[i] == _preds[i]:\n",
" cat2_corr += 1\n",
" elif _classes[i] == 3:\n",
" cat3 += 1\n",
" if _classes[i] == _preds[i]:\n",
" cat3_corr += 1\n",
" elif _classes[i] == 4:\n",
" cat4 += 1\n",
" if _classes[i] == _preds[i]:\n",
" cat4_corr += 1\n",
" elif _classes[i] == 5:\n",
" cat5 += 1\n",
" if _classes[i] == _preds[i]:\n",
" cat5_corr += 1\n",
" elif _classes[i] == 6:\n",
" cat6 += 1\n",
" if _classes[i] == _preds[i]:\n",
" cat6_corr += 1\n",
" elif _classes[i] == 7:\n",
" cat7 += 1\n",
" if _classes[i] == _preds[i]:\n",
" cat7_corr += 1\n",
" elif _classes[i] == 8:\n",
" cat8 += 1\n",
" if _classes[i] == _preds[i]:\n",
" cat8_corr += 1\n",
" elif _classes[i] == 9:\n",
" print('here')\n",
" cat9 += 1\n",
" if _classes[i] == _preds[i]:\n",
" cat9_corr += 1'''\n",
" \n",
" \n",
" predicted_labels.append(preds.cpu().detach().numpy().tolist())\n",
" for t, p in zip(classes.view(-1), preds.view(-1)):\n",
" confusion_matrix[t.long(), p.long()] += 1\n",
" \n",
"print(confusion_matrix)\n",
"\n",
"print(confusion_matrix.diag()/confusion_matrix.sum(1))\n",
"\n",
"\n",
"'''cat1_acc = cat1_corr/cat1\n",
"cat2_acc = cat2_corr/cat2\n",
"cat3_acc = cat3_corr/cat3\n",
"cat4_acc = cat4_corr/cat4\n",
"cat5_acc = cat5_corr/cat5\n",
"cat6_acc = cat6_corr/cat6\n",
"cat7_acc = cat7_corr/cat7\n",
"cat8_acc = cat8_corr/cat8\n",
"cat9_acc = cat9_corr/cat9\n",
"\n",
"print('class 1 accuracy {0}, class 1 correct classifications: {1}, class 1 images: {2}'.format(cat1_acc, cat1_corr, cat1))\n",
"print('class 2 accuracy {0}, class 2 correct classifications: {1}, class 2 images: {2}'.format(cat2_acc, cat2_corr, cat2))\n",
"print('class 3 accuracy {0}, class 3 correct classifications: {1}, class 3 images: {2}'.format(cat3_acc, cat3_corr, cat3))\n",
"print('class 4 accuracy {0}, class 4 correct classifications: {1}, class 4 images: {2}'.format(cat4_acc, cat4_corr, cat4))\n",
"print('class 5 accuracy {0}, class 5 correct classifications: {1}, class 5 images: {2}'.format(cat5_acc, cat5_corr, cat5))\n",
"print('class 6 accuracy {0}, class 6 correct classifications: {1}, class 6 images: {2}'.format(cat6_acc, cat6_corr, cat6))\n",
"print('class 7 accuracy {0}, class 7 correct classifications: {1}, class 7 images: {2}'.format(cat7_acc, cat7_corr, cat7))\n",
"print('class 8 accuracy {0}, class 8 correct classifications: {1}, class 8 images: {2}'.format(cat8_acc, cat8_corr, cat8))\n",
"print('class 9 accuracy {0}, class 9 correct classifications: {1}, class 9 images: {2}'.format(cat9_acc, cat9_corr, cat9))\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"print('1', cat1_acc)\n",
"print('2', cat2_acc)\n",
"print('3', cat3_acc)\n",
"print('4', cat4_acc)\n",
"print('5', cat5_acc)\n",
"print('6', cat6_acc)\n",
"print('7', cat7_acc)\n",
"print('8', cat8_acc)\n",
"print('9', cat9_acc)'''\n"
]
},
{
"cell_type": "code",
"execution_count": 132,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10folds/9_test_all/2.jpg\n",
"10folds/9_test_all/19.jpg\n",
"10folds/9_test_all/42.jpg\n",
"10folds/9_test_all/44.jpg\n",
"10folds/9_test_all/45.jpg\n",
"10folds/9_test_all/64.jpg\n",
"10folds/9_test_all/76.jpg\n",
"10folds/9_test_all/164.jpg\n",
"10folds/9_test_all/183.jpg\n",
"10folds/9_test_all/194.jpg\n",
"10folds/9_test_all/221.jpg\n",
"10folds/9_test_all/240.jpg\n",
"10folds/9_test_all/332.jpg\n",
"10folds/9_test_all/352.jpg\n",
"10folds/9_test_all/356.jpg\n",
"10folds/9_test_all/358.jpg\n",
"10folds/9_test_all/372.jpg\n",
"10folds/9_test_all/387.jpg\n",
"10folds/9_test_all/399.jpg\n",
"10folds/9_test_all/90007.jpg\n",
"10folds/9_test_all/90038.jpg\n",
"10folds/9_test_all/90054.jpg\n",
"10folds/9_test_all/90097.jpg\n",
"10folds/9_test_all/90202.jpg\n",
"10folds/9_test_all/90258.jpg\n",
"10folds/9_test_all/100034.jpg\n",
"10folds/9_test_all/100044.jpg\n",
"10folds/9_test_all/100080.jpg\n",
"10folds/9_test_all/100083.jpg\n",
"10folds/9_test_all/100088.jpg\n",
"10folds/9_test_all/100103.jpg\n",
"10folds/9_test_all/100146.jpg\n",
"10folds/9_test_all/100153.jpg\n",
"10folds/9_test_all/100198.jpg\n",
"10folds/9_test_all/100222.jpg\n",
"10folds/9_test_all/100242.jpg\n",
"10folds/9_test_all/100263.jpg\n",
"10folds/9_test_all/100280.jpg\n",
"10folds/9_test_all/100293.jpg\n",
"10folds/9_test_all/100342.jpg\n",
"10folds/9_test_all/100366.jpg\n",
"10folds/9_test_all/100373.jpg\n",
"10folds/9_test_all/100375.jpg\n",
"10folds/9_test_all/100379.jpg\n",
"10folds/9_test_all/10001.jpg\n",
"10folds/9_test_all/10017.jpg\n",
"10folds/9_test_all/10022.jpg\n",
"10folds/9_test_all/10053.jpg\n",
"10folds/9_test_all/10058.jpg\n",
"10folds/9_test_all/10060.jpg\n",
"10folds/9_test_all/10085.jpg\n",
"10folds/9_test_all/10132.jpg\n",
"10folds/9_test_all/10149.jpg\n",
"10folds/9_test_all/10157.jpg\n",
"10folds/9_test_all/10160.jpg\n",
"10folds/9_test_all/10184.jpg\n",
"10folds/9_test_all/10213.jpg\n",
"10folds/9_test_all/10214.jpg\n",
"10folds/9_test_all/10236.jpg\n",
"10folds/9_test_all/10238.jpg\n",
"10folds/9_test_all/10274.jpg\n",
"10folds/9_test_all/10285.jpg\n",
"10folds/9_test_all/10316.jpg\n",
"10folds/9_test_all/10318.jpg\n",
"10folds/9_test_all/10321.jpg\n",
"10folds/9_test_all/10331.jpg\n",
"10folds/9_test_all/10388.jpg\n",
"10folds/9_test_all/10389.jpg\n",
"10folds/9_test_all/10392.jpg\n",
"10folds/9_test_all/10410.jpg\n",
"10folds/9_test_all/10479.jpg\n",
"10folds/9_test_all/10484.jpg\n",
"10folds/9_test_all/10509.jpg\n",
"10folds/9_test_all/10543.jpg\n",
"10folds/9_test_all/10577.jpg\n",
"10folds/9_test_all/10578.jpg\n",
"10folds/9_test_all/10590.jpg\n",
"10folds/9_test_all/10596.jpg\n",
"10folds/9_test_all/10604.jpg\n",
"10folds/9_test_all/10608.jpg\n",
"10folds/9_test_all/10659.jpg\n",
"10folds/9_test_all/10697.jpg\n",
"10folds/9_test_all/10701.jpg\n"
]
}
],
"source": [
"input_path = \"10folds/9_test_all/\"\n",
"vector_fh = open('fold9_resnet50_feature_vectors.txt', 'a+')\n",
"df = pd.read_csv('../../10fold_mona/test-9.csv')\n",
"\n",
"for i in range(df.shape[0]):\n",
" filename = input_path + str(df.iloc[i]['ID']) + '.jpg'\n",
" print(filename)\n",
" img = Image.open(filename)\n",
" image = normalize(to_tensor(scaler(img))).unsqueeze(0).to(device)\n",
" model_ft = model_ft.cuda()\n",
" #model_conv = model_conv.cuda()\n",
" tf_last_layer_chopped = nn.Sequential(*list(model_ft.children())[:-1])\n",
" output = tf_last_layer_chopped(image)\n",
" nd_arr = output.cpu().detach().numpy().reshape(1, 2048)\n",
" np.savetxt(vector_fh, nd_arr)"
]
},
{
"cell_type": "code",
"execution_count": 140,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0. 0.3445 0.76539 0.135 0.16818 0.39333 0.46833 0. 0.10715]\n"
]
}
],
"source": [
"fold0_acc = np.asarray([0.0000, 0.4286, 0.6154, 0.0000, 0.0000, 0.8333, 0.3750, 0.0000, 0.2857])\n",
"fold1_acc = np.asarray([0.0000, 0.5000, 0.8077, 0.0000, 0.1818, 0.6667, 0.3750, 0.0000, 0.2857])\n",
"acc = np.add(fold0_acc, fold1_acc)\n",
"fold2_acc = np.asarray([0.0000, 0.2857, 0.7308, 0.2000, 0.0000, 0.3333, 0.4000, 0.0000, 0.0000])\n",
"acc = np.add(acc, fold2_acc)\n",
"fold3_acc = np.asarray([0.0000, 0.3571, 0.7692, 0.4000, 0.1000, 0.5000, 0.3333, 0.0000, 0.1667])\n",
"acc = np.add(acc, fold3_acc)\n",
"fold4_acc = np.asarray([0.0000, 0.2857, 0.7308, 0.2500, 0.3000, 0.1667, 0.2000, 0.0000, 0.0000])\n",
"acc = np.add(acc, fold4_acc)\n",
"fold5_acc = np.asarray([0.0000, 0.3571, 0.7692, 0.0000, 0.1000, 0.5000, 0.6000, 0.0000, 0.1667])\n",
"acc = np.add(acc, fold5_acc)\n",
"fold6_acc = np.asarray([0.0000, 0.5385, 0.8462, 0.5000, 0.2000, 0.3333, 0.6000, 0.0000, 0.1667])\n",
"acc = np.add(acc, fold6_acc)\n",
"fold7_acc = np.asarray([0.0000, 0.2308, 0.7692, 0.0000, 0.4000, 0.0000, 0.6000, 0.0000, 0.0000])\n",
"acc = np.add(acc, fold7_acc)\n",
"fold8_acc = np.asarray([0.0000, 0.3077, 0.8077, 0.0000, 0.2000, 0.4000, 0.6667, 0.0000, 0.0000])\n",
"acc = np.add(acc, fold8_acc)\n",
"fold9_acc = np.asarray([0.0000, 0.1538, 0.8077, 0.0000, 0.2000, 0.2000, 0.5333, 0.0000, 0.0000])\n",
"acc = np.add(acc, fold9_acc)\n",
"print(acc/10)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/scratch/sjn-p3/anaconda/anaconda3/lib/python3.6/site-packages/torchvision-0.2.1-py3.6.egg/torchvision/transforms/transforms.py:188: UserWarning: The use of the transforms.Scale transform is deprecated, please use transforms.Resize instead.\n"
]
}
],
"source": [
"import glob\n",
"from PIL import Image\n",
"input_path = \"a10folds/0_test_all\"\n",
"# only test\n",
"vector_fh = open('resnet50_feature_vectors_fold0.txt', 'a+')\n",
"\n",
"filenames = glob.glob(input_path + \"/*.*\")\n",
"\n",
"scaler = transforms.Scale((224, 224))\n",
"normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n",
"to_tensor = transforms.ToTensor()\n",
"\n",
"for filename in filenames:\n",
" #print(filename)\n",
" img = Image.open(filename)\n",
" image = normalize(to_tensor(scaler(img))).unsqueeze(0).to(device)\n",
" model_ft = model_ft.cuda()\n",
" #model_conv = model_conv.cuda()\n",
" tf_last_layer_chopped = nn.Sequential(*list(model_ft.children())[:-1])\n",
" output = tf_last_layer_chopped(image)\n",
" nd_arr = output.cpu().detach().numpy().reshape(1, 2048)\n",
" np.savetxt(vector_fh, nd_arr)\n",
" \n"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [],
"source": [
"%rm class_names3_7.txt"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"ename": "FileNotFoundError",
"evalue": "File b'merged_JanJunAugSep2018_gv_ih_student_coding.csv' does not exist",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-24-af8e1c604e97>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mclass_names_fh\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'class_names2_3_5_7_9.txt'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'a+'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"merged_JanJunAugSep2018_gv_ih_student_coding.csv\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0mdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"ID\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mfilenames\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mglob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mglob\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput_path\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[0;32m/scratch/sjn-p3/anaconda/anaconda3/lib/python3.6/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36mparser_f\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, escapechar, comment, encoding, dialect, tupleize_cols, error_bad_lines, warn_bad_lines, skipfooter, skip_footer, doublequote, delim_whitespace, as_recarray, compact_ints, use_unsigned, low_memory, buffer_lines, memory_map, float_precision)\u001b[0m\n\u001b[1;32m 707\u001b[0m skip_blank_lines=skip_blank_lines)\n\u001b[1;32m 708\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 709\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_read\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 710\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 711\u001b[0m \u001b[0mparser_f\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/scratch/sjn-p3/anaconda/anaconda3/lib/python3.6/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 447\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 448\u001b[0m \u001b[0;31m# Create the parser.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 449\u001b[0;31m \u001b[0mparser\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mTextFileReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 450\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 451\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mchunksize\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0miterator\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/scratch/sjn-p3/anaconda/anaconda3/lib/python3.6/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m 816\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'has_index_names'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'has_index_names'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 817\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 818\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mengine\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 819\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 820\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/scratch/sjn-p3/anaconda/anaconda3/lib/python3.6/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m_make_engine\u001b[0;34m(self, engine)\u001b[0m\n\u001b[1;32m 1047\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_make_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mengine\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'c'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1048\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mengine\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'c'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1049\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCParserWrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1050\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1051\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mengine\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'python'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/scratch/sjn-p3/anaconda/anaconda3/lib/python3.6/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, src, **kwds)\u001b[0m\n\u001b[1;32m 1693\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'allow_leading_cols'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex_col\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1694\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1695\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reader\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mparsers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTextReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msrc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1696\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1697\u001b[0m \u001b[0;31m# XXX\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32mpandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader.__cinit__\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._setup_parser_source\u001b[0;34m()\u001b[0m\n",
"\u001b[0;31mFileNotFoundError\u001b[0m: File b'merged_JanJunAugSep2018_gv_ih_student_coding.csv' does not exist"
]
}
],
"source": [
"import pandas as pd\n",
"import ntpath\n",
"import os\n",
"\n",
"#class_names_fh = open('class_names3_7.txt', 'a+')\n",
"class_names_fh = open('class_names2_3_5_7_9.txt', 'a+')\n",
"\n",
"df = pd.read_csv(\"merged_JanJunAugSep2018_gv_ih_student_coding.csv\")\n",
"df = df.set_index(\"ID\")\n",
"filenames = glob.glob(input_path + \"/*.*\")\n",
"\n",
"for filename in filenames:\n",
" no_extension_filename = ntpath.basename(filename)[:-4]\n",
" if int(no_extension_filename) in df.index:\n",
" class_names_fh.write(str(df.loc[int(no_extension_filename)]['Q3 Theme']) + \"\\n\")\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment