Created
March 26, 2021 18:46
-
-
Save amaarora/c562da34b95d97f8254960bdca6a12d1 to your computer and use it in GitHub Desktop.
Plot SPPs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "metadata": { | |
| "gradient": {}, | |
| "trusted": false | |
| }, | |
| "id": "satellite-superior", | |
| "cell_type": "code", | |
| "source": "import timm \nimport torch \nimport torchvision\nfrom matplotlib import pyplot as plt", | |
| "execution_count": 1, | |
| "outputs": [] | |
| }, | |
| { | |
| "metadata": { | |
| "trusted": false | |
| }, | |
| "id": "preceding-space", | |
| "cell_type": "code", | |
| "source": "def avg_sq_ch_mean(model, input, output): \n \"calculate average channel square mean of output activations\"\n return torch.mean(output.mean(axis=[0,2,3])**2).item()\n\n\ndef avg_ch_var(model, input, output): \n \"calculate average channel variance of output activations\"\n return torch.mean(output.var(axis=[0,2,3])).item()", | |
| "execution_count": 2, | |
| "outputs": [] | |
| }, | |
| { | |
| "metadata": { | |
| "trusted": false | |
| }, | |
| "id": "romance-oakland", | |
| "cell_type": "code", | |
| "source": "class ActivationStatsHook:\n \"\"\"Iterates through each of `model`'s modules and if module's class name \n is present in `layer_names` then registers `hook_fns` inside that module\n and stores activation stats inside `self.stats`.\n\n Arguments:\n model (nn.Module): model from which we will extract the activation stats\n layer_names (List[str]): The layer name to look for to register forward \n hook. Example, `BasicBlock`, `Bottleneck`\n hook_fns (List[Callable]): List of hook functions to be registered at every\n module in `layer_names`.\n \n Inspiration from https://docs.fast.ai/callback.hook.html.\n \"\"\"\n\n def __init__(self, model, layer_names, hook_fns=[avg_sq_ch_mean, avg_ch_var]):\n self.model = model\n self.layer_names = layer_names \n self.hook_fns = hook_fns\n self.stats = dict((hook_fn.__name__, []) for hook_fn in hook_fns)\n for hook_fn in hook_fns: \n self.register_hook(layer_names, hook_fn)\n\n def _create_hook(self, hook_fn):\n def append_activation_stats(module, input, output):\n out = hook_fn(module, input, output)\n self.stats[hook_fn.__name__].append(out)\n return append_activation_stats\n \n def register_hook(self, layer_names, hook_fn):\n for layer in self.model.modules():\n layer_name = layer.__class__.__name__\n if layer_name not in layer_names: \n continue\n layer.register_forward_hook(self._create_hook(hook_fn))", | |
| "execution_count": 3, | |
| "outputs": [] | |
| }, | |
| { | |
| "metadata": { | |
| "trusted": false | |
| }, | |
| "id": "incomplete-jason", | |
| "cell_type": "code", | |
| "source": "def extract_spp_stats(model, \n layer_names, \n hook_fns=[avg_sq_ch_mean, avg_ch_var], \n input_shape=[8, 3, 224, 224]):\n \"\"\"Extract average square channel mean and variance of activations during \n forward pass to plot Signal Propogation Plots (SPP).\n \n Paper: https://arxiv.org/abs/2101.08692\n \"\"\" \n x = torch.normal(0., 1., input_shape)\n hook = ActivationStatsHook(model, layer_names, hook_fns)\n _ = model(x)\n return hook.stats", | |
| "execution_count": 4, | |
| "outputs": [] | |
| }, | |
| { | |
| "metadata": { | |
| "gradient": {}, | |
| "trusted": false | |
| }, | |
| "id": "filled-singles", | |
| "cell_type": "code", | |
| "source": "m = timm.create_model('nfnet_f0')\nstats = extract_spp_stats(m, layer_names=['NormFreeBlock'], hook_fns=[avg_sq_ch_mean, avg_ch_var])\nplt.plot(stats['avg_sq_ch_mean'], label='avg_sq_ch_mean');\nplt.plot(stats['avg_ch_var'], label='avg_ch_var');\nplt.legend();", | |
| "execution_count": 5, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAfuUlEQVR4nO3deXxV5b3v8c8vgwlEZEokSlBQKVMSGSJXxeNchVYFKlasetRTD1evVmpPry+r9yW1reeo9XoE8dZDnaq2VmVQULEXBy5qRQmIzK0oUyhgiAIGiAL53T/WTowxISHZOyt77e/79dqv7OHZa/122Hx5eJ61nmXujoiIJL+0sAsQEZH4UKCLiESEAl1EJCIU6CIiEaFAFxGJiIywdpybm+u9e/cOa/ciIklp8eLF2909r6HXQgv03r17U1paGtbuRUSSkpltaOw1DbmIiESEAl1EJCIU6CIiERHaGLqItM6+ffsoKyujqqoq7FIkAbKzsykoKCAzM7PZ71GgiySpsrIyOnXqRO/evTGzsMuROHJ3KioqKCsro0+fPs1+n4ZcRJJUVVUV3bt3V5hHkJnRvXv3Q/7flwJdJIkpzKOrJX+2yRfo21bBvDvgyy/CrkREpF1JvkDfsQHemRwEu4iI1Eq+QM8vCn5uXRZuHSKSlK6++mqmT58edhkJkXyBfkRPyO4CW5eHXYmISLuSfIctmgW99G0rwq5EpN24c85KVv1jV1y3OfDoI5h04aAm240ZM4ZNmzZRVVXFxIkTqa6u5uOPP+a3v/0tAE888QSlpaVMnTqVX//61zz99NPk5eXRq1cvhg0bxs9//vMGtztlyhQefvhhMjIyGDhwIH/+85+pqKjgsssuY/PmzZxyyinMmzePxYsXk5ub2+A2nnzySe677z7MjOLiYp566ikAFixYwP3338/WrVu59957GTduXIPvnz9/PpMmTaJLly4sX76cH/7whxQVFTF58mT27t3LCy+8wPHHH095eTnXXXcdGzduBOCBBx5gxIgRvP/++0ycOJGqqio6dOjA448/Tr9+/XjiiSeYPXs2e/bs4eOPP2bs2LHce++9Tf6um9JkoJtZNrAAyIq1n+7uk+q1yQKeBIYBFcCl7r6+1dU1Jr8ISh+H6gOQlp6w3YhI0x577DG6devG3r17Oemkk3j99dcZMWJEbaA/++yz3H777SxatIgZM2bw4Ycfsm/fPoYOHcqwYcMa3e7dd9/NunXryMrKYseOHQDceeednHbaadxxxx28/PLLPProo42+f+XKlfzmN7/hr3/9K7m5uXz22We1r23ZsoW3336bNWvWcNFFFzUa6AAffvghq1evplu3bhx33HFce+21vP/++0yePJkHH3yQBx54gIkTJ3LzzTdz2mmnsXHjRs4//3xWr15N//79eeutt8jIyOC1117jtttuY8aMGQAsXbqUDz74gKysLPr168dPfvITevXqdSi/+m9pTg/9S+Bsd680s0zgbTOb6+4L67T5MfC5u59gZuOBe4BLW1XZweQXwf69UPEx5H0nYbsRSRbN6UknypQpU5g1axYAmzZtYt26dRx33HEsXLiQvn37smbNGkaMGMHkyZMZPXo02dnZZGdnc+GFFx50u8XFxVx++eWMGTOGMWPGAEHPeubMmQB8//vfp2vXro2+/4033uCSSy6p7b1369at9rUxY8aQlpbGwIED2bZt20HrOOmkkzjqqKMAOP744znvvPMAKCoq4s033wTgtddeY9Wqrw/U2LVrF5WVlezcuZOrrrqKjz76CDNj3759tW3OOeccOnfuDMDAgQPZsGFD4gPd3R2ojD3MjN28XrPRwC9j96cDU83MYu+Nv7oTowp0kdDMnz+f1157jXfffZeOHTty5plnUlVVxfjx43nuuefo378/Y8eObdEx1S+//DILFixgzpw53HXXXSxfHr95s6ysrNr7TcVU3bZpaWm1j9PS0ti/fz8A1dXVLFy4kOzs7G+898Ybb+Sss85i1qxZrF+/njPPPLPB7aanp9duqzWaNSlqZulmthT4FJjn7u/Va9IT2ATg7vuBnUD3BrYzwcxKzay0vLy85VXn9oO0TE2MioRs586ddO3alY4dO7JmzRoWLgz+4z527FhefPFFnnnmGcaPHw/AiBEjmDNnDlVVVVRWVvLSSy81ut3q6mo2bdrEWWedxT333MPOnTuprKzk9NNP509/+hMAc+fO5fPPP290G2effTbPP/88FRUVAN8Ycom38847jwcffLD28dKlS4Hg99OzZ08gmEtItGYFursfcPfBQAEw3MwKW7Izd5/m7iXuXpKX1+AFN5on4zDI66+JUZGQjRw5kv379zNgwABuvfVWTj75ZAC6du3KgAED2LBhA8OHDweCoYuLLrqI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\n", | |
| "text/plain": "<Figure size 432x288 with 1 Axes>" | |
| }, | |
| "metadata": { | |
| "needs_background": "light" | |
| }, | |
| "output_type": "display_data" | |
| } | |
| ] | |
| }, | |
| { | |
| "metadata": { | |
| "gradient": {}, | |
| "trusted": false | |
| }, | |
| "id": "foreign-damages", | |
| "cell_type": "code", | |
| "source": "m = torchvision.models.resnet50()\nstats = extract_spp_stats(m, layer_names=['Bottleneck'], hook_fns=[avg_sq_ch_mean, avg_ch_var])\nplt.plot(stats['avg_sq_ch_mean'], label='avg_sq_ch_mean');\nplt.plot(stats['avg_ch_var'], label='avg_ch_var');\nplt.legend();", | |
| "execution_count": 6, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": "<Figure size 432x288 with 1 Axes>" | |
| }, | |
| "metadata": { | |
| "needs_background": "light" | |
| }, | |
| "output_type": "display_data" | |
| } | |
| ] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "name": "python3", | |
| "display_name": "Python 3", | |
| "language": "python" | |
| }, | |
| "language_info": { | |
| "name": "python", | |
| "version": "3.8.5", | |
| "mimetype": "text/x-python", | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 3 | |
| }, | |
| "pygments_lexer": "ipython3", | |
| "nbconvert_exporter": "python", | |
| "file_extension": ".py" | |
| }, | |
| "gist": { | |
| "id": "", | |
| "data": { | |
| "description": "Plot SPPs", | |
| "public": true | |
| } | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 5 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment