{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "uJHywE_oL3j2" }, "source": [ "# Simple NN with Flax.\n", "\n", "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.sandbox.google.com/github/google-deepmind/optax/blob/main/examples/flax_example.ipynb)\n", "\n", "This notebook trains a simple one-layer NN with Optax and Flax. For more advanced applications of those two libraries, we recommend checking out the [`cifar10_resnet`](https://colab.sandbox.google.com/github/google-deepmind/optax/blob/main/examples/cifar10_resnet.ipynb) example." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "2UQeQxFzdrzd" }, "outputs": [], "source": [ "import jax\n", "import jax.numpy as jnp\n", "import optax\n", "import matplotlib.pyplot as plt\n", "from flax import linen as nn" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "YSqWu8a_dl4Q" }, "outputs": [], "source": [ "# @markdown Learning rate for the optimizer:\n", "LEARNING_RATE = 1e-2 # @param{type:\"number\"}\n", "# @markdown Number of training steps:\n", "NUM_STEPS = 100 # @param{type:\"integer\"}\n", "# @markdown Number of samples in the training dataset:\n", "NUM_SAMPLES = 20 # @param{type:\"integer\"}\n", "# @markdown Shape of the input:\n", "X_DIM = 10 # @param{type:\"integer\"}\n", "# @markdown Shape of the target:\n", "Y_DIM = 5 # @param{type:\"integer\"}\n" ] }, { "cell_type": "markdown", "metadata": { "id": "MNo8j9Fmmm7H" }, "source": [ "In this cell, we initialize a random number generator (RNG) and use it to create separate RNGs for all randomness-related things." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "nmrlbUqQeEGo" }, "outputs": [], "source": [ "rng = jax.random.PRNGKey(0)\n", "params_rng, w_rng, b_rng, samples_rng, noise_rng = jax.random.split(rng, num=5)" ] }, { "cell_type": "markdown", "metadata": { "id": "l2aAe-CXoE8Z" }, "source": [ "In the next cell, we define a model and obtain its initial parameters." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "LrKhX5XUeLqg" }, "outputs": [], "source": [ "# Creates a one linear layer instance.\n", "model = nn.Dense(features=Y_DIM)\n", "\n", "# Initializes the parameters.\n", "params = model.init(params_rng, jnp.ones((X_DIM,), dtype=jnp.float32))" ] }, { "cell_type": "markdown", "metadata": { "id": "FvOlOg5ag4uZ" }, "source": [ "In the next cell we generate our training data.\n", "\n", "We will be approximating a function of the form `y = wx + b`, hence why we generate `w`, `b`, training samples `x` and obtain `y`, using the formula above." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "rHgo4HHxef4D" }, "outputs": [], "source": [ "# Generates ground truth w and b.\n", "w = jax.random.normal(w_rng, (X_DIM, Y_DIM))\n", "b = jax.random.normal(b_rng, (Y_DIM,))\n", "\n", "# Generates training samples.\n", "x_samples = jax.random.normal(samples_rng, (NUM_SAMPLES, X_DIM))\n", "y_samples = jnp.dot(x_samples, w) + b\n", "# Adds noise to the target.\n", "y_samples += 0.1 * jax.random.normal(noise_rng, (NUM_SAMPLES, Y_DIM))" ] }, { "cell_type": "markdown", "metadata": { "id": "rNdtDg4ukJB3" }, "source": [ "Next we define a custom MSE loss function." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ikgNAXm0fKM1" }, "outputs": [], "source": [ "def make_mse_func(x_batched, y_batched):\n", " def mse(params):\n", " # Defines the squared loss for a single (x, y) pair.\n", " def squared_error(x, y):\n", " pred = model.apply(params, x)\n", " return jnp.inner(y-pred, y-pred) / 2.0\n", " # Vectorises the squared error and computes mean over the loss values.\n", " return jnp.mean(jax.vmap(squared_error)(x_batched, y_batched), axis=0)\n", " return jax.jit(mse) # `jit`s the result.\n", "\n", "# Instantiates the sampled loss.\n", "loss = make_mse_func(x_samples, y_samples)\n", "\n", "# Creates a function that returns value and gradient of the loss.\n", "loss_grad_fn = jax.value_and_grad(loss)" ] }, { "cell_type": "markdown", "metadata": { "id": "8-Lm815FrcDD" }, "source": [ "In the next cell, we construct a simple Adam optimiser using Optax gradient transformations passed to the `optax.chain`.\n", "\n", "The same result can be achieved by using the `optax.adam` alias. However, here, we demonstrate how to work with gradient transformations manually so that you can build your own custom optimiser if needed." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "F7aS_-dofapt" }, "outputs": [], "source": [ "tx = optax.chain(\n", " # Sets the parameters of Adam. Note the learning_rate is not here.\n", " optax.scale_by_adam(b1=0.9, b2=0.999, eps=1e-8),\n", " # Puts a minus sign to *minimise* the loss.\n", " optax.scale(-LEARNING_RATE)\n", ")" ] }, { "cell_type": "markdown", "metadata": { "id": "dZhCXZC0qpV1" }, "source": [ "We then pass the initial parameters of the model to the optimiser to initialize it." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "1Oukzb31fbyZ" }, "outputs": [], "source": [ "opt_state = tx.init(params)" ] }, { "cell_type": "markdown", "metadata": { "id": "eOpZ_zZ_qwWz" }, "source": [ "Finally, we train the model for `NUM_STEPS` steps." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "l09Gos8pfzXU" }, "outputs": [], "source": [ "loss_history = []\n", "\n", "# Minimises the loss.\n", "for _ in range(NUM_STEPS):\n", " # Computes gradient of the loss.\n", " loss_val, grads = loss_grad_fn(params)\n", " loss_history.append(loss_val)\n", " # Updates the optimiser state, creates an update to the params.\n", " updates, opt_state = tx.update(grads, opt_state)\n", " # Updates the parameters.\n", " params = optax.apply_updates(params, updates)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "height": 294 }, "executionInfo": { "elapsed": 179, "status": "ok", "timestamp": 1702312436820, "user": { "displayName": "", "userId": "" }, "user_tz": 0 }, "id": "frb0aKw7jhee", "outputId": "f57e2f1a-f73e-4905-a6d7-b7a6c0fea872" }, "outputs": [ { "data": { "image/png": "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\nQv7+/po3b57atWtnG3m/4syZMyZVd3Ou/CXj6NGjV+1z/PjxPP2vsFgs6tKli9577z1t2bJF8fHx\n+vTTT+Xv76/Dhw/bpjb9VXBwsMaMGaO5c+fq3Llz2rBhg3r37i3DMPT8889r+/btRfTpAKBoEPgB\noIy5MmodGRmZZ33+K3799deSLKnAmjZtKklav369Ll68mG+fZcuWSZK8vb1Vu3bta75ehQoVNGLE\nCNtI/YoVK67Z32Kx6NZbb9WsWbMUGhoqq9Wq1atX3+zHAIBiReAHgDLmytryBw4cUHp6ep7zixcv\nVkxMTEmXVSD33nuvnJyclJCQoM8++yzP+YsXL+rNN9+09b0y1clqtSo7O/uqr+vp6Skp91ShzMzM\nq/Z3dnaWq6trnmsAoDQg8ANAGdOmTRt5eXkpISFBgwcPti1LeenSJX355Zfq06ePAgICTK7yxlSv\nXl0jRoyQJI0fP16fffaZLXDv379fd911lw4ePCgvLy8999xztuuSk5MVERGhV199VTt27LAt12m1\nWrV06VI9++yzkmRbRlSS/v3vfys6Olpz587NtXHYmTNn9MQTTyguLk4Wi0W33357sX9uALgZBH4A\nKGP8/Pz0+uuvS5JmzZqlypUry8/PT+XLl9ewYcMUERGh//znPyZXeePefvtt3X777crIyNAjjzwi\nHx8fVahQQbVr19by5cvl7u6uGTNmKDIyMtd1R48e1XPPPaeGDRvK09NTAQEBcnNzU5cuXXTixAmF\nh4fbHl6WpOzsbM2ZM0e9e/dWQECAfH19Vb58eYWEhOiDDz6QJL3yyitq0KBBiX5+ALgeAj8AlEFP\nPPGEfvjhB9tof3Z2turUqaMJEyYoNjb2mktrljZeXl765Zdf9Pnnn6tdu3by8vLSxYsXVb16dQ0f\nPlw7duxQz549c11Tvnx5/fTTTxo7dqyaN2+uoKAgpaSkyNvbW7feeqteffVV/fbbb7mW9Bw3bpze\nf/999ezZU5GRkTIMQxkZGapataruv/9+rVy5Uv/+979L+uMDwHVZDHtZcw0AAADATWOEHwAAAHBg\nBH4AAADAgRH4AQAAAAdG4AcAAAAcGIEfAAAAcGAEfgAAAMCBEfgBAAAAB0bgBwAAABwYgR8AAABw\nYAR+AAAAwIG5mF2AvQsLC1NycrJq1KhhdikAAABwYHFxcSpfvryOHDlyU9cR+AspOTlZ6enpZpcB\n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\n", "text/plain": [ "\u003cFigure size 600x400 with 1 Axes\u003e" ] }, "metadata": { "image/png": { "height": 277, "width": 382 } }, "output_type": "display_data" } ], "source": [ "plt.plot(loss_history)\n", "plt.title('Train loss')\n", "plt.xlabel('Step')\n", "plt.ylabel('MSE')\n", "plt.show()" ] } ], "metadata": { "colab": { "collapsed_sections": [], "provenance": [] } }, "nbformat": 4, "nbformat_minor": 0 }