{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### Deep Learning Course\n", " \n", "2021/2022\n", "***\n", "Gonçalo Faria, Rita Ramos, Marcos Treviso\n", "***\n", "# Pytorch Basics\n", "\n", "Pytorch is a platform for deep learning in Python/C++. It provides tools for efficiently creating, training, testing and analyzing neural networks. \n", "\n", "We devided the lab in 2 parts. \n", "* PART I : we intend to show you the fundamentals of how to use Pytorch. \n", "* PART II : we intend to convince you that Pytorch is a great tool for defining and training deep learning models. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import torch\n", "import torch.nn as nn\n", "import torch.nn.functional as F\n", "import torch.optim as optim\n", "import torchvision\n", "\n", "# selects a gpu for you, if you have one. \n", "DEVICE = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from pprint import pprint\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from IPython.core.debugger import set_trace" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.seed(0)\n", "torch.manual_seed(0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# PART I - Pytorch Fundamentals\n", "***\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Useful Functions\n", "Pytorch (and other libraries) have many functions that operate on tensors. Let's try some of them and plot the results." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([200])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = torch.arange(-10, 10, 0.1, dtype=torch.float)\n", "x.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Many functions are applied elementwise to the tensor: \n", " - sin, cos, tan, tanh,.... (and other functions from trigonometry), exp, log, sigmoid, relu, abs, clamp, ceil, clip, round, sqrt ..." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# sin, tanh, exp, log, sigmoid, relu, abs, clamp, ceil, clip, round, sqrt\n", "y = torch.sin(x)\n", "plt.plot(x, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Many functions are applied to a specific axis and reduce the dimentionality of the tensor:\n", " - argmax, argmin, max, min, sum, mean, std, any, prod, all, median, cumsum, bincount ..." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " x.sum() tensor(-10.0000) \n", " x.sum(axis=0) tensor(-10.0000) \n" ] } ], "source": [ "print(\" x.sum() %s \" % x.sum())\n", "print(\" x.sum(axis=0) %s \" % x.sum(axis=0))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x.shape : torch.Size([200]) \n", "y.shape : torch.Size([4, 5, 10]) \n" ] } ], "source": [ "y = x.reshape((4,5,10))\n", "\n", "print(\"x.shape : %s \"% str(x.shape) )\n", "print(\"y.shape : %s \"% str(y.shape) )" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "y.sum(axis=1).shape : torch.Size([4, 10]) \n", "y.sum(axis=0).shape : torch.Size([5, 10]) \n", "y.sum(axis=[0,1]).shape : torch.Size([10]) \n" ] } ], "source": [ "print(\"y.sum(axis=1).shape : %s \"% str(y.sum(axis=1).shape) )\n", "print(\"y.sum(axis=0).shape : %s \"% str(y.sum(axis=0).shape) )\n", "print(\"y.sum(axis=[0,1]).shape : %s \"% str(y.sum(axis=[0,1]).shape) )" ] }, { "attachments": { "1*vPb9E0Yd1QUAD0oFmAgaOw.png": { "image/png": "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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "# Automatic differentiation with `autograd`\n", "\n", "Central to all neural networks in PyTorch is the `autograd` package. \n", "\n", "![1*vPb9E0Yd1QUAD0oFmAgaOw.png](attachment:1*vPb9E0Yd1QUAD0oFmAgaOw.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "We can say that it is the _true_ power behind PyTorch. The autograd package provides automatic differentiation for all operations on Tensors. It is a **define-by-run** framework, which means that your backprop is defined by how your code is run, and that **every single iteration can be different**.\n", "\n", "Refs:\n", "- https://pytorch.org/docs/stable/autograd.html\n", "- https://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`torch.Tensor` is the central class of the package. If you set its attribute `.requires_grad` as `True`, it starts to track all operations on it. When you finish your computation you can call `.backward()` and have all the gradients computed automatically. The gradient for this tensor will be accumulated into `.grad` attribute." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor(2., requires_grad=True)\n", "tensor(2., requires_grad=True)\n" ] } ], "source": [ "# setting requires_grad in directly via tensor's constructor\n", "x = torch.tensor(2., requires_grad=True)\n", "\n", "print(x)\n", "# or by setting .requires_grad attribute\n", "# you can do this at any moment to track operations on x\n", "x.requires_grad = True \n", "\n", "print(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Consider a simple function $y$ of $x$.\n", "\n", "$ y(x) = x^2 $\n", "\n", "$ \\frac{\\partial y}{\\partial x}\\bigg(x = 2\\bigg) = 4$ // Evaluate derivative on x=2" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Grad of x: None\n", "Evaluate derivative of y w.r.t x at x=2: tensor(4.)\n" ] } ], "source": [ "# let's perform a simple operation on x\n", "y = x ** 2\n", "\n", "print(\"Grad of x:\", x.grad)\n", "\n", "# if you want to compute the derivatives, you can call .backward() on a Tensor\n", "y.backward()\n", "print(\"Evaluate derivative of y w.r.t x at x=2:\", x.grad)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To stop a tensor from tracking history, you can call `.detach()` to detach it from the computation history, and to prevent future computation from being tracked. (i.e. everything that uses a variable with `.detach()` is treated as a constant )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To evaluate $ \\frac{\\partial y}{\\partial x} $ on different values of x, we have to reset the values of x.grad." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Evaluate derivative of y w.r.t x at x=2 (a second time without reset): tensor(8.)\n", "Evaluate derivative of y w.r.t x at x=2 (a second time but with reset): tensor(4.)\n" ] } ], "source": [ "y = x ** 2\n", "y.backward()\n", "\n", "print(\"Evaluate derivative of y w.r.t x at x=2 (a second time without reset):\", x.grad)\n", "\n", "x.grad.data.zero_()\n", "y = x ** 2\n", "y.backward()\n", "print(\"Evaluate derivative of y w.r.t x at x=2 (a second time but with reset):\", x.grad)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For autograd to compute derivatives, it has to \"track\" ( save intermediate values ) of every computation. \n", "\n", "To prevent tracking history (and using memory), you can also wrap the code block in with `torch.no_grad()`:. This can be particularly helpful when evaluating a model because the model may have trainable parameters with `requires_grad=True`, but for which we don’t need the gradients." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x: tensor(2., requires_grad=True)\n", "y: tensor(4., grad_fn=)\n", "x: tensor(2., requires_grad=True)\n", "y: tensor(8.)\n" ] } ], "source": [ "x = torch.tensor(2.)\n", "x.requires_grad = True\n", "print('x:', x)\n", "\n", "y = x ** 2\n", "print('y:', y)\n", "\n", "with torch.no_grad():\n", " y = 2 * y\n", " print('x:', x) # Try to think why x.requires_grad is True\n", " print('y:', y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# PART II - Linear Regression and Gradient Descent.\n", "***\n", "\n", "We will demonstrate why Pytorch, and neural network frameworks more generally, are particularly useful for researchers and practitioners.\n", "\n", "Until now, you have been implementing linear regression and Neural Networks by:\n", "\n", "A ) defining a model and loss function. \n", "\n", "B ) Compute the gradients of the loss w.r.t the weights. \n", "\n", "C ) Update the weights using a first-order method.\n", "\n", "Using Pytorch, you will still have to do A) and C), however B) will be done automatically using automatic differentiation (**autograd**). Also, it provides support for training models using hardware accelerators ( like GPUs and TPUs ), and it contains many off-the-shelf implementations of state-of-the-art algorithms, architectures, and much more (https://pytorch.org/docs/stable/index.html).\n", "\n", "In this part of the notebook we will compare how we perform linear regression: \n", "1. pure numpy\n", "2. numpy + pytorch's autograd \n", "3. pure pytorch" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# The Problem" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(100, 1) (100,)\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from sklearn.datasets import make_regression\n", "\n", "n_features = 1\n", "n_samples = 100\n", "\n", "X, y = make_regression(\n", " n_samples=n_samples,\n", " n_features=n_features,\n", " noise=20,\n", " random_state=42,\n", ")\n", "\n", "fix, ax = plt.subplots()\n", "ax.plot(X, y, \".\")\n", "print(X.shape, y.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Numpy Solution" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "class LinearRegression(object):\n", " def __init__(self, n_features, n_targets=1, lr=0.1):\n", " self.W = np.zeros((n_targets, n_features))\n", " self.lr = lr\n", "\n", " def update_weight(self, X, y):\n", " m = X.shape[0]\n", " y_hat = self.predict(X)\n", " W_grad = 2 * np.dot(X.T, y_hat - y) / m\n", " self.W = self.W - self.lr * W_grad\n", "\n", " def loss(self, y_hat, y):\n", " return np.mean(np.power(y_hat - y, 2))\n", "\n", " def predict(self, X):\n", " y_hat = np.dot(X, self.W.T)\n", " return y_hat.squeeze(-1)\n", "\n", " def train(self, X, y, epochs=50):\n", " \"\"\"\n", " X (n_examples x n_features):\n", " y (n_examples): gold labels\n", " \"\"\"\n", " loss_history = []\n", " for _ in range(epochs):\n", " # for x_i, y_i in zip(X, y):\n", " # self.update_weight(x_i, y_i)\n", " self.update_weight(X, y)\n", " y_hat = self.predict(X)\n", " loss = self.loss(y_hat, y)\n", " loss_history.append(loss)\n", " return loss_history" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "use_bias = False\n", "if use_bias:\n", " X_np = np.hstack([np.ones((n_samples,1)), X])\n", " n_features += 1\n", "else:\n", " X_np = X" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "model = LinearRegression(n_features=n_features, n_targets=1, lr=0.1)\n", "loss_history = model.train(X_np, y, epochs=50)\n", "y_hat = model.predict(X_np)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(loss_history)\n", "plt.title('Loss per epoch');" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Vis\n", "fig, ax = plt.subplots()\n", "ax.plot(X, y, \".\", label=\"data\")\n", "ax.plot(X, y_hat, \".\", label=\"pred\")\n", "ax.set_title(f\"MSE: {loss_history[-1]:0.1f}\")\n", "ax.legend();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Numpy + Autograd Solution" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "class MixedLinearRegression(object):\n", " def __init__(self, n_features, n_targets=1, lr=0.01):\n", " self.W = torch.zeros(n_targets, n_features, requires_grad=True) # note requires_grad=True!\n", " self.lr = lr\n", " \n", " def update_weight(self):\n", " # Gradients are given to us by autograd!\n", " self.W.data = self.W.data - self.lr * self.W.grad.data\n", "\n", " def loss(self, y_hat, y):\n", " return torch.mean(torch.pow(y_hat - y, 2))\n", "\n", " def predict(self, X):\n", " y_hat = torch.matmul(X, self.W.t())\n", " return y_hat.squeeze(-1)\n", "\n", " def train(self, X, y, epochs=50):\n", " \"\"\"\n", " X (n_examples x n_features):\n", " y (n_examples): gold labels\n", " \"\"\"\n", " loss_history = []\n", " for _ in range(epochs):\n", " \n", " # Our neural net is a Line function!\n", " y_hat = self.predict(X)\n", " \n", " # Compute the loss using torch operations so they are saved in the gradient history.\n", " loss = self.loss(y_hat, y)\n", " \n", " # Computes the gradient of loss with respect to all Variables with requires_grad=True.\n", " loss.backward()\n", " loss_history.append(loss.item())\n", "\n", " # Update a and b using gradient descent; a.data and b.data are Tensors.\n", " self.update_weight()\n", "\n", " # Reset the accumulated gradients\n", " self.W.grad.data.zero_()\n", " \n", " return loss_history" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "X_pt = torch.from_numpy(X_np).float()\n", "y_pt = torch.from_numpy(y).float()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "model = MixedLinearRegression(n_features=n_features, n_targets=1, lr=0.1)\n", "loss_history = model.train(X_pt, y_pt, epochs=50)\n", "with torch.no_grad():\n", " y_hat = model.predict(X_pt)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(loss_history)\n", "plt.title('Loss per epoch');" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Vis\n", "fig, ax = plt.subplots()\n", "ax.plot(X_pt.cpu().numpy(), y_pt.cpu().numpy(), \".\", label=\"data\")\n", "ax.plot(X_pt.cpu().numpy(), y_hat.cpu().numpy(), \".\", label=\"pred\")\n", "ax.set_title(f\"MSE: {loss_history[-1]:0.1f}\")\n", "ax.legend();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# PyTorch Solution" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "X = torch.tensor(X,dtype=torch.float).float()\n", "y = torch.tensor(y.reshape((n_samples, n_features)),dtype=torch.float)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "class LinReg(nn.Module):\n", " # Model definition. \n", " # using off-the-shelf linear layer w/ bias.\n", " def __init__(self, input_dim):\n", " super().__init__()\n", " self.beta = nn.Linear(input_dim, 1)\n", "\n", " def forward(self, X):\n", " return self.beta(X)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "# define model, loss function and optimizer\n", "\n", "# using off-the-shelf loss and optimizer.\n", "\n", "model = LinReg(n_features).to(DEVICE) # <-- here\n", "loss_fn = nn.MSELoss()\n", "optimizer = optim.SGD(model.parameters(), lr=0.1)\n", "\n", "# move to GPU if available\n", "X, y = X.to(DEVICE), y.to(DEVICE) # <-- here" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "def train(model, X, y, epochs=50):\n", " \"\"\"\n", " Defining the training loop. \n", " \"\"\"\n", " model.train() # <-- here\n", " loss_history = []\n", " for _ in range(epochs):\n", " optimizer.zero_grad() # sets the gradients \"to zero\".\n", "\n", " y_ = model(X)\n", " loss = loss_fn(y_, y)\n", " \n", " loss_history.append(loss.item())\n", "\n", " loss.backward() # computes the gradients.\n", " optimizer.step() # updates weights using the gradients.\n", "\n", " return loss_history" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "def evaluate(model, X):\n", " \"\"\"\n", " Evaluating the model. \n", " \"\"\"\n", " model.eval() # <-- here\n", " with torch.no_grad(): \n", " y_ = model(X) \n", " return y_" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "loss_history = train(model, X, y, epochs=50)\n", "y_hat = evaluate(model, X)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(loss_history)\n", "plt.title('Loss per epoch');" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Vis\n", "fig, ax = plt.subplots()\n", "ax.plot(X.cpu().numpy(), y.cpu().numpy(), \".\", label=\"data\")\n", "ax.plot(X.cpu().numpy(), y_hat.cpu().numpy(), \".\", label=\"pred\")\n", "ax.set_title(f\"MSE: {loss_history[-1]:0.1f}\")\n", "ax.legend();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note: I did gradient descent with all the data. I did not split the data into `train` and `valid` which should be done!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Wrap up\n", "\n", "So when using Pytorch, we would advise you to use the following code as a backbone. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1) Define the model class\n", "\n", "Define the model class by extending the torch.nn.Module abstract class. " ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "# model definition\n", "class LogisticRegressor(nn.Module):\n", " # define model elements\n", " def __init__(self, n_inputs):\n", " super(LogisticRegressor, self).__init__()\n", " self.layer = nn.Linear(n_inputs, 1)\n", " self.activation = nn.Sigmoid()\n", " \n", " # forward propagate input\n", " def forward(self, X):\n", " X = self.layer(X)\n", " X = self.activation(X)\n", " return X\n", " \n", "model = LogisticRegressor(32)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2) Define loss and optimizer\n", "\n", "The training process requires that you define a loss function and an optimization algorithm.\n", "\n", "Common loss functions include the following:\n", "\n", "* BCELoss: Binary cross-entropy loss for binary classification.\n", "\n", "* CrossEntropyLoss: Categorical cross-entropy loss for multi-class classification.\n", "\n", "* MSELoss: Mean squared loss for regression.\n", "\n", "Common (first order) optimizers include: \n", "\n", "* SGD : stochastic gradient descent. \n", "* Adam : Similar to SGD but uses the EMA of gradients, and squared gradients to adjust the learning rate. " ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "# define the optimization\n", "criterion = nn.BCELoss()\n", "optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3) Training iteration\n", "\n", "Each update to the model involves the same general pattern comprised of:\n", "\n", "* Clearing the last error gradient. ( stop gradient accumulation )\n", "* A forward pass of the input through the model.\n", "* Calculating the loss for the model output.\n", "* Backpropagating the error through the model.\n", "* Update the model in an effort to reduce loss." ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [], "source": [ "## Toy data.\n", "inputs = torch.zeros( (16,32), dtype=torch.float32)\n", "targets = (torch.randn((16,1), dtype=torch.float32)>0).float()" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "# clear the gradients\n", "optimizer.zero_grad()\n", "# compute the model output\n", "yhat = model(inputs)\n", "# calculate loss\n", "loss = criterion(yhat, targets)\n", "# credit assignment\n", "loss.backward()\n", "# update model weights\n", "optimizer.step()" ] } ], "metadata": { "anaconda-cloud": {}, "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.9.2" } }, "nbformat": 4, "nbformat_minor": 1 }