Skip to content

Instantly share code, notes, and snippets.

@hushell
Created February 18, 2020 14:10
Show Gist options
  • Save hushell/851cdfb35a28b4c5f1035b686fd26e97 to your computer and use it in GitHub Desktop.
Save hushell/851cdfb35a28b4c5f1035b686fd26e97 to your computer and use it in GitHub Desktop.
Filter visualization
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Pytorch visualization\n",
"- https://github.com/pytorch/vision/blob/master/torchvision/utils.py\n",
"- https://github.com/utkuozbulak/pytorch-cnn-visualizations"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import torch\n",
"import torchvision \n",
"import torch.nn as nn\n",
"from torchvision import utils\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"plt.ion() # interactive mode\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"AlexNet(\n",
" (features): Sequential(\n",
" (0): Conv2d (3, 64, kernel_size=(11, 11), stride=(4, 4), padding=(2, 2))\n",
" (1): ReLU(inplace)\n",
" (2): MaxPool2d(kernel_size=(3, 3), stride=(2, 2), dilation=(1, 1))\n",
" (3): Conv2d (64, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
" (4): ReLU(inplace)\n",
" (5): MaxPool2d(kernel_size=(3, 3), stride=(2, 2), dilation=(1, 1))\n",
" (6): Conv2d (192, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
" (7): ReLU(inplace)\n",
" (8): Conv2d (384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
" (9): ReLU(inplace)\n",
" (10): Conv2d (256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
" (11): ReLU(inplace)\n",
" (12): MaxPool2d(kernel_size=(3, 3), stride=(2, 2), dilation=(1, 1))\n",
" )\n",
" (classifier): Sequential(\n",
" (0): Dropout(p=0.5)\n",
" (1): Linear(in_features=9216, out_features=4096)\n",
" (2): ReLU(inplace)\n",
" (3): Dropout(p=0.5)\n",
" (4): Linear(in_features=4096, out_features=4096)\n",
" (5): ReLU(inplace)\n",
" (6): Linear(in_features=4096, out_features=1000)\n",
" )\n",
")"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"alexnet = torchvision.models.alexnet(pretrained=True)\n",
"alexnet"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"torch.Size([64, 3, 11, 11])\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f541d6737b8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from torchvision import utils\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"\n",
"def vistensor(tensor, ch=0, allkernels=False, nrow=8, padding=1): \n",
" '''\n",
" vistensor: visuzlization tensor\n",
" @ch: visualization channel \n",
" @allkernels: visualization all tensores\n",
" ''' \n",
" \n",
" n,c,w,h = tensor.shape\n",
" if allkernels: tensor = tensor.view(n*c,-1,w,h )\n",
" elif c != 3: tensor = tensor[:,ch,:,:].unsqueeze(dim=1)\n",
" \n",
" rows = np.min( (tensor.shape[0]//nrow + 1, 64 ) ) \n",
" grid = utils.make_grid(tensor, nrow=nrow, normalize=True, padding=padding)\n",
" plt.figure( figsize=(nrow,rows) )\n",
" plt.imshow(grid.numpy().transpose((1, 2, 0)))\n",
"\n",
"def savetensor(tensor, filename, ch=0, allkernels=False, nrow=8, padding=2):\n",
" '''\n",
" savetensor: save tensor\n",
" @filename: file name\n",
" @ch: visualization channel \n",
" @allkernels: visualization all tensores\n",
" ''' \n",
"\n",
" n,c,w,h = tensor.shape\n",
" if allkernels: tensor = tensor.view(n*c,-1,w,h )\n",
" elif c != 3: tensor = tensor[:,ch,:,:].unsqueeze(dim=1) \n",
" utils.save_image(tensor, filename, nrow=nrow )\n",
"\n",
"\n",
"ik = 0\n",
"kernel = alexnet.features[ik].weight.data.clone()\n",
"print(kernel.shape)\n",
"\n",
"vistensor(kernel, ch=0, allkernels=False)\n",
"savetensor(kernel,'kernel.png', allkernels=False)\n",
"\n",
"plt.axis('off')\n",
"plt.ioff()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"# Print Autograd Graph\n",
"- https://github.com/szagoruyko/functional-zoo/blob/master/visualize.py\n",
"- https://discuss.pytorch.org/t/print-autograd-graph/692"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.38.0 (20140413.2041)\n",
" -->\n",
"<!-- Title: %3 Pages: 1 -->\n",
"<svg width=\"519pt\" height=\"864pt\"\n",
" viewBox=\"0.00 0.00 519.05 864.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(0.649624 0.649624) rotate(0) translate(4 1326)\">\n",
"<title>%3</title>\n",
"<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-1326 795,-1326 795,4 -4,4\"/>\n",
"<!-- 140494486538616 -->\n",
"<g id=\"node1\" class=\"node\"><title>140494486538616</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"671,-21 567,-21 567,-0 671,-0 671,-21\"/>\n",
"<text text-anchor=\"middle\" x=\"619\" y=\"-7.4\" font-family=\"Times,serif\" font-size=\"12.00\">AddmmBackward</text>\n",
"</g>\n",
"<!-- 140494486539176 -->\n",
"<g id=\"node2\" class=\"node\"><title>140494486539176</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"544,-78 442,-78 442,-57 544,-57 544,-78\"/>\n",
"<text text-anchor=\"middle\" x=\"493\" y=\"-64.4\" font-family=\"Times,serif\" font-size=\"12.00\">ExpandBackward</text>\n",
"</g>\n",
"<!-- 140494486539176&#45;&gt;140494486538616 -->\n",
"<g id=\"edge1\" class=\"edge\"><title>140494486539176&#45;&gt;140494486538616</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M514.948,-56.9197C535.06,-48.1406 565.059,-35.0457 587.686,-25.1689\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"589.117,-28.3634 596.881,-21.155 586.316,-21.9479 589.117,-28.3634\"/>\n",
"</g>\n",
"<!-- 140494486539400 -->\n",
"<g id=\"node3\" class=\"node\"><title>140494486539400</title>\n",
"<polygon fill=\"lightblue\" stroke=\"black\" points=\"537.5,-148 448.5,-148 448.5,-114 537.5,-114 537.5,-148\"/>\n",
"<text text-anchor=\"middle\" x=\"493\" y=\"-134.4\" font-family=\"Times,serif\" font-size=\"12.00\">classifier.6.bias</text>\n",
"<text text-anchor=\"middle\" x=\"493\" y=\"-121.4\" font-family=\"Times,serif\" font-size=\"12.00\"> (1000)</text>\n",
"</g>\n",
"<!-- 140494486539400&#45;&gt;140494486539176 -->\n",
"<g id=\"edge2\" class=\"edge\"><title>140494486539400&#45;&gt;140494486539176</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M493,-113.842C493,-106.012 493,-96.5396 493,-88.2816\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"496.5,-88.0419 493,-78.0419 489.5,-88.0419 496.5,-88.0419\"/>\n",
"</g>\n",
"<!-- 140494486539232 -->\n",
"<g id=\"node4\" class=\"node\"><title>140494486539232</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"675.5,-78 562.5,-78 562.5,-57 675.5,-57 675.5,-78\"/>\n",
"<text text-anchor=\"middle\" x=\"619\" y=\"-64.4\" font-family=\"Times,serif\" font-size=\"12.00\">ThresholdBackward</text>\n",
"</g>\n",
"<!-- 140494486539232&#45;&gt;140494486538616 -->\n",
"<g id=\"edge3\" class=\"edge\"><title>140494486539232&#45;&gt;140494486538616</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M619,-56.9197C619,-49.9083 619,-40.1442 619,-31.4652\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"622.5,-31.3408 619,-21.3408 615.5,-31.3409 622.5,-31.3408\"/>\n",
"</g>\n",
"<!-- 140494486539456 -->\n",
"<g id=\"node5\" class=\"node\"><title>140494486539456</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"668,-141.5 564,-141.5 564,-120.5 668,-120.5 668,-141.5\"/>\n",
"<text text-anchor=\"middle\" x=\"616\" y=\"-127.9\" font-family=\"Times,serif\" font-size=\"12.00\">AddmmBackward</text>\n",
"</g>\n",
"<!-- 140494486539456&#45;&gt;140494486539232 -->\n",
"<g id=\"edge4\" class=\"edge\"><title>140494486539456&#45;&gt;140494486539232</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M616.469,-120.391C616.885,-111.866 617.505,-99.1392 618.028,-88.4235\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"621.533,-88.4035 618.525,-78.2449 614.541,-88.0624 621.533,-88.4035\"/>\n",
"</g>\n",
"<!-- 140494486539568 -->\n",
"<g id=\"node6\" class=\"node\"><title>140494486539568</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"545,-205 443,-205 443,-184 545,-184 545,-205\"/>\n",
"<text text-anchor=\"middle\" x=\"494\" y=\"-191.4\" font-family=\"Times,serif\" font-size=\"12.00\">ExpandBackward</text>\n",
"</g>\n",
"<!-- 140494486539568&#45;&gt;140494486539456 -->\n",
"<g id=\"edge5\" class=\"edge\"><title>140494486539568&#45;&gt;140494486539456</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M513.062,-183.891C533.117,-173.781 564.893,-157.763 587.838,-146.196\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"589.717,-149.169 597.071,-141.542 586.566,-142.918 589.717,-149.169\"/>\n",
"</g>\n",
"<!-- 140494486539736 -->\n",
"<g id=\"node7\" class=\"node\"><title>140494486539736</title>\n",
"<polygon fill=\"lightblue\" stroke=\"black\" points=\"538.5,-275 449.5,-275 449.5,-241 538.5,-241 538.5,-275\"/>\n",
"<text text-anchor=\"middle\" x=\"494\" y=\"-261.4\" font-family=\"Times,serif\" font-size=\"12.00\">classifier.4.bias</text>\n",
"<text text-anchor=\"middle\" x=\"494\" y=\"-248.4\" font-family=\"Times,serif\" font-size=\"12.00\"> (4096)</text>\n",
"</g>\n",
"<!-- 140494486539736&#45;&gt;140494486539568 -->\n",
"<g id=\"edge6\" class=\"edge\"><title>140494486539736&#45;&gt;140494486539568</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M494,-240.842C494,-233.012 494,-223.54 494,-215.282\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"497.5,-215.042 494,-205.042 490.5,-215.042 497.5,-215.042\"/>\n",
"</g>\n",
"<!-- 140495929010312 -->\n",
"<g id=\"node8\" class=\"node\"><title>140495929010312</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"668.5,-205 563.5,-205 563.5,-184 668.5,-184 668.5,-205\"/>\n",
"<text text-anchor=\"middle\" x=\"616\" y=\"-191.4\" font-family=\"Times,serif\" font-size=\"12.00\">DropoutBackward</text>\n",
"</g>\n",
"<!-- 140495929010312&#45;&gt;140494486539456 -->\n",
"<g id=\"edge7\" class=\"edge\"><title>140495929010312&#45;&gt;140494486539456</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M616,-183.891C616,-175.366 616,-162.639 616,-151.923\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"619.5,-151.745 616,-141.745 612.5,-151.745 619.5,-151.745\"/>\n",
"</g>\n",
"<!-- 140494486539792 -->\n",
"<g id=\"node9\" class=\"node\"><title>140494486539792</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"670.5,-268.5 557.5,-268.5 557.5,-247.5 670.5,-247.5 670.5,-268.5\"/>\n",
"<text text-anchor=\"middle\" x=\"614\" y=\"-254.9\" font-family=\"Times,serif\" font-size=\"12.00\">ThresholdBackward</text>\n",
"</g>\n",
"<!-- 140494486539792&#45;&gt;140495929010312 -->\n",
"<g id=\"edge8\" class=\"edge\"><title>140494486539792&#45;&gt;140495929010312</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M614.312,-247.391C614.59,-238.866 615.004,-226.139 615.352,-215.423\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"618.856,-215.353 615.683,-205.245 611.86,-215.126 618.856,-215.353\"/>\n",
"</g>\n",
"<!-- 140494486539904 -->\n",
"<g id=\"node10\" class=\"node\"><title>140494486539904</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"666,-332 562,-332 562,-311 666,-311 666,-332\"/>\n",
"<text text-anchor=\"middle\" x=\"614\" y=\"-318.4\" font-family=\"Times,serif\" font-size=\"12.00\">AddmmBackward</text>\n",
"</g>\n",
"<!-- 140494486539904&#45;&gt;140494486539792 -->\n",
"<g id=\"edge9\" class=\"edge\"><title>140494486539904&#45;&gt;140494486539792</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M614,-310.891C614,-302.366 614,-289.639 614,-278.923\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"617.5,-278.745 614,-268.745 610.5,-278.745 617.5,-278.745\"/>\n",
"</g>\n",
"<!-- 140494486540016 -->\n",
"<g id=\"node11\" class=\"node\"><title>140494486540016</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"543,-389 441,-389 441,-368 543,-368 543,-389\"/>\n",
"<text text-anchor=\"middle\" x=\"492\" y=\"-375.4\" font-family=\"Times,serif\" font-size=\"12.00\">ExpandBackward</text>\n",
"</g>\n",
"<!-- 140494486540016&#45;&gt;140494486539904 -->\n",
"<g id=\"edge10\" class=\"edge\"><title>140494486540016&#45;&gt;140494486539904</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M513.251,-367.92C532.638,-359.18 561.512,-346.163 583.386,-336.301\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"584.905,-339.456 592.583,-332.155 582.029,-333.074 584.905,-339.456\"/>\n",
"</g>\n",
"<!-- 140494486540184 -->\n",
"<g id=\"node12\" class=\"node\"><title>140494486540184</title>\n",
"<polygon fill=\"lightblue\" stroke=\"black\" points=\"536.5,-459 447.5,-459 447.5,-425 536.5,-425 536.5,-459\"/>\n",
"<text text-anchor=\"middle\" x=\"492\" y=\"-445.4\" font-family=\"Times,serif\" font-size=\"12.00\">classifier.1.bias</text>\n",
"<text text-anchor=\"middle\" x=\"492\" y=\"-432.4\" font-family=\"Times,serif\" font-size=\"12.00\"> (4096)</text>\n",
"</g>\n",
"<!-- 140494486540184&#45;&gt;140494486540016 -->\n",
"<g id=\"edge11\" class=\"edge\"><title>140494486540184&#45;&gt;140494486540016</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M492,-424.842C492,-417.012 492,-407.54 492,-399.282\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"495.5,-399.042 492,-389.042 488.5,-399.042 495.5,-399.042\"/>\n",
"</g>\n",
"<!-- 140495929009960 -->\n",
"<g id=\"node13\" class=\"node\"><title>140495929009960</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"666.5,-389 561.5,-389 561.5,-368 666.5,-368 666.5,-389\"/>\n",
"<text text-anchor=\"middle\" x=\"614\" y=\"-375.4\" font-family=\"Times,serif\" font-size=\"12.00\">DropoutBackward</text>\n",
"</g>\n",
"<!-- 140495929009960&#45;&gt;140494486539904 -->\n",
"<g id=\"edge12\" class=\"edge\"><title>140495929009960&#45;&gt;140494486539904</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M614,-367.92C614,-360.908 614,-351.144 614,-342.465\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"617.5,-342.341 614,-332.341 610.5,-342.341 617.5,-342.341\"/>\n",
"</g>\n",
"<!-- 140494486540240 -->\n",
"<g id=\"node14\" class=\"node\"><title>140494486540240</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"658,-452.5 566,-452.5 566,-431.5 658,-431.5 658,-452.5\"/>\n",
"<text text-anchor=\"middle\" x=\"612\" y=\"-438.9\" font-family=\"Times,serif\" font-size=\"12.00\">ViewBackward</text>\n",
"</g>\n",
"<!-- 140494486540240&#45;&gt;140495929009960 -->\n",
"<g id=\"edge13\" class=\"edge\"><title>140494486540240&#45;&gt;140495929009960</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M612.312,-431.391C612.59,-422.866 613.004,-410.139 613.352,-399.423\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"616.856,-399.353 613.683,-389.245 609.86,-399.126 616.856,-399.353\"/>\n",
"</g>\n",
"<!-- 140494486610048 -->\n",
"<g id=\"node15\" class=\"node\"><title>140494486610048</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"674,-516 550,-516 550,-495 674,-495 674,-516\"/>\n",
"<text text-anchor=\"middle\" x=\"612\" y=\"-502.4\" font-family=\"Times,serif\" font-size=\"12.00\">MaxPool2DBackward</text>\n",
"</g>\n",
"<!-- 140494486610048&#45;&gt;140494486540240 -->\n",
"<g id=\"edge14\" class=\"edge\"><title>140494486610048&#45;&gt;140494486540240</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M612,-494.891C612,-486.366 612,-473.639 612,-462.923\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"615.5,-462.745 612,-452.745 608.5,-462.745 615.5,-462.745\"/>\n",
"</g>\n",
"<!-- 140494486610160 -->\n",
"<g id=\"node16\" class=\"node\"><title>140494486610160</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"668.5,-573 555.5,-573 555.5,-552 668.5,-552 668.5,-573\"/>\n",
"<text text-anchor=\"middle\" x=\"612\" y=\"-559.4\" font-family=\"Times,serif\" font-size=\"12.00\">ThresholdBackward</text>\n",
"</g>\n",
"<!-- 140494486610160&#45;&gt;140494486610048 -->\n",
"<g id=\"edge15\" class=\"edge\"><title>140494486610160&#45;&gt;140494486610048</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M612,-551.92C612,-544.908 612,-535.144 612,-526.465\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"615.5,-526.341 612,-516.341 608.5,-526.341 615.5,-526.341\"/>\n",
"</g>\n",
"<!-- 140494486610272 -->\n",
"<g id=\"node17\" class=\"node\"><title>140494486610272</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"665.5,-630 558.5,-630 558.5,-609 665.5,-609 665.5,-630\"/>\n",
"<text text-anchor=\"middle\" x=\"612\" y=\"-616.4\" font-family=\"Times,serif\" font-size=\"12.00\">ConvNdBackward</text>\n",
"</g>\n",
"<!-- 140494486610272&#45;&gt;140494486610160 -->\n",
"<g id=\"edge16\" class=\"edge\"><title>140494486610272&#45;&gt;140494486610160</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M612,-608.92C612,-601.908 612,-592.144 612,-583.465\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"615.5,-583.341 612,-573.341 608.5,-583.341 615.5,-583.341\"/>\n",
"</g>\n",
"<!-- 140494486610384 -->\n",
"<g id=\"node18\" class=\"node\"><title>140494486610384</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"541.5,-693.5 428.5,-693.5 428.5,-672.5 541.5,-672.5 541.5,-693.5\"/>\n",
"<text text-anchor=\"middle\" x=\"485\" y=\"-679.9\" font-family=\"Times,serif\" font-size=\"12.00\">ThresholdBackward</text>\n",
"</g>\n",
"<!-- 140494486610384&#45;&gt;140494486610272 -->\n",
"<g id=\"edge17\" class=\"edge\"><title>140494486610384&#45;&gt;140494486610272</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M504.844,-672.391C525.814,-662.236 559.094,-646.12 583.004,-634.542\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"584.821,-637.55 592.296,-630.042 581.77,-631.25 584.821,-637.55\"/>\n",
"</g>\n",
"<!-- 140494486610608 -->\n",
"<g id=\"node19\" class=\"node\"><title>140494486610608</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"538.5,-757 431.5,-757 431.5,-736 538.5,-736 538.5,-757\"/>\n",
"<text text-anchor=\"middle\" x=\"485\" y=\"-743.4\" font-family=\"Times,serif\" font-size=\"12.00\">ConvNdBackward</text>\n",
"</g>\n",
"<!-- 140494486610608&#45;&gt;140494486610384 -->\n",
"<g id=\"edge18\" class=\"edge\"><title>140494486610608&#45;&gt;140494486610384</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M485,-735.891C485,-727.366 485,-714.639 485,-703.923\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"488.5,-703.745 485,-693.745 481.5,-703.745 488.5,-703.745\"/>\n",
"</g>\n",
"<!-- 140494486610720 -->\n",
"<g id=\"node20\" class=\"node\"><title>140494486610720</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"417.5,-820.5 304.5,-820.5 304.5,-799.5 417.5,-799.5 417.5,-820.5\"/>\n",
"<text text-anchor=\"middle\" x=\"361\" y=\"-806.9\" font-family=\"Times,serif\" font-size=\"12.00\">ThresholdBackward</text>\n",
"</g>\n",
"<!-- 140494486610720&#45;&gt;140494486610608 -->\n",
"<g id=\"edge19\" class=\"edge\"><title>140494486610720&#45;&gt;140494486610608</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M380.375,-799.391C400.849,-789.236 433.344,-773.12 456.689,-761.542\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"458.358,-764.621 465.761,-757.042 455.247,-758.35 458.358,-764.621\"/>\n",
"</g>\n",
"<!-- 140494486610944 -->\n",
"<g id=\"node21\" class=\"node\"><title>140494486610944</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"414.5,-884 307.5,-884 307.5,-863 414.5,-863 414.5,-884\"/>\n",
"<text text-anchor=\"middle\" x=\"361\" y=\"-870.4\" font-family=\"Times,serif\" font-size=\"12.00\">ConvNdBackward</text>\n",
"</g>\n",
"<!-- 140494486610944&#45;&gt;140494486610720 -->\n",
"<g id=\"edge20\" class=\"edge\"><title>140494486610944&#45;&gt;140494486610720</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M361,-862.891C361,-854.366 361,-841.639 361,-830.923\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"364.5,-830.745 361,-820.745 357.5,-830.745 364.5,-830.745\"/>\n",
"</g>\n",
"<!-- 140494486611056 -->\n",
"<g id=\"node22\" class=\"node\"><title>140494486611056</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"294,-947.5 170,-947.5 170,-926.5 294,-926.5 294,-947.5\"/>\n",
"<text text-anchor=\"middle\" x=\"232\" y=\"-933.9\" font-family=\"Times,serif\" font-size=\"12.00\">MaxPool2DBackward</text>\n",
"</g>\n",
"<!-- 140494486611056&#45;&gt;140494486610944 -->\n",
"<g id=\"edge21\" class=\"edge\"><title>140494486611056&#45;&gt;140494486610944</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M252.156,-926.391C273.551,-916.191 307.562,-899.976 331.87,-888.387\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"333.465,-891.505 340.985,-884.042 330.452,-885.186 333.465,-891.505\"/>\n",
"</g>\n",
"<!-- 140494486611280 -->\n",
"<g id=\"node23\" class=\"node\"><title>140494486611280</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"288.5,-1011 175.5,-1011 175.5,-990 288.5,-990 288.5,-1011\"/>\n",
"<text text-anchor=\"middle\" x=\"232\" y=\"-997.4\" font-family=\"Times,serif\" font-size=\"12.00\">ThresholdBackward</text>\n",
"</g>\n",
"<!-- 140494486611280&#45;&gt;140494486611056 -->\n",
"<g id=\"edge22\" class=\"edge\"><title>140494486611280&#45;&gt;140494486611056</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M232,-989.891C232,-981.366 232,-968.639 232,-957.923\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"235.5,-957.745 232,-947.745 228.5,-957.745 235.5,-957.745\"/>\n",
"</g>\n",
"<!-- 140494486611392 -->\n",
"<g id=\"node24\" class=\"node\"><title>140494486611392</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"285.5,-1068 178.5,-1068 178.5,-1047 285.5,-1047 285.5,-1068\"/>\n",
"<text text-anchor=\"middle\" x=\"232\" y=\"-1054.4\" font-family=\"Times,serif\" font-size=\"12.00\">ConvNdBackward</text>\n",
"</g>\n",
"<!-- 140494486611392&#45;&gt;140494486611280 -->\n",
"<g id=\"edge23\" class=\"edge\"><title>140494486611392&#45;&gt;140494486611280</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M232,-1046.92C232,-1039.91 232,-1030.14 232,-1021.47\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"235.5,-1021.34 232,-1011.34 228.5,-1021.34 235.5,-1021.34\"/>\n",
"</g>\n",
"<!-- 140494486611504 -->\n",
"<g id=\"node25\" class=\"node\"><title>140494486611504</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"165,-1131.5 41,-1131.5 41,-1110.5 165,-1110.5 165,-1131.5\"/>\n",
"<text text-anchor=\"middle\" x=\"103\" y=\"-1117.9\" font-family=\"Times,serif\" font-size=\"12.00\">MaxPool2DBackward</text>\n",
"</g>\n",
"<!-- 140494486611504&#45;&gt;140494486611392 -->\n",
"<g id=\"edge24\" class=\"edge\"><title>140494486611504&#45;&gt;140494486611392</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M123.156,-1110.39C144.551,-1100.19 178.562,-1083.98 202.87,-1072.39\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"204.465,-1075.5 211.985,-1068.04 201.452,-1069.19 204.465,-1075.5\"/>\n",
"</g>\n",
"<!-- 140494486611728 -->\n",
"<g id=\"node26\" class=\"node\"><title>140494486611728</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"159.5,-1195 46.5,-1195 46.5,-1174 159.5,-1174 159.5,-1195\"/>\n",
"<text text-anchor=\"middle\" x=\"103\" y=\"-1181.4\" font-family=\"Times,serif\" font-size=\"12.00\">ThresholdBackward</text>\n",
"</g>\n",
"<!-- 140494486611728&#45;&gt;140494486611504 -->\n",
"<g id=\"edge25\" class=\"edge\"><title>140494486611728&#45;&gt;140494486611504</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M103,-1173.89C103,-1165.37 103,-1152.64 103,-1141.92\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"106.5,-1141.74 103,-1131.74 99.5001,-1141.74 106.5,-1141.74\"/>\n",
"</g>\n",
"<!-- 140494486611840 -->\n",
"<g id=\"node27\" class=\"node\"><title>140494486611840</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"156.5,-1252 49.5,-1252 49.5,-1231 156.5,-1231 156.5,-1252\"/>\n",
"<text text-anchor=\"middle\" x=\"103\" y=\"-1238.4\" font-family=\"Times,serif\" font-size=\"12.00\">ConvNdBackward</text>\n",
"</g>\n",
"<!-- 140494486611840&#45;&gt;140494486611728 -->\n",
"<g id=\"edge26\" class=\"edge\"><title>140494486611840&#45;&gt;140494486611728</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M103,-1230.92C103,-1223.91 103,-1214.14 103,-1205.47\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"106.5,-1205.34 103,-1195.34 99.5001,-1205.34 106.5,-1205.34\"/>\n",
"</g>\n",
"<!-- 140494486611952 -->\n",
"<g id=\"node28\" class=\"node\"><title>140494486611952</title>\n",
"<polygon fill=\"lightblue\" stroke=\"black\" points=\"98,-1322 0,-1322 0,-1288 98,-1288 98,-1322\"/>\n",
"<text text-anchor=\"middle\" x=\"49\" y=\"-1308.4\" font-family=\"Times,serif\" font-size=\"12.00\">features.0.weight</text>\n",
"<text text-anchor=\"middle\" x=\"49\" y=\"-1295.4\" font-family=\"Times,serif\" font-size=\"12.00\"> (64, 3, 11, 11)</text>\n",
"</g>\n",
"<!-- 140494486611952&#45;&gt;140494486611840 -->\n",
"<g id=\"edge27\" class=\"edge\"><title>140494486611952&#45;&gt;140494486611840</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M63.1879,-1287.84C70.7656,-1279.21 80.0962,-1268.58 87.8193,-1259.79\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"90.6538,-1261.87 94.6217,-1252.04 85.3937,-1257.25 90.6538,-1261.87\"/>\n",
"</g>\n",
"<!-- 140494486612008 -->\n",
"<g id=\"node29\" class=\"node\"><title>140494486612008</title>\n",
"<polygon fill=\"lightblue\" stroke=\"black\" points=\"200,-1322 116,-1322 116,-1288 200,-1288 200,-1322\"/>\n",
"<text text-anchor=\"middle\" x=\"158\" y=\"-1308.4\" font-family=\"Times,serif\" font-size=\"12.00\">features.0.bias</text>\n",
"<text text-anchor=\"middle\" x=\"158\" y=\"-1295.4\" font-family=\"Times,serif\" font-size=\"12.00\"> (64)</text>\n",
"</g>\n",
"<!-- 140494486612008&#45;&gt;140494486611840 -->\n",
"<g id=\"edge28\" class=\"edge\"><title>140494486612008&#45;&gt;140494486611840</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M143.549,-1287.84C135.752,-1279.12 126.132,-1268.37 118.219,-1259.52\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"120.809,-1257.16 111.533,-1252.04 115.591,-1261.83 120.809,-1257.16\"/>\n",
"</g>\n",
"<!-- 140494486611560 -->\n",
"<g id=\"node30\" class=\"node\"><title>140494486611560</title>\n",
"<polygon fill=\"lightblue\" stroke=\"black\" points=\"281,-1138 183,-1138 183,-1104 281,-1104 281,-1138\"/>\n",
"<text text-anchor=\"middle\" x=\"232\" y=\"-1124.4\" font-family=\"Times,serif\" font-size=\"12.00\">features.3.weight</text>\n",
"<text text-anchor=\"middle\" x=\"232\" y=\"-1111.4\" font-family=\"Times,serif\" font-size=\"12.00\"> (192, 64, 5, 5)</text>\n",
"</g>\n",
"<!-- 140494486611560&#45;&gt;140494486611392 -->\n",
"<g id=\"edge29\" class=\"edge\"><title>140494486611560&#45;&gt;140494486611392</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M232,-1103.84C232,-1096.01 232,-1086.54 232,-1078.28\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"235.5,-1078.04 232,-1068.04 228.5,-1078.04 235.5,-1078.04\"/>\n",
"</g>\n",
"<!-- 140494486611616 -->\n",
"<g id=\"node31\" class=\"node\"><title>140494486611616</title>\n",
"<polygon fill=\"lightblue\" stroke=\"black\" points=\"383,-1138 299,-1138 299,-1104 383,-1104 383,-1138\"/>\n",
"<text text-anchor=\"middle\" x=\"341\" y=\"-1124.4\" font-family=\"Times,serif\" font-size=\"12.00\">features.3.bias</text>\n",
"<text text-anchor=\"middle\" x=\"341\" y=\"-1111.4\" font-family=\"Times,serif\" font-size=\"12.00\"> (192)</text>\n",
"</g>\n",
"<!-- 140494486611616&#45;&gt;140494486611392 -->\n",
"<g id=\"edge30\" class=\"edge\"><title>140494486611616&#45;&gt;140494486611392</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M312.362,-1103.84C295.489,-1094.32 274.311,-1082.37 257.932,-1073.13\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"259.341,-1069.91 248.912,-1068.04 255.901,-1076 259.341,-1069.91\"/>\n",
"</g>\n",
"<!-- 140494486611112 -->\n",
"<g id=\"node32\" class=\"node\"><title>140494486611112</title>\n",
"<polygon fill=\"lightblue\" stroke=\"black\" points=\"410,-954 312,-954 312,-920 410,-920 410,-954\"/>\n",
"<text text-anchor=\"middle\" x=\"361\" y=\"-940.4\" font-family=\"Times,serif\" font-size=\"12.00\">features.6.weight</text>\n",
"<text text-anchor=\"middle\" x=\"361\" y=\"-927.4\" font-family=\"Times,serif\" font-size=\"12.00\"> (384, 192, 3, 3)</text>\n",
"</g>\n",
"<!-- 140494486611112&#45;&gt;140494486610944 -->\n",
"<g id=\"edge31\" class=\"edge\"><title>140494486611112&#45;&gt;140494486610944</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M361,-919.842C361,-912.012 361,-902.54 361,-894.282\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"364.5,-894.042 361,-884.042 357.5,-894.042 364.5,-894.042\"/>\n",
"</g>\n",
"<!-- 140494486611168 -->\n",
"<g id=\"node33\" class=\"node\"><title>140494486611168</title>\n",
"<polygon fill=\"lightblue\" stroke=\"black\" points=\"512,-954 428,-954 428,-920 512,-920 512,-954\"/>\n",
"<text text-anchor=\"middle\" x=\"470\" y=\"-940.4\" font-family=\"Times,serif\" font-size=\"12.00\">features.6.bias</text>\n",
"<text text-anchor=\"middle\" x=\"470\" y=\"-927.4\" font-family=\"Times,serif\" font-size=\"12.00\"> (384)</text>\n",
"</g>\n",
"<!-- 140494486611168&#45;&gt;140494486610944 -->\n",
"<g id=\"edge32\" class=\"edge\"><title>140494486611168&#45;&gt;140494486610944</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M441.362,-919.842C424.489,-910.322 403.311,-898.373 386.932,-889.131\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"388.341,-885.908 377.912,-884.042 384.901,-892.004 388.341,-885.908\"/>\n",
"</g>\n",
"<!-- 140494486610776 -->\n",
"<g id=\"node34\" class=\"node\"><title>140494486610776</title>\n",
"<polygon fill=\"lightblue\" stroke=\"black\" points=\"534,-827 436,-827 436,-793 534,-793 534,-827\"/>\n",
"<text text-anchor=\"middle\" x=\"485\" y=\"-813.4\" font-family=\"Times,serif\" font-size=\"12.00\">features.8.weight</text>\n",
"<text text-anchor=\"middle\" x=\"485\" y=\"-800.4\" font-family=\"Times,serif\" font-size=\"12.00\"> (256, 384, 3, 3)</text>\n",
"</g>\n",
"<!-- 140494486610776&#45;&gt;140494486610608 -->\n",
"<g id=\"edge33\" class=\"edge\"><title>140494486610776&#45;&gt;140494486610608</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M485,-792.842C485,-785.012 485,-775.54 485,-767.282\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"488.5,-767.042 485,-757.042 481.5,-767.042 488.5,-767.042\"/>\n",
"</g>\n",
"<!-- 140494486610832 -->\n",
"<g id=\"node35\" class=\"node\"><title>140494486610832</title>\n",
"<polygon fill=\"lightblue\" stroke=\"black\" points=\"636,-827 552,-827 552,-793 636,-793 636,-827\"/>\n",
"<text text-anchor=\"middle\" x=\"594\" y=\"-813.4\" font-family=\"Times,serif\" font-size=\"12.00\">features.8.bias</text>\n",
"<text text-anchor=\"middle\" x=\"594\" y=\"-800.4\" font-family=\"Times,serif\" font-size=\"12.00\"> (256)</text>\n",
"</g>\n",
"<!-- 140494486610832&#45;&gt;140494486610608 -->\n",
"<g id=\"edge34\" class=\"edge\"><title>140494486610832&#45;&gt;140494486610608</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M565.362,-792.842C548.489,-783.322 527.311,-771.373 510.932,-762.131\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"512.341,-758.908 501.912,-757.042 508.901,-765.004 512.341,-758.908\"/>\n",
"</g>\n",
"<!-- 140494486610440 -->\n",
"<g id=\"node36\" class=\"node\"><title>140494486610440</title>\n",
"<polygon fill=\"lightblue\" stroke=\"black\" points=\"664,-700 560,-700 560,-666 664,-666 664,-700\"/>\n",
"<text text-anchor=\"middle\" x=\"612\" y=\"-686.4\" font-family=\"Times,serif\" font-size=\"12.00\">features.10.weight</text>\n",
"<text text-anchor=\"middle\" x=\"612\" y=\"-673.4\" font-family=\"Times,serif\" font-size=\"12.00\"> (256, 256, 3, 3)</text>\n",
"</g>\n",
"<!-- 140494486610440&#45;&gt;140494486610272 -->\n",
"<g id=\"edge35\" class=\"edge\"><title>140494486610440&#45;&gt;140494486610272</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M612,-665.842C612,-658.012 612,-648.54 612,-640.282\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"615.5,-640.042 612,-630.042 608.5,-640.042 615.5,-640.042\"/>\n",
"</g>\n",
"<!-- 140494486610496 -->\n",
"<g id=\"node37\" class=\"node\"><title>140494486610496</title>\n",
"<polygon fill=\"lightblue\" stroke=\"black\" points=\"772,-700 682,-700 682,-666 772,-666 772,-700\"/>\n",
"<text text-anchor=\"middle\" x=\"727\" y=\"-686.4\" font-family=\"Times,serif\" font-size=\"12.00\">features.10.bias</text>\n",
"<text text-anchor=\"middle\" x=\"727\" y=\"-673.4\" font-family=\"Times,serif\" font-size=\"12.00\"> (256)</text>\n",
"</g>\n",
"<!-- 140494486610496&#45;&gt;140494486610272 -->\n",
"<g id=\"edge36\" class=\"edge\"><title>140494486610496&#45;&gt;140494486610272</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M696.785,-665.842C678.817,-656.233 656.222,-644.149 638.876,-634.873\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"640.311,-631.671 629.843,-630.042 637.01,-637.844 640.311,-631.671\"/>\n",
"</g>\n",
"<!-- 140494486540072 -->\n",
"<g id=\"node38\" class=\"node\"><title>140494486540072</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"761.5,-389 688.5,-389 688.5,-368 761.5,-368 761.5,-389\"/>\n",
"<text text-anchor=\"middle\" x=\"725\" y=\"-375.4\" font-family=\"Times,serif\" font-size=\"12.00\">TBackward</text>\n",
"</g>\n",
"<!-- 140494486540072&#45;&gt;140494486539904 -->\n",
"<g id=\"edge37\" class=\"edge\"><title>140494486540072&#45;&gt;140494486539904</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M705.665,-367.92C688.264,-359.297 662.461,-346.512 642.66,-336.701\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"644,-333.459 633.486,-332.155 640.892,-339.731 644,-333.459\"/>\n",
"</g>\n",
"<!-- 140494486609992 -->\n",
"<g id=\"node39\" class=\"node\"><title>140494486609992</title>\n",
"<polygon fill=\"lightblue\" stroke=\"black\" points=\"778,-459 676,-459 676,-425 778,-425 778,-459\"/>\n",
"<text text-anchor=\"middle\" x=\"727\" y=\"-445.4\" font-family=\"Times,serif\" font-size=\"12.00\">classifier.1.weight</text>\n",
"<text text-anchor=\"middle\" x=\"727\" y=\"-432.4\" font-family=\"Times,serif\" font-size=\"12.00\"> (4096, 9216)</text>\n",
"</g>\n",
"<!-- 140494486609992&#45;&gt;140494486540072 -->\n",
"<g id=\"edge38\" class=\"edge\"><title>140494486609992&#45;&gt;140494486540072</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M726.475,-424.842C726.22,-417.012 725.912,-407.54 725.643,-399.282\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"729.134,-398.923 725.31,-389.042 722.137,-399.15 729.134,-398.923\"/>\n",
"</g>\n",
"<!-- 140494486539624 -->\n",
"<g id=\"node40\" class=\"node\"><title>140494486539624</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"767.5,-205 694.5,-205 694.5,-184 767.5,-184 767.5,-205\"/>\n",
"<text text-anchor=\"middle\" x=\"731\" y=\"-191.4\" font-family=\"Times,serif\" font-size=\"12.00\">TBackward</text>\n",
"</g>\n",
"<!-- 140494486539624&#45;&gt;140494486539456 -->\n",
"<g id=\"edge39\" class=\"edge\"><title>140494486539624&#45;&gt;140494486539456</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M713.031,-183.891C694.212,-173.826 664.441,-157.906 642.836,-146.351\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"644.311,-143.171 633.843,-141.542 641.01,-149.344 644.311,-143.171\"/>\n",
"</g>\n",
"<!-- 140494486539848 -->\n",
"<g id=\"node41\" class=\"node\"><title>140494486539848</title>\n",
"<polygon fill=\"lightblue\" stroke=\"black\" points=\"791,-275 689,-275 689,-241 791,-241 791,-275\"/>\n",
"<text text-anchor=\"middle\" x=\"740\" y=\"-261.4\" font-family=\"Times,serif\" font-size=\"12.00\">classifier.4.weight</text>\n",
"<text text-anchor=\"middle\" x=\"740\" y=\"-248.4\" font-family=\"Times,serif\" font-size=\"12.00\"> (4096, 4096)</text>\n",
"</g>\n",
"<!-- 140494486539848&#45;&gt;140494486539624 -->\n",
"<g id=\"edge40\" class=\"edge\"><title>140494486539848&#45;&gt;140494486539624</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M737.635,-240.842C736.477,-232.923 735.072,-223.324 733.854,-215.001\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"737.308,-214.43 732.396,-205.042 730.381,-215.443 737.308,-214.43\"/>\n",
"</g>\n",
"<!-- 140494486539288 -->\n",
"<g id=\"node42\" class=\"node\"><title>140494486539288</title>\n",
"<polygon fill=\"lightgrey\" stroke=\"black\" points=\"768.5,-78 695.5,-78 695.5,-57 768.5,-57 768.5,-78\"/>\n",
"<text text-anchor=\"middle\" x=\"732\" y=\"-64.4\" font-family=\"Times,serif\" font-size=\"12.00\">TBackward</text>\n",
"</g>\n",
"<!-- 140494486539288&#45;&gt;140494486538616 -->\n",
"<g id=\"edge41\" class=\"edge\"><title>140494486539288&#45;&gt;140494486538616</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M712.317,-56.9197C694.521,-48.2581 668.095,-35.3957 647.902,-25.5675\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"649.36,-22.3844 638.837,-21.155 646.296,-28.6785 649.36,-22.3844\"/>\n",
"</g>\n",
"<!-- 140494486539512 -->\n",
"<g id=\"node43\" class=\"node\"><title>140494486539512</title>\n",
"<polygon fill=\"lightblue\" stroke=\"black\" points=\"788,-148 686,-148 686,-114 788,-114 788,-148\"/>\n",
"<text text-anchor=\"middle\" x=\"737\" y=\"-134.4\" font-family=\"Times,serif\" font-size=\"12.00\">classifier.6.weight</text>\n",
"<text text-anchor=\"middle\" x=\"737\" y=\"-121.4\" font-family=\"Times,serif\" font-size=\"12.00\"> (1000, 4096)</text>\n",
"</g>\n",
"<!-- 140494486539512&#45;&gt;140494486539288 -->\n",
"<g id=\"edge42\" class=\"edge\"><title>140494486539512&#45;&gt;140494486539288</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M735.686,-113.842C735.05,-106.012 734.28,-96.5396 733.608,-88.2816\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"737.075,-87.7254 732.776,-78.0419 730.098,-88.2927 737.075,-87.7254\"/>\n",
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
"<graphviz.dot.Digraph at 0x7fc76bf68b38>"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from graphviz import Digraph\n",
"import torch\n",
"from torch.autograd import Variable\n",
"%matplotlib inline\n",
"\n",
"\n",
"def make_dot(var, params=None):\n",
" \"\"\" Produces Graphviz representation of PyTorch autograd graph\n",
"\n",
" Blue nodes are the Variables that require grad, orange are Tensors\n",
" saved for backward in torch.autograd.Function\n",
"\n",
" Args:\n",
" var: output Variable\n",
" params: dict of (name, Variable) to add names to node that\n",
" require grad (TODO: make optional)\n",
" \"\"\"\n",
" if params is not None:\n",
" #assert all(isinstance(p, Variable) for p in params.values()) \n",
" param_map = {id(v): k for k, v in params.items()}\n",
"\n",
"\n",
" node_attr = dict(style='filled',\n",
" shape='box',\n",
" align='left',\n",
" fontsize='12',\n",
" ranksep='0.1',\n",
" height='0.2')\n",
" dot = Digraph(node_attr=node_attr, graph_attr=dict(size=\"12,12\"))\n",
" seen = set()\n",
"\n",
" def size_to_str(size):\n",
" return '('+(', ').join(['%d' % v for v in size])+')'\n",
"\n",
" def add_nodes(var):\n",
" if var not in seen:\n",
" if torch.is_tensor(var):\n",
" dot.node(str(id(var)), size_to_str(var.size()), fillcolor='orange')\n",
" elif hasattr(var, 'variable'):\n",
" u = var.variable\n",
" #name = param_map[id(u)] if params is not None else ''\n",
" #node_name = '%s\\n %s' % (name, size_to_str(u.size()))\n",
" node_name = '%s\\n %s' % (param_map.get(id(u.data)), size_to_str(u.size()))\n",
" dot.node(str(id(var)), node_name, fillcolor='lightblue')\n",
" \n",
" else:\n",
" dot.node(str(id(var)), str(type(var).__name__))\n",
" seen.add(var)\n",
" if hasattr(var, 'next_functions'):\n",
" for u in var.next_functions:\n",
" if u[0] is not None:\n",
" dot.edge(str(id(u[0])), str(id(var)))\n",
" add_nodes(u[0])\n",
" if hasattr(var, 'saved_tensors'):\n",
" for t in var.saved_tensors:\n",
" dot.edge(str(id(t)), str(id(var)))\n",
" add_nodes(t)\n",
" add_nodes(var.grad_fn)\n",
" return dot\n",
"\n",
"\n",
"from torchvision import models\n",
"\n",
"torch.manual_seed(1)\n",
"inputs = torch.randn(1,3,224,224)\n",
"model = models.alexnet(pretrained=False)\n",
"y = model(Variable(inputs))\n",
"#print(y)\n",
"\n",
"\n",
"g = make_dot(y, params=model.state_dict())\n",
"#g.view()\n",
"g\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [conda env:anaconda3]",
"language": "python",
"name": "conda-env-anaconda3-py"
},
"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
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment