From 1d733c0d6c73bd32c42a9bc2607b850e94db86c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Sok=C3=B3=C5=82?= <8431159+mtsokol@users.noreply.github.com> Date: Tue, 3 Dec 2024 17:51:07 +0100 Subject: [PATCH] NLP: JAX time series classification (#105) --- docs/JAX_time_series_classification.ipynb | 1539 +++++++++++++++++++++ docs/JAX_time_series_classification.md | 389 ++++++ docs/conf.py | 2 + docs/tutorials.md | 1 + 4 files changed, 1931 insertions(+) create mode 100644 docs/JAX_time_series_classification.ipynb create mode 100644 docs/JAX_time_series_classification.md diff --git a/docs/JAX_time_series_classification.ipynb b/docs/JAX_time_series_classification.ipynb new file mode 100644 index 0000000..17cd388 --- /dev/null +++ b/docs/JAX_time_series_classification.ipynb @@ -0,0 +1,1539 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Time series classification with JAX\n", + "\n", + "In this tutorial, we're going to perform time series classification with a Convolutional Neural Network.\n", + "We will use the FordA dataset from the [UCR archive](https://www.cs.ucr.edu/%7Eeamonn/time_series_data_2018/),\n", + "which contains measurements of engine noise captured by a motor sensor.\n", + "\n", + "We need to assess if an engine is malfunctioning based on the recorded noises it generates.\n", + "Each sample comprises of noise measurements across time, together with a \"yes/no\" label,\n", + "so this is a binary classification problem.\n", + "\n", + "Although convolution models are mainly associated with image processing, they are also useful\n", + "for time series data because they can extract temporal structures." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tools overview and setup\n", + "\n", + "Here's a list of key packages that belong to the JAX AI stack required for this tutorial:\n", + "\n", + "- [JAX](https://github.com/jax-ml/jax) for array computations.\n", + "- [Flax](https://github.com/google/flax) for constructing neural networks.\n", + "- [Optax](https://github.com/google-deepmind/optax) for gradient processing and optimization.\n", + "- [Grain](https://github.com/google/grain/) to define data sources.\n", + "- [tqdm](https://tqdm.github.io/) for a progress bar to monitor the training progress.\n", + "\n", + "We'll start by installing and importing these packages." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Required packages\n", + "# !pip install -U jax flax optax\n", + "# !pip install -U grain tqdm requests matplotlib" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import jax\n", + "import jax.numpy as jnp\n", + "from flax import nnx\n", + "import optax\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import grain.python as grain\n", + "import tqdm" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load the dataset\n", + "\n", + "We load dataset files into NumPy arrays, add singleton dimension to take convolution features\n", + "into account, and change `-1` label to `0` (so that the expected values are `0` and `1`):" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_ucr_dataset() -> tuple:\n", + " root_url = \"https://raw.githubusercontent.com/hfawaz/cd-diagram/master/FordA/\"\n", + "\n", + " train_data = np.loadtxt(root_url + \"FordA_TRAIN.tsv\", delimiter=\"\\t\")\n", + " x_train, y_train = train_data[:, 1:], train_data[:, 0].astype(int)\n", + "\n", + " test_data = np.loadtxt(root_url + \"FordA_TEST.tsv\", delimiter=\"\\t\")\n", + " x_test, y_test = test_data[:, 1:], test_data[:, 0].astype(int)\n", + "\n", + " x_train = x_train.reshape((*x_train.shape, 1))\n", + " x_test = x_test.reshape((*x_test.shape, 1))\n", + "\n", + " rng = np.random.RandomState(113)\n", + " indices = rng.permutation(len(x_train))\n", + " x_train = x_train[indices]\n", + " y_train = y_train[indices]\n", + "\n", + " y_train[y_train == -1] = 0\n", + " y_test[y_test == -1] = 0\n", + "\n", + " return (x_train, y_train), (x_test, y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "(x_train, y_train), (x_test, y_test) = prepare_ucr_dataset()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's visualize example samples from each class." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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BEEMNuetIkIQBEEQRO+hQIQgCIIgiJ5BgQhBEARBED2DAhGCIAiCIHrGeRmI/Pmf/zk2b96MZDKJffv24cknn+z1Jq06/uVf/gVvf/vbsW7dOhiGga9//euO+xlj+NSnPoXp6WmkUikcOHAAL7/8suMxZ8+exe23345cLoeRkRHccccdyOfzK/hf9Df3338/rrjiCgwNDWFqagq//uu/jkOHDjkeUyqVcOedd2J8fBzZbBbvete7cPLkScdjjhw5gltuuQXpdBpTU1P4xCc+gVqttpL/St/zwAMPYNeuXaqh0/79+/Htb39b3U/7ORw+85nPwDAMfPzjH1e/o30dDH/4h38IwzAcXxdeeKG6v6/2MzvPeOihh1g8Hmd/8zd/w1544QX2wQ9+kI2MjLCTJ0/2etNWFd/61rfY7//+77OvfvWrDAD72te+5rj/M5/5DBseHmZf//rX2U9+8hN26623si1btrBisagec9NNN7Hdu3ezxx9/nP3gBz9g27dvZ7fddtsK/yf9y4033si+/OUvs+eff54dPHiQvfWtb2UbN25k+XxePebDH/4wm5mZYd/97nfZU089xa666ip29dVXq/trtRq7+OKL2YEDB9gzzzzDvvWtb7GJiQl277339uJf6lv+6Z/+iX3zm99kP/vZz9ihQ4fYJz/5SRaLxdjzzz/PGKP9HAZPPvkk27x5M9u1axf72Mc+pn5P+zoY7rvvPnbRRRex48ePq69Tp06p+/tpP593gciVV17J7rzzTvVzvV5n69atY/fff38Pt2p14w5ELMtia9euZZ/97GfV7+bm5lgikWB/93d/xxhj7MUXX2QA2I9+9CP1mG9/+9vMMAx29OjRFdv21cTs7CwDwB599FHGGN+nsViMfeUrX1GP+elPf8oAsMcee4wxxgNG0zTZiRMn1GMeeOABlsvlWLlcXtl/YJUxOjrK/vqv/5r2cwgsLi6yHTt2sIcffpi9+c1vVoEI7evguO+++9ju3bs97+u3/XxepWYqlQqefvppHDhwQP3ONE0cOHAAjz32WA+3bLB45ZVXcOLECcd+Hh4exr59+9R+fuyxxzAyMoLLL79cPebAgQMwTRNPPPHEim/zamB+fh4AMDY2BgB4+umnUa1WHfv5wgsvxMaNGx37+ZJLLsGaNWvUY2688UYsLCzghRdeWMGtXz3U63U89NBDWFpawv79+2k/h8Cdd96JW265xbFPATqmg+bll1/GunXrsHXrVtx+++04cuQIgP7bz3099C5oTp8+jXq97tixALBmzRq89NJLPdqqwePEiRMA4Lmf5X0nTpzA1NSU4/5oNIqxsTH1GMLGsix8/OMfx5ve9CZcfPHFAPg+jMfjGBkZcTzWvZ+93gd5H2Hz3HPPYf/+/SiVSshms/ja176GN77xjTh48CDt5wB56KGH8OMf/xg/+tGPGu6jYzo49u3bhwcffBA7d+7E8ePH8elPfxrXXHMNnn/++b7bz+dVIEIQq5U777wTzz//PH74wx/2elMGlp07d+LgwYOYn5/HP/zDP+C9730vHn300V5v1kDx+uuv42Mf+xgefvhhJJPJXm/OQHPzzTer73ft2oV9+/Zh06ZN+Pu//3ukUqkeblkj51VqZmJiApFIpMEZfPLkSaxdu7ZHWzV4yH3Zaj+vXbsWs7OzjvtrtRrOnj1L74WLu+66C9/4xjfw/e9/Hxs2bFC/X7t2LSqVCubm5hyPd+9nr/dB3kfYxONxbN++HXv37sX999+P3bt348/+7M9oPwfI008/jdnZWVx22WWIRqOIRqN49NFH8YUvfAHRaBRr1qyhfR0SIyMjuOCCC3D48OG+O6bPq0AkHo9j7969+O53v6t+Z1kWvvvd72L//v093LLBYsuWLVi7dq1jPy8sLOCJJ55Q+3n//v2Ym5vD008/rR7zve99D5ZlYd++fSu+zf0IYwx33XUXvva1r+F73/setmzZ4rh/7969iMVijv186NAhHDlyxLGfn3vuOUfQ9/DDDyOXy+GNb3zjyvwjqxTLslAul2k/B8j111+P5557DgcPHlRfl19+OW6//Xb1Pe3rcMjn8/j5z3+O6enp/jumA7W+rgIeeughlkgk2IMPPshefPFF9qEPfYiNjIw4nMHE8iwuLrJnnnmGPfPMMwwA+9M//VP2zDPPsNdee40xxst3R0ZG2D/+4z+yZ599lr3jHe/wLN/ds2cPe+KJJ9gPf/hDtmPHDirf1fjIRz7ChoeH2SOPPOIowSsUCuoxH/7wh9nGjRvZ9773PfbUU0+x/fv3s/3796v7ZQneDTfcwA4ePMj++Z//mU1OTlKpo4t77rmHPfroo+yVV15hzz77LLvnnnuYYRjsO9/5DmOM9nOY6FUzjNG+Doq7776bPfLII+yVV15h//qv/8oOHDjAJiYm2OzsLGOsv/bzeReIMMbYF7/4RbZx40YWj8fZlVdeyR5//PFeb9Kq4/vf/z4D0PD13ve+lzHGS3j/4A/+gK1Zs4YlEgl2/fXXs0OHDjme48yZM+y2225j2WyW5XI59v73v58tLi724L/pT7z2LwD25S9/WT2mWCyyj370o2x0dJSl02n2zne+kx0/ftzxPK+++iq7+eabWSqVYhMTE+zuu+9m1Wp1hf+b/uYDH/gA27RpE4vH42xycpJdf/31KghhjPZzmLgDEdrXwfCe97yHTU9Ps3g8ztavX8/e8573sMOHD6v7+2k/G4wxFqzGQhAEQRAE0R7nlUeEIAiCIIj+ggIRgiAIgiB6BgUiBEEQBEH0DApECIIgCILoGRSIEARBEATRMygQIQiCIAiiZ1AgQhAEQRBEz6BAhCAIgiCInkGBCEEQBEEQPYMCEYIgCIIgegYFIgRBEARB9AwKRAiCIAiC6Bn/P/PdQ2nIBX4sAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "classes = np.unique(np.concatenate((y_train, y_test), axis=0))\n", + "for c in classes:\n", + " c_x_train = x_train[y_train == c]\n", + " plt.plot(c_x_train[0], label=\"class \" + str(c))\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create a Data Loader using Grain\n", + "\n", + "For handling input data we're going to use Grain, a pure Python package developed for JAX and\n", + "Flax models.\n", + "\n", + "Grain follows the source-sampler-loader paradigm. Grain supports custom setups where data sources\n", + "might come in different forms, but they all need to implement the `grain.RandomAccessDataSource`\n", + "interface. See [PyGrain Data Sources](https://github.com/google/grain/blob/main/docs/data_sources.md)\n", + "for more details.\n", + "\n", + "Our dataset is comprised of relatively small NumPy arrays so our `DataSource` is uncomplicated:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "class DataSource(grain.RandomAccessDataSource):\n", + " def __init__(self, x, y):\n", + " self._x = x\n", + " self._y = y\n", + "\n", + " def __getitem__(self, idx):\n", + " return {\"measurement\": self._x[idx], \"label\": self._y[idx]}\n", + "\n", + " def __len__(self):\n", + " return len(self._x)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "train_source = DataSource(x_train, y_train)\n", + "test_source = DataSource(x_test, y_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Samplers determine the order in which records are processed, and we'll use the\n", + "[`IndexSmapler`](https://github.com/google/grain/blob/main/docs/data_loader/samplers.md#index-sampler)\n", + "recommended by Grain.\n", + "\n", + "Finally, we'll create `DataLoader`s that handle orchestration of loading.\n", + "We'll leverage Grain's multiprocessing capabilities to scale processing up to 4 workers." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "seed = 12\n", + "train_batch_size = 128\n", + "test_batch_size = 2 * train_batch_size\n", + "\n", + "train_sampler = grain.IndexSampler(\n", + " len(train_source),\n", + " shuffle=True,\n", + " seed=seed,\n", + " shard_options=grain.NoSharding(), # No sharding since this is a single-device setup\n", + " num_epochs=1, # Iterate over the dataset for one epoch\n", + ")\n", + "\n", + "test_sampler = grain.IndexSampler(\n", + " len(test_source),\n", + " shuffle=False,\n", + " seed=seed,\n", + " shard_options=grain.NoSharding(), # No sharding since this is a single-device setup\n", + " num_epochs=1, # Iterate over the dataset for one epoch\n", + ")\n", + "\n", + "\n", + "train_loader = grain.DataLoader(\n", + " data_source=train_source,\n", + " sampler=train_sampler, # Sampler to determine how to access the data\n", + " worker_count=4, # Number of child processes launched to parallelize the transformations among\n", + " worker_buffer_size=2, # Count of output batches to produce in advance per worker\n", + " operations=[\n", + " grain.Batch(train_batch_size, drop_remainder=True),\n", + " ]\n", + ")\n", + "\n", + "test_loader = grain.DataLoader(\n", + " data_source=test_source,\n", + " sampler=test_sampler, # Sampler to determine how to access the data\n", + " worker_count=4, # Number of child processes launched to parallelize the transformations among\n", + " worker_buffer_size=2, # Count of output batches to produce in advance per worker\n", + " operations=[\n", + " grain.Batch(test_batch_size),\n", + " ]\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define the Model\n", + "\n", + "Let's now construct the Convolutional Neural Network with Flax by subclassing `nnx.Module`.\n", + "You can learn more about the [Flax NNX module system in the Flax documentation](https://flax.readthedocs.io/en/latest/nnx_basics.html#the-flax-nnx-module-system).\n", + "\n", + "Let's have three convolution and dense layers, and use ReLU activation function for middle\n", + "layers and softmax in the final layer for binary classification output." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "class MyModel(nnx.Module):\n", + " def __init__(self, rngs: nnx.Rngs):\n", + " self.conv_1 = nnx.Conv(\n", + " in_features=1, out_features=64, kernel_size=3, padding=\"SAME\", rngs=rngs\n", + " )\n", + " self.layer_norm_1 = nnx.LayerNorm(num_features=64, epsilon=0.001, rngs=rngs)\n", + "\n", + " self.conv_2 = nnx.Conv(\n", + " in_features=64, out_features=64, kernel_size=3, padding=\"SAME\", rngs=rngs\n", + " )\n", + " self.layer_norm_2 = nnx.LayerNorm(num_features=64, epsilon=0.001, rngs=rngs)\n", + "\n", + " self.conv_3 = nnx.Conv(\n", + " in_features=64, out_features=64, kernel_size=3, padding=\"SAME\", rngs=rngs\n", + " )\n", + " self.layer_norm_3 = nnx.LayerNorm(num_features=64, epsilon=0.001, rngs=rngs)\n", + "\n", + " self.dense_1 = nnx.Linear(in_features=64, out_features=2, rngs=rngs)\n", + "\n", + " def __call__(self, x: jax.Array):\n", + " x = self.conv_1(x)\n", + " x = self.layer_norm_1(x)\n", + " x = jax.nn.relu(x)\n", + "\n", + " x = self.conv_2(x)\n", + " x = self.layer_norm_2(x)\n", + " x = jax.nn.relu(x)\n", + "\n", + " x = self.conv_3(x)\n", + " x = self.layer_norm_3(x)\n", + " x = jax.nn.relu(x)\n", + "\n", + " x = jnp.mean(x, axis=(1,)) # global average pooling\n", + " x = self.dense_1(x)\n", + " x = jax.nn.softmax(x)\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MyModel(\n", + " conv_1=Conv(\n", + " kernel_shape=(3, 1, 64),\n", + " kernel=Param(\n", + " value=Array(shape=(3, 1, 64), dtype=float32)\n", + " ),\n", + " bias=Param(\n", + " value=Array(shape=(64,), dtype=float32)\n", + " ),\n", + " in_features=1,\n", + " out_features=64,\n", + " kernel_size=(3,),\n", + " strides=1,\n", + " padding='SAME',\n", + " input_dilation=1,\n", + " kernel_dilation=1,\n", + " feature_group_count=1,\n", + " use_bias=True,\n", + " mask=None,\n", + " dtype=None,\n", + " param_dtype=,\n", + " precision=None,\n", + " kernel_init=.init at 0x7fec9a939bd0>,\n", + " bias_init=,\n", + " conv_general_dilated=\n", + " ),\n", + " layer_norm_1=LayerNorm(\n", + " scale=Param(\n", + " value=Array(shape=(64,), dtype=float32)\n", + " ),\n", + " bias=Param(\n", + " value=Array(shape=(64,), dtype=float32)\n", + " ),\n", + " num_features=64,\n", + " epsilon=0.001,\n", + " dtype=None,\n", + " param_dtype=,\n", + " use_bias=True,\n", + " use_scale=True,\n", + " bias_init=,\n", + " scale_init=,\n", + " reduction_axes=-1,\n", + " feature_axes=-1,\n", + " axis_name=None,\n", + " axis_index_groups=None,\n", + " use_fast_variance=True\n", + " ),\n", + " conv_2=Conv(\n", + " kernel_shape=(3, 64, 64),\n", + " kernel=Param(\n", + " value=Array(shape=(3, 64, 64), dtype=float32)\n", + " ),\n", + " bias=Param(\n", + " value=Array(shape=(64,), dtype=float32)\n", + " ),\n", + " in_features=64,\n", + " out_features=64,\n", + " kernel_size=(3,),\n", + " strides=1,\n", + " padding='SAME',\n", + " input_dilation=1,\n", + " kernel_dilation=1,\n", + " feature_group_count=1,\n", + " use_bias=True,\n", + " mask=None,\n", + " dtype=None,\n", + " param_dtype=,\n", + " precision=None,\n", + " kernel_init=.init at 0x7fec9a939bd0>,\n", + " bias_init=,\n", + " conv_general_dilated=\n", + " ),\n", + " layer_norm_2=LayerNorm(\n", + " scale=Param(\n", + " value=Array(shape=(64,), dtype=float32)\n", + " ),\n", + " bias=Param(\n", + " value=Array(shape=(64,), dtype=float32)\n", + " ),\n", + " num_features=64,\n", + " epsilon=0.001,\n", + " dtype=None,\n", + " param_dtype=,\n", + " use_bias=True,\n", + " use_scale=True,\n", + " bias_init=,\n", + " scale_init=,\n", + " reduction_axes=-1,\n", + " feature_axes=-1,\n", + " axis_name=None,\n", + " axis_index_groups=None,\n", + " use_fast_variance=True\n", + " ),\n", + " conv_3=Conv(\n", + " kernel_shape=(3, 64, 64),\n", + " kernel=Param(\n", + " value=Array(shape=(3, 64, 64), dtype=float32)\n", + " ),\n", + " bias=Param(\n", + " value=Array(shape=(64,), dtype=float32)\n", + " ),\n", + " in_features=64,\n", + " out_features=64,\n", + " kernel_size=(3,),\n", + " strides=1,\n", + " padding='SAME',\n", + " input_dilation=1,\n", + " kernel_dilation=1,\n", + " feature_group_count=1,\n", + " use_bias=True,\n", + " mask=None,\n", + " dtype=None,\n", + " param_dtype=,\n", + " precision=None,\n", + " kernel_init=.init at 0x7fec9a939bd0>,\n", + " bias_init=,\n", + " conv_general_dilated=\n", + " ),\n", + " layer_norm_3=LayerNorm(\n", + " scale=Param(\n", + " value=Array(shape=(64,), dtype=float32)\n", + " ),\n", + " bias=Param(\n", + " value=Array(shape=(64,), dtype=float32)\n", + " ),\n", + " num_features=64,\n", + " epsilon=0.001,\n", + " dtype=None,\n", + " param_dtype=,\n", + " use_bias=True,\n", + " use_scale=True,\n", + " bias_init=,\n", + " scale_init=,\n", + " reduction_axes=-1,\n", + " feature_axes=-1,\n", + " axis_name=None,\n", + " axis_index_groups=None,\n", + " use_fast_variance=True\n", + " ),\n", + " dense_1=Linear(\n", + " kernel=Param(\n", + " value=Array(shape=(64, 2), dtype=float32)\n", + " ),\n", + " bias=Param(\n", + " value=Array(shape=(2,), dtype=float32)\n", + " ),\n", + " in_features=64,\n", + " out_features=2,\n", + " use_bias=True,\n", + " dtype=None,\n", + " param_dtype=,\n", + " precision=None,\n", + " kernel_init=.init at 0x7fec9a939bd0>,\n", + " bias_init=,\n", + " dot_general=\n", + " )\n", + ")\n" + ] + } + ], + "source": [ + "model = MyModel(rngs=nnx.Rngs(0))\n", + "nnx.display(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Train the Model\n", + "\n", + "To train our Flax model we need to construct an `nnx.Optimizer` object with our model and\n", + "a selected optimization algorithm. The optimizer object manages the model’s parameters and\n", + "applies gradients during training.\n", + "\n", + "We're going to use [Adam optimizer](https://optax.readthedocs.io/en/latest/api/optimizers.html#adam),\n", + "a popular choice for Deep Learning models. We'll use it through\n", + "[Optax](https://optax.readthedocs.io/en/latest/index.html), an optimization library developed for JAX." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "num_epochs = 300\n", + "learning_rate = 0.0005\n", + "momentum = 0.9\n", + "\n", + "optimizer = nnx.Optimizer(model, optax.adam(learning_rate, momentum))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll define a loss and logits computation function using Optax's\n", + "[`losses.softmax_cross_entropy_with_integer_labels`](https://optax.readthedocs.io/en/latest/api/losses.html#optax.losses.softmax_cross_entropy_with_integer_labels)." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def compute_losses_and_logits(model: nnx.Module, batch_tokens: jax.Array, labels: jax.Array):\n", + " logits = model(batch_tokens)\n", + "\n", + " loss = optax.softmax_cross_entropy_with_integer_labels(\n", + " logits=logits, labels=labels\n", + " ).mean()\n", + " return loss, logits" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll now define the training and evaluation step functions. The loss and logits from both\n", + "functions will be used for calculating accuracy metrics.\n", + "\n", + "For training, we'll use `nnx.value_and_grad` to compute the gradients, and then update\n", + "the model’s parameters using our optimizer.\n", + "\n", + "Notice the use of [`nnx.jit`](https://flax.readthedocs.io/en/latest/api_reference/flax.nnx/transforms.html#flax.nnx.jit). This sets up the functions for just-in-time (JIT) compilation with [XLA](https://openxla.org/xla)\n", + "for performant execution across different hardware accelerators like GPUs and TPUs." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "@nnx.jit\n", + "def train_step(\n", + " model: nnx.Module, optimizer: nnx.Optimizer, batch: dict[str, jax.Array]\n", + "):\n", + " batch_tokens = jnp.array(batch[\"measurement\"])\n", + " labels = jnp.array(batch[\"label\"], dtype=jnp.int32)\n", + "\n", + " grad_fn = nnx.value_and_grad(compute_losses_and_logits, has_aux=True)\n", + " (loss, logits), grads = grad_fn(model, batch_tokens, labels)\n", + "\n", + " optimizer.update(grads) # In-place updates.\n", + "\n", + " return loss\n", + "\n", + "@nnx.jit\n", + "def eval_step(\n", + " model: nnx.Module, batch: dict[str, jax.Array], eval_metrics: nnx.MultiMetric\n", + "):\n", + " batch_tokens = jnp.array(batch[\"measurement\"])\n", + " labels = jnp.array(batch[\"label\"], dtype=jnp.int32)\n", + " loss, logits = compute_losses_and_logits(model, batch_tokens, labels)\n", + "\n", + " eval_metrics.update(\n", + " loss=loss,\n", + " logits=logits,\n", + " labels=labels,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "eval_metrics = nnx.MultiMetric(\n", + " loss=nnx.metrics.Average('loss'),\n", + " accuracy=nnx.metrics.Accuracy(),\n", + ")\n", + "\n", + "train_metrics_history = {\n", + " \"train_loss\": [],\n", + "}\n", + "\n", + "eval_metrics_history = {\n", + " \"test_loss\": [],\n", + " \"test_accuracy\": [],\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now train the CNN model. We'll evaluate the model’s performance on the test set\n", + "after each epoch, and print the metrics: total loss and accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "bar_format = \"{desc}[{n_fmt}/{total_fmt}]{postfix} [{elapsed}<{remaining}]\"\n", + "train_total_steps = len(x_train) // train_batch_size\n", + "\n", + "def train_one_epoch(epoch: int):\n", + " model.train()\n", + " with tqdm.tqdm(\n", + " desc=f\"[train] epoch: {epoch}/{num_epochs}, \",\n", + " total=train_total_steps,\n", + " bar_format=bar_format,\n", + " miniters=10,\n", + " leave=True,\n", + " ) as pbar:\n", + " for batch in train_loader:\n", + " loss = train_step(model, optimizer, batch)\n", + " train_metrics_history[\"train_loss\"].append(loss.item())\n", + " pbar.set_postfix({\"loss\": loss.item()})\n", + " pbar.update(1)\n", + "\n", + "def evaluate_model(epoch: int):\n", + " # Compute the metrics on the train and val sets after each training epoch.\n", + " model.eval()\n", + "\n", + " eval_metrics.reset() # Reset the eval metrics\n", + " for test_batch in test_loader:\n", + " eval_step(model, test_batch, eval_metrics)\n", + "\n", + " for metric, value in eval_metrics.compute().items():\n", + " eval_metrics_history[f'test_{metric}'].append(value)\n", + "\n", + " if epoch % 10 == 0:\n", + " print(f\"[test] epoch: {epoch + 1}/{num_epochs}\")\n", + " print(f\"- total loss: {eval_metrics_history['test_loss'][-1]:0.4f}\")\n", + " print(f\"- Accuracy: {eval_metrics_history['test_accuracy'][-1]:0.4f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 0/300, [28/28], loss=0.684 [00:05<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 1/300\n", + "- total loss: 0.6887\n", + "- Accuracy: 0.5159\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 1/300, [28/28], loss=0.676 [00:03<00:00]\n", + "[train] epoch: 2/300, [28/28], loss=0.663 [00:03<00:00]\n", + "[train] epoch: 3/300, [28/28], loss=0.655 [00:03<00:00]\n", + "[train] epoch: 4/300, [28/28], loss=0.654 [00:03<00:00]\n", + "[train] epoch: 5/300, [28/28], loss=0.649 [00:03<00:00]\n", + "[train] epoch: 6/300, [28/28], loss=0.651 [00:03<00:00]\n", + "[train] epoch: 7/300, [28/28], loss=0.646 [00:03<00:00]\n", + "[train] epoch: 8/300, [28/28], loss=0.62 [00:03<00:00] \n", + "[train] epoch: 9/300, [28/28], loss=0.632 [00:03<00:00]\n", + "[train] epoch: 10/300, [28/28], loss=0.606 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 11/300\n", + "- total loss: 0.6179\n", + "- Accuracy: 0.7068\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 11/300, [28/28], loss=0.6 [00:03<00:00] \n", + "[train] epoch: 12/300, [28/28], loss=0.604 [00:03<00:00]\n", + "[train] epoch: 13/300, [28/28], loss=0.587 [00:03<00:00]\n", + "[train] epoch: 14/300, [28/28], loss=0.588 [00:03<00:00]\n", + "[train] epoch: 15/300, [28/28], loss=0.583 [00:03<00:00]\n", + "[train] epoch: 16/300, [28/28], loss=0.578 [00:03<00:00]\n", + "[train] epoch: 17/300, [28/28], loss=0.578 [00:03<00:00]\n", + "[train] epoch: 18/300, [28/28], loss=0.575 [00:03<00:00]\n", + "[train] epoch: 19/300, [28/28], loss=0.573 [00:03<00:00]\n", + "[train] epoch: 20/300, [28/28], loss=0.57 [00:03<00:00] \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 21/300\n", + "- total loss: 0.5673\n", + "- Accuracy: 0.7848\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 21/300, [28/28], loss=0.567 [00:03<00:00]\n", + "[train] epoch: 22/300, [28/28], loss=0.565 [00:03<00:00]\n", + "[train] epoch: 23/300, [28/28], loss=0.564 [00:03<00:00]\n", + "[train] epoch: 24/300, [28/28], loss=0.561 [00:03<00:00]\n", + "[train] epoch: 25/300, [28/28], loss=0.561 [00:03<00:00]\n", + "[train] epoch: 26/300, [28/28], loss=0.56 [00:03<00:00] \n", + "[train] epoch: 27/300, [28/28], loss=0.558 [00:03<00:00]\n", + "[train] epoch: 28/300, [28/28], loss=0.557 [00:03<00:00]\n", + "[train] epoch: 29/300, [28/28], loss=0.556 [00:03<00:00]\n", + "[train] epoch: 30/300, [28/28], loss=0.554 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 31/300\n", + "- total loss: 0.5454\n", + "- Accuracy: 0.7985\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 31/300, [28/28], loss=0.553 [00:03<00:00]\n", + "[train] epoch: 32/300, [28/28], loss=0.553 [00:03<00:00]\n", + "[train] epoch: 33/300, [28/28], loss=0.551 [00:03<00:00]\n", + "[train] epoch: 34/300, [28/28], loss=0.55 [00:03<00:00] \n", + "[train] epoch: 35/300, [28/28], loss=0.55 [00:03<00:00] \n", + "[train] epoch: 36/300, [28/28], loss=0.549 [00:03<00:00]\n", + "[train] epoch: 37/300, [28/28], loss=0.547 [00:03<00:00]\n", + "[train] epoch: 38/300, [28/28], loss=0.547 [00:03<00:00]\n", + "[train] epoch: 39/300, [28/28], loss=0.546 [00:03<00:00]\n", + "[train] epoch: 40/300, [28/28], loss=0.545 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 41/300\n", + "- total loss: 0.5324\n", + "- Accuracy: 0.7970\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 41/300, [28/28], loss=0.546 [00:03<00:00]\n", + "[train] epoch: 42/300, [28/28], loss=0.543 [00:03<00:00]\n", + "[train] epoch: 43/300, [28/28], loss=0.542 [00:03<00:00]\n", + "[train] epoch: 44/300, [28/28], loss=0.541 [00:03<00:00]\n", + "[train] epoch: 45/300, [28/28], loss=0.542 [00:03<00:00]\n", + "[train] epoch: 46/300, [28/28], loss=0.541 [00:03<00:00]\n", + "[train] epoch: 47/300, [28/28], loss=0.541 [00:03<00:00]\n", + "[train] epoch: 48/300, [28/28], loss=0.54 [00:03<00:00] \n", + "[train] epoch: 49/300, [28/28], loss=0.539 [00:03<00:00]\n", + "[train] epoch: 50/300, [28/28], loss=0.537 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 51/300\n", + "- total loss: 0.5250\n", + "- Accuracy: 0.7992\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 51/300, [28/28], loss=0.538 [00:03<00:00]\n", + "[train] epoch: 52/300, [28/28], loss=0.537 [00:03<00:00]\n", + "[train] epoch: 53/300, [28/28], loss=0.538 [00:03<00:00]\n", + "[train] epoch: 54/300, [28/28], loss=0.536 [00:03<00:00]\n", + "[train] epoch: 55/300, [28/28], loss=0.536 [00:03<00:00]\n", + "[train] epoch: 56/300, [28/28], loss=0.534 [00:03<00:00]\n", + "[train] epoch: 57/300, [28/28], loss=0.534 [00:03<00:00]\n", + "[train] epoch: 58/300, [28/28], loss=0.534 [00:03<00:00]\n", + "[train] epoch: 59/300, [28/28], loss=0.533 [00:03<00:00]\n", + "[train] epoch: 60/300, [28/28], loss=0.532 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 61/300\n", + "- total loss: 0.5202\n", + "- Accuracy: 0.8068\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 61/300, [28/28], loss=0.533 [00:03<00:00]\n", + "[train] epoch: 62/300, [28/28], loss=0.531 [00:03<00:00]\n", + "[train] epoch: 63/300, [28/28], loss=0.531 [00:03<00:00]\n", + "[train] epoch: 64/300, [28/28], loss=0.531 [00:03<00:00]\n", + "[train] epoch: 65/300, [28/28], loss=0.529 [00:03<00:00]\n", + "[train] epoch: 66/300, [28/28], loss=0.532 [00:03<00:00]\n", + "[train] epoch: 67/300, [28/28], loss=0.528 [00:03<00:00]\n", + "[train] epoch: 68/300, [28/28], loss=0.529 [00:03<00:00]\n", + "[train] epoch: 69/300, [28/28], loss=0.528 [00:03<00:00]\n", + "[train] epoch: 70/300, [28/28], loss=0.528 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 71/300\n", + "- total loss: 0.5121\n", + "- Accuracy: 0.8114\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 71/300, [28/28], loss=0.528 [00:03<00:00]\n", + "[train] epoch: 72/300, [28/28], loss=0.526 [00:03<00:00]\n", + "[train] epoch: 73/300, [28/28], loss=0.531 [00:03<00:00]\n", + "[train] epoch: 74/300, [28/28], loss=0.524 [00:03<00:00]\n", + "[train] epoch: 75/300, [28/28], loss=0.525 [00:03<00:00]\n", + "[train] epoch: 76/300, [28/28], loss=0.524 [00:03<00:00]\n", + "[train] epoch: 77/300, [28/28], loss=0.526 [00:03<00:00]\n", + "[train] epoch: 78/300, [28/28], loss=0.523 [00:03<00:00]\n", + "[train] epoch: 79/300, [28/28], loss=0.524 [00:03<00:00]\n", + "[train] epoch: 80/300, [28/28], loss=0.523 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 81/300\n", + "- total loss: 0.5091\n", + "- Accuracy: 0.8098\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 81/300, [28/28], loss=0.522 [00:03<00:00]\n", + "[train] epoch: 82/300, [28/28], loss=0.522 [00:03<00:00]\n", + "[train] epoch: 83/300, [28/28], loss=0.521 [00:03<00:00]\n", + "[train] epoch: 84/300, [28/28], loss=0.523 [00:03<00:00]\n", + "[train] epoch: 85/300, [28/28], loss=0.521 [00:03<00:00]\n", + "[train] epoch: 86/300, [28/28], loss=0.523 [00:03<00:00]\n", + "[train] epoch: 87/300, [28/28], loss=0.52 [00:03<00:00] \n", + "[train] epoch: 88/300, [28/28], loss=0.523 [00:03<00:00]\n", + "[train] epoch: 89/300, [28/28], loss=0.519 [00:03<00:00]\n", + "[train] epoch: 90/300, [28/28], loss=0.52 [00:03<00:00] \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 91/300\n", + "- total loss: 0.5021\n", + "- Accuracy: 0.8159\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 91/300, [28/28], loss=0.519 [00:03<00:00]\n", + "[train] epoch: 92/300, [28/28], loss=0.52 [00:03<00:00] \n", + "[train] epoch: 93/300, [28/28], loss=0.518 [00:03<00:00]\n", + "[train] epoch: 94/300, [28/28], loss=0.52 [00:03<00:00] \n", + "[train] epoch: 95/300, [28/28], loss=0.518 [00:03<00:00]\n", + "[train] epoch: 96/300, [28/28], loss=0.52 [00:03<00:00] \n", + "[train] epoch: 97/300, [28/28], loss=0.517 [00:03<00:00]\n", + "[train] epoch: 98/300, [28/28], loss=0.517 [00:03<00:00]\n", + "[train] epoch: 99/300, [28/28], loss=0.518 [00:03<00:00]\n", + "[train] epoch: 100/300, [28/28], loss=0.516 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 101/300\n", + "- total loss: 0.5027\n", + "- Accuracy: 0.8152\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 101/300, [28/28], loss=0.516 [00:03<00:00]\n", + "[train] epoch: 102/300, [28/28], loss=0.519 [00:03<00:00]\n", + "[train] epoch: 103/300, [28/28], loss=0.515 [00:03<00:00]\n", + "[train] epoch: 104/300, [28/28], loss=0.517 [00:03<00:00]\n", + "[train] epoch: 105/300, [28/28], loss=0.515 [00:03<00:00]\n", + "[train] epoch: 106/300, [28/28], loss=0.515 [00:03<00:00]\n", + "[train] epoch: 107/300, [28/28], loss=0.515 [00:03<00:00]\n", + "[train] epoch: 108/300, [28/28], loss=0.514 [00:03<00:00]\n", + "[train] epoch: 109/300, [28/28], loss=0.514 [00:03<00:00]\n", + "[train] epoch: 110/300, [28/28], loss=0.513 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 111/300\n", + "- total loss: 0.4984\n", + "- Accuracy: 0.8212\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 111/300, [28/28], loss=0.514 [00:03<00:00]\n", + "[train] epoch: 112/300, [28/28], loss=0.514 [00:03<00:00]\n", + "[train] epoch: 113/300, [28/28], loss=0.513 [00:03<00:00]\n", + "[train] epoch: 114/300, [28/28], loss=0.513 [00:03<00:00]\n", + "[train] epoch: 115/300, [28/28], loss=0.512 [00:03<00:00]\n", + "[train] epoch: 116/300, [28/28], loss=0.512 [00:03<00:00]\n", + "[train] epoch: 117/300, [28/28], loss=0.511 [00:03<00:00]\n", + "[train] epoch: 118/300, [28/28], loss=0.511 [00:03<00:00]\n", + "[train] epoch: 119/300, [28/28], loss=0.511 [00:03<00:00]\n", + "[train] epoch: 120/300, [28/28], loss=0.511 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 121/300\n", + "- total loss: 0.4931\n", + "- Accuracy: 0.8265\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 121/300, [28/28], loss=0.511 [00:03<00:00]\n", + "[train] epoch: 122/300, [28/28], loss=0.51 [00:03<00:00] \n", + "[train] epoch: 123/300, [28/28], loss=0.509 [00:03<00:00]\n", + "[train] epoch: 124/300, [28/28], loss=0.509 [00:03<00:00]\n", + "[train] epoch: 125/300, [28/28], loss=0.509 [00:03<00:00]\n", + "[train] epoch: 126/300, [28/28], loss=0.509 [00:03<00:00]\n", + "[train] epoch: 127/300, [28/28], loss=0.508 [00:03<00:00]\n", + "[train] epoch: 128/300, [28/28], loss=0.508 [00:03<00:00]\n", + "[train] epoch: 129/300, [28/28], loss=0.507 [00:03<00:00]\n", + "[train] epoch: 130/300, [28/28], loss=0.506 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 131/300\n", + "- total loss: 0.4879\n", + "- Accuracy: 0.8265\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 131/300, [28/28], loss=0.507 [00:03<00:00]\n", + "[train] epoch: 132/300, [28/28], loss=0.505 [00:03<00:00]\n", + "[train] epoch: 133/300, [28/28], loss=0.505 [00:03<00:00]\n", + "[train] epoch: 134/300, [28/28], loss=0.504 [00:03<00:00]\n", + "[train] epoch: 135/300, [28/28], loss=0.505 [00:03<00:00]\n", + "[train] epoch: 136/300, [28/28], loss=0.504 [00:03<00:00]\n", + "[train] epoch: 137/300, [28/28], loss=0.505 [00:03<00:00]\n", + "[train] epoch: 138/300, [28/28], loss=0.504 [00:03<00:00]\n", + "[train] epoch: 139/300, [28/28], loss=0.503 [00:03<00:00]\n", + "[train] epoch: 140/300, [28/28], loss=0.502 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 141/300\n", + "- total loss: 0.4847\n", + "- Accuracy: 0.8311\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 141/300, [28/28], loss=0.502 [00:03<00:00]\n", + "[train] epoch: 142/300, [28/28], loss=0.501 [00:03<00:00]\n", + "[train] epoch: 143/300, [28/28], loss=0.501 [00:03<00:00]\n", + "[train] epoch: 144/300, [28/28], loss=0.5 [00:03<00:00] \n", + "[train] epoch: 145/300, [28/28], loss=0.5 [00:03<00:00] \n", + "[train] epoch: 146/300, [28/28], loss=0.5 [00:03<00:00] \n", + "[train] epoch: 147/300, [28/28], loss=0.5 [00:03<00:00] \n", + "[train] epoch: 148/300, [28/28], loss=0.5 [00:03<00:00] \n", + "[train] epoch: 149/300, [28/28], loss=0.499 [00:03<00:00]\n", + "[train] epoch: 150/300, [28/28], loss=0.499 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 151/300\n", + "- total loss: 0.4795\n", + "- Accuracy: 0.8364\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 151/300, [28/28], loss=0.498 [00:03<00:00]\n", + "[train] epoch: 152/300, [28/28], loss=0.499 [00:03<00:00]\n", + "[train] epoch: 153/300, [28/28], loss=0.498 [00:03<00:00]\n", + "[train] epoch: 154/300, [28/28], loss=0.498 [00:03<00:00]\n", + "[train] epoch: 155/300, [28/28], loss=0.498 [00:03<00:00]\n", + "[train] epoch: 156/300, [28/28], loss=0.496 [00:03<00:00]\n", + "[train] epoch: 157/300, [28/28], loss=0.496 [00:03<00:00]\n", + "[train] epoch: 158/300, [28/28], loss=0.495 [00:03<00:00]\n", + "[train] epoch: 159/300, [28/28], loss=0.495 [00:03<00:00]\n", + "[train] epoch: 160/300, [28/28], loss=0.494 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 161/300\n", + "- total loss: 0.4762\n", + "- Accuracy: 0.8462\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 161/300, [28/28], loss=0.494 [00:03<00:00]\n", + "[train] epoch: 162/300, [28/28], loss=0.494 [00:03<00:00]\n", + "[train] epoch: 163/300, [28/28], loss=0.493 [00:03<00:00]\n", + "[train] epoch: 164/300, [28/28], loss=0.492 [00:03<00:00]\n", + "[train] epoch: 165/300, [28/28], loss=0.492 [00:03<00:00]\n", + "[train] epoch: 166/300, [28/28], loss=0.493 [00:03<00:00]\n", + "[train] epoch: 167/300, [28/28], loss=0.492 [00:03<00:00]\n", + "[train] epoch: 168/300, [28/28], loss=0.493 [00:03<00:00]\n", + "[train] epoch: 169/300, [28/28], loss=0.494 [00:03<00:00]\n", + "[train] epoch: 170/300, [28/28], loss=0.492 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 171/300\n", + "- total loss: 0.4717\n", + "- Accuracy: 0.8492\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 171/300, [28/28], loss=0.492 [00:03<00:00]\n", + "[train] epoch: 172/300, [28/28], loss=0.49 [00:03<00:00] \n", + "[train] epoch: 173/300, [28/28], loss=0.489 [00:03<00:00]\n", + "[train] epoch: 174/300, [28/28], loss=0.489 [00:03<00:00]\n", + "[train] epoch: 175/300, [28/28], loss=0.49 [00:03<00:00] \n", + "[train] epoch: 176/300, [28/28], loss=0.488 [00:03<00:00]\n", + "[train] epoch: 177/300, [28/28], loss=0.488 [00:03<00:00]\n", + "[train] epoch: 178/300, [28/28], loss=0.486 [00:03<00:00]\n", + "[train] epoch: 179/300, [28/28], loss=0.49 [00:03<00:00] \n", + "[train] epoch: 180/300, [28/28], loss=0.489 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 181/300\n", + "- total loss: 0.4704\n", + "- Accuracy: 0.8477\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 181/300, [28/28], loss=0.488 [00:03<00:00]\n", + "[train] epoch: 182/300, [28/28], loss=0.488 [00:03<00:00]\n", + "[train] epoch: 183/300, [28/28], loss=0.486 [00:03<00:00]\n", + "[train] epoch: 184/300, [28/28], loss=0.484 [00:03<00:00]\n", + "[train] epoch: 185/300, [28/28], loss=0.484 [00:03<00:00]\n", + "[train] epoch: 186/300, [28/28], loss=0.483 [00:03<00:00]\n", + "[train] epoch: 187/300, [28/28], loss=0.483 [00:03<00:00]\n", + "[train] epoch: 188/300, [28/28], loss=0.484 [00:03<00:00]\n", + "[train] epoch: 189/300, [28/28], loss=0.485 [00:03<00:00]\n", + "[train] epoch: 190/300, [28/28], loss=0.483 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 191/300\n", + "- total loss: 0.4653\n", + "- Accuracy: 0.8568\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 191/300, [28/28], loss=0.482 [00:03<00:00]\n", + "[train] epoch: 192/300, [28/28], loss=0.48 [00:03<00:00] \n", + "[train] epoch: 193/300, [28/28], loss=0.482 [00:03<00:00]\n", + "[train] epoch: 194/300, [28/28], loss=0.481 [00:03<00:00]\n", + "[train] epoch: 195/300, [28/28], loss=0.48 [00:03<00:00] \n", + "[train] epoch: 196/300, [28/28], loss=0.48 [00:03<00:00] \n", + "[train] epoch: 197/300, [28/28], loss=0.478 [00:03<00:00]\n", + "[train] epoch: 198/300, [28/28], loss=0.478 [00:03<00:00]\n", + "[train] epoch: 199/300, [28/28], loss=0.479 [00:03<00:00]\n", + "[train] epoch: 200/300, [28/28], loss=0.479 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 201/300\n", + "- total loss: 0.4606\n", + "- Accuracy: 0.8576\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 201/300, [28/28], loss=0.48 [00:03<00:00] \n", + "[train] epoch: 202/300, [28/28], loss=0.476 [00:03<00:00]\n", + "[train] epoch: 203/300, [28/28], loss=0.477 [00:03<00:00]\n", + "[train] epoch: 204/300, [28/28], loss=0.476 [00:03<00:00]\n", + "[train] epoch: 205/300, [28/28], loss=0.475 [00:03<00:00]\n", + "[train] epoch: 206/300, [28/28], loss=0.476 [00:03<00:00]\n", + "[train] epoch: 207/300, [28/28], loss=0.475 [00:03<00:00]\n", + "[train] epoch: 208/300, [28/28], loss=0.473 [00:03<00:00]\n", + "[train] epoch: 209/300, [28/28], loss=0.475 [00:03<00:00]\n", + "[train] epoch: 210/300, [28/28], loss=0.474 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 211/300\n", + "- total loss: 0.4581\n", + "- Accuracy: 0.8591\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 211/300, [28/28], loss=0.471 [00:03<00:00]\n", + "[train] epoch: 212/300, [28/28], loss=0.473 [00:03<00:00]\n", + "[train] epoch: 213/300, [28/28], loss=0.471 [00:03<00:00]\n", + "[train] epoch: 214/300, [28/28], loss=0.473 [00:03<00:00]\n", + "[train] epoch: 215/300, [28/28], loss=0.471 [00:03<00:00]\n", + "[train] epoch: 216/300, [28/28], loss=0.472 [00:03<00:00]\n", + "[train] epoch: 217/300, [28/28], loss=0.47 [00:03<00:00] \n", + "[train] epoch: 218/300, [28/28], loss=0.471 [00:03<00:00]\n", + "[train] epoch: 219/300, [28/28], loss=0.469 [00:03<00:00]\n", + "[train] epoch: 220/300, [28/28], loss=0.469 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 221/300\n", + "- total loss: 0.4528\n", + "- Accuracy: 0.8705\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 221/300, [28/28], loss=0.468 [00:03<00:00]\n", + "[train] epoch: 222/300, [28/28], loss=0.468 [00:03<00:00]\n", + "[train] epoch: 223/300, [28/28], loss=0.467 [00:03<00:00]\n", + "[train] epoch: 224/300, [28/28], loss=0.467 [00:03<00:00]\n", + "[train] epoch: 225/300, [28/28], loss=0.466 [00:03<00:00]\n", + "[train] epoch: 226/300, [28/28], loss=0.465 [00:03<00:00]\n", + "[train] epoch: 227/300, [28/28], loss=0.465 [00:03<00:00]\n", + "[train] epoch: 228/300, [28/28], loss=0.465 [00:03<00:00]\n", + "[train] epoch: 229/300, [28/28], loss=0.465 [00:03<00:00]\n", + "[train] epoch: 230/300, [28/28], loss=0.465 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 231/300\n", + "- total loss: 0.4497\n", + "- Accuracy: 0.8720\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 231/300, [28/28], loss=0.465 [00:03<00:00]\n", + "[train] epoch: 232/300, [28/28], loss=0.464 [00:03<00:00]\n", + "[train] epoch: 233/300, [28/28], loss=0.463 [00:03<00:00]\n", + "[train] epoch: 234/300, [28/28], loss=0.462 [00:03<00:00]\n", + "[train] epoch: 235/300, [28/28], loss=0.462 [00:03<00:00]\n", + "[train] epoch: 236/300, [28/28], loss=0.461 [00:03<00:00]\n", + "[train] epoch: 237/300, [28/28], loss=0.46 [00:03<00:00] \n", + "[train] epoch: 238/300, [28/28], loss=0.458 [00:03<00:00]\n", + "[train] epoch: 239/300, [28/28], loss=0.46 [00:03<00:00] \n", + "[train] epoch: 240/300, [28/28], loss=0.458 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 241/300\n", + "- total loss: 0.4464\n", + "- Accuracy: 0.8765\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 241/300, [28/28], loss=0.459 [00:03<00:00]\n", + "[train] epoch: 242/300, [28/28], loss=0.457 [00:03<00:00]\n", + "[train] epoch: 243/300, [28/28], loss=0.458 [00:03<00:00]\n", + "[train] epoch: 244/300, [28/28], loss=0.456 [00:03<00:00]\n", + "[train] epoch: 245/300, [28/28], loss=0.457 [00:03<00:00]\n", + "[train] epoch: 246/300, [28/28], loss=0.455 [00:03<00:00]\n", + "[train] epoch: 247/300, [28/28], loss=0.454 [00:03<00:00]\n", + "[train] epoch: 248/300, [28/28], loss=0.454 [00:03<00:00]\n", + "[train] epoch: 249/300, [28/28], loss=0.454 [00:03<00:00]\n", + "[train] epoch: 250/300, [28/28], loss=0.452 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 251/300\n", + "- total loss: 0.4439\n", + "- Accuracy: 0.8780\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 251/300, [28/28], loss=0.45 [00:03<00:00] \n", + "[train] epoch: 252/300, [28/28], loss=0.453 [00:03<00:00]\n", + "[train] epoch: 253/300, [28/28], loss=0.45 [00:03<00:00] \n", + "[train] epoch: 254/300, [28/28], loss=0.451 [00:03<00:00]\n", + "[train] epoch: 255/300, [28/28], loss=0.45 [00:03<00:00] \n", + "[train] epoch: 256/300, [28/28], loss=0.452 [00:03<00:00]\n", + "[train] epoch: 257/300, [28/28], loss=0.452 [00:03<00:00]\n", + "[train] epoch: 258/300, [28/28], loss=0.449 [00:03<00:00]\n", + "[train] epoch: 259/300, [28/28], loss=0.449 [00:03<00:00]\n", + "[train] epoch: 260/300, [28/28], loss=0.448 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 261/300\n", + "- total loss: 0.4413\n", + "- Accuracy: 0.8788\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 261/300, [28/28], loss=0.446 [00:03<00:00]\n", + "[train] epoch: 262/300, [28/28], loss=0.447 [00:03<00:00]\n", + "[train] epoch: 263/300, [28/28], loss=0.445 [00:03<00:00]\n", + "[train] epoch: 264/300, [28/28], loss=0.445 [00:03<00:00]\n", + "[train] epoch: 265/300, [28/28], loss=0.445 [00:03<00:00]\n", + "[train] epoch: 266/300, [28/28], loss=0.445 [00:03<00:00]\n", + "[train] epoch: 267/300, [28/28], loss=0.443 [00:03<00:00]\n", + "[train] epoch: 268/300, [28/28], loss=0.444 [00:03<00:00]\n", + "[train] epoch: 269/300, [28/28], loss=0.443 [00:03<00:00]\n", + "[train] epoch: 270/300, [28/28], loss=0.442 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 271/300\n", + "- total loss: 0.4383\n", + "- Accuracy: 0.8788\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 271/300, [28/28], loss=0.443 [00:03<00:00]\n", + "[train] epoch: 272/300, [28/28], loss=0.441 [00:03<00:00]\n", + "[train] epoch: 273/300, [28/28], loss=0.441 [00:03<00:00]\n", + "[train] epoch: 274/300, [28/28], loss=0.441 [00:03<00:00]\n", + "[train] epoch: 275/300, [28/28], loss=0.44 [00:03<00:00] \n", + "[train] epoch: 276/300, [28/28], loss=0.441 [00:03<00:00]\n", + "[train] epoch: 277/300, [28/28], loss=0.438 [00:03<00:00]\n", + "[train] epoch: 278/300, [28/28], loss=0.438 [00:03<00:00]\n", + "[train] epoch: 279/300, [28/28], loss=0.437 [00:03<00:00]\n", + "[train] epoch: 280/300, [28/28], loss=0.436 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 281/300\n", + "- total loss: 0.4360\n", + "- Accuracy: 0.8871\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 281/300, [28/28], loss=0.436 [00:03<00:00]\n", + "[train] epoch: 282/300, [28/28], loss=0.435 [00:03<00:00]\n", + "[train] epoch: 283/300, [28/28], loss=0.435 [00:03<00:00]\n", + "[train] epoch: 284/300, [28/28], loss=0.434 [00:03<00:00]\n", + "[train] epoch: 285/300, [28/28], loss=0.434 [00:03<00:00]\n", + "[train] epoch: 286/300, [28/28], loss=0.433 [00:03<00:00]\n", + "[train] epoch: 287/300, [28/28], loss=0.433 [00:03<00:00]\n", + "[train] epoch: 288/300, [28/28], loss=0.432 [00:03<00:00]\n", + "[train] epoch: 289/300, [28/28], loss=0.432 [00:03<00:00]\n", + "[train] epoch: 290/300, [28/28], loss=0.432 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[test] epoch: 291/300\n", + "- total loss: 0.4335\n", + "- Accuracy: 0.8917\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[train] epoch: 291/300, [28/28], loss=0.433 [00:03<00:00]\n", + "[train] epoch: 292/300, [28/28], loss=0.432 [00:03<00:00]\n", + "[train] epoch: 293/300, [28/28], loss=0.43 [00:03<00:00] \n", + "[train] epoch: 294/300, [28/28], loss=0.431 [00:03<00:00]\n", + "[train] epoch: 295/300, [28/28], loss=0.431 [00:03<00:00]\n", + "[train] epoch: 296/300, [28/28], loss=0.43 [00:03<00:00] \n", + "[train] epoch: 297/300, [28/28], loss=0.429 [00:03<00:00]\n", + "[train] epoch: 298/300, [28/28], loss=0.428 [00:03<00:00]\n", + "[train] epoch: 299/300, [28/28], loss=0.427 [00:03<00:00]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 3h 32min 15s, sys: 44min 47s, total: 4h 17min 2s\n", + "Wall time: 22min 33s\n" + ] + } + ], + "source": [ + "%%time\n", + "for epoch in range(num_epochs):\n", + " train_one_epoch(epoch)\n", + " evaluate_model(epoch)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, let's visualize the loss and accuracy with Matplotlib." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(train_metrics_history[\"train_loss\"], label=\"Loss value during the training\")\n", + "plt.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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uro6PPfccygvL8cDDzwAoKvT3COPPII///nPGDZsGKKjo/H0008jIiJCKbguhbmpe2qMS40xAeqMS40xAYzr5/qSl1RRDGm1WgwaNOiKj6PX61X1ATqPcbkONcYEqDMuNcYEXH5cjrgj9FMzZ87EqVOnsHz5clgsFowePRrbtm1TGiBUVFRAq/3x12TPnDmDzMxMWCwWBAcHIzk5GV9++SXi4+OVOY899hiam5sxb9481NXV4dprr8W2bdsueDhrT5ibLk6NcakxJkCdcakxJoBx/VRv85IqiiEiIqJFixb1+LW4nJwcm/erVq3CqlWrLno8jUaDlStXYuXKlb/UEomIyMmwmxwREREREbklFkPo6gC0YsUKmy5AasC4XIcaYwLUGZcaYwLUG5crU+s5UWNcaowJUGdcaowJYFxXQiOO6oVKRERERETkQLwzREREREREbonFEBERERERuSUWQ0RERERE5JZYDBERERERkVtiMQTg5ZdfxpAhQ+Dj44OUlBTs2bPH0UvqtT/+8Y/QaDQ2rxEjRijjra2tWLhwIQYMGICAgADccccdqKqqcuCKu/ff//4X06dPR0REBDQaDTZt2mQzLiJYvnw5wsPD4evri/T0dBw9etRmTm1tLWbNmgW9Xo+goCDcf//9aGpq6scoLnSpuO69994Lzl9GRobNHGeLKysrC+PGjUNgYCDCwsJw6623ori42GZObz53FRUVuPnmm+Hn54ewsDAsXboUHR0d/RmKojcxXX/99Recq/nz59vMcaaYAOCVV17BqFGjlIfVpaamYuvWrcq4q50nd8Pc5HhqzE3MS65zvVNjbnLKvCRubv369aLT6WTNmjVy6NAhyczMlKCgIKmqqnL00nplxYoVctVVV0llZaXyOnXqlDI+f/58GTx4sGRnZ8vevXtlwoQJMnHiRAeuuHtbtmyRJ598UjZs2CAAZOPGjTbjzz77rBgMBtm0aZN8/fXXcsstt0h0dLScPXtWmZORkSFJSUmye/du+fzzzyU2Nlbuuuuufo7E1qXimjNnjmRkZNicv9raWps5zhbX1KlTZe3atXLw4EEpLCyUm266SSIjI6WpqUmZc6nPXUdHhyQkJEh6errs379ftmzZIkajUZYtW+aIkHoV0+TJkyUzM9PmXNXX1yvjzhaTiMi//vUv+eSTT+Tbb7+V4uJieeKJJ8TL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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axs = plt.subplots(1, 2, figsize=(10, 5))\n", + "axs[0].set_title(\"Loss value on test set\")\n", + "axs[0].plot(eval_metrics_history[\"test_loss\"])\n", + "axs[1].set_title(\"Accuracy on test set\")\n", + "axs[1].plot(eval_metrics_history[\"test_accuracy\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our model reached almost 90% accuracy on the test set after 300 epochs, but it's worth noting\n", + "that the loss function isn't completely flat yet. We could continue until the curve flattens,\n", + "but we also need to pay attention to validation accuracy so as to spot when the model starts\n", + "overfitting.\n", + "\n", + "For model early stopping and selecting best model, you can check out [Orbax](https://github.com/google/orbax),\n", + "a library which provides checkpointing and persistence utilities." + ] + } + ], + "metadata": { + "jupytext": { + "formats": "ipynb,md:myst" + }, + "kernelspec": { + "display_name": "jax-env", + "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.10.15" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/JAX_time_series_classification.md b/docs/JAX_time_series_classification.md new file mode 100644 index 0000000..4fbd21b --- /dev/null +++ b/docs/JAX_time_series_classification.md @@ -0,0 +1,389 @@ +--- +jupytext: + formats: ipynb,md:myst + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.15.2 +kernelspec: + display_name: jax-env + language: python + name: python3 +--- + +# Time series classification with JAX + +In this tutorial, we're going to perform time series classification with a Convolutional Neural Network. +We will use the FordA dataset from the [UCR archive](https://www.cs.ucr.edu/%7Eeamonn/time_series_data_2018/), +which contains measurements of engine noise captured by a motor sensor. + +We need to assess if an engine is malfunctioning based on the recorded noises it generates. +Each sample comprises of noise measurements across time, together with a "yes/no" label, +so this is a binary classification problem. + +Although convolution models are mainly associated with image processing, they are also useful +for time series data because they can extract temporal structures. + ++++ + +## Tools overview and setup + +Here's a list of key packages that belong to the JAX AI stack required for this tutorial: + +- [JAX](https://github.com/jax-ml/jax) for array computations. +- [Flax](https://github.com/google/flax) for constructing neural networks. +- [Optax](https://github.com/google-deepmind/optax) for gradient processing and optimization. +- [Grain](https://github.com/google/grain/) to define data sources. +- [tqdm](https://tqdm.github.io/) for a progress bar to monitor the training progress. + +We'll start by installing and importing these packages. + +```{code-cell} ipython3 +# Required packages +# !pip install -U jax flax optax +# !pip install -U grain tqdm requests matplotlib +``` + +```{code-cell} ipython3 +import jax +import jax.numpy as jnp +from flax import nnx +import optax + +import numpy as np +import matplotlib.pyplot as plt +import grain.python as grain +import tqdm +``` + +## Load the dataset + +We load dataset files into NumPy arrays, add singleton dimension to take convolution features +into account, and change `-1` label to `0` (so that the expected values are `0` and `1`): + +```{code-cell} ipython3 +def prepare_ucr_dataset() -> tuple: + root_url = "https://raw.githubusercontent.com/hfawaz/cd-diagram/master/FordA/" + + train_data = np.loadtxt(root_url + "FordA_TRAIN.tsv", delimiter="\t") + x_train, y_train = train_data[:, 1:], train_data[:, 0].astype(int) + + test_data = np.loadtxt(root_url + "FordA_TEST.tsv", delimiter="\t") + x_test, y_test = test_data[:, 1:], test_data[:, 0].astype(int) + + x_train = x_train.reshape((*x_train.shape, 1)) + x_test = x_test.reshape((*x_test.shape, 1)) + + rng = np.random.RandomState(113) + indices = rng.permutation(len(x_train)) + x_train = x_train[indices] + y_train = y_train[indices] + + y_train[y_train == -1] = 0 + y_test[y_test == -1] = 0 + + return (x_train, y_train), (x_test, y_test) +``` + +```{code-cell} ipython3 +(x_train, y_train), (x_test, y_test) = prepare_ucr_dataset() +``` + +Let's visualize example samples from each class. + +```{code-cell} ipython3 +classes = np.unique(np.concatenate((y_train, y_test), axis=0)) +for c in classes: + c_x_train = x_train[y_train == c] + plt.plot(c_x_train[0], label="class " + str(c)) +plt.legend() +plt.show() +``` + +### Create a Data Loader using Grain + +For handling input data we're going to use Grain, a pure Python package developed for JAX and +Flax models. + +Grain follows the source-sampler-loader paradigm. Grain supports custom setups where data sources +might come in different forms, but they all need to implement the `grain.RandomAccessDataSource` +interface. See [PyGrain Data Sources](https://github.com/google/grain/blob/main/docs/data_sources.md) +for more details. + +Our dataset is comprised of relatively small NumPy arrays so our `DataSource` is uncomplicated: + +```{code-cell} ipython3 +class DataSource(grain.RandomAccessDataSource): + def __init__(self, x, y): + self._x = x + self._y = y + + def __getitem__(self, idx): + return {"measurement": self._x[idx], "label": self._y[idx]} + + def __len__(self): + return len(self._x) +``` + +```{code-cell} ipython3 +train_source = DataSource(x_train, y_train) +test_source = DataSource(x_test, y_test) +``` + +Samplers determine the order in which records are processed, and we'll use the +[`IndexSmapler`](https://github.com/google/grain/blob/main/docs/data_loader/samplers.md#index-sampler) +recommended by Grain. + +Finally, we'll create `DataLoader`s that handle orchestration of loading. +We'll leverage Grain's multiprocessing capabilities to scale processing up to 4 workers. + +```{code-cell} ipython3 +seed = 12 +train_batch_size = 128 +test_batch_size = 2 * train_batch_size + +train_sampler = grain.IndexSampler( + len(train_source), + shuffle=True, + seed=seed, + shard_options=grain.NoSharding(), # No sharding since this is a single-device setup + num_epochs=1, # Iterate over the dataset for one epoch +) + +test_sampler = grain.IndexSampler( + len(test_source), + shuffle=False, + seed=seed, + shard_options=grain.NoSharding(), # No sharding since this is a single-device setup + num_epochs=1, # Iterate over the dataset for one epoch +) + + +train_loader = grain.DataLoader( + data_source=train_source, + sampler=train_sampler, # Sampler to determine how to access the data + worker_count=4, # Number of child processes launched to parallelize the transformations among + worker_buffer_size=2, # Count of output batches to produce in advance per worker + operations=[ + grain.Batch(train_batch_size, drop_remainder=True), + ] +) + +test_loader = grain.DataLoader( + data_source=test_source, + sampler=test_sampler, # Sampler to determine how to access the data + worker_count=4, # Number of child processes launched to parallelize the transformations among + worker_buffer_size=2, # Count of output batches to produce in advance per worker + operations=[ + grain.Batch(test_batch_size), + ] +) +``` + +## Define the Model + +Let's now construct the Convolutional Neural Network with Flax by subclassing `nnx.Module`. +You can learn more about the [Flax NNX module system in the Flax documentation](https://flax.readthedocs.io/en/latest/nnx_basics.html#the-flax-nnx-module-system). + +Let's have three convolution and dense layers, and use ReLU activation function for middle +layers and softmax in the final layer for binary classification output. + +```{code-cell} ipython3 +class MyModel(nnx.Module): + def __init__(self, rngs: nnx.Rngs): + self.conv_1 = nnx.Conv( + in_features=1, out_features=64, kernel_size=3, padding="SAME", rngs=rngs + ) + self.layer_norm_1 = nnx.LayerNorm(num_features=64, epsilon=0.001, rngs=rngs) + + self.conv_2 = nnx.Conv( + in_features=64, out_features=64, kernel_size=3, padding="SAME", rngs=rngs + ) + self.layer_norm_2 = nnx.LayerNorm(num_features=64, epsilon=0.001, rngs=rngs) + + self.conv_3 = nnx.Conv( + in_features=64, out_features=64, kernel_size=3, padding="SAME", rngs=rngs + ) + self.layer_norm_3 = nnx.LayerNorm(num_features=64, epsilon=0.001, rngs=rngs) + + self.dense_1 = nnx.Linear(in_features=64, out_features=2, rngs=rngs) + + def __call__(self, x: jax.Array): + x = self.conv_1(x) + x = self.layer_norm_1(x) + x = jax.nn.relu(x) + + x = self.conv_2(x) + x = self.layer_norm_2(x) + x = jax.nn.relu(x) + + x = self.conv_3(x) + x = self.layer_norm_3(x) + x = jax.nn.relu(x) + + x = jnp.mean(x, axis=(1,)) # global average pooling + x = self.dense_1(x) + x = jax.nn.softmax(x) + return x +``` + +```{code-cell} ipython3 +model = MyModel(rngs=nnx.Rngs(0)) +nnx.display(model) +``` + +## Train the Model + +To train our Flax model we need to construct an `nnx.Optimizer` object with our model and +a selected optimization algorithm. The optimizer object manages the model’s parameters and +applies gradients during training. + +We're going to use [Adam optimizer](https://optax.readthedocs.io/en/latest/api/optimizers.html#adam), +a popular choice for Deep Learning models. We'll use it through +[Optax](https://optax.readthedocs.io/en/latest/index.html), an optimization library developed for JAX. + +```{code-cell} ipython3 +num_epochs = 300 +learning_rate = 0.0005 +momentum = 0.9 + +optimizer = nnx.Optimizer(model, optax.adam(learning_rate, momentum)) +``` + +We'll define a loss and logits computation function using Optax's +[`losses.softmax_cross_entropy_with_integer_labels`](https://optax.readthedocs.io/en/latest/api/losses.html#optax.losses.softmax_cross_entropy_with_integer_labels). + +```{code-cell} ipython3 +def compute_losses_and_logits(model: nnx.Module, batch_tokens: jax.Array, labels: jax.Array): + logits = model(batch_tokens) + + loss = optax.softmax_cross_entropy_with_integer_labels( + logits=logits, labels=labels + ).mean() + return loss, logits +``` + +We'll now define the training and evaluation step functions. The loss and logits from both +functions will be used for calculating accuracy metrics. + +For training, we'll use `nnx.value_and_grad` to compute the gradients, and then update +the model’s parameters using our optimizer. + +Notice the use of [`nnx.jit`](https://flax.readthedocs.io/en/latest/api_reference/flax.nnx/transforms.html#flax.nnx.jit). This sets up the functions for just-in-time (JIT) compilation with [XLA](https://openxla.org/xla) +for performant execution across different hardware accelerators like GPUs and TPUs. + +```{code-cell} ipython3 +@nnx.jit +def train_step( + model: nnx.Module, optimizer: nnx.Optimizer, batch: dict[str, jax.Array] +): + batch_tokens = jnp.array(batch["measurement"]) + labels = jnp.array(batch["label"], dtype=jnp.int32) + + grad_fn = nnx.value_and_grad(compute_losses_and_logits, has_aux=True) + (loss, logits), grads = grad_fn(model, batch_tokens, labels) + + optimizer.update(grads) # In-place updates. + + return loss + +@nnx.jit +def eval_step( + model: nnx.Module, batch: dict[str, jax.Array], eval_metrics: nnx.MultiMetric +): + batch_tokens = jnp.array(batch["measurement"]) + labels = jnp.array(batch["label"], dtype=jnp.int32) + loss, logits = compute_losses_and_logits(model, batch_tokens, labels) + + eval_metrics.update( + loss=loss, + logits=logits, + labels=labels, + ) +``` + +```{code-cell} ipython3 +eval_metrics = nnx.MultiMetric( + loss=nnx.metrics.Average('loss'), + accuracy=nnx.metrics.Accuracy(), +) + +train_metrics_history = { + "train_loss": [], +} + +eval_metrics_history = { + "test_loss": [], + "test_accuracy": [], +} +``` + +We can now train the CNN model. We'll evaluate the model’s performance on the test set +after each epoch, and print the metrics: total loss and accuracy. + +```{code-cell} ipython3 +bar_format = "{desc}[{n_fmt}/{total_fmt}]{postfix} [{elapsed}<{remaining}]" +train_total_steps = len(x_train) // train_batch_size + +def train_one_epoch(epoch: int): + model.train() + with tqdm.tqdm( + desc=f"[train] epoch: {epoch}/{num_epochs}, ", + total=train_total_steps, + bar_format=bar_format, + miniters=10, + leave=True, + ) as pbar: + for batch in train_loader: + loss = train_step(model, optimizer, batch) + train_metrics_history["train_loss"].append(loss.item()) + pbar.set_postfix({"loss": loss.item()}) + pbar.update(1) + +def evaluate_model(epoch: int): + # Compute the metrics on the train and val sets after each training epoch. + model.eval() + + eval_metrics.reset() # Reset the eval metrics + for test_batch in test_loader: + eval_step(model, test_batch, eval_metrics) + + for metric, value in eval_metrics.compute().items(): + eval_metrics_history[f'test_{metric}'].append(value) + + if epoch % 10 == 0: + print(f"[test] epoch: {epoch + 1}/{num_epochs}") + print(f"- total loss: {eval_metrics_history['test_loss'][-1]:0.4f}") + print(f"- Accuracy: {eval_metrics_history['test_accuracy'][-1]:0.4f}") +``` + +```{code-cell} ipython3 +%%time +for epoch in range(num_epochs): + train_one_epoch(epoch) + evaluate_model(epoch) +``` + +Finally, let's visualize the loss and accuracy with Matplotlib. + +```{code-cell} ipython3 +plt.plot(train_metrics_history["train_loss"], label="Loss value during the training") +plt.legend() +``` + +```{code-cell} ipython3 +fig, axs = plt.subplots(1, 2, figsize=(10, 5)) +axs[0].set_title("Loss value on test set") +axs[0].plot(eval_metrics_history["test_loss"]) +axs[1].set_title("Accuracy on test set") +axs[1].plot(eval_metrics_history["test_accuracy"]) +``` + +Our model reached almost 90% accuracy on the test set after 300 epochs, but it's worth noting +that the loss function isn't completely flat yet. We could continue until the curve flattens, +but we also need to pay attention to validation accuracy so as to spot when the model starts +overfitting. + +For model early stopping and selecting best model, you can check out [Orbax](https://github.com/google/orbax), +a library which provides checkpointing and persistence utilities. diff --git a/docs/conf.py b/docs/conf.py index a4a1e26..e6bb2c4 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -58,6 +58,7 @@ 'JAX_examples_image_segmentation.md', 'JAX_Vision_transformer.md', 'JAX_machine_translation.md', + 'JAX_time_series_classification.md', ] suppress_warnings = [ @@ -90,4 +91,5 @@ 'JAX_examples_image_segmentation.ipynb', 'JAX_Vision_transformer.ipynb', 'JAX_machine_translation.ipynb', + 'JAX_time_series_classification.ipynb', ] diff --git a/docs/tutorials.md b/docs/tutorials.md index 6559e90..61d5066 100644 --- a/docs/tutorials.md +++ b/docs/tutorials.md @@ -18,6 +18,7 @@ JAX_basic_text_classification JAX_examples_image_segmentation JAX_Vision_transformer JAX_machine_translation +JAX_time_series_classification ``` Once you've gone through this content, you can refer to package-specific