From b4a07e46d3e367b5f8f38d4caf478cd7592d98e5 Mon Sep 17 00:00:00 2001 From: Neta Zmora <neta.zmora@intel.com> Date: Mon, 29 Oct 2018 13:43:43 +0200 Subject: [PATCH] Jupyter: utility notebook to save intermediate activations to file This short notebook performs a forward-pass on a single ImageNet image, and saves the intermediate results to a file for later inspection --- jupyter/save_intermediate_feature_maps.ipynb | 182 +++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 jupyter/save_intermediate_feature_maps.ipynb diff --git a/jupyter/save_intermediate_feature_maps.ipynb b/jupyter/save_intermediate_feature_maps.ipynb new file mode 100644 index 0000000..ed971b9 --- /dev/null +++ b/jupyter/save_intermediate_feature_maps.ipynb @@ -0,0 +1,182 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Save intermediate feature-maps to file\n", + "\n", + "This short notebook performs a forward-pass on a single ImageNet image, and save the intermediate results to a file for later inspection." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "import torchvision\n", + "import torch.nn as nn\n", + "from torch.autograd import Variable\n", + "\n", + "# Relative import of code from distiller, w/o installing the package\n", + "import os\n", + "import sys\n", + "import numpy as np \n", + "import matplotlib.pyplot as plt\n", + "from PIL import Image\n", + "\n", + "module_path = os.path.abspath(os.path.join('..'))\n", + "if module_path not in sys.path:\n", + " sys.path.append(module_path)\n", + "\n", + "import distiller\n", + "import apputils\n", + "import models\n", + "from apputils import *" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Load ResNet50\n", + "resnet50 = models.create_model(pretrained=True, dataset='imagenet', arch='resnet50', parallel=False)\n", + "\n", + "# Load the \"sparse\" compressed model \n", + "resnet50_sparse = models.create_model(pretrained=True, dataset='imagenet', arch='resnet50', parallel=True)\n", + "load_checkpoint(resnet50_sparse , \"../examples/classifier_compression/resnet50_checkpoint_70.66-sparse_76.09-top1.pth.tar\");\n", + "resnet50_sparse = distiller.make_non_parallel_copy(resnet50_sparse)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from torchvision import transforms\n", + "\n", + "normalize = transforms.Normalize(\n", + " mean=[0.485, 0.456, 0.406],\n", + " std=[0.229, 0.224, 0.225]\n", + ")\n", + "preprocess = transforms.Compose([\n", + " transforms.Resize(256),\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " normalize\n", + "])\n", + "\n", + "# Open some file and do a forward-pass. We do this to check everything is cool.\n", + "img = Image.open(\"../../data.imagenet/val/n02669723/ILSVRC2012_val_00029372.JPEG\")\n", + "img = preprocess(img)\n", + "img = img.unsqueeze_(0)\n", + "\n", + "sample = Variable(img)\n", + "\n", + "resnet50_sparse.eval()\n", + "predictions = resnet50_sparse(sample.cuda())\n", + "\n", + "top1_vals, top1_indices = torch.max(predictions, 1)\n", + "print(top1_vals.item())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# This is where the work gets done:\n", + "# We register for forward callbacks, perform a forward pass, and in the callbacks we cache the\n", + "# intermediate feature-maps.\n", + "\n", + "intermediary_results = {}\n", + "cb_handles = []\n", + "\n", + "def save_conv_output(m, i, o):\n", + " intermediary_results[m.distiller_name] = o.data.cpu().numpy()\n", + " \n", + "def register_forward_hook(m):\n", + " if hasattr(m, 'distiller_name'):\n", + " h = m.register_forward_hook(save_conv_output)\n", + " cb_handles.append(h)\n", + "\n", + "distiller.utils.assign_layer_fq_names(resnet50_sparse)\n", + "resnet50_sparse.apply(register_forward_hook)\n", + "predictions = resnet50_sparse(sample.cuda())\n", + "for h in cb_handles:\n", + " h.remove()\n", + "print(len(intermediary_results))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Now save the feature-maps to file...\n", + "import pickle \n", + "\n", + "with open('resnet50_sparse_fms.pickle', 'wb') as f:\n", + " pickle.dump(intermediary_results, f)\n", + " #np_weights = pickle.save(handle)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# This is how you load results later...\n", + "\n", + "intermediary_results_from_file = {}\n", + "\n", + "with open('resnet50_sparse_fms.pickle', 'rb') as f:\n", + " intermediary_results_from_file = pickle.load(f)\n", + " \n", + "# To print all layer names:\n", + "for name, tensor in intermediary_results_from_file.items():\n", + " print(name, tensor.size)" + ] + }, + { + "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.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} -- GitLab