Skip to content

Instantly share code, notes, and snippets.

@anand086
Last active July 22, 2021 06:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anand086/0aac6c5644b94599d7df646602a71e11 to your computer and use it in GitHub Desktop.
Save anand086/0aac6c5644b94599d7df646602a71e11 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"#hide\n",
"!pip install -Uqq fastbook\n",
"import fastbook\n",
"fastbook.setup_book()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"#hide\n",
"from fastai.vision.all import *\n",
"from fastbook import *\n",
"\n",
"matplotlib.rc('image', cmap='Greys')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"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.48.0 (20210717.2242)\n",
" -->\n",
"<!-- Title: G Pages: 1 -->\n",
"<svg width=\"661pt\" height=\"78pt\"\n",
" viewBox=\"0.00 0.00 660.87 78.00\" 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 74)\">\n",
"<title>G</title>\n",
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-74 656.87,-74 656.87,4 -4,4\"/>\n",
"<!-- init -->\n",
"<g id=\"node1\" class=\"node\">\n",
"<title>init</title>\n",
"<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">init</text>\n",
"</g>\n",
"<!-- predict -->\n",
"<g id=\"node2\" class=\"node\">\n",
"<title>predict</title>\n",
"<ellipse fill=\"none\" stroke=\"black\" cx=\"135.2\" cy=\"-18\" rx=\"44.39\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"135.2\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">predict</text>\n",
"</g>\n",
"<!-- init&#45;&gt;predict -->\n",
"<g id=\"edge1\" class=\"edge\">\n",
"<title>init&#45;&gt;predict</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M54.25,-18C62.37,-18 71.63,-18 80.89,-18\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"80.89,-21.5 90.89,-18 80.89,-14.5 80.89,-21.5\"/>\n",
"</g>\n",
"<!-- loss -->\n",
"<g id=\"node3\" class=\"node\">\n",
"<title>loss</title>\n",
"<ellipse fill=\"none\" stroke=\"black\" cx=\"244.99\" cy=\"-52\" rx=\"28.7\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"244.99\" y=\"-48.3\" font-family=\"Times,serif\" font-size=\"14.00\">loss</text>\n",
"</g>\n",
"<!-- predict&#45;&gt;loss -->\n",
"<g id=\"edge2\" class=\"edge\">\n",
"<title>predict&#45;&gt;loss</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M170.6,-28.85C183.05,-32.78 197.09,-37.21 209.54,-41.14\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"208.53,-44.49 219.12,-44.16 210.64,-37.81 208.53,-44.49\"/>\n",
"</g>\n",
"<!-- gradient -->\n",
"<g id=\"node4\" class=\"node\">\n",
"<title>gradient</title>\n",
"<ellipse fill=\"none\" stroke=\"black\" cx=\"406.63\" cy=\"-52\" rx=\"50.09\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"406.63\" y=\"-48.3\" font-family=\"Times,serif\" font-size=\"14.00\">gradient</text>\n",
"</g>\n",
"<!-- loss&#45;&gt;gradient -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>loss&#45;&gt;gradient</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M273.8,-52C293.82,-52 321.57,-52 346.45,-52\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"346.55,-55.5 356.55,-52 346.55,-48.5 346.55,-55.5\"/>\n",
"</g>\n",
"<!-- step -->\n",
"<g id=\"node5\" class=\"node\">\n",
"<title>step</title>\n",
"<ellipse fill=\"none\" stroke=\"black\" cx=\"524.23\" cy=\"-18\" rx=\"30.59\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"524.23\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">step</text>\n",
"</g>\n",
"<!-- gradient&#45;&gt;step -->\n",
"<g id=\"edge4\" class=\"edge\">\n",
"<title>gradient&#45;&gt;step</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M445.8,-40.77C459.01,-36.89 473.76,-32.55 486.82,-28.71\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"487.82,-32.06 496.43,-25.88 485.85,-25.35 487.82,-32.06\"/>\n",
"</g>\n",
"<!-- step&#45;&gt;predict -->\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<title>step&#45;&gt;predict</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M493.68,-18C428.65,-18 272.39,-18 189.67,-18\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"189.47,-14.5 179.47,-18 189.47,-21.5 189.47,-14.5\"/>\n",
"<text text-anchor=\"middle\" x=\"315.09\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\">repeat</text>\n",
"</g>\n",
"<!-- stop -->\n",
"<g id=\"node6\" class=\"node\">\n",
"<title>stop</title>\n",
"<ellipse fill=\"none\" stroke=\"black\" cx=\"622.32\" cy=\"-18\" rx=\"30.59\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"622.32\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">stop</text>\n",
"</g>\n",
"<!-- step&#45;&gt;stop -->\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<title>step&#45;&gt;stop</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M554.84,-18C563.24,-18 572.53,-18 581.44,-18\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"581.64,-21.5 591.64,-18 581.64,-14.5 581.64,-21.5\"/>\n",
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
"<graphviz.files.Source at 0x7f8d64ce64e0>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gv('''\n",
"init->predict->loss->gradient->step->stop\n",
"step->predict[label=repeat]\n",
"''')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def f(x): return x**2"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/ec2-user/SageMaker/.env/fastai/lib/python3.6/site-packages/fastbook/__init__.py:73: UserWarning: Not providing a value for linspace's steps is deprecated and will throw a runtime error in a future release. This warning will appear only once per process. (Triggered internally at /pytorch/aten/src/ATen/native/RangeFactories.cpp:25.)\n",
" x = torch.linspace(min,max)\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEGCAYAAABo25JHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAvr0lEQVR4nO3deXxU1fnH8c+TnSQQCEmALBAgLLIvYV9EqBY3UBQVF6SgiEvV7trFtnSvra1LW4uIIiqiiFYUFypakD2sYScQshFISEjIvp7fHzP0l8YkJCE3dzLzvF+veXln7mHuNwPmmXvPueeIMQallFKey8vuAEoppeylhUAppTycFgKllPJwWgiUUsrDaSFQSikP52N3gKYKCwszsbGxdsdQSqk2ZdeuXeeMMeF17WtzhSA2NpaEhAS7YyilVJsiIin17dNLQ0op5eG0ECillIfTQqCUUh5OC4FSSnk4LQRKKeXhLC8EIuItIntE5MM69vmLyCoRSRKR7SISa3UepZRS/6s1zggeAw7Xs28BcN4YEwf8BfhDK+RRSilVg6WFQESigeuBpfU0mQksd26vBqaJiFiRJSmrkMVrD1FeWW3F2yullKWe/fdxtp/MseS9rT4j+CvwQ6C+375RQBqAMaYSyAc6124kIgtFJEFEErKzs5sVJC23mGWbk9lw5Gyz/rxSStklNaeYv/z7GNuTcy15f8sKgYjcAGQZY3Zd7nsZY5YYY+KNMfHh4XXeIX1Jk/uG07VDAG/tTLvcOEop1areTkjDS+DWkdGWvL+VZwQTgBkicgp4C5gqIq/XapMBxACIiA8QAlhy7uPtJcyOj2bjsWxO55VYcQillGpxlVXVrN6VzuS+4UR2bGfJMSwrBMaYJ40x0caYWOAOYIMx5u5azT4A7nVu3+psY9nambNHxlBtYPWudKsOoZRSLWrj8WzOXCjljlExlh2j1e8jEJHFIjLD+fRloLOIJAHfBZ6w8tjdOwcyIa4zbyekUV2tazUrpVzfqp1pdA7yY2r/LpYdo1UKgTHmS2PMDc7tp4wxHzi3S40xs40xccaY0caYk1ZnuS0+hvTzJWw5YU3vu1JKtZSsglI+P5zFLSOj8fOx7te1x91Z/M2BXQlp58tbO1PtjqKUUg1aszuDymrDbfHWXRYCDywEAb7e3Dw8is8OnuV8UbndcZRSqk7GGN7emUZ8j07ERQRbeiyPKwQAt4+KobyqmjV7MuyOopRSddqRnMvJc0XcZmEn8UUeWQiu6NaBYTEdWbkjFQsHKSmlVLOt3JFK+wAfbhwSafmxPLIQAMwZHUNSViG7Us7bHUUppf5HXnE56w6c4aZhUbTz87b8eB5bCG4YEkmwvw9v7tBOY6WUa1mzO4PyymrmjO7eKsfz2EIQ5O/DzGGRfLQ/k/ziCrvjKKUU4OgkfmtnKkNjOjIgskOrHNNjCwHAnNHdKaus5v292mmslHINu1PPc+xsIXNaoZP4Io8uBIOiQhgcFaKdxkopl7FyRxpBft7cONT6TuKLPLoQgOOs4MiZAvak5dkdRSnl4fJLKvhw/2lmDo8iyN+n1Y7r8YVgxrBIgvy8WbldO42VUvZ6f08GpRXVzBnVOp3EF3l8IQj292Hm8CjW7j+tncZKKdsYY3hjewpDo0MYHB3Sqsf2+EIAcOfo7pRWVLNmj05PrZSyR0KKo5P4zjGtezYAWggAR6fxsJiOvLFdO42VUvZ4Y1sK7f19WrWT+CItBE53julOUlYhOyxaE1QppeqTW1TOusQzzBoRRaBf63USX6SFwOnGIZG0D/DhDe00Vkq1stW70iivqubOMT1sOb6Vi9cHiMgOEdknIgdF5Jd1tJknItkistf5uM+qPJfSzs+bW0ZE88mBM+QUltkVQynlYaqrDSt3OKab7te1vS0ZrDwjKAOmGmOGAsOA6SIyto52q4wxw5yPpRbmuaS7xnSnvKqatxO001gp1Tq2nMgh+VyRLZ3EF1m5eL0xxhQ6n/o6Hy7dE9unS3vG9AzlzR0pVOmaxkqpVrBi2yk6Bfpy3eButmWwtI9ARLxFZC+QBaw3xmyvo9ktIrJfRFaLSJ2Ta4jIQhFJEJGE7OxsKyNzz7gepOWWsPGYtcdRSqnM/BLWHzrLbaNiCPC1frrp+lhaCIwxVcaYYUA0MFpEBtVqshaINcYMAdYDy+t5nyXGmHhjTHx4eLiVkblmQFfC2/uzYluKpcdRSqmV21MxwN02dRJf1CqjhowxecAXwPRar+cYYy72zC4FRrZGnob4+XgxZ1QMXxzNIi232O44Sik3VV5ZzcqdaVzVL4KY0EBbs1g5aihcRDo6t9sBVwNHarWpeVFsBnDYqjxNMWdMd7xEdCipUsoynx06Q3ZBGfeMtfdsAKw9I+gGfCEi+4GdOPoIPhSRxSIyw9nmUefQ0n3Ao8A8C/M0WreQdnzjigjeTkijtKLK7jhKKTe0YmsKMaHtmNzX2svdjWHZLWzGmP3A8Dpef6rG9pPAk1ZluBz3jI3l04Nn+fhAJjcPj7Y7jlLKjRw7W8D25FyeuLY/3l5idxy9s7g+43t3pld4EMu3aKexUqplvbb1FH4+XtwW33qrkDVEC0E9vLyEuWN7sDctj326aI1SqoVcKK1gze4MZgyNJDTIz+44gBaCBt0yMpogP2+Wbz1ldxSllJtYnZBOcXkV88bH2h3lv7QQNKB9gC+3jIzmw32ZOv+QUuqyVVcbVmxLYUT3jgyKat3FZxqiheAS5o7rQXlVNW/tTLM7ilKqjdt4PJvkc0Xc60JnA6CF4JLiItozMS6M17elUFlVbXccpVQb9trWFMKC/bl2kH3zCtVFC0EjzB3Xg8z8UtYfOmt3FKVUG5WSU8QXR7O4c0x3/Hxc61eva6VxUdOu6EJ0p3a8suWU3VGUUm3U8i0peItwl43TTddHC0EjeHsJc8f1YEdyLgdP59sdRynVxhSWVfJOQhrXDe5Glw4Bdsf5Gi0EjXR7fHfa+Xrz6uZTdkdRSrUx7+5Kp6Cskm9NiLU7Sp20EDRSSKAvt4yM4l/7TutQUqVUo1VXG17dcophMR0Z3r2T3XHqpIWgCeaNj6W8spo3dVZSpVQj/eeYY8ioq54NgBaCJomLaM+kPmGs2JZCeaUOJVVKXdqyzclEtHe9IaM1aSFoovkTepJVUMbHBzLtjqKUcnFJWQVsOn6Oe8b2cLkhozW5bjIXdWXfcHqFBbHsq2SM0QXulVL1e2WzY5bROS44ZLQmLQRN5OUlfGtCLPvS89mVct7uOEopF3W+qJx3d6dz87AowoL97Y7TICuXqgwQkR0iss+5Ctkv62jjLyKrRCRJRLaLSKxVeVrSLSOjCWnny9JNyXZHUUq5qDd3pFJaUc2CST3tjnJJVp4RlAFTjTFDgWHAdBEZW6vNAuC8MSYO+AvwBwvztJhAPx/uHNOdzw6dITVHF7hXSv2v8spqlm85xaQ+YfTt0t7uOJdkWSEwDoXOp77OR+2L6jOB5c7t1cA0EbF/3bZGuHdcLF4ivLJFzwqUUv/rw/2nySoo475JveyO0iiW9hGIiLeI7AWycCxev71WkyggDcAYUwnkA53reJ+FIpIgIgnZ2dlWRm60riEB3DCkG2/vTONCaYXdcZRSLsIYw9JNyfSJCGZynzC74zSKpYXAGFNljBkGRAOjRWRQM99niTEm3hgTHx4e3qIZL8eCib0oKq9i1Q5dq0Ap5bDtZC6HMi8wf2JP2sgFjtYZNWSMyQO+AKbX2pUBxACIiA8QAuS0RqaWMDg6hNE9Q3l1yykqdK0CpRSwdNNJQoP8uHl4lN1RGs3KUUPhItLRud0OuBo4UqvZB8C9zu1bgQ2mjQ3OXzipFxl5JaxL1BvMlPJ0SVkFfH4ki7njehDg6213nEaz8oygG/CFiOwHduLoI/hQRBaLyAxnm5eBziKSBHwXeMLCPJaY2j+C3uFBLNl4Um8wU8rDLd2UjL+PF/eM7WF3lCbxseqNjTH7geF1vP5Uje1SYLZVGVqDl5dw/6RePLEmka0nchgf1zY6h5RSLSuroJQ1uzO4bVQ0nV38BrLa9M7iFnDT8CjCgv1Ysumk3VGUUjZ5bUsKFdXVLJjYNoaM1qSFoAUE+Hpz77hYvjyazdEzBXbHUUq1suLySlZsS+GaAV3oGRZkd5wm00LQQu4e24MAXy9e0rMCpTzOOwnp5JdUsHBy2zsbAC0ELaZTkB+3x8fwr70ZZOaX2B1HKdVKKquqeWnTSUb26MTIHqF2x2kWLQQt6L5Jvag2sOwrnXZCKU/xUWIm6edLWHRlb7ujNJsWghYUExrIDUO68eb2VPKLddoJpdydMYYX/3OSuIhgpvWPsDtOs2khaGEPTO5NUXkVr29PsTuKUspi/zmWzeHMCyyc3Asvr7YxnURdtBC0sAGRHbiybzivbE6mtKLK7jhKKQu9+J8TdO0QwE3D2s50EnXRQmCBRVf25lxhOat3pdsdRSllkb1peWw7mcuCiT1dej3ixmjb6V3U2F6hDI3pyJKNJ6nUyeiUcksvfnmC9gE+Lr8ecWNoIbCAiPDQlN6k5hbzkU5Gp5TbScoq4JODZ5g3PpZgf8tm6mk1WggscvUVXegTEcw/vjyhk9Ep5Wb+8eVJ2vl6860Jrr8ecWNoIbCIl5fw0FW9OXKmgA1HsuyOo5RqIWm5xby/N4M5o7sTGuRnd5wWoYXAQjcOiSS6Uzte+CJJzwqUchMvbTqJl8D9k93jbAC0EFjKx9uLB67szZ5Ux+gCpVTbllVQyls705g1PJpuIe3sjtNirFyhLEZEvhCRQyJyUEQeq6PNFBHJF5G9zsdTdb1XWzZ7ZDRhwf787Ysku6MopS7Tsq9OUVlVzaIpbXc6ibpYeUZQCXzPGDMAGAs8LCID6mi3yRgzzPlYbGEeWwT4erNwck++SjrHntTzdsdRSjXT+aJyVmw9xXWDu7XJqaYbYlkhMMZkGmN2O7cLgMNA2779rpnuGtODToG+PL9BzwqUaqte2ZxMUXkVj0yNsztKi2uVPgIRicWxbOX2OnaPE5F9IvKxiAys588vFJEEEUnIzs62Mqolgvx9WDCxJxuOZHEgI9/uOEqpJrpQWsErW04xfWBX+nftYHecFmd5IRCRYOBd4HFjzIVau3cDPYwxQ4Hngffreg9jzBJjTLwxJj48PNzSvFaZOz6WDgE+PL/huN1RlFJNtHzzKQpKK93ybAAsLgQi4oujCLxhjFlTe78x5oIxptC5vQ7wFRG3XP29Q4Av8yb05NODZzmcWbseKqVcVWFZJS9vTmZa/wgGRYXYHccSVo4aEuBl4LAx5pl62nR1tkNERjvz5FiVyW7zJ8QS5OfNCzqCSKk24/VtKeQVV/DtaX3sjmIZKyfJmADcAySKyF7naz8GugMYY14EbgUeFJFKoAS4w7jxnVcdA/2YOz6WF/9zguNnC+jTpb3dkZRSDSgur+SljSeZ1CeMYTEd7Y5jGcsKgTHmK6DBlRqMMS8AL1iVwRXdP6kXy7ec4tnPj/PCnSPsjqOUasCKrSnkFJXz+Dfc92wA9M7iVhca5Me942P5KDGTY2cL7I6jlKpHcXkl/3SeDbTVRekbSwuBDe6f1ItAX2+e+1xHECnlql7bmkJuUTmPf6Ov3VEsp4XABnpWoJRrKyqrZMnGk0zuG87IHp3sjmM5LQQ2uXhW8KyeFSjlcv7/bMC9+wYu0kJgk05BfsybEMu6xEyOnNH7CpRyFYVllSzZeILJfcMZ0d39zwZAC4Gt7p/Ui2A/H/6y/pjdUZRSTq98lcz54gq+d7X79w1cpIXARh0D/VgwyXG3cWK6zkGklN3yiytYsukk37iiC0Pd+L6B2rQQ2Gz+xJ50DPTlz+uP2h1FKY/30qaTFJRW8l0POhsALQS26xDgywOTe/Pl0Wx2pegqZkrZJaewjGWbk7l+SDcGRLrfDKMN0ULgAu4d34OwYD/+/Jn2FShll39uPElpRRXf8ZCRQjVpIXABgX4+PDQlji0ncticdM7uOEp5nDP5pSzfcoqbhkURF+F5c4A1WAhEpIOIfG1xThEZYl0kz3TnmO5EhgTwx0+O4Mbz7inlkp7bcJxqY/iOh/UNXFRvIRCR24AjwLvOxedH1dj9qtXBPE2ArzePX92Xfen5fHrwjN1xlPIYyeeKWLUzjTtHdycmNNDuOLZo6Izgx8BIY8ww4FvAChG52bmvwVlFVfPMGh5F7/Ag/vTZMSqrqu2Oo5RHeGb9Mfy8vXhkquf1DVzUUCHwNsZkAhhjdgBXAT8VkUcBvXZhAR9vL75/TT+SsgpZsyfD7jhKub0DGfms3Xea+RNjCW/vb3cc2zRUCApq9g84i8IUYCZQ5yLz6vJNH9SVIdEh/HX9MUorquyOo5Rb+9NnRwlp58vCyV/rCvUoDRWCB6l1CcgYUwBMB+Zf6o1FJEZEvhCRQ84+hsfqaCMi8pyIJInIfhHx+JVaRIQfTe/P6fxSXt+WYnccpdzW1hM5fHk0mwen9Cakna/dcWxVbyEwxuwDYgFEZFqN1yuMMW804r0rge8ZYwYAY4GHRWRArTbXAn2cj4XAP5qU3k1NiAtjUp8wnt+QRH5xhd1xlHI71dWG3318mG4hAcwbH2t3HNtd6j6CK0VkAo5LQk1ijMk0xux2bhcAh4GoWs1mAq8Zh21ARxHp1tRjuaMnru3PhdIK/v4fXeheqZb2UWIm+9Pz+d41/Qjw9bY7ju0aGj76c8Af+DfgJyJPNfcgIhILDAe219oVBaTVeJ7O14sFIrJQRBJEJCE7O7u5MdqUgZEh3Dwsilc2n+J0XondcZRyG+WV1Tz96VH6d23PzcO/9uvGIzV0aeiXOO4j+AVwxBizuDkHEJFg4F3gcWNMsybeN8YsMcbEG2Piw8PDm/MWbdJ3r3Hc3PKMTlOtVIt5c3sKqbnF/Oja/nh76Uh4uPSlofbGmD8AzbrnWkR8cRSBN4wxa+pokgHE1Hge7XxNAdGdApk3PpZ3d6dzOFMXr1Hqcl0oreC5DUmM69WZKX0950vlpVyqEBys9d9GExEBXgYOG2OeqafZB8Bc5+ihsUD+xXsXlMPDU+IIaefLbz46rFNPKHWZ/v7FCXKLyvnxdVfg+BWlwMLOYmACcA8wVUT2Oh/XicgiEVnkbLMOOAkkAS8BDzXjOG4tJNCXR6f24aukc3x51DP6R5SyQlpuMcs2JzNreBSDo0PsjuNSfOrbUauz+DkReaop/QTGmK+4xFQUxvEV9+HGvqenuntsD1ZsS+E36w4zqU8YPt46aaxSTfXHT4/iJfD9b/azO4rLsbyzWF0+Px8vnri2P0lZhazcmXbpP6CU+h97Us+zdt9pFk7qRWTHdnbHcTmX+mrZAVgLBNd8UUSmWJRH1eOaAV0Y3TOUv64/xoVSvclMqcYyxvDrjw4T3t6fB6707Kkk6tNgITDG/BV4Gwh0dui2E5Hngd+1Rjj1/0SEn10/gJyicv62QW8yU6qxPtyfya6U83zv6r4E+dd7NdyjNeZi8xgcQzy3ADuB0zg6glUrGxwdwuyR0SzbnEzyuSK74yjl8krKq/j9x0cYGNmB2fExl/4DHqoxhaACKAHaAQFAsjFGJ8u3yQ+m98PP24vffHTY7ihKubwlG0+SkVfCz28cqDePNaAxhWAnjkIwCpgEzBGRdyxNpeoV0T6AR6b24d+Hz7LpuA4nVao+p/NK+Md/krh+SDdG9wy1O45La0whWGCMeco562imMWYmjhvBlE3mT4ylR+dAFq89pCuZKVWP3398BGPgyWv72x3F5V2yEBhjEup4bYU1cVRj+Pt485PrruB4ViErdM0Cpb5m56lcPth3mgeu7E10J89ch7gp9M6kNurqAV2Y1CeMZ9Yf41xhmd1xlHIZlVXV/Oz9A0SGBLDoyl52x2kTtBC0USLCL2YMpLSiij98fMTuOEq5jDe2p3LkTAE/u2EAgX46XLQxtBC0Yb3Dg5k/sSfv7Epnd+p5u+MoZbtzhWX8+bOjTIwLY/qgrnbHaTO0ELRxj07tQ5cO/vz8XwepqtbZSZVne/qToxSXV/GLGQN0dtEm0ELQxgX5+/CT6weQmJHPyh2pdsdRyjZ7Us+zKiGNBRN7EhfRrCVUPJYWAjdw45BujO/dmT9+ckQ7jpVHqqyq5ifvHaBrhwC+Pa2P3XHaHC0EbkBEWDxzECUVVfxW7zhWHmj51hQOZV7g5zcOIFjnE2oyLQRuIi4imAcm92bNngy2nDhndxylWs2Z/FKe+ewoU/qFawdxM1lWCERkmYhkiciBevZPEZH8GquXPWVVFk/xyNQ4uocG8rP3D1BeqXccK8/wqw8PUVltWDxjkHYQN5OVZwSvAtMv0WaTMWaY86EL31ymAF9vfjlzICeyi1iy8YTdcZSy3JdHs/goMZNvT42je2e9g7i5LCsExpiNQK5V76/qdlW/CK4f3I3nNiRxMrvQ7jhKWaa4vJKfvn+AuIhg7p+sdxBfDrv7CMaJyD4R+VhEBtbXSEQWikiCiCRkZ+uMm5fy8xsH4O/jxY/fS8SxLLRS7ueZz46Rfr6E380ajL+Pt91x2jQ7C8FuoIcxZijwPPB+fQ2NMUuMMfHGmPjw8PDWytdmRXQI4MfXXcG2k7m8k5BudxylWlxiej7LNidz55jujIrVKaYvl22FwBhzwRhT6NxeB/iKSJhdedzN7fExjI4N5TfrDpNdoPcWKPdRWVXNE2v2Exbsz4+m6xTTLcG2QiAiXcXZxS8io51ZcuzK4268vITfzhpMSXkVv1h70O44SrWYpV8lc/D0BX45YyAh7XztjuMWrBw+uhLYCvQTkXQRWSAii0RkkbPJrcABEdkHPAfcYfSCdouKiwjm0WlxfLQ/k08OnLE7jlKX7UR2Ic+sP8Y1A7roPQMtyLJb8Iwxcy6x/wXgBauOrxweuLI36xLP8LN/HWBsr1A6BvrZHUmpZqmqNvxw9X7a+Xrz65v0noGWZPeoIWUxX28vnp49hPNF5Sz+8JDdcZRqtte2nmJXynmeumEAER0C7I7jVrQQeICBkSE8OKU3a3Zn8MWRLLvjKNVkqTnF/PETxzQSs0ZE2R3H7Wgh8BCPTI2jT0QwT65JJL+4wu44SjVadbXhB6v34e0l/PbmwXpJyAJaCDyEv483f75tKNmFZTqKSLUpr2w5xfbkXJ66cQCRHdvZHcctaSHwIEOiO/LwVXG8tyeDTw5k2h1HqUtKyirkj58cYVr/CGaPjLY7jtvSQuBhHrkqjoGRHfjJewd0ERvl0iqrqvneO/to5+fN72bpJSEraSHwMH4+Xjxz2zAKSiv5ic5FpFzYP748wb60PH590yAdJWQxLQQeqF/X9nzvmr58evCszkWkXNK+tDye/fw4Nw6N5IYhkXbHcXtaCDzUfZN6MbZXKL9Ye5CUnCK74yj1X8XllTy+ai8R7f359cxBdsfxCFoIPJS3l/DMbcPw8RIeX7WXyipd0Uy5hl99eJhTOUX8+bZhhATqXEKtQQuBB4vs2I7f3DyYPal5PL8hye44SrH+0FlW7khl4eRejOvd2e44HkMLgYe7cWgks4ZH8fyG4+xI1gXllH3O5Jfyw9X7GNCtA9+9uq/dcTyKFgLF4psG0T00kMfe2kNecbndcZQHqqo2PPbWHsoqq3n+zuG64lgr00KgCPb34fk5IzhXWMYPVu/XIaWq1b2wIYntybksnjmI3uHBdsfxOFoIFACDo0P40fT+rD90lhXbUuyOozzIjuRcnv38GDcPj+IWnVDOFlYuTLNMRLJE5EA9+0VEnhORJBHZLyIjrMqiGmfBxJ5M7R/Brz88TGJ6vt1xlAfIKSzj0ZV76B4ayK90jQHbWHlG8CowvYH91wJ9nI+FwD8szKIaQUT40+yhdA7246E3d+kspcpSVdWGx1ftJbe4nL/dNYJgf8vWyVKXYFkhMMZsBBoahjITeM04bAM6ikg3q/KoxgkN8uOFO0eQmVfK91fv0/4CZZnnNxxn0/Fz/HLGQAZGhtgdx6PZ2UcQBaTVeJ7ufE3ZbGSPTjx53RWsP3SWlzadtDuOckNfHT/Hs58fZ9bwKO4YFWN3HI/XJjqLRWShiCSISEJ2drbdcTzC/AmxXDuoK3/45ChbT+TYHUe5kYy8Eh59aw9x4cH8+mbtF3AFdhaCDKDmV4Fo52tfY4xZYoyJN8bEh4eHt0o4Tyci/PHWIcR2DuSRN3dzOq/E7kjKDZRWVLFoxS4qKqt58Z6RBPppv4ArsLMQfADMdY4eGgvkG2N0tRQX0j7Al3/eE09ZZTUPvr6L0ooquyOpNswYw0/fP0BiRj7P3D5M7xdwIVYOH10JbAX6iUi6iCwQkUUissjZZB1wEkgCXgIesiqLar64iGD+fNtQ9qXn89S/DmjnsWq217elsHpXOo9O68PVA7rYHUfVYNl5mTFmziX2G+Bhq46vWs43B3bl21PjeH5DEgO6dWDehJ52R1JtzNYTOfxy7SGm9o/g8Wl97I6jamkTncXKft/5Rl+uHtCFxR8eYuMx7bBXjZeaU8yDb+wiNiyIv94xDC8v7Rx2NVoIVKN4eQl/uX0Yfbu05+E3d3Miu9DuSKoNKCitYMHynQAsnRtPhwBdX8AVaSFQjRbs78NLc+Px8/bi/uUJOlOpapBjRtG9JJ8r4u93jSA2LMjuSKoeWghUk8SEBvLiPSNJP1/CAyt2UVapI4nU1xlj+OXag2w4ksUvZgxkfO8wuyOpBmghUE02KjaUp2cPYXtyLk+8m6gjidTXvPxVMq9tTWHh5F7cPbaH3XHUJejdHKpZZg6LIi23mD99doyY0EBdUUr91ycHzvCbdYe5dlBXnpje3+44qhG0EKhme/iqOFJzi3nu8+NEdQzg9lHd7Y6kbLYrJZfH3trDsJiO/OV2HSHUVmghUM0mIvzm5sFkFZTx5JpEOgX6cc3ArnbHUjY5draA+a8mENmxHUvnxhPgq8tNthXaR6Aui6+3F3+/awSDozvy7ZV72JHc0Mzjyl1l5JUw9+Ud+Pt48dr80XQO9rc7kmoCLQTqsgX6+fDKvFFEdWrHguU7OZx5we5IqhXlFJYx9+XtFJVVsnz+aGJCA+2OpJpIC4FqEaFBfrw2fzTB/j7c8/J2veHMQ+SXVDB32Q7Sz5ew9N54rujWwe5Iqhm0EKgWE90pkNfvGwPA3Uu3k5ZbbHMiZaWiskrmv7qTY2cLePGekYzp1dnuSKqZtBCoFtU7PJgVC8ZQXF7FXUu3cya/1O5IygKlFVUsXJHA3rQ8np8znKv6RdgdSV0GLQSqxV3RrQPL548mt6icOS9t02LgZkorqrj/tQS2nMjh6VuHMH2QLjXe1mkhUJYYFtOR5fNHk11QpsXAjVwsAl8lneOPtwxh1ohouyOpFqCFQFlmZI9O/y0GdyzZSma+LnfZlpWUV3HfckcRePrWocyO10Xn3YWlhUBEpovIURFJEpEn6tg/T0SyRWSv83GflXlU6xvZoxOvLRhNTmE5s1/cSkpOkd2RVDMUlFZw77IdbD7hKAK3jtQzAXdi5VKV3sDfgGuBAcAcERlQR9NVxphhzsdSq/Io+4zo3ok37x9LUVkls1/cyvGzBXZHUk1wvqicu5ZuZ3fqeZ67Y7gWATdk5RnBaCDJGHPSGFMOvAXMtPB4yoUNjg5h1QPjALjtn1vZn55nbyDVKGcvlHL7kq0cOVPAP+8ZyY1DI+2OpCxgZSGIAtJqPE93vlbbLSKyX0RWi0idFx1FZKGIJIhIQna2LpPYVvXt0p53Fo0jyN+HO5Zs48ujWXZHUg1Iyipg1t+3kH6+hFfnjWLaFbrgvLuyu7N4LRBrjBkCrAeW19XIGLPEGBNvjIkPDw9v1YCqZfXoHMSaB8cT2zmI+5YnsHpXut2RVB0STuVyyz+2UlZZzaqF4xgfpwvLuDMrC0EGUPMbfrTztf8yxuQYY8qcT5cCIy3Mo1xERIcAVj0wlrG9OvP9d/bx3OfHdXEbF/JxYiZ3Ld1OaJAfax4cz+DoELsjKYtZWQh2An1EpKeI+AF3AB/UbCAiNe9EmQEctjCPciHtA3xZNm8Us4ZH8cz6Yzy+ai+lFbrspZ2MMbyw4TgPvrGbgZEdePfB8XTvrBPIeQLL1iMwxlSKyCPAp4A3sMwYc1BEFgMJxpgPgEdFZAZQCeQC86zKo1yPn48Xf75tKL0jgnn606Ok5haz5J54wtvrFMatrbSiiifXJPLengxuGhbJ728ZousJeBBpa6fk8fHxJiEhwe4YqoV9nJjJd97eS6dAP/5+1wiGd+9kdySPcTqvhAdf38W+9Hy+f01fHr4qDhFdWczdiMguY0x8Xfvs7ixWCoBrB3dj9aLxeHsJt/9zGyt3pNodySNsOXGOG5//ihPZRbx490gemdpHi4AH0kKgXMagqBDWPjKRMb1CeXJNIj94Zx/F5ZV2x3JL1dWGf3x5gruXbqdjoC/vPzyB6YN0mVFPpWsWK5fSKciPV781mr+sP8bfvkxiT1oeL9w5nP5ddcGTlpJdUMZ3397LpuPnuH5wN/5w6xCC/fVXgSfTMwLlcry9hO9/sx8r5o8hr7iCmS9sZsW2FB1i2gI2Hsvm2mc3sSM5l9/ePJgX7hyuRUBpIVCua2KfMD5+bBJjenXmZ+8f4N5Xdup01s1UXF7JT99PZO6yHXQK9OVfj0zgzjHdtT9AAVoIlIsLb+/Pq/NG8auZA9mZnMs1f/kP7+1J17ODJth5Kpdrn93EG9tTuW9iT9Z+e6JealP/QwuBcnleXsI942JZ99gk+nRpz3dW7ePeV3aSmqNrIjckv7iCJ9ckMvvFrVRVG1beP5af3jBA7w9QX6P3Eag2parasGLrKZ7+9ChVxvDYtL4smNgTPx/9TnORMYa1+zNZvPYQuUVlLJjYk+9c3ZdAP+0L8GQN3UeghUC1SafzSvj5BwdZf+gsPcOC+Ml1VzDtigiPv+admJ7P4g8PsvPUeQZHhfC7WYMZFKVzBSktBMqNfXE0i199eIiT2UVM6hPGj6b398hffBl5Jfx1/TFW704nNNCP73+zH7fFx+Dt5dmFUf0/LQTKrVVUVfPa1hSe+/w4+SUVXD+4G9+9pi+9w4Ptjma5c4Vl/P2LE7y+LQWAueN68Og3+tAhwNfmZMrVaCFQHuFCaQVLN55k6VfJlFZUcf2QSBZd2YuBke53hnA6r4SXNp3krR1plFVWcevIaB77Rl+iOrazO5pyUVoIlEc5V1jGS5tO8sa2VArLKpnSL5z5E3oyMS4MrzZ+qeRARj6vbjnFv/ZmUG1g5rBIHpoSR1yE+5/9qMujhUB5pPziClZsO8WrW05xrrCcnmFB3D22B7OGR9EpyM/ueI1WUl7FpwfP8NrWU+xOzaOdrze3xUdz/+ReRHfS9QJU42ghUB6trLKKjxPPsHzrKfak5uHrLVzVL4JZI6KY0i/CJcfVV1UbdiTn8t6edNYlnqGwrJLYzoHcMy6WW0dGE9JO+wBU0zRUCHRgsXJ7/j7e3DQ8ipuGR3Ho9AXW7E7n/b2n+ezQWQL9vJnSL5xrBnRlct9wQm08Uygur2TbyRw+PXCWfx8+S05ROUF+3lw7uBuzhkcxtlfnNn9pS7kmS88IRGQ68CyOFcqWGmN+X2u/P/AajrWKc4DbjTGnGnpPPSNQLaGyqpotJ3L49OAZPjt0luwCx9LZA7p1YGKfMOJ7dGJoTEe6dAiwLEN+cQX7M/LYnZLH5hPn2JN6nooqQ7C/D1f1j+CaAV2YdkWE3gimWoQtl4ZExBs4BlwNpONYw3iOMeZQjTYPAUOMMYtE5A7gZmPM7Q29rxYC1dKqqw370vPYnHSOzUk57Eo5T3lVNQBdOwTQv1t74sKD6R0RTEynQLqG+NOlQwDtGzFEs7SiirMXSjmTX0pGXgknsgs5kVXE0bMFJJ8rAkAEBkWGMD6uMxN6hzGmVyj+Pq53uUq1bXYVgnHAL4wx33Q+fxLAGPO7Gm0+dbbZKiI+wBkg3DQQSguBslppRRWHMi+wNzWPfel5HDtbyMnsQsoqq/+nnZ+3F8EBPgT5e+Pv483FizYVVdUUllVRWFZBacX//hkfL6FH50DiIoIZEt2RYTEdGRwdouP+leXs6iOIAtJqPE8HxtTXxrnYfT7QGThXs5GILAQWAnTv3t2qvEoBEODrzYjunRhRY93k6mpDRl4JGXkl//2Gf764gsKyCorKqiirrPpvWx8vL4L8fWgf4EOHAB+6dAiga0gA3ULa0aNzIL7eOi+Sci1t4uKjMWYJsAQcZwQ2x1EeyMtLiAkNJCZUh2sq92PlV5MMIKbG82jna3W2cV4aCsHRaayUUqqVWFkIdgJ9RKSniPgBdwAf1GrzAXCvc/tWYEND/QNKKaVanmWXhpzX/B8BPsUxfHSZMeagiCwGEowxHwAvAytEJAnIxVEslFJKtSJL+wiMMeuAdbVee6rGdikw28oMSimlGqbDF5RSysNpIVBKKQ+nhUAppTycFgKllPJwbW4aahHJBlKa+cfDqHXXsotw1Vzgutk0V9NorqZxx1w9jDHhde1oc4XgcohIQn1zbdjJVXOB62bTXE2juZrG03LppSGllPJwWgiUUsrDeVohWGJ3gHq4ai5w3Wyaq2k0V9N4VC6P6iNQSin1dZ52RqCUUqoWLQRKKeXh3LoQiMjTInJERPaLyHsi0rGedtNF5KiIJInIE62Qa7aIHBSRahGpdyiYiJwSkUQR2Ssilq/P2YRcrfp5OY8ZKiLrReS487+d6mlX5fy89opI7WnPWypLgz+/iPiLyCrn/u0iEmtFjmbkmici2TU+n/taKdcyEckSkQP17BcRec6Ze7+IjHCRXFNEJL/G5/VUXe0syBUjIl+IyCHn/4+P1dGmZT8zY4zbPoBrAB/n9h+AP9TRxhs4AfQC/IB9wACLc10B9AO+BOIbaHcKCGvFz+uSuez4vJzH/SPwhHP7ibr+Lp37Ci3OccmfH3gIeNG5fQewqhU+n8bkmge80Fr/nmocdzIwAjhQz/7rgI8BAcYC210k1xTgQxs+r27ACOd2e+BYHX+XLfqZufUZgTHmM2NMpfPpNhyrpNU2Gkgyxpw0xpQDbwEzLc512Bhz1MpjNEcjc7X65+U0E1ju3F4O3NQKx6xLY37+mllXA9NERLCWXX8vl2SM2YhjvZH6zAReMw7bgI4i0s0FctnCGJNpjNnt3C4ADuNY372mFv3M3LoQ1DIfRwWtLQpIq/E8na9/6HYxwGcisktEFtodxsmuz6uLMSbTuX0G6FJPuwARSRCRbSJykwU5GvPz/7eN84tIPtDZgixNzQVwi/NSwmoRialjvx1c+f/BcSKyT0Q+FpGBrX1w52XF4cD2Wrta9DNrE4vXN0RE/g10rWPXT4wx/3K2+QlQCbzhSrkaYaIxJkNEIoD1InLE+S3G7lyWaChbzSfGGCMi9Y177uH8zHoBG0Qk0RhzoqWztlFrgZXGmDIReQDHWctUmzO5st04/j0Vish1wPtAn9Y6uIgEA+8CjxtjLlh5rDZfCIwx32hov4jMA24AphnnxbVaMoCa34yina9ZmquR75Hh/G+WiLyH4/T/sgpBC+Sy5POChrOJyFkR6WaMyXSeAmfV8x4XP7OTIvIljm9TLVkIGvPzX2yTLiI+QAiQ04IZmpXLGFMzw1Ic/S6uwLJ/U5ej5i9fY8w6Efm7iIQZYyyfjE5EfHEUgTeMMWvqaNKin5lbXxoSkenAD4EZxpjieprtBPqISE8R8cPRuWfJaJOmEJEgEWl/cRtHx3edoxtamV2f1wfAvc7te4Gvnb2ISCcR8XduhwETgEMtnKMxP3/NrLcCG+r5EtKquWpdQ56B49qzK/gAmOscCTMWyK9xGdA2ItL1Yt+OiIzG8fvS6oKO85gvA4eNMc/U06xlP7PW7hFvzQeQhOM62l7n4+JIjkhgXY121+HomT+B4xKJ1bluxnFNrww4C3xaOxeO0R/7nI+DrpLLjs/LeczOwOfAceDfQKjz9XhgqXN7PJDo/MwSgQUWZfnazw8sxvGFAyAAeMf5728H0KuVPqNL5fqd89/SPuALoH8r5VoJZAIVzn9fC4BFwCLnfgH+5sydSAMj6Vo51yM1Pq9twPhWyjURR//g/hq/u66z8jPTKSaUUsrDufWlIaWUUpemhUAppTycFgKllPJwWgiUUsrDaSFQSikPp4VAKaU8nBYCpZTycFoIlLpMIjLKOZFbgPOO8IMiMsjuXEo1lt5QplQLEJFf47ijuB2Qboz5nc2RlGo0LQRKtQDn/D47gVIcUxFU2RxJqUbTS0NKtYzOQDCOFaUCbM6iVJPoGYFSLUAc6yO/BfQEuhljHrE5klKN1ubXI1DKbiIyF6gwxrwpIt7AFhGZaozZYHc2pRpDzwiUUsrDaR+BUkp5OC0ESinl4bQQKKWUh9NCoJRSHk4LgVJKeTgtBEop5eG0ECillIf7PzkjnCbkdy+YAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plot_function(f, 'x', 'x**2')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plot_function(f, 'x', 'x**2')\n",
"plt.scatter(-1.5, f(-1.5), color='red');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Calculating Gradients"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# let's pick a tensor value at which we want gradient\n",
"xt = tensor(4.).requires_grad_()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor(4., requires_grad=True)"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"xt"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor(16., grad_fn=<PowBackward0>)"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# calculate function with that value\n",
"yt = f(xt)\n",
"yt"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"# tell pytorch to calculate the gradient\n",
"yt.backward()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor(8.)"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# view the gradient by checking \"grad\" attribute of tensor\n",
"# the derivative of x**2 is 2*x and so value is 8\n",
"xt.grad"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"# same steps with vector argument for function \n",
"xt = tensor([3.,4.,10.]).requires_grad_()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([ 3., 4., 10.], requires_grad=True)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"xt"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"# define function to return scalar value\n",
"def f(x): \n",
" return (x**2).sum()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor(125., grad_fn=<SumBackward0>)"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# calculate function and return scalar value\n",
"# which in this case will be 125 (3**2 + 4**2 + 10**2 = 9 + 16 + 100 = 125)\n",
"yt = f(xt)\n",
"yt"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"# tell pytorch to calculate the gradient\n",
"yt.backward()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([ 6., 8., 20.])"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# view the gradient by checking \"grad\" attribute of tensor\n",
"xt.grad"
]
}
],
"metadata": {
"jupytext": {
"split_at_heading": true
},
"kernelspec": {
"display_name": "fastai",
"language": "python",
"name": "fastai"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.13"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment