{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "4jQLbOS7JhxD" }, "source": [ "# PyTorch Introduction\n", "\n", "Today, we will be intoducing PyTorch, \"an open source deep learning platform that provides a seamless path from research prototyping to production deployment\".\n", "\n", "This notebook is by no means comprehensive. If you have any questions the documentation and Google are your friends.\n", "\n", "Goal takeaways:\n", "- Automatic differentiation is a powerful tool\n", "- PyTorch implements common functions used in deep learning" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Rw-LPR3HJhxJ" }, "outputs": [], "source": [ "import torch\n", "import torch.nn as nn\n", "import torch.nn.functional as F\n", "\n", "from mpl_toolkits.mplot3d import Axes3D\n", "import matplotlib.pyplot as plt\n", "\n", "import numpy as np\n", "\n", "torch.manual_seed(446)\n", "np.random.seed(446)" ] }, { "cell_type": "markdown", "metadata": { "id": "GQDY0uBiJhxJ" }, "source": [ "## Tensors and relation to numpy\n", "\n", "By this point, we have worked with numpy quite a bit. PyTorch's basic building block, the `tensor` is similar to numpy's `ndarray`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "LHKLjTFWJhxK", "outputId": "6499ece2-946c-4275-ab68-1852c6c19e1d" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x_numpy, x_torch\n", "Numpy: [0.1 0.2 0.3]\n", "Torch: tensor([0.1000, 0.2000, 0.3000])\n", "\n", "to and from numpy and pytorch\n", "Numpy -> Torch: tensor([0.1000, 0.2000, 0.3000], dtype=torch.float64)\n", "Torch -> Numpy: [0.1 0.2 0.3]\n", "\n", "x+y\n", "Numpy: [3.1 4.2 5.3]\n", "Torch: tensor([3.1000, 4.2000, 5.3000])\n", "\n", "norm\n", "Numpy: 0.374166\n", "Torch: 0.374166\n", "\n", "mean along the 0th dimension\n", "Numpy: [2. 3.]\n", "Torch: tensor([2., 3.])\n" ] } ], "source": [ "# we create tensors in a similar way to numpy nd arrays\n", "x_numpy = np.array([0.1, 0.2, 0.3])\n", "x_torch = torch.tensor([0.1, 0.2, 0.3])\n", "print('x_numpy, x_torch')\n", "print(f\"Numpy: {x_numpy}\")\n", "print(f\"Torch: {x_torch}\")\n", "print()\n", "\n", "# to and from numpy, pytorch\n", "print('to and from numpy and pytorch')\n", "print(f\"Numpy -> Torch: {torch.from_numpy(x_numpy)}\")\n", "print(f\"Torch -> Numpy: {x_torch.numpy()}\")\n", "print()\n", "\n", "# we can do basic operations like +-*/\n", "y_numpy = np.array([3,4,5.])\n", "y_torch = torch.tensor([3,4,5.])\n", "print(\"x+y\")\n", "print(f\"Numpy: {x_numpy + y_numpy}\")\n", "print(f\"Torch: {x_torch + y_torch}\")\n", "print()\n", "\n", "# many functions that are in numpy are also in pytorch\n", "print(\"norm\")\n", "print(f\"Numpy: {np.linalg.norm(x_numpy):.6g}\")\n", "print(f\"Torch: {torch.norm(x_torch):.6g}\")\n", "print()\n", "\n", "# to apply an operation along a dimension,\n", "# we use the dim keyword argument instead of axis\n", "x_numpy = np.array([[1,2],[3,4.]])\n", "x_torch = torch.tensor([[1,2],[3,4.]])\n", "print(\"mean along the 0th dimension\")\n", "print(f\"Numpy: {np.mean(x_numpy, axis=0)}\")\n", "print(f\"Torch: {torch.mean(x_torch, dim=0)}\")\n" ] }, { "cell_type": "markdown", "metadata": { "id": "YgGuAT7-JhxK" }, "source": [ "### `Tensor.view`\n", "We can use the `Tensor.view()` function to reshape tensors similarly to `numpy.reshape()`.\n", "\n", "**Note:** A imporant difference between `view` and `reshape` is that `view` returns reference to the same tensor as the one passed in. This means that if we modify values in the output of `view` they will also change for its input. This can lead to some issues. For more information see [PyTorch](https://pytorch.org/docs/stable/tensor_view.html).\n", "\n", "Similarly to `reshape` it can also automatically calculate the correct dimension if a `-1` is passed in. This is useful if we are working with batches, but the batch size is unknown." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "c87j1vX4JhxL", "outputId": "c91bfe24-7027-4fe4-a01d-953fed4d1066" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "torch.Size([10000, 3, 28, 28])\n", "torch.Size([10000, 3, 784])\n", "torch.Size([10000, 3, 784])\n", "torch.Size([10000, 3, 784])\n" ] } ], "source": [ "# \"MNIST\" - like\n", "N, C, W, H = 10000, 3, 28, 28\n", "X = torch.randn((N, C, W, H))\n", "\n", "print(X.shape)\n", "print(X.view(N, C, 784).shape)\n", "print(X.view(-1, C, 784).shape) # automatically choose the 0th dimension\n", "\n", "# Alternatively you can use torch.reshape, though it's less commonly used\n", "print(torch.reshape(X, (-1, C, 784)).shape)" ] }, { "cell_type": "markdown", "metadata": { "id": "xYZQu4eyJhxM" }, "source": [ "## PyTorch as an auto grad framework\n", "\n", "Main benefit of PyTorch is that it keeps track of gradients for us, as we do the calculations.\n", "This is done through computation graphs, which you can read more about in Appendix 1 of this notebook.\n", "The example below shows how to use these gradients.\n", "\n", "Consider the function $f(x) = (x-2)^2$.\n", "\n", "Q: Compute $\\frac{d}{dx} f(x)$ and then compute $f'(1)$.\n", "\n", "We make a `backward()` call on the leaf variable (`y`) in the computation, computing all the gradients of `y` at once." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "mpNsPVaFJhxM", "outputId": "477abfe0-ce30-41f0-bdeb-b3b5866e1fc7" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Analytical f'(x): tensor([-2.], grad_fn=)\n", "PyTorch's f'(x): tensor([-2.])\n" ] } ], "source": [ "def f(x):\n", " return (x-2)**2\n", "\n", "def fp(x):\n", " return 2*(x-2)\n", "\n", "x = torch.tensor([1.0], requires_grad=True)\n", "\n", "y = f(x)\n", "y.backward()\n", "\n", "print('Analytical f\\'(x):', fp(x))\n", "print('PyTorch\\'s f\\'(x):', x.grad)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "w2ui_X5kJhxM" }, "source": [ "It can also find gradients of functions.\n", "\n", "Let $w = [w_1, w_2]^T$\n", "\n", "Consider $g(w) = 2w_1w_2 + w_2\\cos(w_1)$\n", "\n", "Q: Compute $\\nabla_w g(w)$ and verify $\\nabla_w g([\\pi,1]) = [2, \\pi - 1]^T$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "XCmYCypXJhxN", "outputId": "fbbe682b-8f89-4663-fb0c-8ac6d32d2509" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Analytical grad g(w) tensor([2.0000, 5.2832])\n", "PyTorch's grad g(w) tensor([2.0000, 5.2832])\n" ] } ], "source": [ "def g(w):\n", " return 2*w[0]*w[1] + w[1]*torch.cos(w[0])\n", "\n", "def grad_g(w):\n", " return torch.tensor([2*w[1] - w[1]*torch.sin(w[0]), 2*w[0] + torch.cos(w[0])])\n", "\n", "w = torch.tensor([np.pi, 1], requires_grad=True)\n", "\n", "z = g(w)\n", "z.backward()\n", "\n", "print('Analytical grad g(w)', grad_g(w))\n", "print('PyTorch\\'s grad g(w)', w.grad)" ] }, { "cell_type": "markdown", "metadata": { "id": "palemKNRJhxN" }, "source": [ "## Using the gradients - Linear regression using GD with torch\n", "Now that we have gradients, we can use our favorite optimization algorithm: gradient descent!\n", "\n", "**Note**: This example is an illustration to connect ideas we have seen before to PyTorch's way of doing things. We will see how to do this in the \"PyTorchic\" way in the next example.\n", "\n", "But first lets generate synthetic data to solve on our problem." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "80oVXI15JhxO", "outputId": "b96a7cbe-d58a-4909-a767-b0d5efcd46f2" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X shape torch.Size([50, 2])\n", "y shape torch.Size([50, 1])\n", "w shape torch.Size([2, 1])\n" ] } ], "source": [ "# make a simple linear dataset with some noise\n", "d = 2\n", "n = 50\n", "\n", "X = torch.randn(n,d)\n", "true_w = torch.tensor([[-1.0], [2.0]])\n", "y = X @ true_w + torch.randn(n,1) * 0.1\n", "print('X shape', X.shape)\n", "print('y shape', y.shape)\n", "print('w shape', true_w.shape)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "fPMrxyGqJhxO" }, "source": [ "We will also define a helper function to visualize result's of what $\\hat{w}$ we have learned." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Jzl5zI8pJhxO" }, "outputs": [], "source": [ "def visualize_fun(w, title, num_pts=20):\n", " \n", " x1, x2 = np.meshgrid(np.linspace(-2,2, num_pts), np.linspace(-2,2, num_pts))\n", " X_plane = torch.tensor(np.stack([np.reshape(x1, (num_pts**2)), np.reshape(x2, (num_pts**2))], axis=1)).float()\n", " y_plane = np.reshape((X_plane @ w).detach().numpy(), (num_pts, num_pts))\n", " \n", " plt3d = plt.figure().gca(projection='3d')\n", " plt3d.plot_surface(x1, x2, y_plane, alpha=0.2)\n", "\n", " ax = plt.gca()\n", " ax.scatter(X[:,0].numpy(), X[:,1].numpy(), y.numpy(), c='r', marker='o')\n", "\n", " ax.set_xlabel('$X_1$')\n", " ax.set_ylabel('$X_2$')\n", " ax.set_zlabel('$Y$')\n", " \n", " plt.title(title)\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "_RCypV6yJhxO", "outputId": "fbdf5cd9-7f12-4f5a-ff02-469e6be90e22" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "visualize_fun(true_w, 'Dataset and true $w$')" ] }, { "cell_type": "markdown", "metadata": { "id": "BwfAi7BaJhxP" }, "source": [ "### Algorithm for Linear regression using GD with automatically computed derivatives\n", "\n", "**Note**: This example is an illustration to connect ideas we have seen before to PyTorch's way of doing things. We will see how to do this in the \"PyTorchic\" way in the next example." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "nTpC3BbeJhxP", "outputId": "100e50ef-5d1d-411f-eefa-d156acbed05e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "iter,\tloss,\tw\n", "0,\t10.80,\t[0.4813288 0.5591256]\n", "1,\t5.77,\t[0.09721348 0.96224976]\n", "2,\t3.09,\t[-0.18760675 1.2525702 ]\n", "3,\t1.66,\t[-0.39907765 1.4613875 ]\n", "4,\t0.89,\t[-0.55630636 1.6113691 ]\n", "5,\t0.48,\t[-0.6733763 1.7189198]\n", "6,\t0.26,\t[-0.76067793 1.7959039 ]\n", "7,\t0.15,\t[-0.8258846 1.8508956]\n", "8,\t0.08,\t[-0.8746693 1.8900856]\n", "9,\t0.05,\t[-0.9112309 1.9179397]\n", "10,\t0.03,\t[-0.93868095 1.9376758 ]\n", "11,\t0.02,\t[-0.95932806 1.9516102 ]\n", "12,\t0.02,\t[-0.97488767 1.9614073 ]\n", "13,\t0.01,\t[-0.98663604 1.968262 ]\n", "14,\t0.01,\t[-0.9955243 1.97303 ]\n", "15,\t0.01,\t[-1.0022622 1.9763234]\n", "16,\t0.01,\t[-1.0073804 1.9785789]\n", "17,\t0.01,\t[-1.0112761 1.9801074]\n", "18,\t0.01,\t[-1.0142475 1.9811295]\n", "19,\t0.01,\t[-1.0165185 1.981801 ]\n", "\n", "true w\t\t [-1. 2.]\n", "estimated w\t [-1.0165185 1.981801 ]\n" ] } ], "source": [ "# define a linear model with no bias\n", "def model(X, w):\n", " return X @ w\n", "\n", "# the residual sum of squares loss function\n", "def rss(y, y_hat):\n", " return torch.norm(y - y_hat)**2 / n\n", "\n", "# Define hyperparameters\n", "step_size = 0.1\n", "\n", "# And starting w\n", "w = torch.tensor([[1.], [0]], requires_grad=True)\n", "\n", "print('iter,\\tloss,\\tw')\n", "for i in range(20):\n", " y_hat = model(X, w)\n", " loss = rss(y, y_hat)\n", " \n", " loss.backward() # compute the gradient of the loss\n", " \n", " w.data = w.data - step_size * w.grad # do a gradient descent step\n", " \n", " print('{},\\t{:.2f},\\t{}'.format(i, loss.item(), w.view(2).detach().numpy()))\n", " \n", " # We need to zero the grad variable since the backward()\n", " # call accumulates the gradients in .grad instead of overwriting.\n", " # The detach_() is for efficiency. You do not need to worry too much about it.\n", " w.grad.detach()\n", " w.grad.zero_()\n", "\n", "print('\\ntrue w\\t\\t', true_w.view(2).numpy())\n", "print('estimated w\\t', w.view(2).detach().numpy())" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "JIDXZqI1JhxP", "outputId": "b6b9d34f-537b-4e14-98cf-f9881684f992" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "visualize_fun(w, 'Dataset with learned $w$ (Manual GD)')" ] }, { "cell_type": "markdown", "metadata": { "id": "5U9Xi9AmJhxP" }, "source": [ "## torch.nn.Module\n", "\n", "`Module` is PyTorch's way of performing operations on tensors. Modules are implemented as subclasses of the `torch.nn.Module` class. All modules are callable and can be composed together to create complex functions.\n", "\n", "[`torch.nn` docs](https://pytorch.org/docs/stable/nn.html)\n", "\n", "Note: most of the functionality implemented for modules can be accessed in a functional form via `torch.nn.functional`, but these require you to create and manage the weight tensors yourself. **Note:** This\n", "\n", "[`torch.nn.functional` docs](https://pytorch.org/docs/stable/nn.html#torch-nn-functional).\n", "\n", "### Linear Module\n", "The bread and butter of modules is the Linear module which does a linear transformation with a bias. It takes the input and output dimensions as parameters, and creates the weights in the object. It is just a matrix multiplication and addition of bias:\n", "\n", "$$ f(X) = XW + b, f: \\mathbb{R}^{n \\times d} \\rightarrow \\mathbb{R}^{n \\times h} $$\n", "\n", "where $X \\in \\mathbb{R}^{n \\times d}$, $W \\in \\mathbb{R}^{d \\times h}$ and $b \\in \\mathbb{R}^{h}$\n", "\n", "Unlike how we initialized our $w$ manually, the Linear module automatically initializes the weights randomly. For minimizing non convex loss functions (e.g. training neural networks), initialization is important and can affect results. If training isn't working as well as expected, one thing to try is manually initializing the weights to something different from the default. PyTorch implements some common initializations in `torch.nn.init`.\n", "\n", "[`torch.nn.init` docs](https://pytorch.org/docs/stable/nn.html#torch-nn-init)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Tur-YOxpJhxQ", "outputId": "2577cfce-fa7c-4231-d42a-8d91d516a37e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "example_tensor torch.Size([2, 3])\n", "transformed torch.Size([2, 4])\n", "\n", "We can see that the weights exist in the background\n", "\n", "W: Parameter containing:\n", "tensor([[ 0.2151, -0.2631, 0.4498],\n", " [-0.3092, 0.3098, -0.4239],\n", " [-0.0499, -0.2222, 0.0085],\n", " [-0.0356, 0.5260, 0.4925]], requires_grad=True)\n", "b: Parameter containing:\n", "tensor([-0.0887, 0.3944, 0.4080, 0.2182], requires_grad=True)\n" ] } ], "source": [ "d_in = 3\n", "d_out = 4\n", "linear_module = nn.Linear(d_in, d_out)\n", "\n", "example_tensor = torch.tensor([[1.,2,3], [4,5,6]])\n", "# applys a linear transformation to the data\n", "transformed = linear_module(example_tensor)\n", "print('example_tensor', example_tensor.shape)\n", "print('transformed', transformed.shape)\n", "print()\n", "print('We can see that the weights exist in the background\\n')\n", "print('W:', linear_module.weight)\n", "print('b:', linear_module.bias)" ] }, { "cell_type": "markdown", "metadata": { "id": "9lDZ2EtyJhxQ" }, "source": [ "### Activation functions\n", "PyTorch implements a number of activation functions including but not limited to `ReLU`, `Tanh`, and `Sigmoid`. Since they are modules, they need to be instantiated." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "a5vAZ1lwJhxQ", "outputId": "06918dca-f65d-4d16-a229-942555cf24ee" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "example_tensor tensor([-1., 1., 0.])\n", "activated tensor([0., 1., 0.])\n" ] } ], "source": [ "activation_fn = nn.ReLU() # we instantiate an instance of the ReLU module\n", "example_tensor = torch.tensor([-1.0, 1.0, 0.0])\n", "activated = activation_fn(example_tensor)\n", "print('example_tensor', example_tensor)\n", "print('activated', activated)" ] }, { "cell_type": "markdown", "metadata": { "id": "zXH-1ipXJhxQ" }, "source": [ "### Sequential\n", "\n", "Many times, we want to compose Modules together. `torch.nn.Sequential` provides a good interface for composing simple modules." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "8ztmvadTJhxQ", "outputId": "6f23a19d-f84e-4218-b46b-d97e4802959b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "transformed torch.Size([2, 1])\n" ] } ], "source": [ "d_in = 3\n", "d_hidden = 4\n", "d_out = 1\n", "model = torch.nn.Sequential(\n", " nn.Linear(d_in, d_hidden),\n", " nn.Tanh(),\n", " nn.Linear(d_hidden, d_out),\n", " nn.Sigmoid()\n", ")\n", "\n", "example_tensor = torch.tensor([[1.,2,3],[4,5,6]])\n", "transformed = model(example_tensor)\n", "print('transformed', transformed.shape)" ] }, { "cell_type": "markdown", "metadata": { "id": "MiNTXI1WJhxR" }, "source": [ "Note: we can access *all* of the parameters (of any `nn.Module`) with the `parameters()` method. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ZL7HKvaYJhxR", "outputId": "ec4b0bd4-bb98-4691-fb44-c55fd47091cd" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parameter containing:\n", "tensor([[-0.1409, 0.0518, 0.3034],\n", " [ 0.0913, 0.2452, -0.2616],\n", " [ 0.5021, 0.0118, 0.1383],\n", " [ 0.4757, -0.3128, 0.2707]], requires_grad=True)\n", "Parameter containing:\n", "tensor([-0.3952, 0.1285, 0.1777, -0.4675], requires_grad=True)\n", "Parameter containing:\n", "tensor([[ 0.0391, -0.4876, -0.1731, 0.4704]], requires_grad=True)\n", "Parameter containing:\n", "tensor([0.0454], requires_grad=True)\n" ] } ], "source": [ "params = model.parameters()\n", "\n", "for param in params:\n", " print(param)" ] }, { "cell_type": "markdown", "metadata": { "id": "8VgP1_kBJhxR" }, "source": [ "### Loss functions\n", "PyTorch implements many common loss functions including `MSELoss` and `CrossEntropyLoss`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "19cgWAGmJhxR", "outputId": "c23d278e-1da9-42ad-b2f8-6d3e4c598e1f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor(0.6667)\n" ] } ], "source": [ "mse_loss_fn = nn.MSELoss()\n", "\n", "input = torch.tensor([[0., 0, 0]])\n", "target = torch.tensor([[1., 0, -1]])\n", "\n", "loss = mse_loss_fn(input, target)\n", "\n", "print(loss)" ] }, { "cell_type": "markdown", "metadata": { "id": "CK7MRcgoJhxS" }, "source": [ "## torch.optim\n", "PyTorch implements a number of gradient-based optimization methods in `torch.optim`, including Gradient Descent. At the minimum, it takes in the model parameters and a learning rate.\n", "\n", "Optimizers do not compute the gradients for you, so you must call `backward()` yourself. You also must call the `optim.zero_grad()` function before calling `backward()` since by default PyTorch does and inplace add to the `.grad` member variable rather than overwriting it.\n", "\n", "This does both the `detach_()` and `zero_()` calls on all tensor's `grad` variables.\n", "\n", "[`torch.optim` docs](https://pytorch.org/docs/stable/optim.html)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "qtSZzh9lJhxS", "outputId": "f94f4ca7-9054-4832-fca1-2ec36034bdc6" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "model params before: Parameter containing:\n", "tensor([[0.1950]], requires_grad=True)\n", "model params after: Parameter containing:\n", "tensor([[0.2219]], requires_grad=True)\n" ] } ], "source": [ "# create a simple model\n", "model = nn.Linear(1, 1)\n", "\n", "# create a simple dataset\n", "X_simple = torch.tensor([[1.]])\n", "y_simple = torch.tensor([[2.]])\n", "\n", "# create our optimizer\n", "optim = torch.optim.SGD(model.parameters(), lr=1e-2)\n", "mse_loss_fn = nn.MSELoss()\n", "\n", "y_hat = model(X_simple)\n", "print('model params before:', model.weight)\n", "loss = mse_loss_fn(y_hat, y_simple)\n", "optim.zero_grad()\n", "loss.backward()\n", "optim.step()\n", "print('model params after:', model.weight)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "NAOiXlvXJhxS" }, "source": [ "As we can see, the parameter was updated in the correct direction" ] }, { "cell_type": "markdown", "metadata": { "id": "kW-pr275JhxS" }, "source": [ "## Linear regression using GD with torch.nn module\n", "\n", "Now let's combine what we've learned to solve linear regression in a \"PyTorchic\" way." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "_iVdcw_VJhxS", "outputId": "0d1abb41-4026-41d4-bcef-b7c1ed673012" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "iter,\tloss,\tw\n", "0,\t4.37,\t[-0.5072827 0.7721884]\n", "1,\t2.34,\t[-0.6624694 1.0903175]\n", "2,\t1.25,\t[-0.77252483 1.3242052 ]\n", "3,\t0.67,\t[-0.85030663 1.4962891 ]\n", "4,\t0.36,\t[-0.90505993 1.6230037 ]\n", "5,\t0.20,\t[-0.9434225 1.716392 ]\n", "6,\t0.11,\t[-0.9701522 1.7852831]\n", "7,\t0.06,\t[-0.98865306 1.8361537 ]\n", "8,\t0.04,\t[-1.0013554 1.8737577]\n", "9,\t0.02,\t[-1.0099901 1.9015862]\n", "10,\t0.02,\t[-1.0157865 1.9222052]\n", "11,\t0.01,\t[-1.019615 1.9375019]\n", "12,\t0.01,\t[-1.0220896 1.9488654]\n", "13,\t0.01,\t[-1.0236413 1.9573189]\n", "14,\t0.01,\t[-1.0245715 1.963617 ]\n", "15,\t0.01,\t[-1.0250894 1.9683164]\n", "16,\t0.01,\t[-1.0253391 1.9718288]\n", "17,\t0.01,\t[-1.0254192 1.9744583]\n", "18,\t0.01,\t[-1.0253965 1.9764304]\n", "19,\t0.01,\t[-1.025315 1.9779121]\n", "\n", "true w\t\t [-1. 2.]\n", "estimated w\t [-1.025315 1.9779121]\n" ] } ], "source": [ "step_size = 0.1\n", "\n", "linear_module = nn.Linear(d, 1, bias=False)\n", "\n", "loss_func = nn.MSELoss()\n", "\n", "optim = torch.optim.SGD(linear_module.parameters(), lr=step_size)\n", "\n", "print('iter,\\tloss,\\tw')\n", "\n", "for i in range(20):\n", " y_hat = linear_module(X)\n", " loss = loss_func(y_hat, y)\n", " optim.zero_grad()\n", " loss.backward()\n", " optim.step()\n", " \n", " print('{},\\t{:.2f},\\t{}'.format(i, loss.item(), linear_module.weight.view(2).detach().numpy()))\n", "\n", "print('\\ntrue w\\t\\t', true_w.view(2).numpy())\n", "print('estimated w\\t', linear_module.weight.view(2).detach().numpy())" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "0XiWTvd9JhxS", "outputId": "7440b0e7-b246-4584-9bbe-56c2dae30568" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "visualize_fun(linear_module.weight.t(), 'Dataset with learned $w$ (PyTorch GD)')" ] }, { "cell_type": "markdown", "metadata": { "id": "rC3kw6ftJhxT" }, "source": [ "## Linear regression using SGD \n", "In the previous examples, we computed the average gradient over the entire dataset (Gradient Descent). We can implement Stochastic Gradient Descent with a simple modification." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "fa9JMaQUJhxT", "outputId": "7f1a29cb-6da9-42d3-eb70-9d9f57868e67" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "iter,\tloss,\tw\n", "0,\t0.01,\t[-0.16747227 0.69458336]\n", "20,\t0.73,\t[-0.5277779 1.409119 ]\n", "40,\t0.05,\t[-0.7416818 1.7194623]\n", "60,\t0.04,\t[-0.80749375 1.8314769 ]\n", "80,\t0.09,\t[-0.888827 1.8813882]\n", "100,\t0.06,\t[-0.93712914 1.9570426 ]\n", "120,\t0.00,\t[-0.964763 1.9772898]\n", "140,\t0.00,\t[-0.9806282 1.9791763]\n", "160,\t0.04,\t[-0.9831248 1.9838824]\n", "180,\t0.01,\t[-0.9979536 1.9885796]\n", "\n", "true w\t\t [-1. 2.]\n", "estimated w\t [-0.9991454 1.9860797]\n" ] } ], "source": [ "step_size = 0.01\n", "\n", "linear_module = nn.Linear(d, 1)\n", "loss_func = nn.MSELoss()\n", "optim = torch.optim.SGD(linear_module.parameters(), lr=step_size)\n", "print('iter,\\tloss,\\tw')\n", "for i in range(200):\n", " rand_idx = np.random.choice(n) # take a random point from the dataset\n", " x = X[rand_idx] \n", " y_hat = linear_module(x)\n", " loss = loss_func(y_hat, y[rand_idx]) # only compute the loss on the single point\n", " optim.zero_grad()\n", " loss.backward()\n", " optim.step()\n", " \n", " if i % 20 == 0:\n", " print('{},\\t{:.2f},\\t{}'.format(i, loss.item(), linear_module.weight.view(2).detach().numpy()))\n", "\n", "print('\\ntrue w\\t\\t', true_w.view(2).numpy())\n", "print('estimated w\\t', linear_module.weight.view(2).detach().numpy())" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "0tuKzHWyJhxT", "outputId": "11a8b7ac-d3c9-4718-ef2d-4a2de6e819a5" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "visualize_fun(linear_module.weight.t(), 'Dataset with learned $w$ (PyTorch SGD)')" ] }, { "cell_type": "markdown", "metadata": { "id": "vhmk4YPWJhxT" }, "source": [ "# Neural Network Basics in PyTorch\n", "\n", "Let's consider the dataset from hw3. We will try and fit a simple neural network to the data." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "cD2kkX3PJhxT", "outputId": "a184128e-adc3-45f4-cbf4-e76312d0af0c" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEYCAYAAABRB/GsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAmDUlEQVR4nO3df3RcZ3kn8O/XyiSRIa2SjVjwxIpDCgaMYqvoYOX4nC0JAaehTmaTQjA2XbYsPrQLS1JWrJ3o1A412KCF5OzSLTWFLa2NMQEzdXC6TqhDs5uDvJWRY8VJDAkFORO6mCZKAStElp/9Y2bk0eje+eV773vv3O/nHJ+jmbkzeu9YM8993+d9n5dmBhERSa8FrhsgIiJuKRCIiKScAoGISMopEIiIpJwCgYhIyikQiIiknAKBiEjKKRCIiKScAoGkDskfkbwuot+1lOQRkj8n+Z98jukm+SDJ50l+ieQ2krc1+Pr/l+SyQBstqXOe6waIxBnJHwH4D2b27RZf4mMAHjKzFTWO2QTgB2b2NpLdAI4A+I0GX/+/Avg4gFtabJ+IegQiIbscwLE6x1wH4N7Sz+8DcL+ZTTX4+vsAXEPyla01T0SBQNpUafhnE8nHS0Mu/5PkhR7HvZ7kd0hOkjxG8saKx/4aQA+A+0j+guTHmnz+QQDXAPhc6fmvrXru+SRfANBb+h3jAH4bwN9XHfdpkvmK28Mk/47k+Wb2IoDDAFa39EaJQIFA2ts6FL8grwTwWgBDlQ+SzAC4D8ADAF4B4MMAdpFcCgBm9l4AEwDWmNnLzezTTT7/WgD/G8CHSs//fuXzzewlAFcD+Gnp8V4Ug8LxqvP4FIpX/X0kPwjgegA3l54PAE8AWN7KGyQCKBBIe/ucmZ0ws+cAfALA2qrHBwC8HMB2M3vJzA4C+JbHcX7O9fkAsALAoxW3uwD8vPIAM/tnAHcD+DKK+YQbzOyFikN+XnqeSEsUCKSdnaj4+ccAFlU9vgjACTM7U3VctsHXP9fnA/MDwfMALvI4bgzF3sImMztR9dhFACab+J0icygQSDtbXPFzD4Bnqx5/FsBikguqjitU3K61YUcjz69nOeYGgqMoDmPNItkL4M9Q7BH8vsdrvL7qNUSaokAg7ew/kryM5CUA7gSwp+rxQwBOAfgYyQzJtwBYA+CrFcf8PwCv9nn9Rp5fT3UguB/Ab5VvkMyimIf4IIA/BNBb+j3lxy8E8CYADzbxO0XmUCCQdvYVFBO5PwTwNICtlQ+Wkq1rUJyp8zMA/wPA75nZkxWHbQMwVJoV9J9beL6v0pTPiwFUHv9XAG4g2Uny11AMDJ81s31mdgrAMIr5jrI1AL5jZtW9HZGGUVtVSjsKYCGYMyQ/ieJMonsaOPYQgPeb2WOhN0zallYWi8SMmd3RxLErw2yLpIOGhkREUk5DQyIiKacegYhIyiUyR3DppZfakiVLXDdDRCRRDh8+/DMz666+P5GBYMmSJRgdHXXdDBGRRCH5Y6/7NTQkIpJyCgQiIikXm0BAsoPkGMlvuW6LiEiaxCYQAPgIinXVRUQkQrEIBCQvA/AOAH/hui0iImkTl1lD96C4ybdXHXYAAMkNADYAQE9PTzStEomBdV/4Lh55+rnZ26uuvAS7PnC1wxZJu3HeIyD5OygW2Dpc6zgz22Fm/WbW3909bxqsSNsZyo9jycb9c4IAADzy9HNYsnE/Vtz1APJjzWx9IOLNeSAAsArAjaVqkV8FcC3JnW6bJOLWUH4cO0cmah4zOTWNwXsfVTCQc+Y8EJjZJjO7zMyWAHg3gINmtt5xs0Sc2n2oejdKb9NnDMMHqve6F2mO80AgIvPNNFEM8tnJqRBbImkQl2QxAMDMvgPgO46bIeJUs0M9i7o6Q2qJpEWsAoFI2g3lx7GrTm6gUmYBMbh6aYgtkjTQ0JBITOTHCtg1MgG/QaFM1ae1qzOD4XcuR64vG3rbpL2pRyASE8MHjvsGAQL4wSffEWVzJEXUIxCJiVpJX+UBJEzqEYjExKKuThQ8ggEB3zxAfqyA4QPH8ezkFBZ1dWJw9VINFUnT1CMQiYnB1UvRmemYcx8BrBvo8fxyz48VsGnvOAqTUzAAhckpbNo7rgVm0jQFApGYyPVlse3mXmS7OkEA2a5O3H3rCmzN9XoeP3zgOKamZ+bcNzU9owVm0jQNDYnESK4v2/DQjtcwUq37RfwoEIjEQCtj/R2k5wrkDjKsZkqbUiAQcaw81l8e5imP9QOoGQz8ylA0U55CBFCOQMS5Vsf6sz5TSv3uF/GjQCDimN/6gXrF5LxmGXVmOlRyQpqmQCDimN9isXqLyLxmGW27uVfrCKRpyhGIODa4eumcHAHQ+JV9M7OMRPwoEIg4Vv4i1wphcUWBQCQGdGUvLikQiDikWkESB84DAckLATwM4AIU2/N1M9vstlUi4Wt1/YBI0OIwa+hXAK41s+UAVgC4nuSA2yaJhE+1giQunPcIzMwA/KJ0M1P6p6WR0vZaXT8gErQ49AhAsoPkEQA/BfCgmR3yOGYDyVGSoydPnoy8jSJBa3X9gEjQYhEIzGzGzFYAuAzAm0m+0eOYHWbWb2b93d3dkbdRJGhaGSxxEYtAUGZmkwAeAnC946aIhE4rgyUunOcISHYDmDazSZKdAN4G4FOOmyUSCa0fkDhwHggAvArAl0l2oNhD+ZqZfctxm0REUsN5IDCzowD6XLdDRCStYpUjEBGR6CkQiIiknAKBiEjKOc8RiKTNUH4cuw+dwIwZOkisXbkYW3O9rpslKaZAIBKhofw4do5MzN6eMZu9rWAgrmhoSCRCuw+daOp+kSgoEIhEaMa86yn63S8SBQUCkQh1kE3dLxIFBQKRCK1dubip+1uVHytg1faDuGLjfqzafhD5sUKgry/tRclikQiVE8JhzhrKjxUweO+jmD5THG4qTE5h8N5HAWjnM/FGS+DYZH9/v42OjrpuhkgsrbjrAUxOTc+7v6szgyOb3+6gRRIXJA+bWX/1/eoRiLQZryBQ6/6ky48VMHzgOAqTU+ggMWOGbFcnBlcvVQ+oQQoEIpJYQ/lx7BqZmN3btjz7qjA5hdv3HMHoj5/T+owGKFks0mYuXphp6v6kyo8V5gSBagZg18iEEuUNUCAQaTOb1yxDpmPudNRMB7F5zTJHLQrHpr1HfYNAmQHYsu9YFM1JNAUCkTaT68ti+HeXz+kBvOz89hoFHsqPY2r6TEPHTk5Nq1dQh/NAQHIxyYdIPk7yGMmPuG6TSDv4xYunZ3+enJrG4L2Pts0X4lcOTdQ/qMKd3xwPqSXtIQ6XCacBfNTMvkfyIgCHST5oZo+7bphIUMozW56dnMKiCGa0bNl3bHYdQdn0GcOWfccSP5MmP1bAmSZnvf/ypZlwGtMmnAcCM/sJgJ+Ufv45yScAZAEoEEhbyI8VsGnvOKami19GhckpbNpbvEIN60u5naeQDh847roJbcf50FAlkktQ3L/4kMdjG0iOkhw9efJk5G0TadXwgeOzQaBsanpGX2gtenZyqunnqJJTbbEJBCRfDuAbAG4zs3+pftzMdphZv5n1d3d3R99AkRb5fXG18oXWqFpTRZOeJ1jU1el5f2dmAdYP9Hg+ts7nfimKRSAgmUExCOwys72u2yMSJL8vLr/7g1BrqmjSeyKDq5eiM9Mx577OTAe23XwVtuZ6sX6gZ7aaaweJ9QM9WlRWh/McAUkC+CKAJ8zss67bIxK0a17XPW/hU2emA4Orl4b2O3N9Wdy254jnY2H2RKJQzqv4Jd+35nr1xd8k54EAwCoA7wUwTvJI6b47zOx+d02Kt/xYAXfddwzPnyom/hZmFsCA2XnVFy/MYPOaZYmfHdIO8mMFfONwYU4QIIBb3pQN/f8n29WJgseXfpg9kajk+sJ//9LEeSAws/8D5XJ8VRbU8nOqamHN86emcdueI3OuCDszC7Dt5qv04YmYV6LYADz0ZPgTHgZXL50zWwkIvyciyeQ8EIi3/FgBW/YdC2y639T0Gdy25wg27T2qgBAhvwBeK7AHpfx/XPl3dGEmFmlBiRkFgpgJOgBUKwcEVWWMRrksstf9UfnV6bM9xudPTYe+hkGSR5cHMVJeeBTFop+dIxMYymvZfdhcb1avNQzSCPUIYsTrQxumXSMT6L/8El0ZhsgvYZuNKGHrYg1DGKIu0ZE26hE4NpQfx5KN+7Fk4/6Wx40XZhags4WxXwNw254jWHHXA4lfZBRXfnPeo0rYuljDELRyT7kwOQXD2RId+psNjnoEDg3lx7FzpLkqigBAAutW+i+SKX5wjjZVplebm4ej3pz3sLXDzKFaw1v6ew2GAoFDuw+daOr4rs4MttxYf31A5Rzr/FgBd+w9Om+KabXpM6YPVkhcznl3HYiC4NdTTtrwVpwpEDhQHu+slzAMYiPu8pdQ9d6uXvTBak9JXnxVa/gnScNbcadAEKFmp4Y+ve2GwH731lwv+i+/BB/92qO+AUgfLImbWttMJml4K+6ULI5Is1NDV115SeBtyPVl8Zl3LZ+3ny1Q/EM49dJpXLFxP1ZtP6hEnMRCrc9LUns5caQeQQTyY4WaV+LVVl15CXZ94OpQ2lL+8FTWKurMLMDpMzZ7O4qNU0QkPhQIQlbuCdQLAtmuTjyy8dpI2lQ9Zrxq+8F5CTnNypA4WJhZ4DnRYaFKZQRKgSBEjfYEXE/na5dFR9J+Lsh0eAaCC6rWZjRKC9O8KayGZCg/jtv3HKkbBC5emMG2m3ud/jH6JYkXkMoViFOTp3z2Xva5vxYtTPOnHkHAGpmmCRSnhn7mXctjcTXitegIKNbDUa5AXFoU4J4KWpjmTz2CAK37wnexs4Eg0JnpiE0QAIpf8ttu7vWsiDk1PVNzCp9ImIIs0aEhUH8KBAHJjxXwyNPP1T2ug3Q+FOQl15fFGZ9hrMmpaVUqFSfKFynZrk4QxUkVrX5+2qHuUlhiEQhIfonkT0k+5rotrbrzm/W/KAnEqidQrdYHYtfIhMZSJVL5sQJWbT+I20s77d196wo8svHalj8/rgsAxlksAgGAvwRwvetGtCI/VkDfxx/AL1+qXz563UBPbIMAUHulpgGqYS+RCSOxG2Tvot3EIllsZg+TXOK6Hc1a94XvNjQcBADrB/yrhcZFri87Z6FZNY2lSlTCSuwmue5SmOLSI6iL5AaSoyRHT54Mf+PvepoJAvfcuiL2QaBs85pl8NtEUdNJJSpK7EYrMYHAzHaYWb+Z9Xd3dzttS6OJYaAYBJJ0BZLry2LdQI9nMChPJ1UwkLApsRutxASCOLnrvvrTKYnicFCSgkDZ1lwv7r51he90UuUKJGxK7EZLgaAJ5cSw3xh6WVdnBncnaDjIS63ppOqeSxQuOO/s11PQK/DLM5JUbbcoFslikrsBvAXApSSfAbDZzL7otlVz5ccKGPz6o5ieqb1cLMzKoVELclWnSKPKM4Yqk8UvNrjtaiuvr2q7MekRmNlaM3uVmWXM7LK4BQGgOByUpiAAqHsubtSaMZSE10+iWPQI4qxcrbCR4aB2CgJAe+x3K8kT9owhzUiaT4GgBq8uqpfOTAe23LgsolZFq3LedTko3r7niIKChCbsIUkNec4Xi6GhuPLqQlYjkIrViSrh2z7inigNe0hSQ57zKRD4GMqPe141VMosIO5O2DqBVvmNq6oyabIkIaCHXQpCpSbmozW4j26c9Pf32+joaCivXfygHMVUnVkK2ZQNjVyxcb9vee2kLZpLM69tSYFot0oVd0geNrP+6vuVI6hwNifgHwQ6Mx2pvHrwG1cFgC37jqXu/UgqJUrn0taVRQoEJY3uL5zGIAAUx1VvK5UDrjY51fy2ge1qKD+O3YdOYMYMHSTWrlwcq4WFSpSepfUEZylHgLN/EPWCQAeZuj+QsrSedzOG8uPYOTIx+3c0Y4adIxOx2tRHidKztJ7gLAUCFIc26s0OAoC1KxdH0Jr4unhhpqn702b3oRNN3e+CEqVnaZjsrNQPDQ3lx+sObSwg8J6V8d9PIGyb1yzzLLNhVuxVpfHLpJJfj7JeTzNqqslfpGGys1IbCMrd+Fo6yFhvLRm18vtQvXnN5NR0asdWK3WQnl/6XlVcxb3B1UvnLRhN6zBZKoeG1n3hu3WDABDv/YVdyfVlsfD8+dcPaR1breQ3dJj2IcW40jDZWanrETS6qczFCzOp/INohN8Yar0FeO2uPHQY51lDMlcch8nKU1oLk1Ozvcyw1y2lLhDcsfdo3WOI4ni4ePMbWyWUK9ia69UX/zlI+7z+6imt5aHGsKe2pioQ5McKONVAXfN1Cd1ZLCqDq5fi9j1H5q00NmhxmbQujfP6qwPfqZdO+85gLA+/hvFepCZHUF4wVs/6Ac0OqifXl/UtNzE5NR2rujWSHGmb11/e7Kqy7lO9cveFyalQigWmokfQ6IIx1cxpXLZGyYmwrlqkvbmc1+9iSKqRza68VBYLBILpLcWiR0DyepLHST5FcmPQr99IOWkFgebUmmKXxgU5cu785u+HPa/fRUXW/Fih7tV/PUH2luoGApIPklweyG/zfv0OAH8K4LcBvAHAWpJvCPJ31PpiIorDQQoCzcn1ZX1XFKdxQY6cO1flL6IekioHnlqypc9QvTUoQV10NTI09F8A3EPyRwDuMLOfBPKbz3ozgKfM7IcAQPKrAG4C8HhQv8BvlosWjJ2bzWuWaUGOBMbV1qhRD0nVG6Ho6szMKwnuVz48qIuuuoHAzL4H4BqStwD4XyT3Avi0mQX1LmUBVBZjeQbAyuqDSG4AsAEAenp6mvoFfisI07p4JCiVH9zynOfKKym9t9IsF/P6oy41USvAZBbQc9vbsFdBN5QjIEkAxwH8GYAPA/gByfcG0oIGmdkOM+s3s/7u7u6mnqsVhOHJ9WVnu/TVc541e0iSIOohKb8A00Fi+J3eIxRhf4fV3aGM5CMArgBwDMAIgEMAngTwEQAXmNmGc2oAeTWALWa2unR7EwCY2Ta/54S5Q5k0T7teJVPaF29VivK9qF4vAUQ3QnEuO5RtAPC4zY8YHyb5RABt+wcAryF5BYACgHcDeE8ArysRUTnf5Enj4q1aohyScpULqaWRHEGt3cnfca4NMLPTJD8E4ACADgBfqvM7JWZUzjd5as2USWMgiFrcahyd0zqC8kyfc2Vm95vZa83sSjP7RBCvKdHRrlfJo16cVIrFgjJJNiXjk8fV4i2JJwUCCUSuL4tHNl6Lu29dAQC4fc+RwOuhSHDUi4tWfqyAVdsPhlInKAipqDUk0VACMjnimLBsV0n4XKhHIIFJW/XIpCuvAVnU1YlnJ6cwfOB47K5U20ESPhfqEUhglIBMliRcqSbdUH7ct0pvnD4X6hFIYJSATJYkXKkm2VB+vObe6HH6XCgQSGCUgEwW9eDCteuQfxCI2+dCgUACo2mkyaIeXLhqVe+J2+dCOQIJVNxWTIq/sCtair+4fUYUCERSSlNIw1Nr9tXCTPwGYhQIRFKsOhhoL4m5Wq1Keuc3/Xcg++TNVwXZxEAoEIikmKaQ+mv1vRnKj+OXL/nvQBbH9zV+fRRpK3FfWp92mkLqr9X3ZvehE76PZWOaiFePQEKjq83485sq6rcIKk1anV47U2O6UFwT8eoRSGh0tRl/flNFidoJz6DEucfo9950LczUfF4H6Xk/Ed8LIAUCCY0WLMXf4Oql8PraMiD0gF3uMRYmp2CI317Xg6uXItMx/915/tQ0hvLzk8HloObXI1g30BN4G4PiNBCQfCfJYyTPkJy3j6YkmxYsxV+uLwu/gYywA3bce4y5vixedr736PnOkYk5ASs/VsDg1x/1HFLrILF+oAdbc72htfVcue4RPAbgZgAPO26HhEAlJ5LBL4EZdsBOQo/xhalp38fu2Ht0zs/TM/ND6sULM3h62w2xDgKA40BgZk+YWTzCvwROJSeSwStgE8A1r+sO9fcmocdYqy2nps8gP1ZAfqyAU9NnPI95/pR/IImTxMwaIrkBwAYA6OmJ71ibzKWSE/GX68ti9MfPYdfIxOwwkQH4xuEC+i+/JLT/vySUuBhcvRS37Tni+/gffe2I79BakoTeIyD5bZKPefy7qZnXMbMdZtZvZv3d3eFeqUjw4jw7RICHnjw57wst7PH6JPQYc33ZmiUhzljt4nJdnbVnGMVF6D0CM7su7N8h8ab1BPHnarw+CT3GT958Vc1eQS1bblwWbGNC4jpZLCkQ99khEv14fZJ6iLm+LNYP9HhOs/VDAOsHemIf5MpcTx/9tySfAXA1gP0kD7hsj4RDq1fjL8oZXnFfP+Bla64Xd9+6wnexWKUOEnffuiL2M4UquZ419E0zu8zMLjCzf21mq122R8LhevWq1Fcer7+4YtXsBeeF8/WQ1B5iri+Lz7xr+byAWYkAPvOu5YnpCZRpaEhC53L1qjTnxYppkJNT06FcqSdh/YCfcsD0SgITxdXDSQsCgAKBRMDl6lVpXFRX6klYP1BLri+LI5vfjntuXTFnxlPShoMqJWYdgSRbtqvTMyeQlA9/GvjlbILO5SRh/UAjkjDjqVHqEUgkVG4i/vwSoY0kSJt1YcXc/K7OTOzWD6SNegQSCe2PG39+VTNr1ddvVvWaEgD41Wnv8gwSHQUCiUw7daXbkd/wXZC7atXKQ+hvwx0NDYk0KEmLoFoRxfBdkmcMtTP1CEQakIYyGVEM3y3SpIFYUiAQJ/JjhUTlC9IypBH28F27zBhqNwoEErkkXl1HNbWy3WnSQDwpEEjkknh1TXqXGw5hZmXb06SB+FGyWCKXxISh3wzKAGdWijijHoFETgnD9Epabigt1COQyCVxlbHfTlNJ2YEqDpJYfjotFAgkcknYorDalhuXIbNgbkIgs4CJ2YEqDpJafjoNFAjEiVxfFo9svBbrBnrwTy+8iNv2HMGVm+7HUH7cddM85fqyGH7n8jnBa/idyas771ISc0NpoRyBODOUH8fOkYnZ2zNms7fjWM5Xs13OjXJD8eV6q8phkk+SPErymyS7XLZHorX70Imm7nel3UtLeAnjnK95Xfe8DYrinhtKC9dDQw8CeKOZXQXg+wA2OW6PRCiKapfnKo0JzjDOOT9WwDcOF+ZsUEQAt7xJvaw4cL1n8QNmdrp0cwTAZS7bI9GKsv59q9KY4AzjnL1e0wA89OTJll9TguO6R1Dp9wH8rd+DJDeQHCU5evKk/njawdqVi5u634U0JjjDOOc0vo9JEnogIPltko95/Lup4pg7AZwGsMvvdcxsh5n1m1l/d3d32M2WCGzN9WL9QM9sD6CDxPqBnlglipO+v24r/M6ta2HrayZ+3We9RTu/j0kS+qwhM7uu1uMk3wfgdwC81SxGg8MSia253lh98Ve75nXd2DUyMWdsu90TnIOrl2Lw649iembux/EXL55GfqzQ9Jh+fqyAX750et79mQVs6/cxSVzPGroewMcA3Ghmp1y2RaRaWhOcub4sXnb+/GvE6TPWUp5g+MDxeUEFAF5+4Xlt/T4miescwecAXATgQZJHSH7ecXtEZqU5wfnC1LTn/a2U3fbLA0ye8v4dEj3Xs4Z+w8wWm9mK0r8PumyPSKU0Jzj9xu4JND2NNI15lqRx3SMQia00f4ENrl46b/EXUOwRNTs8pIVk8adAIOIjiVVSg5Lry8Jv5kYzPaK05lmSRoFAxEcSq6QGKRtAjyjNeZYkUdE5kRrSXGguiI3m05xnSRL1CETEUxA9ojTnWZJEgUBEfOX6shhcvRSLujrx7OQUhg8cb2rWUJrzLEmioSERD9pbt6hcibQ8PFSuRAqgofejfIzey3hTIJBYcvlFfK5ffu2kViXSRt+LNOdZkkJDQxI7rvcASGPpaT9K9qaDAoHEjusvYn35naVkbzooEEjs+H3htlLnphX68jtLyd50UCCQ2Amyzk0rVBLhrLQvqksLJYsldgZXL8Xte47MK3FQrnMT5peQSiLMp2Rv+1OPQGKnVp2bsIeHVBJB0kg9AomlbFen55d+eXgorCtUJYpra3Rar9ZhJIt6BBJLQZZBboYSxf4andbrevqvNM/1VpV/QvJoaXeyB0guctkeiY+gyiA3S7Nk/DU6rXfLvmNah5EwrnsEw2Z2lZmtAPAtAH/suD0SI0GUQW6WZsn4a2TYLD9WwKTPNpcaXosvpzkCM/uXipsvA3wvAiWFgiiD3ArNkvG2yCdvUxmY77rvWM3nSzy57hGA5CdIngCwDjV6BCQ3kBwlOXrypGZwpEHl1TkAdJCzQwwab46e17AZAPzyV6eRHysgP1bA8zU2pNfwWnzRLNyLcJLfBvBKj4fuNLO/qThuE4ALzWxzvdfs7++30dHRAFspcVZdBA4o9gw0ZBO9/FgBd913bN4XfmemAxect8B3WOjihRmM/fHbo2ii1EDysJn1V98feo/AzK4zszd6/PubqkN3Abgl7PZI8vglKbfs8x+GkHDk+rJYeP78EeWp6RnfIAAAm9csC7NZco5czxp6TcXNmwA86aotEl9+ScbJqWkNETnQbNK3qzOjnlvMuc4RbCf5GMmjAN4O4COO2yMxVCvJWCs5KeFoJunbmenAlhvVG4g7p4HAzG4pDRNdZWZrzEyXdzJPrSRjreSkhMMvaexFeZxkcN0jEKmr3hfJUH48opYIcHY2Vwe91n6fle3qVBBICNUakkTo6sz4JiN3HzqBrbnell53KD+O3YdOYMYMHSTWrlzc8mulSfkLvno2V5lWYyeLegSSCLXGmWdanAI9lB/HzpGJ2efPmGHnyIR6GA3yWucBaDV2EoW+jiAMWkeQTq/etB9nfP5c77l1RdNfPFds3O+5lL2DxNPbbmi+gSIx52wdgUhQ3rOyx/exZmcPDeXHfeuZtNrDEEkqBQJJjFpj98+fam5Nwe5DJ3wfq5cEFWk3CgSSKH4VSQE0tdK41lX/2pWLm2qTSNIpEEii1JqJMjk13XCit9ZVv2YNSdooEEii5Pqy6OrM+D6+a2SioSEiv6v+9QP+eQiRdqVAIIlTayppo1tZbs31Yv1Az2zPoIPE+oEe9QYklTR9VBKp7+MP+JaXIIB/3P6OaBskkgCaPiptZfOaZZ6b2wP+RdHyYwWs2n4QV2zcj1XbD6pyqUiJAoEkUq4vi3UDPfOCgV9pg/LmNoXJKRiAwuQUNu0dVzAQgWoNSYJtzfWi//JLMHzgOJ6dnMKirk4Mrl46Z4VxfqyA4QPHPffaLW97qVIIknYKBJJotTaa99rislqzm6yItCMNDUnb8trislozm6yItCsFAmlb9a72VSpZpCgWgYDkR0kayUtdt0XaR62rfZVKFjnLeSAguRjF/YonXLdF2ovXloqdmQ7cc+sKPLLxWgUBkRLngQDA3QA+BvhWBRZpSeXGKYR6ASJ+nM4aInkTgIKZPco6pX9JbgCwAQB6elQPRhpTa1aRiBSFHghIfhvAKz0euhPAHSgOC9VlZjsA7ACKJSYCa6CISMqFHgjM7Dqv+0n2ArgCQLk3cBmA75F8s5n9U9jtEhGRImdDQ2Y2DuAV5dskfwSg38x+5qpNIiJpFIdksYiIOBSbEhNmtsR1G0RE0iiR+xGQPAngx00+7VIAaRx2SuN5p/GcgXSedxrPGWj9vC83s+7qOxMZCFpBctRrQ4Z2l8bzTuM5A+k87zSeMxD8eStHICKScgoEIiIpl6ZAsMN1AxxJ43mn8ZyBdJ53Gs8ZCPi8U5MjEBERb2nqEYiIiAcFAhGRlGu7QEDyepLHST5FcqPH4xeQ3FN6/BDJJQ6aGbgGzvuPSD5O8ijJvyN5uYt2BqneOVccd0tp46PETzNs5JxJvqv0f32M5FeibmMYGvj77iH5EMmx0t/4DS7aGSSSXyL5U5KP+TxOkv+t9J4cJfmbLf8yM2ubfwA6ADwN4NUAzgfwKIA3VB3zhwA+X/r53QD2uG53ROd9DYCFpZ//IOnn3cg5l467CMDDAEZQrGXlvO0h/z+/BsAYgItLt1/hut0RnfcOAH9Q+vkNAH7kut0BnPe/AfCbAB7zefwGAH8LgAAGABxq9Xe1W4/gzQCeMrMfmtlLAL4K4KaqY24C8OXSz18H8FbW2wwh/uqet5k9ZGanSjdHUKz2mmSN/F8DwJ8A+BSAF6NsXEgaOecPAPhTM3seAMzspxG3MQyNnLcB+LXSz78O4NkI2xcKM3sYwHM1DrkJwF9Z0QiALpKvauV3tVsgyAI4UXH7mdJ9nseY2WkALwD4V5G0LjyNnHel96N4JZFkdc+51FVebGb7o2xYiBr5f34tgNeSfITkCMnrI2tdeBo57y0A1pN8BsD9AD4cTdOcavZz7ys2ReckGiTXA+gH8Fuu2xImkgsAfBbA+xw3JWrnoTg89BYUe30Pk+w1s0mXjYrAWgB/aWafIXk1gL8m+UYzO+O6YUnQbj2CAoDFFbcvK93neQzJ81DsRv5zJK0LTyPnDZLXobgz3I1m9quI2haWeud8EYA3AvhOaa+LAQD7Ep4wbuT/+RkA+8xs2sz+EcD3UQwMSdbIeb8fwNcAwMy+C+BCFAuztbOGPveNaLdA8A8AXkPyCpLno5gM3ld1zD4A/6708+8COGilzEuC1T1vkn0A/hzFINAO48Y1z9nMXjCzS81siRVLnI+geO6jbpobiEb+vvMo9gZA8lIUh4p+GGEbw9DIeU8AeCsAkHw9ioHgZKStjN4+AL9Xmj00AOAFM/tJKy/UVkNDZnaa5IcAHEBxpsGXzOwYyY8DGDWzfQC+iGK38SkUEzHvdtfiYDR43sMAXg7g3lJufMLMbnTW6HPU4Dm3lQbP+QCAt5N8HMAMgEEzS3SPt8Hz/iiAL5C8HcXE8fuSfoFHcjeKQf3SUu5jM4AMAJjZ51HMhdwA4CkApwD8+5Z/V8LfKxEROUftNjQkIiJNUiAQEUk5BQIRkZRTIBARSTkFAhGRlFMgEBFJOQUCEZGUUyAQCUCpFv7bSj9vJfnfXbdJpFFttbJYxKHNAD5O8hUA+gAkdtW2pI9WFosEhOTfo1jG4y1m9nPX7RFplIaGRAJAshfAqwC8pCAgSaNAIHKOSrtC7UJxx6hftMlmMJIiCgQi54DkQgB7AXzUzJ5AcWvMzW5bJdIc5QhERFJOPQIRkZRTIBARSTkFAhGRlFMgEBFJOQUCEZGUUyAQEUk5BQIRkZT7/5lZUm53vNndAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "\n", "d = 1\n", "n = 200\n", "X = torch.rand(n,d)\n", "y = 4 * torch.sin(np.pi * X) * torch.cos(6*np.pi*X**2)\n", "\n", "plt.scatter(X.numpy(), y.numpy())\n", "plt.title('plot of $f(x)$')\n", "plt.xlabel('$x$')\n", "plt.ylabel('$y$')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "JaUBFZGIJhxU" }, "source": [ "Here we define a simple two hidden layer neural network with Tanh activations. There are a few hyper parameters to play with to get a feel for how they change the results." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "vNjfSahuJhxU", "outputId": "e204d43c-dd0f-4dd8-d6a4-d1c42666f5d9" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "iter,\tloss\n", "0,\t3.96\n", "600,\t3.69\n", "1200,\t2.58\n", "1800,\t1.10\n", "2400,\t0.91\n", "3000,\t0.68\n", "3600,\t0.14\n", "4200,\t0.08\n", "4800,\t0.06\n", "5400,\t0.15\n" ] } ], "source": [ "# feel free to play with these parameters\n", "\n", "step_size = 0.05\n", "n_epochs = 6000\n", "n_hidden_1 = 32\n", "n_hidden_2 = 32\n", "d_out = 1\n", "\n", "neural_network = nn.Sequential(\n", " nn.Linear(d, n_hidden_1), \n", " nn.Tanh(),\n", " nn.Linear(n_hidden_1, n_hidden_2),\n", " nn.Tanh(),\n", " nn.Linear(n_hidden_2, d_out)\n", " )\n", "\n", "loss_func = nn.MSELoss()\n", "\n", "optim = torch.optim.SGD(neural_network.parameters(), lr=step_size)\n", "print('iter,\\tloss')\n", "for i in range(n_epochs):\n", " y_hat = neural_network(X)\n", " loss = loss_func(y_hat, y)\n", " optim.zero_grad()\n", " loss.backward()\n", " optim.step()\n", " \n", " if i % (n_epochs // 10) == 0:\n", " print('{},\\t{:.2f}'.format(i, loss.item()))\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ic6YX9lNJhxU", "outputId": "036e3ef2-eba5-4b69-ad2b-1f4836ee4ccf" }, "outputs": [ { "data": { "image/png": "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fryK3NjE6uJzLb3ejMxcKqq0Z1cy49e8okoH7d9hoLG6R1DT/wGf1vegUuoWpdRKpdTKEi9NYAnrTR8Rz9LEIZ400pW1jtuFOaGZVFJATjCXlvAwrys3thf9dheidFWt4y15zb57ttUqNhesf4eBxueBQCm1SCm1ro6vKTXOeQA4Dsyp73W01i9prYdprYfFxsb6utnCTx5LSybtogGscp7FxfmrCFeK60Ym2Gr/17hoB22PldNr347qev3m8WBkXldObCLtKo4QX7oTgOi2zV8zEeWIIKZsPzHlB9gsVUdtx+eBQGs9Tms9qI6vDwCUUjcClwMztLbRwLDwm8fSkhn5mxmctWsLm39rv03ARw+IJWl3IWHo6hXFdl781lLmxK55rebw0KEjx5s1T+DKcnP42PFTMoYiwmSy2C6szhqaANwLTNZae7/UoQgcEycaf372mbXtOIkry837q9z093wYbux6Bgq4YmhwbV5eU1qKk3atW7GpSwJwoqxGc8f0MzJzqajUpwSC9pGtgvbvMNBYPUfwD6ADsFAptVop9aLF7RFWSU4GpxM+rXeayBI1J4oPtXawLaorGlicE9zzVPvLKyhr7WBrdHeSPIX2wCgX3lTV8wO7iyiLaENxRyM1tbSs4nRPE35kddZQX611vNZ6iOfr11a2R1hIKZgwARYuNPYDtgnzQ2zw9k3kxCaiVVit48HKHLvPjU3krF351ccVNHl4qOZiss0xPav/DmV+wD6s7hEIccLEibB/PyxbZnVLqsVFO4guP8CQ4k18mzik1vFglp6ahAK+SRxC733FDNqRBxip/00dHho9IBYF9KmRMRTMcyyBSAKBsI9x46BVK1sND6WnJjG2cA1haJb0HgaExodYWooTDXxw1sWUt2rD9DUn5m6a0hsy51jO3JmP82AJWXFJQT/HEogkEAj7iIqC88+3VSBIS3Fy57GfKG3bkezufW1fJdWbnNEODkS256MBP2PKhq9od9TI52hKb8icY7l29accadUa18DRITHHEmgkEAh7mTgRVq+G7dutbomhqor4H74h+ueT2PzU5OAvNldDemoSjohw5g6ZQPtj5Uza+HWTe0PFpeW0PVbOlA1L+HjABRyIbF99XNiHBAJhLxMmGH/aJY101SqjFLOZ3hpC0lKcPDE1mV1nDSEnNpEb133e5N5QXLSDyRu+osOx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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "X_grid = torch.from_numpy(np.linspace(0,1,50)).float().view(-1, d)\n", "y_hat = neural_network(X_grid)\n", "plt.scatter(X.numpy(), y.numpy())\n", "plt.plot(X_grid.detach().numpy(), y_hat.detach().numpy(), 'r')\n", "plt.title('plot of $f(x)$ and $\\hat{f}(x)$')\n", "plt.xlabel('$x$')\n", "plt.ylabel('$y$')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "mo4LEXsyJhxU" }, "source": [ "## Useful links:\n", "- [60 minute PyTorch Tutorial](https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html)\n", "- [PyTorch Docs](https://pytorch.org/docs/stable/index.html)\n", "- [Lecture notes on Auto-Diff](https://courses.cs.washington.edu/courses/cse446/19wi/notes/auto-diff.pdf)\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "E3IIQel9JhxU" }, "source": [ "# Appendix 1: Computation graphs\n", "\n", "What's special about PyTorch's `tensor` object is that it implicitly creates a computation graph in the background. A computation graph is a a way of writing a mathematical expression as a graph. There is an algorithm to compute the gradients of all the variables of a computation graph in time on the same order it is to compute the function itself.\n", "\n", "Consider the expression $e=(a+b)*(b+1)$ with values $a=2, b=1$. We can draw the evaluated computation graph as\n", "
\n", "
\n", "\n", "\n", "\n", "[source](https://colah.github.io/posts/2015-08-Backprop/)\n", "\n", "In PyTorch, we can write this as" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "5FgHVktiJhxU", "outputId": "4cba6ba5-ddf0-4c67-dd42-4235bdb0af25" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "c tensor(3., grad_fn=)\n", "d tensor(2., grad_fn=)\n", "e tensor(6., grad_fn=)\n" ] } ], "source": [ "a = torch.tensor(2.0, requires_grad=True) # we set requires_grad=True to let PyTorch know to keep the graph\n", "b = torch.tensor(1.0, requires_grad=True)\n", "c = a + b\n", "d = b + 1\n", "e = c * d\n", "print('c', c)\n", "print('d', d)\n", "print('e', e)" ] }, { "cell_type": "markdown", "metadata": { "id": "41qbnXe9JhxV" }, "source": [ "We can see that PyTorch kept track of the computation graph for us." ] }, { "cell_type": "markdown", "metadata": { "id": "nbbtIwqRJhxV" }, "source": [ "# Appendix 2: Things that might help on the homework\n", "\n", "## Momentum\n", "\n", "There are other optimization algorithms besides stochastic gradient descent. One is a modification of SGD called momentum. We won't get into it here, but if you would like to read more [here](https://distill.pub/2017/momentum/) is a good place to start.\n", "\n", "We only change the step size and add the momentum keyword argument to the optimizer. Notice how it reduces the training loss in fewer iterations." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "R4xSAzouJhxV", "outputId": "a1e0ce6a-2805-4877-b3eb-63ea1b936c7f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "iter,\tloss\n", "0,\t3.83\n", "150,\t3.06\n", "300,\t0.74\n", "450,\t0.12\n", "600,\t0.04\n", "750,\t0.03\n", "900,\t0.01\n", "1050,\t0.00\n", "1200,\t0.00\n", "1350,\t0.00\n" ] } ], "source": [ "# feel free to play with these parameters\n", "\n", "step_size = 0.05\n", "momentum = 0.9\n", "n_epochs = 1500\n", "d = X.shape[1]\n", "n_hidden_1 = 32\n", "n_hidden_2 = 32\n", "d_out = 1\n", "\n", "neural_network = nn.Sequential(\n", " nn.Linear(d, n_hidden_1), \n", " nn.Tanh(),\n", " nn.Linear(n_hidden_1, n_hidden_2),\n", " nn.Tanh(),\n", " nn.Linear(n_hidden_2, d_out)\n", ")\n", "\n", "loss_func = nn.MSELoss()\n", "\n", "optim = torch.optim.SGD(neural_network.parameters(), lr=step_size, momentum=momentum)\n", "print('iter,\\tloss')\n", "for i in range(n_epochs):\n", " y_hat = neural_network(X)\n", " loss = loss_func(y_hat, y)\n", " optim.zero_grad()\n", " loss.backward()\n", " optim.step()\n", " \n", " if i % (n_epochs // 10) == 0:\n", " print('{},\\t{:.2f}'.format(i, loss.item()))\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "HwWOkyR-JhxV", "outputId": "b8ee4197-a194-4f3c-e280-54b8f038822f" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "X_grid = torch.from_numpy(np.linspace(0,1,50)).float().view(-1, d)\n", "y_hat = neural_network(X_grid)\n", "plt.scatter(X.numpy(), y.numpy())\n", "plt.plot(X_grid.detach().numpy(), y_hat.detach().numpy(), 'r')\n", "plt.title('plot of $f(x)$ and $\\hat{f}(x)$')\n", "plt.xlabel('$x$')\n", "plt.ylabel('$y$')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "D09b9CYYJhxV" }, "source": [ "## CrossEntropyLoss\n", "So far, we have been considering regression tasks and have used the [MSELoss](https://pytorch.org/docs/stable/nn.html#torch.nn.MSELoss) module. For the homework, we will be performing a classification task and will use the cross entropy loss.\n", "\n", "PyTorch implements a version of the cross entropy loss in one module called [CrossEntropyLoss](https://pytorch.org/docs/stable/nn.html#torch.nn.CrossEntropyLoss). Its usage is slightly different than MSE, so we will break it down here. \n", "\n", "- input: The first parameter to CrossEntropyLoss is the output of our network. It expects a *real valued* tensor of dimensions $(N,C)$ where $N$ is the minibatch size and $C$ is the number of classes. In our case $N=3$ and $C=2$. The values along the second dimension correspond to raw unnormalized scores for each class. The CrossEntropyLoss module does the softmax calculation for us, so we do not need to apply our own softmax to the output of our neural network.\n", "- output: The second parameter to CrossEntropyLoss is the true label. It expects an *integer valued* tensor of dimension $(N)$. The integer at each element corresponds to the correct class. In our case, the \"correct\" class labels are class 0, class 1, and class 1.\n", "\n", "Try out the loss function on three toy predictions. The true class labels are $y=[1,1,0]$. The first two examples correspond to predictions that are \"correct\" in that they have higher raw scores for the correct class. The second example is \"more confident\" in the prediction, leading to a smaller loss. The last two examples are incorrect predictions with lower and higher confidence respectively." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "IG5_xfQpJhxW", "outputId": "a4375143-99d2-4ce1-d720-c5c3b0caa28f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor(0.1269)\n" ] } ], "source": [ "loss = nn.CrossEntropyLoss()\n", "\n", "input = torch.tensor([[-1., 1],[-1, 1],[1, -1]]) # raw scores correspond to the correct class\n", "# input = torch.tensor([[-3., 3],[-3, 3],[3, -3]]) # raw scores correspond to the correct class with higher confidence\n", "# input = torch.tensor([[1., -1],[1, -1],[-1, 1]]) # raw scores correspond to the incorrect class\n", "# input = torch.tensor([[3., -3],[3, -3],[-3, 3]]) # raw scores correspond to the incorrect class with incorrectly placed confidence\n", "\n", "target = torch.tensor([1, 1, 0])\n", "output = loss(input, target)\n", "print(output)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "x3ca7xosJhxW" }, "source": [ "## Learning rate schedulers\n", "\n", "Often we do not want to use a fixed learning rate throughout all training. PyTorch offers learning rate schedulers to change the learning rate over time. Common strategies include multiplying the lr by a constant every epoch (e.g. 0.9) and halving the learning rate when the training loss flattens out.\n", "\n", "See the [learning rate scheduler docs](https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate) for usage and examples" ] }, { "cell_type": "markdown", "metadata": { "id": "JA_8CrwnJhxX" }, "source": [ "# Appendix 3: Beyond Linear Layers\n", "\n", "## Convolutions\n", "When working with images, we often want to use convolutions to extract features using convolutions. PyTorch implments this for us in the `torch.nn.Conv2d` module. It expects the input to have a specific dimension $(N, C_{in}, H_{in}, W_{in})$ where $N$ is batch size, $C_{in}$ is the number of channels the image has, and $H_{in}, W_{in}$ are the image height and width respectively.\n", "\n", "We can modify the convolution to have different properties with the parameters:\n", "- kernel_size\n", "- stride\n", "- padding\n", "\n", "They can change the output dimension so be careful.\n", "\n", "See the [`torch.nn.Conv2d` docs](https://pytorch.org/docs/stable/nn.html#torch.nn.Conv2d) for more information." ] }, { "cell_type": "markdown", "metadata": { "id": "MFNCKNR3JhxX" }, "source": [ "To illustrate what the `Conv2d` module is doing, let's set the conv weights manually to a Gaussian blur kernel.\n", "\n", "We can see that it applies the kernel to the image." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "-ghdIfXFJhxX", "outputId": "177ed056-c156-444b-cda6-d19bdbabce16" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "# an entire mnist digit\n", "image = np.array([0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0.3803922 , 0.37647063, 0.3019608 ,0.46274513, 0.2392157 , 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0.3529412 , 0.5411765 , 0.9215687 ,0.9215687 , 0.9215687 , 0.9215687 , 0.9215687 , 0.9215687 ,0.9843138 , 0.9843138 , 0.9725491 , 0.9960785 , 0.9607844 ,0.9215687 , 0.74509805, 0.08235294, 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.54901963,0.9843138 , 0.9960785 , 0.9960785 , 0.9960785 , 0.9960785 ,0.9960785 , 0.9960785 , 0.9960785 , 0.9960785 , 0.9960785 ,0.9960785 , 0.9960785 , 0.9960785 , 0.9960785 , 0.9960785 ,0.7411765 , 0.09019608, 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0.8862746 , 0.9960785 , 0.81568635,0.7803922 , 0.7803922 , 0.7803922 , 0.7803922 , 0.54509807,0.2392157 , 0.2392157 , 0.2392157 , 0.2392157 , 0.2392157 ,0.5019608 , 0.8705883 , 0.9960785 , 0.9960785 , 0.7411765 ,0.08235294, 0., 0., 0., 0.,0., 0., 0., 0., 0.,0.14901961, 0.32156864, 0.0509804 , 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.13333334,0.8352942 , 0.9960785 , 0.9960785 , 0.45098042, 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0.32941177, 0.9960785 ,0.9960785 , 0.9176471 , 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0.32941177, 0.9960785 , 0.9960785 , 0.9176471 ,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0.4156863 , 0.6156863 ,0.9960785 , 0.9960785 , 0.95294124, 0.20000002, 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0.09803922, 0.45882356, 0.8941177 , 0.8941177 ,0.8941177 , 0.9921569 , 0.9960785 , 0.9960785 , 0.9960785 ,0.9960785 , 0.94117653, 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0.26666668, 0.4666667 , 0.86274517,0.9960785 , 0.9960785 , 0.9960785 , 0.9960785 , 0.9960785 ,0.9960785 , 0.9960785 , 0.9960785 , 0.9960785 , 0.5568628 ,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0.14509805, 0.73333335,0.9921569 , 0.9960785 , 0.9960785 , 0.9960785 , 0.8745099 ,0.8078432 , 0.8078432 , 0.29411766, 0.26666668, 0.8431373 ,0.9960785 , 0.9960785 , 0.45882356, 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0.4431373 , 0.8588236 , 0.9960785 , 0.9490197 , 0.89019614,0.45098042, 0.34901962, 0.12156864, 0., 0.,0., 0., 0.7843138 , 0.9960785 , 0.9450981 ,0.16078432, 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0.6627451 , 0.9960785 ,0.6901961 , 0.24313727, 0., 0., 0.,0., 0., 0., 0., 0.18823531,0.9058824 , 0.9960785 , 0.9176471 , 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0.07058824, 0.48627454, 0., 0.,0., 0., 0., 0., 0.,0., 0., 0.32941177, 0.9960785 , 0.9960785 ,0.6509804 , 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0.54509807, 0.9960785 , 0.9333334 , 0.22352943, 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0.8235295 , 0.9803922 , 0.9960785 ,0.65882355, 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0.9490197 , 0.9960785 , 0.93725497, 0.22352943, 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0.34901962, 0.9843138 , 0.9450981 ,0.3372549 , 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.01960784,0.8078432 , 0.96470594, 0.6156863 , 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0.01568628, 0.45882356, 0.27058825,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,0., 0., 0., 0.], dtype=np.float32)\n", "image_torch = torch.from_numpy(image).view(1, 1, 28, 28)\n", "\n", "# a gaussian blur kernel\n", "gaussian_kernel = torch.tensor([[1., 2, 1],[2, 4, 2],[1, 2, 1]]) / 16.0\n", "\n", "conv = nn.Conv2d(1, 1, 3)\n", "# manually set the conv weight\n", "conv.weight.data[:] = gaussian_kernel\n", "\n", "convolved = conv(image_torch)\n", "\n", "plt.title('original image')\n", "plt.imshow(image_torch.view(28,28).detach().numpy())\n", "plt.show()\n", "\n", "plt.title('blurred image')\n", "plt.imshow(convolved.view(26,26).detach().numpy())\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "1muk73M1JhxX" }, "source": [ "As we can see, the image is blurred as expected. \n", "\n", "In practice, we learn many kernels at a time. In this example, we take in an RGB image (3 channels) and output a 16 channel image. After an activation function, that could be used as input to another `Conv2d` module." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "RaSnBMsYJhxX", "outputId": "08a61fd3-5e0a-4af7-bf81-8863842c9a55" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "im shape torch.Size([4, 3, 32, 32])\n", "convolved im shape torch.Size([4, 16, 30, 30])\n" ] } ], "source": [ "im_channels = 3 # if we are working with RGB images, there are 3 input channels, with black and white, 1\n", "out_channels = 16 # this is a hyperparameter we can tune\n", "kernel_size = 3 # this is another hyperparameter we can tune\n", "batch_size = 4\n", "image_width = 32\n", "image_height = 32\n", "\n", "im = torch.randn(batch_size, im_channels, image_width, image_height)\n", "\n", "m = nn.Conv2d(im_channels, out_channels, kernel_size)\n", "convolved = m(im) # it is a module so we can call it\n", "\n", "print('im shape', im.shape)\n", "print('convolved im shape', convolved.shape)" ] }, { "cell_type": "markdown", "metadata": { "id": "tcjWN--eJhxX" }, "source": [ "## Recurrent Cells (or Recurrent Neural Networks)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "80Bw2G-RJhxY" }, "outputs": [], "source": [ "def process_corpus(corpus, sentence_length):\n", " \"\"\"\n", " Arguments:\n", " corpus (str) -- Continous text. Can be anything but should be relatively long.\n", " sentence_length (int) -- Size of each sentence in the output.\n", " Does not have to be divisible by # of words in corpus, in which case end will be padded.\n", " Returns:\n", " Tuple of size 4 containing:\n", " - Train Input - shape (batch, sentence) containing indexes of words for each sentence.\n", " - Train Truth - Same as Train Input but contains index of the next word in a given sentence.\n", " - Word to Index Dictionary - Dictionary for each word containing a corresponding integer.\n", " - Index to Word Dictionary - Reverse of Word to Index Dictionary.\n", " \n", " Example:\n", " process_corpus(\"Sam likes cats\", 2) outputs:\n", " - [[1, 2], [3, 0]]\n", " - [[2, 3], [0, 0]]\n", " - {\"\": 0, \"Sam\": 1, \"likes\": 2, \"cats\": 3}\n", " - {0: \"\", 1: \"Sam\", 2: \"likes\", 3: \"cats\"}\n", " \"\"\"\n", " # Let's make corpus a list of words\n", " corpus = corpus.split()\n", " # QUESTION: Should we also trim/lowercase the words here? Is \"You,\" vs. \"you\" very different?\n", "\n", " # Then split it into smaller sentences of size sentence_length\n", " x = []\n", " y = []\n", " for idx in range(0, len(corpus), sentence_length):\n", " x.append(corpus[idx: idx + sentence_length])\n", " # Since we are trying to predict the next word y's are just x's shifted by one\n", " y.append(corpus[idx + 1: idx + sentence_length + 1])\n", " # Last sentences might be shorter. Let's pad it with something smaller\n", " x[-1] += [\"\" for _ in range(sentence_length - len(x[-1]))]\n", " y[-1] += [\"\" for _ in range(sentence_length - len(y[-1]))]\n", "\n", " # Create dictionary from words to indices and vice-versa\n", " # QUESTION: Is \"\" a good choice for end-of-sentence tag? Maybe we should pad beginning of the sentences too?\n", " idx_to_word = {0: \"\"}\n", " word_to_idx = {\"\": 0}\n", " idx = 1\n", " for sentence in x:\n", " for word in sentence:\n", " if word not in word_to_idx:\n", " word_to_idx[word] = idx\n", " idx_to_word[idx] = word\n", " idx += 1\n", "\n", " x_idx = torch.tensor([[word_to_idx[w] for w in s] for s in x]).long()\n", " y_idx = torch.tensor([[word_to_idx[w] for w in s] for s in y]).long()\n", "\n", " return x_idx, y_idx, word_to_idx, idx_to_word" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "tLWThiQ3JhxY", "outputId": "4dcfdf65-70c2-4f76-9595-b5b1375bb950" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sequential(\n", " (0): Embedding(61, 10)\n", " (1): RNN(10, 5, batch_first=True)\n", ")\n", "0,\t4.21\n", "100,\t3.76\n", "200,\t3.32\n", "300,\t2.91\n", "400,\t2.57\n", "500,\t2.29\n", "600,\t2.06\n", "700,\t1.89\n", "800,\t1.75\n", "900,\t1.62\n" ] } ], "source": [ "# Feel free to play with parameters\n", "embedding_size = 10\n", "sentence_length = 5\n", "hidden_size = 5\n", "n_epochs = 1000\n", "\n", "# Dataset\n", "corpus = \"Hey, you. You’re finally awake. \" \\\n", " \"You were trying to cross the border, right? \" \\\n", " \"Walked right into that Imperial ambush, \" \\\n", " \"same as us, and that thief over there. \" \\\n", " \"Skyrim was fine until you came along. \" \\\n", " \"Empire was nice and lazy. \" \\\n", " \"If they hadn’t been looking for you, \" \\\n", " \"I could’ve stolen that horse and been half way to Hammerfell. \" \\\n", " \"You there. You and me — we should be here. \" \\\n", " \"It’s these Stormcloaks the Empire wants. \"\n", "\n", "x, y, word_to_idx, idx_to_word = process_corpus(corpus, sentence_length)\n", "\n", "model_rnn = nn.Sequential(\n", " nn.Embedding(len(idx_to_word), embedding_size),\n", " nn.RNN(embedding_size, hidden_size, batch_first=True),\n", ")\n", "# Linear model has to be separate, because we'll be using only first output of the RNN\n", "linear = nn.Linear(hidden_size, len(idx_to_word))\n", "print(model_rnn)\n", "\n", "criterion = nn.CrossEntropyLoss()\n", "optimizer = torch.optim.Adam(list(model_rnn.parameters()) + list(linear.parameters()))\n", "\n", "for i in range(n_epochs):\n", " x_mid, _ = model_rnn(x)\n", " y_hat = linear(x_mid).transpose(1, 2) # This makes shape correct for the Loss\n", " loss = criterion(y_hat, y)\n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", " \n", " if i % (n_epochs // 10) == 0:\n", " print('{},\\t{:.2f}'.format(i, loss.item()))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "BNZmvY9cJhxY", "outputId": "a1c651d2-ec14-42c0-a0ee-94dc4c32d451" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Truth: ['you.', 'You’re', 'finally', 'awake.', 'You']\n", "Predict: ['you.', 'You’re', 'finally', 'right', 'You']\n", "horse and been half way and been half way and been half way and been half\n" ] } ], "source": [ "# Let's see a prediction for the first sentence\n", "with torch.no_grad():\n", " y_hat = linear(model_rnn(x)[0])\n", " y_hat = torch.argmax(y_hat, dim=2)\n", " sentences_hat = [[idx_to_word[int(w)] for w in s] for s in y_hat]\n", " sentences_true = [[idx_to_word[int(w)] for w in s] for s in y]\n", "\n", " sentence_idx = 0\n", " print(f\"Truth: {sentences_true[sentence_idx]}\")\n", " print(f\"Predict: {sentences_hat[sentence_idx]}\")\n", "\n", "# Lets have a custom sentence, with a random word starting.\n", "with torch.no_grad():\n", " word = \"horse\"\n", " sentence = f\"{word}\"\n", " for _ in range(15):\n", " word_idx = torch.tensor([word_to_idx[word]]).reshape(1, 1)\n", " y_hat, _ = model_rnn(word_idx)\n", " y_hat = linear(y_hat)\n", " y_hat = torch.argmax(y_hat, dim=2)\n", " word = idx_to_word[y_hat.reshape(1).item()]\n", " sentence += f\" {word}\"\n", " print(sentence)\n", " # See how it repeats itself near the end? There are ways of fixing it!" ] }, { "cell_type": "markdown", "metadata": { "id": "jUBTfUq3JhxY" }, "source": [ "## Useful links:\n", "- [60 minute PyTorch Tutorial](https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html)\n", "- [PyTorch Docs](https://pytorch.org/docs/stable/index.html)\n", "- [Lecture notes on Auto-Diff](https://courses.cs.washington.edu/courses/cse446/19wi/notes/auto-diff.pdf)\n", "\n" ] } ], "metadata": { "colab": { "name": "PyTorch Introduction.ipynb", "provenance": [] }, "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.7.10" } }, "nbformat": 4, "nbformat_minor": 0 }