Gen TANG 1 anno fa
parent
commit
34c2bdaf9e
1 ha cambiato i file con 744 aggiunte e 0 eliminazioni
  1. 744 0
      video/autograd_part_two.ipynb

+ 744 - 0
video/autograd_part_two.ipynb

@@ -0,0 +1,744 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import sys\n",
+    "import os\n",
+    "sys.path.append(os.path.abspath(os.path.join('../ch07_autograd')))\n",
+    "from utils import Scalar, draw_graph\n",
+    "from linear_model import Linear, mse"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<torch._C.Generator at 0x7fd5a87a86d0>"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "import torch\n",
+    "\n",
+    "torch.manual_seed(1024)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "x = torch.linspace(100, 300, 200)\n",
+    "x = (x - torch.mean(x)) / torch.std(x)\n",
+    "epsilon = torch.randn(x.shape)\n",
+    "y = 10 * x + 5 + epsilon"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "y = 3.12 * x + -1.99\n",
+      "y = 3.48 * x + -2.28\n",
+      "y = 3.22 * x + -1.97\n",
+      "y = 2.85 * x + -1.22\n",
+      "y = 2.68 * x + -0.23\n",
+      "y = 2.92 * x + 1.08\n",
+      "y = 3.74 * x + 2.61\n",
+      "y = 5.07 * x + 4.15\n",
+      "y = 6.73 * x + 5.52\n",
+      "y = 8.22 * x + 6.48\n",
+      "y = 9.36 * x + 5.75\n",
+      "y = 9.75 * x + 5.42\n",
+      "y = 9.88 * x + 5.28\n",
+      "y = 9.89 * x + 5.26\n",
+      "y = 9.89 * x + 5.20\n",
+      "y = 9.88 * x + 5.18\n",
+      "y = 9.88 * x + 5.17\n",
+      "y = 9.84 * x + 5.14\n",
+      "y = 9.86 * x + 5.15\n",
+      "y = 9.94 * x + 5.21\n"
+     ]
+    }
+   ],
+   "source": [
+    "model = Linear()\n",
+    "\n",
+    "batch_size = 20\n",
+    "learning_rate = 0.1\n",
+    "\n",
+    "for t in range(20):\n",
+    "    ix = (t * batch_size) % len(x)\n",
+    "    xx = x[ix: ix + batch_size]\n",
+    "    yy = y[ix: ix + batch_size]\n",
+    "    loss = mse([model.error(_x, _y) for _x, _y in zip(xx, yy)])\n",
+    "    loss.backward()\n",
+    "    model.a -= learning_rate * model.a.grad\n",
+    "    model.b -= learning_rate * model.b.grad\n",
+    "    model.a.grad = 0.0\n",
+    "    model.b.grad = 0.0\n",
+    "    print(model.string())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "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=\"357pt\" height=\"517pt\"\n",
+       " viewBox=\"0.00 0.00 356.79 516.80\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
+       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 512.797)\">\n",
+       "<title>%3</title>\n",
+       "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-512.797 352.792,-512.797 352.792,4 -4,4\"/>\n",
+       "<!-- 140555659725312backward -->\n",
+       "<g id=\"node1\" class=\"node\"><title>140555659725312backward</title>\n",
+       "<polygon fill=\"lightgreen\" stroke=\"black\" stroke-width=\"2\" points=\"96,-0.5 96,-59.4219 172.205,-59.4219 172.205,-0.5 96,-0.5\"/>\n",
+       "<text text-anchor=\"middle\" x=\"134.103\" y=\"-47.4219\" font-family=\"Menlo\" font-size=\"10.00\">grad=&#45;9.50</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" stroke-width=\"2\" points=\"96,-39.7812 172.205,-39.7812 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"134.103\" y=\"-27.7812\" font-family=\"Menlo\" font-size=\"10.00\">value=0.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" stroke-width=\"2\" points=\"96,-20.1406 172.205,-20.1406 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"134.103\" y=\"-8.14062\" font-family=\"Menlo\" font-size=\"10.00\">a</text>\n",
+       "</g>\n",
+       "<!-- 140555659723296backward -->\n",
+       "<g id=\"node2\" class=\"node\"><title>140555659723296backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M197,-224.938C197,-224.938 249.205,-224.938 249.205,-224.938 255.205,-224.938 261.205,-230.938 261.205,-236.938 261.205,-236.938 261.205,-271.859 261.205,-271.859 261.205,-277.859 255.205,-283.859 249.205,-283.859 249.205,-283.859 197,-283.859 197,-283.859 191,-283.859 185,-277.859 185,-271.859 185,-271.859 185,-236.938 185,-236.938 185,-230.938 191,-224.938 197,-224.938\"/>\n",
+       "<text text-anchor=\"middle\" x=\"223.103\" y=\"-271.859\" font-family=\"Menlo\" font-size=\"10.00\">grad=&#45;1.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"185,-264.219 261.205,-264.219 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"223.103\" y=\"-252.219\" font-family=\"Menlo\" font-size=\"10.00\">value=0.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"185,-244.578 261.205,-244.578 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"223.103\" y=\"-232.578\" font-family=\"Menlo\" font-size=\"10.00\">+</text>\n",
+       "</g>\n",
+       "<!-- 140555659723392backward -->\n",
+       "<g id=\"node5\" class=\"node\"><title>140555659723392backward</title>\n",
+       "<polygon fill=\"lightgreen\" stroke=\"black\" stroke-width=\"2\" points=\"96,-112.719 96,-171.641 172.205,-171.641 172.205,-112.719 96,-112.719\"/>\n",
+       "<text text-anchor=\"middle\" x=\"134.103\" y=\"-159.641\" font-family=\"Menlo\" font-size=\"10.00\">grad=&#45;5.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" stroke-width=\"2\" points=\"96,-152 172.205,-152 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"134.103\" y=\"-140\" font-family=\"Menlo\" font-size=\"10.00\">value=0.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" stroke-width=\"2\" points=\"96,-132.359 172.205,-132.359 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"134.103\" y=\"-120.359\" font-family=\"Menlo\" font-size=\"10.00\">b</text>\n",
+       "</g>\n",
+       "<!-- 140555659723296backward&#45;&gt;140555659723392backward -->\n",
+       "<g id=\"edge2\" class=\"edge\"><title>140555659723296backward&#45;&gt;140555659723392backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M195.867,-224.806C190.467,-218.847 184.933,-212.524 179.959,-206.438 173.129,-198.08 166.115,-188.807 159.691,-179.994\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"162.423,-177.799 153.737,-171.731 156.743,-181.891 162.423,-177.799\"/>\n",
+       "<text text-anchor=\"middle\" x=\"201.174\" y=\"-195.238\" font-family=\"Menlo\" font-size=\"14.00\">&#45;1.00</text>\n",
+       "</g>\n",
+       "<!-- 140555659725264backward -->\n",
+       "<g id=\"node12\" class=\"node\"><title>140555659725264backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M203,-112.719C203,-112.719 255.205,-112.719 255.205,-112.719 261.205,-112.719 267.205,-118.719 267.205,-124.719 267.205,-124.719 267.205,-159.641 267.205,-159.641 267.205,-165.641 261.205,-171.641 255.205,-171.641 255.205,-171.641 203,-171.641 203,-171.641 197,-171.641 191,-165.641 191,-159.641 191,-159.641 191,-124.719 191,-124.719 191,-118.719 197,-112.719 203,-112.719\"/>\n",
+       "<text text-anchor=\"middle\" x=\"229.103\" y=\"-159.641\" font-family=\"Menlo\" font-size=\"10.00\">grad=&#45;1.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"191,-152 267.205,-152 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"229.103\" y=\"-140\" font-family=\"Menlo\" font-size=\"10.00\">value=0.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"191,-132.359 267.205,-132.359 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"229.103\" y=\"-120.359\" font-family=\"Menlo\" font-size=\"10.00\">*</text>\n",
+       "</g>\n",
+       "<!-- 140555659723296backward&#45;&gt;140555659725264backward -->\n",
+       "<g id=\"edge7\" class=\"edge\"><title>140555659723296backward&#45;&gt;140555659725264backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M224.663,-224.727C225.372,-211.716 226.22,-196.127 226.985,-182.08\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"230.501,-181.883 227.55,-171.707 223.511,-181.502 230.501,-181.883\"/>\n",
+       "<text text-anchor=\"middle\" x=\"248.174\" y=\"-195.238\" font-family=\"Menlo\" font-size=\"14.00\">&#45;1.00</text>\n",
+       "</g>\n",
+       "<!-- 140555659722816backward -->\n",
+       "<g id=\"node3\" class=\"node\"><title>140555659722816backward</title>\n",
+       "<ellipse fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" cx=\"229.103\" cy=\"-29.9609\" rx=\"34.8795\" ry=\"18\"/>\n",
+       "<text text-anchor=\"middle\" x=\"229.103\" y=\"-27.7812\" font-family=\"Menlo\" font-size=\"10.00\">x1=1.50</text>\n",
+       "</g>\n",
+       "<!-- 140555659725408backward -->\n",
+       "<g id=\"node4\" class=\"node\"><title>140555659725408backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M105,-337.156C105,-337.156 157.205,-337.156 157.205,-337.156 163.205,-337.156 169.205,-343.156 169.205,-349.156 169.205,-349.156 169.205,-384.078 169.205,-384.078 169.205,-390.078 163.205,-396.078 157.205,-396.078 157.205,-396.078 105,-396.078 105,-396.078 99,-396.078 93,-390.078 93,-384.078 93,-384.078 93,-349.156 93,-349.156 93,-343.156 99,-337.156 105,-337.156\"/>\n",
+       "<text text-anchor=\"middle\" x=\"131.103\" y=\"-384.078\" font-family=\"Menlo\" font-size=\"10.00\">grad=4.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"93,-376.438 169.205,-376.438 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"131.103\" y=\"-364.438\" font-family=\"Menlo\" font-size=\"10.00\">value=4.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"93,-356.797 169.205,-356.797 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"131.103\" y=\"-344.797\" font-family=\"Menlo\" font-size=\"10.00\">&#45;</text>\n",
+       "</g>\n",
+       "<!-- 140555659725504backward -->\n",
+       "<g id=\"node8\" class=\"node\"><title>140555659725504backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M15,-224.938C15,-224.938 67.2051,-224.938 67.2051,-224.938 73.2051,-224.938 79.2051,-230.938 79.2051,-236.938 79.2051,-236.938 79.2051,-271.859 79.2051,-271.859 79.2051,-277.859 73.2051,-283.859 67.2051,-283.859 67.2051,-283.859 15,-283.859 15,-283.859 9,-283.859 3,-277.859 3,-271.859 3,-271.859 3,-236.938 3,-236.938 3,-230.938 9,-224.938 15,-224.938\"/>\n",
+       "<text text-anchor=\"middle\" x=\"41.1025\" y=\"-271.859\" font-family=\"Menlo\" font-size=\"10.00\">grad=&#45;4.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"3,-264.219 79.2051,-264.219 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"41.1025\" y=\"-252.219\" font-family=\"Menlo\" font-size=\"10.00\">value=0.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"3,-244.578 79.2051,-244.578 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"41.1025\" y=\"-232.578\" font-family=\"Menlo\" font-size=\"10.00\">+</text>\n",
+       "</g>\n",
+       "<!-- 140555659725408backward&#45;&gt;140555659725504backward -->\n",
+       "<g id=\"edge10\" class=\"edge\"><title>140555659725408backward&#45;&gt;140555659725504backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M102.231,-336.929C96.6677,-331.03 91.0056,-324.755 85.959,-318.656 79.1297,-310.403 72.2123,-301.168 65.9212,-292.361\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"68.7212,-290.258 60.1048,-284.093 62.9959,-294.285 68.7212,-290.258\"/>\n",
+       "<text text-anchor=\"middle\" x=\"107.174\" y=\"-307.456\" font-family=\"Menlo\" font-size=\"14.00\">&#45;4.00</text>\n",
+       "</g>\n",
+       "<!-- 140555659725600backward -->\n",
+       "<g id=\"node10\" class=\"node\"><title>140555659725600backward</title>\n",
+       "<ellipse fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" cx=\"132.103\" cy=\"-254.398\" rx=\"34.8795\" ry=\"18\"/>\n",
+       "<text text-anchor=\"middle\" x=\"132.103\" y=\"-252.219\" font-family=\"Menlo\" font-size=\"10.00\">y2=4.00</text>\n",
+       "</g>\n",
+       "<!-- 140555659725408backward&#45;&gt;140555659725600backward -->\n",
+       "<g id=\"edge12\" class=\"edge\"><title>140555659725408backward&#45;&gt;140555659725600backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" stroke-dasharray=\"5,2\" d=\"M131.363,-336.946C131.548,-316.535 131.791,-289.784 131.947,-272.59\"/>\n",
+       "</g>\n",
+       "<!-- 140555659725456backward -->\n",
+       "<g id=\"node6\" class=\"node\"><title>140555659725456backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M12,-112.719C12,-112.719 64.2051,-112.719 64.2051,-112.719 70.2051,-112.719 76.2051,-118.719 76.2051,-124.719 76.2051,-124.719 76.2051,-159.641 76.2051,-159.641 76.2051,-165.641 70.2051,-171.641 64.2051,-171.641 64.2051,-171.641 12,-171.641 12,-171.641 6,-171.641 0,-165.641 0,-159.641 0,-159.641 0,-124.719 0,-124.719 0,-118.719 6,-112.719 12,-112.719\"/>\n",
+       "<text text-anchor=\"middle\" x=\"38.1025\" y=\"-159.641\" font-family=\"Menlo\" font-size=\"10.00\">grad=&#45;4.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"0,-152 76.2051,-152 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"38.1025\" y=\"-140\" font-family=\"Menlo\" font-size=\"10.00\">value=0.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"0,-132.359 76.2051,-132.359 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"38.1025\" y=\"-120.359\" font-family=\"Menlo\" font-size=\"10.00\">*</text>\n",
+       "</g>\n",
+       "<!-- 140555659725456backward&#45;&gt;140555659725312backward -->\n",
+       "<g id=\"edge11\" class=\"edge\"><title>140555659725456backward&#45;&gt;140555659725312backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M63.0748,-112.509C75.0748,-98.7314 89.5912,-82.065 102.365,-67.3991\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"105.327,-69.3279 109.255,-59.4883 100.048,-64.7303 105.327,-69.3279\"/>\n",
+       "<text text-anchor=\"middle\" x=\"113.174\" y=\"-83.0187\" font-family=\"Menlo\" font-size=\"14.00\">&#45;8.00</text>\n",
+       "</g>\n",
+       "<!-- 140555659722960backward -->\n",
+       "<g id=\"node9\" class=\"node\"><title>140555659722960backward</title>\n",
+       "<ellipse fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" cx=\"38.1025\" cy=\"-29.9609\" rx=\"34.8795\" ry=\"18\"/>\n",
+       "<text text-anchor=\"middle\" x=\"38.1025\" y=\"-27.7812\" font-family=\"Menlo\" font-size=\"10.00\">x2=2.00</text>\n",
+       "</g>\n",
+       "<!-- 140555659725456backward&#45;&gt;140555659722960backward -->\n",
+       "<g id=\"edge3\" class=\"edge\"><title>140555659725456backward&#45;&gt;140555659722960backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" stroke-dasharray=\"5,2\" d=\"M38.1025,-112.509C38.1025,-92.0979 38.1025,-65.346 38.1025,-48.1524\"/>\n",
+       "</g>\n",
+       "<!-- 140555659723440backward -->\n",
+       "<g id=\"node7\" class=\"node\"><title>140555659723440backward</title>\n",
+       "<ellipse fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" cx=\"314.103\" cy=\"-254.398\" rx=\"34.8795\" ry=\"18\"/>\n",
+       "<text text-anchor=\"middle\" x=\"314.103\" y=\"-252.219\" font-family=\"Menlo\" font-size=\"10.00\">y1=1.00</text>\n",
+       "</g>\n",
+       "<!-- 140555659725504backward&#45;&gt;140555659723392backward -->\n",
+       "<g id=\"edge14\" class=\"edge\"><title>140555659725504backward&#45;&gt;140555659723392backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M65.2944,-224.727C76.9194,-210.95 90.9822,-194.284 103.357,-179.618\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"106.258,-181.607 110.032,-171.707 100.908,-177.093 106.258,-181.607\"/>\n",
+       "<text text-anchor=\"middle\" x=\"115.174\" y=\"-195.238\" font-family=\"Menlo\" font-size=\"14.00\">&#45;4.00</text>\n",
+       "</g>\n",
+       "<!-- 140555659725504backward&#45;&gt;140555659725456backward -->\n",
+       "<g id=\"edge9\" class=\"edge\"><title>140555659725504backward&#45;&gt;140555659725456backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M37.4497,-224.63C36.8287,-218.628 36.2809,-212.334 35.959,-206.438 35.5251,-198.491 35.5083,-189.978 35.7072,-181.855\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"39.2055,-181.964 36.0595,-171.847 32.2098,-181.717 39.2055,-181.964\"/>\n",
+       "<text text-anchor=\"middle\" x=\"57.1743\" y=\"-195.238\" font-family=\"Menlo\" font-size=\"14.00\">&#45;4.00</text>\n",
+       "</g>\n",
+       "<!-- 140555659726128backward -->\n",
+       "<g id=\"node11\" class=\"node\"><title>140555659726128backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M156,-449.375C156,-449.375 208.205,-449.375 208.205,-449.375 214.205,-449.375 220.205,-455.375 220.205,-461.375 220.205,-461.375 220.205,-496.297 220.205,-496.297 220.205,-502.297 214.205,-508.297 208.205,-508.297 208.205,-508.297 156,-508.297 156,-508.297 150,-508.297 144,-502.297 144,-496.297 144,-496.297 144,-461.375 144,-461.375 144,-455.375 150,-449.375 156,-449.375\"/>\n",
+       "<text text-anchor=\"middle\" x=\"182.103\" y=\"-496.297\" font-family=\"Menlo\" font-size=\"10.00\">grad=1.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"144,-488.656 220.205,-488.656 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"182.103\" y=\"-476.656\" font-family=\"Menlo\" font-size=\"10.00\">value=8.50</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"144,-469.016 220.205,-469.016 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"182.103\" y=\"-457.016\" font-family=\"Menlo\" font-size=\"10.00\">mse</text>\n",
+       "</g>\n",
+       "<!-- 140555659726128backward&#45;&gt;140555659725408backward -->\n",
+       "<g id=\"edge4\" class=\"edge\"><title>140555659726128backward&#45;&gt;140555659725408backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M168.836,-449.165C162.638,-435.77 155.177,-419.645 148.531,-405.282\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"151.679,-403.75 144.303,-396.145 145.326,-406.69 151.679,-403.75\"/>\n",
+       "<text text-anchor=\"middle\" x=\"176.96\" y=\"-419.675\" font-family=\"Menlo\" font-size=\"14.00\">4.00</text>\n",
+       "</g>\n",
+       "<!-- 140555659725792backward -->\n",
+       "<g id=\"node13\" class=\"node\"><title>140555659725792backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M199,-337.156C199,-337.156 251.205,-337.156 251.205,-337.156 257.205,-337.156 263.205,-343.156 263.205,-349.156 263.205,-349.156 263.205,-384.078 263.205,-384.078 263.205,-390.078 257.205,-396.078 251.205,-396.078 251.205,-396.078 199,-396.078 199,-396.078 193,-396.078 187,-390.078 187,-384.078 187,-384.078 187,-349.156 187,-349.156 187,-343.156 193,-337.156 199,-337.156\"/>\n",
+       "<text text-anchor=\"middle\" x=\"225.103\" y=\"-384.078\" font-family=\"Menlo\" font-size=\"10.00\">grad=1.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"187,-376.438 263.205,-376.438 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"225.103\" y=\"-364.438\" font-family=\"Menlo\" font-size=\"10.00\">value=1.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"187,-356.797 263.205,-356.797 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"225.103\" y=\"-344.797\" font-family=\"Menlo\" font-size=\"10.00\">&#45;</text>\n",
+       "</g>\n",
+       "<!-- 140555659726128backward&#45;&gt;140555659725792backward -->\n",
+       "<g id=\"edge1\" class=\"edge\"><title>140555659726128backward&#45;&gt;140555659725792backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M193.288,-449.165C198.464,-435.898 204.685,-419.952 210.248,-405.693\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"213.599,-406.733 213.973,-396.145 207.078,-404.189 213.599,-406.733\"/>\n",
+       "<text text-anchor=\"middle\" x=\"223.96\" y=\"-419.675\" font-family=\"Menlo\" font-size=\"14.00\">1.00</text>\n",
+       "</g>\n",
+       "<!-- 140555659725264backward&#45;&gt;140555659725312backward -->\n",
+       "<g id=\"edge6\" class=\"edge\"><title>140555659725264backward&#45;&gt;140555659725312backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M199.994,-112.634C194.217,-106.671 188.293,-100.335 182.959,-94.2188 175.627,-85.811 168.083,-76.4458 161.181,-67.5536\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"163.913,-65.3644 155.049,-59.5612 158.36,-69.6255 163.913,-65.3644\"/>\n",
+       "<text text-anchor=\"middle\" x=\"204.174\" y=\"-83.0187\" font-family=\"Menlo\" font-size=\"14.00\">&#45;1.50</text>\n",
+       "</g>\n",
+       "<!-- 140555659725264backward&#45;&gt;140555659722816backward -->\n",
+       "<g id=\"edge13\" class=\"edge\"><title>140555659725264backward&#45;&gt;140555659722816backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" stroke-dasharray=\"5,2\" d=\"M229.103,-112.509C229.103,-92.0979 229.103,-65.346 229.103,-48.1524\"/>\n",
+       "</g>\n",
+       "<!-- 140555659725792backward&#45;&gt;140555659723296backward -->\n",
+       "<g id=\"edge5\" class=\"edge\"><title>140555659725792backward&#45;&gt;140555659723296backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M224.582,-336.946C224.346,-323.934 224.063,-308.345 223.808,-294.299\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"227.301,-293.861 223.62,-283.926 220.302,-293.988 227.301,-293.861\"/>\n",
+       "<text text-anchor=\"middle\" x=\"246.174\" y=\"-307.456\" font-family=\"Menlo\" font-size=\"14.00\">&#45;1.00</text>\n",
+       "</g>\n",
+       "<!-- 140555659725792backward&#45;&gt;140555659723440backward -->\n",
+       "<g id=\"edge8\" class=\"edge\"><title>140555659725792backward&#45;&gt;140555659723440backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" stroke-dasharray=\"5,2\" d=\"M254.651,-337.059C260.309,-331.15 266.042,-324.838 271.103,-318.656 283.468,-303.552 295.811,-284.936 304.08,-271.822\"/>\n",
+       "</g>\n",
+       "</g>\n",
+       "</svg>\n"
+      ],
+      "text/plain": [
+       "<graphviz.graphs.Digraph at 0x7fd5aa2b4e80>"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# 计算图膨胀\n",
+    "model = Linear()\n",
+    "# 定义两组数据\n",
+    "x1 = Scalar(1.5, label='x1', requires_grad=False)\n",
+    "y1 = Scalar(1.0, label='y1', requires_grad=False)\n",
+    "x2 = Scalar(2.0, label='x2', requires_grad=False)\n",
+    "y2 = Scalar(4.0, label='y2', requires_grad=False)\n",
+    "loss = mse([model.error(x1, y1), model.error(x2, y2)])\n",
+    "loss.backward()\n",
+    "draw_graph(loss, 'backward')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "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=\"274pt\" height=\"629pt\"\n",
+       " viewBox=\"0.00 0.00 274.38 629.02\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
+       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 625.016)\">\n",
+       "<title>%3</title>\n",
+       "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-625.016 270.378,-625.016 270.378,4 -4,4\"/>\n",
+       "<!-- 140555658644016backward -->\n",
+       "<g id=\"node1\" class=\"node\"><title>140555658644016backward</title>\n",
+       "<ellipse fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" cx=\"100.689\" cy=\"-478.836\" rx=\"45.43\" ry=\"18\"/>\n",
+       "<text text-anchor=\"middle\" x=\"100.689\" y=\"-476.656\" font-family=\"Menlo\" font-size=\"10.00\">input=0.50</text>\n",
+       "</g>\n",
+       "<!-- 140555659722816backward -->\n",
+       "<g id=\"node2\" class=\"node\"><title>140555659722816backward</title>\n",
+       "<ellipse fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" cx=\"34.6892\" cy=\"-29.9609\" rx=\"34.8795\" ry=\"18\"/>\n",
+       "<text text-anchor=\"middle\" x=\"34.6892\" y=\"-27.7812\" font-family=\"Menlo\" font-size=\"10.00\">x1=1.50</text>\n",
+       "</g>\n",
+       "<!-- 140555664134784backward -->\n",
+       "<g id=\"node3\" class=\"node\"><title>140555664134784backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M114.587,-224.938C114.587,-224.938 166.792,-224.938 166.792,-224.938 172.792,-224.938 178.792,-230.938 178.792,-236.938 178.792,-236.938 178.792,-271.859 178.792,-271.859 178.792,-277.859 172.792,-283.859 166.792,-283.859 166.792,-283.859 114.587,-283.859 114.587,-283.859 108.587,-283.859 102.587,-277.859 102.587,-271.859 102.587,-271.859 102.587,-236.938 102.587,-236.938 102.587,-230.938 108.587,-224.938 114.587,-224.938\"/>\n",
+       "<text text-anchor=\"middle\" x=\"140.689\" y=\"-271.859\" font-family=\"Menlo\" font-size=\"10.00\">grad=&#45;1.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"102.587,-264.219 178.792,-264.219 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"140.689\" y=\"-252.219\" font-family=\"Menlo\" font-size=\"10.00\">value=0.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"102.587,-244.578 178.792,-244.578 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"140.689\" y=\"-232.578\" font-family=\"Menlo\" font-size=\"10.00\">+</text>\n",
+       "</g>\n",
+       "<!-- 140555664137856backward -->\n",
+       "<g id=\"node7\" class=\"node\"><title>140555664137856backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M53.5867,-112.719C53.5867,-112.719 105.792,-112.719 105.792,-112.719 111.792,-112.719 117.792,-118.719 117.792,-124.719 117.792,-124.719 117.792,-159.641 117.792,-159.641 117.792,-165.641 111.792,-171.641 105.792,-171.641 105.792,-171.641 53.5867,-171.641 53.5867,-171.641 47.5867,-171.641 41.5867,-165.641 41.5867,-159.641 41.5867,-159.641 41.5867,-124.719 41.5867,-124.719 41.5867,-118.719 47.5867,-112.719 53.5867,-112.719\"/>\n",
+       "<text text-anchor=\"middle\" x=\"79.6892\" y=\"-159.641\" font-family=\"Menlo\" font-size=\"10.00\">grad=&#45;1.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"41.5867,-152 117.792,-152 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"79.6892\" y=\"-140\" font-family=\"Menlo\" font-size=\"10.00\">value=0.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"41.5867,-132.359 117.792,-132.359 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"79.6892\" y=\"-120.359\" font-family=\"Menlo\" font-size=\"10.00\">*</text>\n",
+       "</g>\n",
+       "<!-- 140555664134784backward&#45;&gt;140555664137856backward -->\n",
+       "<g id=\"edge9\" class=\"edge\"><title>140555664134784backward&#45;&gt;140555664137856backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M119.996,-224.84C116.004,-218.878 111.995,-212.545 108.546,-206.438 104.017,-198.419 99.6251,-189.562 95.6903,-181.078\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"98.769,-179.392 91.4591,-171.723 92.391,-182.277 98.769,-179.392\"/>\n",
+       "<text text-anchor=\"middle\" x=\"128.761\" y=\"-195.238\" font-family=\"Menlo\" font-size=\"14.00\">&#45;1.00</text>\n",
+       "</g>\n",
+       "<!-- 140555664138096backward -->\n",
+       "<g id=\"node10\" class=\"node\"><title>140555664138096backward</title>\n",
+       "<polygon fill=\"lightgreen\" stroke=\"black\" stroke-width=\"2\" points=\"135.587,-112.719 135.587,-171.641 211.792,-171.641 211.792,-112.719 135.587,-112.719\"/>\n",
+       "<text text-anchor=\"middle\" x=\"173.689\" y=\"-159.641\" font-family=\"Menlo\" font-size=\"10.00\">grad=&#45;1.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" stroke-width=\"2\" points=\"135.587,-152 211.792,-152 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"173.689\" y=\"-140\" font-family=\"Menlo\" font-size=\"10.00\">value=0.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" stroke-width=\"2\" points=\"135.587,-132.359 211.792,-132.359 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"173.689\" y=\"-120.359\" font-family=\"Menlo\" font-size=\"10.00\">b</text>\n",
+       "</g>\n",
+       "<!-- 140555664134784backward&#45;&gt;140555664138096backward -->\n",
+       "<g id=\"edge7\" class=\"edge\"><title>140555664134784backward&#45;&gt;140555664138096backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M149.273,-224.727C153.207,-211.588 157.928,-195.821 162.166,-181.667\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"165.633,-182.291 165.148,-171.707 158.927,-180.283 165.633,-182.291\"/>\n",
+       "<text text-anchor=\"middle\" x=\"179.761\" y=\"-195.238\" font-family=\"Menlo\" font-size=\"14.00\">&#45;1.00</text>\n",
+       "</g>\n",
+       "<!-- 140555658644112backward -->\n",
+       "<g id=\"node4\" class=\"node\"><title>140555658644112backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M107.587,-561.594C107.587,-561.594 159.792,-561.594 159.792,-561.594 165.792,-561.594 171.792,-567.594 171.792,-573.594 171.792,-573.594 171.792,-608.516 171.792,-608.516 171.792,-614.516 165.792,-620.516 159.792,-620.516 159.792,-620.516 107.587,-620.516 107.587,-620.516 101.587,-620.516 95.5867,-614.516 95.5867,-608.516 95.5867,-608.516 95.5867,-573.594 95.5867,-573.594 95.5867,-567.594 101.587,-561.594 107.587,-561.594\"/>\n",
+       "<text text-anchor=\"middle\" x=\"133.689\" y=\"-608.516\" font-family=\"Menlo\" font-size=\"10.00\">grad=1.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"95.5867,-600.875 171.792,-600.875 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"133.689\" y=\"-588.875\" font-family=\"Menlo\" font-size=\"10.00\">value=0.50</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"95.5867,-581.234 171.792,-581.234 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"133.689\" y=\"-569.234\" font-family=\"Menlo\" font-size=\"10.00\">*</text>\n",
+       "</g>\n",
+       "<!-- 140555658644112backward&#45;&gt;140555658644016backward -->\n",
+       "<g id=\"edge4\" class=\"edge\"><title>140555658644112backward&#45;&gt;140555658644016backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" stroke-dasharray=\"5,2\" d=\"M125.105,-561.384C118.994,-540.973 110.984,-514.221 105.836,-497.027\"/>\n",
+       "</g>\n",
+       "<!-- 140555658644256backward -->\n",
+       "<g id=\"node8\" class=\"node\"><title>140555658644256backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M176.587,-449.375C176.587,-449.375 228.792,-449.375 228.792,-449.375 234.792,-449.375 240.792,-455.375 240.792,-461.375 240.792,-461.375 240.792,-496.297 240.792,-496.297 240.792,-502.297 234.792,-508.297 228.792,-508.297 228.792,-508.297 176.587,-508.297 176.587,-508.297 170.587,-508.297 164.587,-502.297 164.587,-496.297 164.587,-496.297 164.587,-461.375 164.587,-461.375 164.587,-455.375 170.587,-449.375 176.587,-449.375\"/>\n",
+       "<text text-anchor=\"middle\" x=\"202.689\" y=\"-496.297\" font-family=\"Menlo\" font-size=\"10.00\">grad=0.50</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"164.587,-488.656 240.792,-488.656 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"202.689\" y=\"-476.656\" font-family=\"Menlo\" font-size=\"10.00\">value=1.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"164.587,-469.016 240.792,-469.016 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"202.689\" y=\"-457.016\" font-family=\"Menlo\" font-size=\"10.00\">mse</text>\n",
+       "</g>\n",
+       "<!-- 140555658644112backward&#45;&gt;140555658644256backward -->\n",
+       "<g id=\"edge8\" class=\"edge\"><title>140555658644112backward&#45;&gt;140555658644256backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M151.638,-561.384C160.103,-547.862 170.311,-531.556 179.367,-517.091\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"182.491,-518.697 184.83,-508.363 176.557,-514.982 182.491,-518.697\"/>\n",
+       "<text text-anchor=\"middle\" x=\"188.547\" y=\"-531.894\" font-family=\"Menlo\" font-size=\"14.00\">0.50</text>\n",
+       "</g>\n",
+       "<!-- 140555664134304backward -->\n",
+       "<g id=\"node5\" class=\"node\"><title>140555664134304backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M176.587,-337.156C176.587,-337.156 228.792,-337.156 228.792,-337.156 234.792,-337.156 240.792,-343.156 240.792,-349.156 240.792,-349.156 240.792,-384.078 240.792,-384.078 240.792,-390.078 234.792,-396.078 228.792,-396.078 228.792,-396.078 176.587,-396.078 176.587,-396.078 170.587,-396.078 164.587,-390.078 164.587,-384.078 164.587,-384.078 164.587,-349.156 164.587,-349.156 164.587,-343.156 170.587,-337.156 176.587,-337.156\"/>\n",
+       "<text text-anchor=\"middle\" x=\"202.689\" y=\"-384.078\" font-family=\"Menlo\" font-size=\"10.00\">grad=1.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"164.587,-376.438 240.792,-376.438 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"202.689\" y=\"-364.438\" font-family=\"Menlo\" font-size=\"10.00\">value=1.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"164.587,-356.797 240.792,-356.797 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"202.689\" y=\"-344.797\" font-family=\"Menlo\" font-size=\"10.00\">&#45;</text>\n",
+       "</g>\n",
+       "<!-- 140555664134304backward&#45;&gt;140555664134784backward -->\n",
+       "<g id=\"edge2\" class=\"edge\"><title>140555664134304backward&#45;&gt;140555664134784backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M180.377,-336.957C176.209,-331.057 172.062,-324.774 168.546,-318.656 163.983,-310.72 159.666,-301.896 155.853,-293.418\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"158.979,-291.829 151.777,-284.059 152.562,-294.625 158.979,-291.829\"/>\n",
+       "<text text-anchor=\"middle\" x=\"188.761\" y=\"-307.456\" font-family=\"Menlo\" font-size=\"14.00\">&#45;1.00</text>\n",
+       "</g>\n",
+       "<!-- 140555659723440backward -->\n",
+       "<g id=\"node6\" class=\"node\"><title>140555659723440backward</title>\n",
+       "<ellipse fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" cx=\"231.689\" cy=\"-254.398\" rx=\"34.8795\" ry=\"18\"/>\n",
+       "<text text-anchor=\"middle\" x=\"231.689\" y=\"-252.219\" font-family=\"Menlo\" font-size=\"10.00\">y1=1.00</text>\n",
+       "</g>\n",
+       "<!-- 140555664134304backward&#45;&gt;140555659723440backward -->\n",
+       "<g id=\"edge5\" class=\"edge\"><title>140555664134304backward&#45;&gt;140555659723440backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" stroke-dasharray=\"5,2\" d=\"M210.233,-336.946C215.637,-316.408 222.73,-289.449 227.25,-272.269\"/>\n",
+       "</g>\n",
+       "<!-- 140555664137856backward&#45;&gt;140555659722816backward -->\n",
+       "<g id=\"edge3\" class=\"edge\"><title>140555664137856backward&#45;&gt;140555659722816backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" stroke-dasharray=\"5,2\" d=\"M67.9835,-112.509C59.5981,-91.9703 48.5913,-65.0114 41.577,-47.8311\"/>\n",
+       "</g>\n",
+       "<!-- 140555664137568backward -->\n",
+       "<g id=\"node9\" class=\"node\"><title>140555664137568backward</title>\n",
+       "<polygon fill=\"lightgreen\" stroke=\"black\" stroke-width=\"2\" points=\"87.5867,-0.5 87.5867,-59.4219 163.792,-59.4219 163.792,-0.5 87.5867,-0.5\"/>\n",
+       "<text text-anchor=\"middle\" x=\"125.689\" y=\"-47.4219\" font-family=\"Menlo\" font-size=\"10.00\">grad=&#45;1.50</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" stroke-width=\"2\" points=\"87.5867,-39.7812 163.792,-39.7812 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"125.689\" y=\"-27.7812\" font-family=\"Menlo\" font-size=\"10.00\">value=0.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" stroke-width=\"2\" points=\"87.5867,-20.1406 163.792,-20.1406 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"125.689\" y=\"-8.14062\" font-family=\"Menlo\" font-size=\"10.00\">a</text>\n",
+       "</g>\n",
+       "<!-- 140555664137856backward&#45;&gt;140555664137568backward -->\n",
+       "<g id=\"edge1\" class=\"edge\"><title>140555664137856backward&#45;&gt;140555664137568backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M91.6551,-112.509C97.1921,-99.2417 103.847,-83.2956 109.798,-69.0367\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"113.162,-70.0649 113.783,-59.4883 106.702,-67.3688 113.162,-70.0649\"/>\n",
+       "<text text-anchor=\"middle\" x=\"125.761\" y=\"-83.0187\" font-family=\"Menlo\" font-size=\"14.00\">&#45;1.50</text>\n",
+       "</g>\n",
+       "<!-- 140555658644256backward&#45;&gt;140555664134304backward -->\n",
+       "<g id=\"edge6\" class=\"edge\"><title>140555658644256backward&#45;&gt;140555664134304backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M202.689,-449.165C202.689,-436.153 202.689,-420.564 202.689,-406.517\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"206.189,-406.145 202.689,-396.145 199.189,-406.145 206.189,-406.145\"/>\n",
+       "<text text-anchor=\"middle\" x=\"219.547\" y=\"-419.675\" font-family=\"Menlo\" font-size=\"14.00\">1.00</text>\n",
+       "</g>\n",
+       "</g>\n",
+       "</svg>\n"
+      ],
+      "text/plain": [
+       "<graphviz.graphs.Digraph at 0x7fd5aa1acaf0>"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# 第一次传播\n",
+    "model = Linear()\n",
+    "loss = 0.5 * mse([model.error(x1, y1)])\n",
+    "loss.backward()\n",
+    "draw_graph(loss, 'backward')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "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=\"274pt\" height=\"629pt\"\n",
+       " viewBox=\"0.00 0.00 274.38 629.02\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
+       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 625.016)\">\n",
+       "<title>%3</title>\n",
+       "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-625.016 270.378,-625.016 270.378,4 -4,4\"/>\n",
+       "<!-- 140555664028672backward -->\n",
+       "<g id=\"node1\" class=\"node\"><title>140555664028672backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M53.5867,-112.719C53.5867,-112.719 105.792,-112.719 105.792,-112.719 111.792,-112.719 117.792,-118.719 117.792,-124.719 117.792,-124.719 117.792,-159.641 117.792,-159.641 117.792,-165.641 111.792,-171.641 105.792,-171.641 105.792,-171.641 53.5867,-171.641 53.5867,-171.641 47.5867,-171.641 41.5867,-165.641 41.5867,-159.641 41.5867,-159.641 41.5867,-124.719 41.5867,-124.719 41.5867,-118.719 47.5867,-112.719 53.5867,-112.719\"/>\n",
+       "<text text-anchor=\"middle\" x=\"79.6892\" y=\"-159.641\" font-family=\"Menlo\" font-size=\"10.00\">grad=&#45;4.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"41.5867,-152 117.792,-152 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"79.6892\" y=\"-140\" font-family=\"Menlo\" font-size=\"10.00\">value=0.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"41.5867,-132.359 117.792,-132.359 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"79.6892\" y=\"-120.359\" font-family=\"Menlo\" font-size=\"10.00\">*</text>\n",
+       "</g>\n",
+       "<!-- 140555659722960backward -->\n",
+       "<g id=\"node6\" class=\"node\"><title>140555659722960backward</title>\n",
+       "<ellipse fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" cx=\"34.6892\" cy=\"-29.9609\" rx=\"34.8795\" ry=\"18\"/>\n",
+       "<text text-anchor=\"middle\" x=\"34.6892\" y=\"-27.7812\" font-family=\"Menlo\" font-size=\"10.00\">x2=2.00</text>\n",
+       "</g>\n",
+       "<!-- 140555664028672backward&#45;&gt;140555659722960backward -->\n",
+       "<g id=\"edge6\" class=\"edge\"><title>140555664028672backward&#45;&gt;140555659722960backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" stroke-dasharray=\"5,2\" d=\"M67.9835,-112.509C59.5981,-91.9703 48.5913,-65.0114 41.577,-47.8311\"/>\n",
+       "</g>\n",
+       "<!-- 140555664137568backward -->\n",
+       "<g id=\"node8\" class=\"node\"><title>140555664137568backward</title>\n",
+       "<polygon fill=\"lightgreen\" stroke=\"black\" stroke-width=\"2\" points=\"87.5867,-0.5 87.5867,-59.4219 163.792,-59.4219 163.792,-0.5 87.5867,-0.5\"/>\n",
+       "<text text-anchor=\"middle\" x=\"125.689\" y=\"-47.4219\" font-family=\"Menlo\" font-size=\"10.00\">grad=&#45;9.50</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" stroke-width=\"2\" points=\"87.5867,-39.7812 163.792,-39.7812 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"125.689\" y=\"-27.7812\" font-family=\"Menlo\" font-size=\"10.00\">value=0.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" stroke-width=\"2\" points=\"87.5867,-20.1406 163.792,-20.1406 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"125.689\" y=\"-8.14062\" font-family=\"Menlo\" font-size=\"10.00\">a</text>\n",
+       "</g>\n",
+       "<!-- 140555664028672backward&#45;&gt;140555664137568backward -->\n",
+       "<g id=\"edge1\" class=\"edge\"><title>140555664028672backward&#45;&gt;140555664137568backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M91.6551,-112.509C97.1921,-99.2417 103.847,-83.2956 109.798,-69.0367\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"113.162,-70.0649 113.783,-59.4883 106.702,-67.3688 113.162,-70.0649\"/>\n",
+       "<text text-anchor=\"middle\" x=\"126.761\" y=\"-83.0187\" font-family=\"Menlo\" font-size=\"14.00\">&#45;8.00</text>\n",
+       "</g>\n",
+       "<!-- 140555664028192backward -->\n",
+       "<g id=\"node2\" class=\"node\"><title>140555664028192backward</title>\n",
+       "<ellipse fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" cx=\"97.6892\" cy=\"-478.836\" rx=\"45.43\" ry=\"18\"/>\n",
+       "<text text-anchor=\"middle\" x=\"97.6892\" y=\"-476.656\" font-family=\"Menlo\" font-size=\"10.00\">input=0.50</text>\n",
+       "</g>\n",
+       "<!-- 140555664028768backward -->\n",
+       "<g id=\"node3\" class=\"node\"><title>140555664028768backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M176.587,-337.156C176.587,-337.156 228.792,-337.156 228.792,-337.156 234.792,-337.156 240.792,-343.156 240.792,-349.156 240.792,-349.156 240.792,-384.078 240.792,-384.078 240.792,-390.078 234.792,-396.078 228.792,-396.078 228.792,-396.078 176.587,-396.078 176.587,-396.078 170.587,-396.078 164.587,-390.078 164.587,-384.078 164.587,-384.078 164.587,-349.156 164.587,-349.156 164.587,-343.156 170.587,-337.156 176.587,-337.156\"/>\n",
+       "<text text-anchor=\"middle\" x=\"202.689\" y=\"-384.078\" font-family=\"Menlo\" font-size=\"10.00\">grad=4.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"164.587,-376.438 240.792,-376.438 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"202.689\" y=\"-364.438\" font-family=\"Menlo\" font-size=\"10.00\">value=4.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"164.587,-356.797 240.792,-356.797 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"202.689\" y=\"-344.797\" font-family=\"Menlo\" font-size=\"10.00\">&#45;</text>\n",
+       "</g>\n",
+       "<!-- 140555664028864backward -->\n",
+       "<g id=\"node5\" class=\"node\"><title>140555664028864backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M114.587,-224.938C114.587,-224.938 166.792,-224.938 166.792,-224.938 172.792,-224.938 178.792,-230.938 178.792,-236.938 178.792,-236.938 178.792,-271.859 178.792,-271.859 178.792,-277.859 172.792,-283.859 166.792,-283.859 166.792,-283.859 114.587,-283.859 114.587,-283.859 108.587,-283.859 102.587,-277.859 102.587,-271.859 102.587,-271.859 102.587,-236.938 102.587,-236.938 102.587,-230.938 108.587,-224.938 114.587,-224.938\"/>\n",
+       "<text text-anchor=\"middle\" x=\"140.689\" y=\"-271.859\" font-family=\"Menlo\" font-size=\"10.00\">grad=&#45;4.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"102.587,-264.219 178.792,-264.219 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"140.689\" y=\"-252.219\" font-family=\"Menlo\" font-size=\"10.00\">value=0.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"102.587,-244.578 178.792,-244.578 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"140.689\" y=\"-232.578\" font-family=\"Menlo\" font-size=\"10.00\">+</text>\n",
+       "</g>\n",
+       "<!-- 140555664028768backward&#45;&gt;140555664028864backward -->\n",
+       "<g id=\"edge3\" class=\"edge\"><title>140555664028768backward&#45;&gt;140555664028864backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M181.308,-337.115C177.195,-331.149 173.074,-324.8 169.546,-318.656 164.96,-310.671 160.544,-301.827 156.605,-293.345\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"159.684,-291.66 152.377,-283.989 153.306,-294.543 159.684,-291.66\"/>\n",
+       "<text text-anchor=\"middle\" x=\"190.761\" y=\"-307.456\" font-family=\"Menlo\" font-size=\"14.00\">&#45;4.00</text>\n",
+       "</g>\n",
+       "<!-- 140555659725600backward -->\n",
+       "<g id=\"node7\" class=\"node\"><title>140555659725600backward</title>\n",
+       "<ellipse fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" cx=\"231.689\" cy=\"-254.398\" rx=\"34.8795\" ry=\"18\"/>\n",
+       "<text text-anchor=\"middle\" x=\"231.689\" y=\"-252.219\" font-family=\"Menlo\" font-size=\"10.00\">y2=4.00</text>\n",
+       "</g>\n",
+       "<!-- 140555664028768backward&#45;&gt;140555659725600backward -->\n",
+       "<g id=\"edge8\" class=\"edge\"><title>140555664028768backward&#45;&gt;140555659725600backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" stroke-dasharray=\"5,2\" d=\"M210.233,-336.946C215.637,-316.408 222.73,-289.449 227.25,-272.269\"/>\n",
+       "</g>\n",
+       "<!-- 140555664029824backward -->\n",
+       "<g id=\"node4\" class=\"node\"><title>140555664029824backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M105.587,-561.594C105.587,-561.594 157.792,-561.594 157.792,-561.594 163.792,-561.594 169.792,-567.594 169.792,-573.594 169.792,-573.594 169.792,-608.516 169.792,-608.516 169.792,-614.516 163.792,-620.516 157.792,-620.516 157.792,-620.516 105.587,-620.516 105.587,-620.516 99.5867,-620.516 93.5867,-614.516 93.5867,-608.516 93.5867,-608.516 93.5867,-573.594 93.5867,-573.594 93.5867,-567.594 99.5867,-561.594 105.587,-561.594\"/>\n",
+       "<text text-anchor=\"middle\" x=\"131.689\" y=\"-608.516\" font-family=\"Menlo\" font-size=\"10.00\">grad=1.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"93.5867,-600.875 169.792,-600.875 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"131.689\" y=\"-588.875\" font-family=\"Menlo\" font-size=\"10.00\">value=8.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"93.5867,-581.234 169.792,-581.234 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"131.689\" y=\"-569.234\" font-family=\"Menlo\" font-size=\"10.00\">*</text>\n",
+       "</g>\n",
+       "<!-- 140555664029824backward&#45;&gt;140555664028192backward -->\n",
+       "<g id=\"edge9\" class=\"edge\"><title>140555664029824backward&#45;&gt;140555664028192backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" stroke-dasharray=\"5,2\" d=\"M122.845,-561.384C116.549,-540.973 108.296,-514.221 102.992,-497.027\"/>\n",
+       "</g>\n",
+       "<!-- 140555664029152backward -->\n",
+       "<g id=\"node10\" class=\"node\"><title>140555664029152backward</title>\n",
+       "<path fill=\"#f0f0f0\" stroke=\"black\" d=\"M173.576,-449.375C173.576,-449.375 231.802,-449.375 231.802,-449.375 237.802,-449.375 243.802,-455.375 243.802,-461.375 243.802,-461.375 243.802,-496.297 243.802,-496.297 243.802,-502.297 237.802,-508.297 231.802,-508.297 231.802,-508.297 173.576,-508.297 173.576,-508.297 167.576,-508.297 161.576,-502.297 161.576,-496.297 161.576,-496.297 161.576,-461.375 161.576,-461.375 161.576,-455.375 167.576,-449.375 173.576,-449.375\"/>\n",
+       "<text text-anchor=\"middle\" x=\"202.689\" y=\"-496.297\" font-family=\"Menlo\" font-size=\"10.00\">grad=0.50</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"161.576,-488.656 243.802,-488.656 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"202.689\" y=\"-476.656\" font-family=\"Menlo\" font-size=\"10.00\">value=16.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" points=\"161.576,-469.016 243.802,-469.016 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"202.689\" y=\"-457.016\" font-family=\"Menlo\" font-size=\"10.00\">mse</text>\n",
+       "</g>\n",
+       "<!-- 140555664029824backward&#45;&gt;140555664029152backward -->\n",
+       "<g id=\"edge4\" class=\"edge\"><title>140555664029824backward&#45;&gt;140555664029152backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M150.158,-561.384C158.869,-547.862 169.372,-531.556 178.691,-517.091\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"181.84,-518.666 184.313,-508.363 175.955,-514.875 181.84,-518.666\"/>\n",
+       "<text text-anchor=\"middle\" x=\"188.547\" y=\"-531.894\" font-family=\"Menlo\" font-size=\"14.00\">0.50</text>\n",
+       "</g>\n",
+       "<!-- 140555664028864backward&#45;&gt;140555664028672backward -->\n",
+       "<g id=\"edge7\" class=\"edge\"><title>140555664028864backward&#45;&gt;140555664028672backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M120.747,-224.75C116.871,-218.795 112.956,-212.488 109.546,-206.438 104.947,-198.28 100.411,-189.298 96.3151,-180.727\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"99.4737,-179.219 92.0625,-171.648 93.1346,-182.188 99.4737,-179.219\"/>\n",
+       "<text text-anchor=\"middle\" x=\"130.761\" y=\"-195.238\" font-family=\"Menlo\" font-size=\"14.00\">&#45;4.00</text>\n",
+       "</g>\n",
+       "<!-- 140555664138096backward -->\n",
+       "<g id=\"node9\" class=\"node\"><title>140555664138096backward</title>\n",
+       "<polygon fill=\"lightgreen\" stroke=\"black\" stroke-width=\"2\" points=\"135.587,-112.719 135.587,-171.641 211.792,-171.641 211.792,-112.719 135.587,-112.719\"/>\n",
+       "<text text-anchor=\"middle\" x=\"173.689\" y=\"-159.641\" font-family=\"Menlo\" font-size=\"10.00\">grad=&#45;5.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" stroke-width=\"2\" points=\"135.587,-152 211.792,-152 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"173.689\" y=\"-140\" font-family=\"Menlo\" font-size=\"10.00\">value=0.00</text>\n",
+       "<polyline fill=\"none\" stroke=\"black\" stroke-width=\"2\" points=\"135.587,-132.359 211.792,-132.359 \"/>\n",
+       "<text text-anchor=\"middle\" x=\"173.689\" y=\"-120.359\" font-family=\"Menlo\" font-size=\"10.00\">b</text>\n",
+       "</g>\n",
+       "<!-- 140555664028864backward&#45;&gt;140555664138096backward -->\n",
+       "<g id=\"edge5\" class=\"edge\"><title>140555664028864backward&#45;&gt;140555664138096backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M149.273,-224.727C153.207,-211.588 157.928,-195.821 162.166,-181.667\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"165.633,-182.291 165.148,-171.707 158.927,-180.283 165.633,-182.291\"/>\n",
+       "<text text-anchor=\"middle\" x=\"180.761\" y=\"-195.238\" font-family=\"Menlo\" font-size=\"14.00\">&#45;4.00</text>\n",
+       "</g>\n",
+       "<!-- 140555664029152backward&#45;&gt;140555664028768backward -->\n",
+       "<g id=\"edge2\" class=\"edge\"><title>140555664029152backward&#45;&gt;140555664028768backward</title>\n",
+       "<path fill=\"none\" stroke=\"deepskyblue\" d=\"M202.689,-449.165C202.689,-436.153 202.689,-420.564 202.689,-406.517\"/>\n",
+       "<polygon fill=\"deepskyblue\" stroke=\"deepskyblue\" points=\"206.189,-406.145 202.689,-396.145 199.189,-406.145 206.189,-406.145\"/>\n",
+       "<text text-anchor=\"middle\" x=\"219.547\" y=\"-419.675\" font-family=\"Menlo\" font-size=\"14.00\">4.00</text>\n",
+       "</g>\n",
+       "</g>\n",
+       "</svg>\n"
+      ],
+      "text/plain": [
+       "<graphviz.graphs.Digraph at 0x7fd5aa6cf130>"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# 第二次传播(梯度积累)\n",
+    "loss = 0.5 * mse([model.error(x2, y2)])\n",
+    "loss.backward()\n",
+    "draw_graph(loss, 'backward')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "y = 3.12 * x + -1.99\n",
+      "y = 3.48 * x + -2.28\n",
+      "y = 3.22 * x + -1.97\n",
+      "y = 2.85 * x + -1.22\n",
+      "y = 2.68 * x + -0.23\n",
+      "y = 2.92 * x + 1.08\n",
+      "y = 3.74 * x + 2.61\n",
+      "y = 5.07 * x + 4.15\n",
+      "y = 6.73 * x + 5.52\n",
+      "y = 8.22 * x + 6.48\n",
+      "y = 9.36 * x + 5.75\n",
+      "y = 9.75 * x + 5.42\n",
+      "y = 9.88 * x + 5.28\n",
+      "y = 9.89 * x + 5.26\n",
+      "y = 9.89 * x + 5.20\n",
+      "y = 9.88 * x + 5.18\n",
+      "y = 9.88 * x + 5.17\n",
+      "y = 9.84 * x + 5.14\n",
+      "y = 9.86 * x + 5.15\n",
+      "y = 9.94 * x + 5.21\n"
+     ]
+    }
+   ],
+   "source": [
+    "model = Linear()\n",
+    "\n",
+    "batch_size = 20\n",
+    "learning_rate = 0.1\n",
+    "# 梯度积累次数\n",
+    "gradient_accu_iter = 4\n",
+    "# 小批量数据量\n",
+    "micro_size = int(batch_size / gradient_accu_iter)\n",
+    "\n",
+    "\n",
+    "for t in range(20 * gradient_accu_iter):\n",
+    "    ix = (t * micro_size) % len(x)\n",
+    "    xx = x[ix: ix + micro_size]\n",
+    "    yy = y[ix: ix + micro_size]\n",
+    "    loss = mse([model.error(_x, _y) for _x, _y in zip(xx, yy)])\n",
+    "    # 调整权重\n",
+    "    loss *= 1 / gradient_accu_iter\n",
+    "    loss.backward()\n",
+    "    if (t + 1) % gradient_accu_iter == 0:\n",
+    "        model.a -= learning_rate * model.a.grad\n",
+    "        model.b -= learning_rate * model.b.grad\n",
+    "        model.a.grad = 0.0\n",
+    "        model.b.grad = 0.0\n",
+    "        print(model.string())\n",
+    "    #model.a -= learning_rate * model.a.grad\n",
+    "    #model.b -= learning_rate * model.b.grad\n",
+    "    #model.a.grad = 0.0\n",
+    "    #model.b.grad = 0.0\n",
+    "    #print(model.string())"
+   ]
+  },
+  {
+   "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.8.5"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}