diff --git a/examples/trace_regularization.ipynb b/examples/trace_regularization.ipynb new file mode 100644 index 0000000..374888d --- /dev/null +++ b/examples/trace_regularization.ipynb @@ -0,0 +1,486 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "a85c316a-b950-448e-a264-4d0e6983790e", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-09-13 14:27:14.105479: W external/org_tensorflow/tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", + "2023-09-13 14:27:16.852688: W external/org_tensorflow/tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", + "2023-09-13 14:27:16.932821: W external/org_tensorflow/tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", + "2023-09-13 14:27:26.407757: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", + "/tikhome/knikolaou/miniconda3/envs/jax/lib/python3.10/site-packages/tqdm/auto.py:22: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "2023-09-13 14:27:50.219477: E external/org_tensorflow/tensorflow/stream_executor/cuda/cuda_driver.cc:265] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected\n", + "WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n" + ] + }, + { + "data": { + "text/html": [ + "
Using backend: cpu\n",
+       "
\n" + ], + "text/plain": [ + "Using backend: cpu\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
Available hardware:\n",
+       "
\n" + ], + "text/plain": [ + "Available hardware:\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
TFRT_CPU_0\n",
+       "
\n" + ], + "text/plain": [ + "TFRT_CPU_0\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import os\n", + "os.environ['CUDA_VISIBLE_DEVICES'] = '-1'\n", + "\n", + "import jax\n", + "import znnl\n", + "from neural_tangents import stax\n", + "import copy\n", + "import optax\n", + "\n", + "from flax import linen as nn\n", + "import flax\n", + "import jax.nn.initializers as inits\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import numpy as onp\n", + "import jax.numpy as np\n", + "# import time" + ] + }, + { + "cell_type": "markdown", + "id": "4d5500f3", + "metadata": {}, + "source": [ + "# Including the trace regularization" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "afc55b14", + "metadata": {}, + "outputs": [], + "source": [ + "from flax.training.train_state import TrainState\n", + "from znnl.training_strategies import SimpleTraining\n", + "from typing import Callable, List, Optional, Tuple, Union\n", + "from znnl.accuracy_functions.accuracy_function import AccuracyFunction\n", + "from znnl.models.jax_model import JaxModel\n", + "from znnl.training_strategies.recursive_mode import RecursiveMode" + ] + }, + { + "cell_type": "code", + "execution_count": 333, + "id": "a8eea84c", + "metadata": {}, + "outputs": [], + "source": [ + " class RegularizedTraining(SimpleTraining):\n", + "\n", + " def __init__(\n", + " self,\n", + " model: Union[JaxModel, None],\n", + " loss_fn: Callable,\n", + " accuracy_fn: AccuracyFunction = None,\n", + " seed: int = None,\n", + " recursive_mode: RecursiveMode = None,\n", + " disable_loading_bar: bool = False,\n", + " recorders: List[\"JaxRecorder\"] = None,\n", + " regularization: float = 0.0, \n", + " ):\n", + " \"\"\"\n", + " Construct a simple training strategy for a model.\n", + "\n", + " Parameters\n", + " ----------\n", + " model : Union[JaxModel, None]\n", + " Model class for a Jax model.\n", + " \"None\" is only used if the training strategy is passed as an input\n", + " to a bigger framework. The strategy then is applied to the framework\n", + " and the model instantiation is handled by that framework.\n", + " loss_fn : Callable\n", + " A function to use in the loss computation.\n", + " accuracy_fn : AccuracyFunction (default = None)\n", + " Funktion class for computing the accuracy of model and given data.\n", + " seed : int (default = None)\n", + " Random seed for the RNG. Uses a random int if not specified.\n", + " recursive_mode : RecursiveMode\n", + " Defining the recursive mode that can be used in training.\n", + " If the recursive mode is used, the training will be performed until a\n", + " condition is fulfilled.\n", + " disable_loading_bar : bool\n", + " Disable the output visualization of the loading bar.\n", + " recorders : List[JaxRecorder]\n", + " A list of recorders to monitor model training.\n", + " \"\"\"\n", + " super().__init__(\n", + " model=model,\n", + " loss_fn=loss_fn,\n", + " accuracy_fn=accuracy_fn,\n", + " seed=seed,\n", + " recursive_mode=recursive_mode,\n", + " disable_loading_bar=disable_loading_bar,\n", + " recorders=recorders,\n", + " )\n", + " self.regularization = regularization\n", + "\n", + " \n", + " def _train_step(self, state: TrainState, batch: dict):\n", + " \"\"\"\n", + " Train a single step.\n", + "\n", + " Parameters\n", + " ----------\n", + " state : TrainState\n", + " Current state of the neural network.\n", + " batch : dict\n", + " Batch of data to train on.\n", + "\n", + " Returns\n", + " -------\n", + " state : dict\n", + " Updated state of the neural network.\n", + " metrics : dict\n", + " Metrics for the current model.\n", + " \"\"\"\n", + "\n", + " def network_grad_fn(params):\n", + " \"\"\"\n", + " helper grad computation\n", + " \"\"\"\n", + " traced_predictions = self.model.apply(params, batch[\"inputs\"]).sum(axis=1)\n", + " ntk_trace_values = np.mean(traced_predictions)\n", + " return ntk_trace_values \n", + "\n", + " def loss_fn(params):\n", + " \"\"\"\n", + " helper loss computation\n", + " \"\"\"\n", + " inner_predictions = self.model.apply(params, batch[\"inputs\"])\n", + " loss = self.loss_fn(inner_predictions, batch[\"targets\"])\n", + "\n", + " # Add gradient regularization\n", + " if self.regularization > 0.0:\n", + " grad = jax.grad(network_grad_fn)(params)\n", + " grad_square = jax.tree_map(lambda x: x ** 2, grad)\n", + " loss += self.regularization * jax.flatten_util.ravel_pytree(grad_square)[0].mean()\n", + "\n", + " return loss, inner_predictions\n", + "\n", + " grad_fn = jax.value_and_grad(loss_fn, has_aux=True)\n", + "\n", + " (_, predictions), grads = grad_fn(state.params)\n", + "\n", + " state = state.apply_gradients(grads=grads) # in place state update.\n", + " metrics = self._compute_metrics(\n", + " predictions=predictions, targets=batch[\"targets\"]\n", + " )\n", + "\n", + " return state, metrics\n", + " " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "3547d5aa", + "metadata": {}, + "source": [ + "# Set up Model" + ] + }, + { + "cell_type": "code", + "execution_count": 334, + "id": "af442d14-0791-48cc-a9e8-aa0c5ee9f9c4", + "metadata": {}, + "outputs": [], + "source": [ + "data_generator = znnl.data.MNISTGenerator(ds_size=50)" + ] + }, + { + "cell_type": "code", + "execution_count": 335, + "id": "11123b2a-b981-4218-98bf-47b0a2bfc271", + "metadata": {}, + "outputs": [], + "source": [ + "class Network(nn.Module):\n", + " \"\"\"\n", + " Simple CNN module.\n", + " \"\"\"\n", + " @nn.compact\n", + " def __call__(self, x): \n", + " x = x.reshape((x.shape[0], -1)) # flatten\n", + " \n", + " x = nn.Dense(features=128)(x)\n", + " x = nn.relu(x)\n", + " \n", + " x = nn.Dense(features=64)(x)\n", + " x = nn.relu(x)\n", + " x = nn.Dense(10)(x)\n", + " return x" + ] + }, + { + "cell_type": "markdown", + "id": "634177cd", + "metadata": {}, + "source": [ + "# Execute training" + ] + }, + { + "cell_type": "code", + "execution_count": 343, + "id": "7936f03f-ee9b-46cb-a399-ba916cad09c2", + "metadata": {}, + "outputs": [], + "source": [ + "model = znnl.models.FlaxModel(\n", + " flax_module=Network(),\n", + " optimizer=optax.adam(learning_rate=0.01),\n", + " input_shape=(1, 28, 28, 1),\n", + " seed=0, \n", + " )\n", + "\n", + "train_recorder = znnl.training_recording.JaxRecorder(\n", + " name=\"train_recorder\",\n", + " loss=True,\n", + " ntk=True,\n", + " entropy= True, \n", + " trace=True,\n", + " loss_derivative=True,\n", + " update_rate=1, \n", + " chunk_size=1000\n", + ")\n", + "train_recorder.instantiate_recorder(\n", + " data_set=data_generator.train_ds\n", + ")\n", + "\n", + "\n", + "test_recorder = znnl.training_recording.JaxRecorder(\n", + " name=\"test_recorder\",\n", + " loss=True,\n", + " update_rate=1,\n", + " chunk_size=1000\n", + ")\n", + "test_recorder.instantiate_recorder(\n", + " data_set=data_generator.test_ds\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 370, + "id": "05e60cd9", + "metadata": {}, + "outputs": [], + "source": [ + "trainer = RegularizedTraining(\n", + " model=model, \n", + " loss_fn=znnl.loss_functions.CrossEntropyLoss(),\n", + " accuracy_fn=znnl.accuracy_functions.LabelAccuracy(), \n", + " recorders=[train_recorder, test_recorder], \n", + " regularization=1e-2, \n", + " # regularization=0.0,\n", + " seed=0\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 381, + "id": "da9ecc3f-dab4-4bc6-bd3a-35a3e5b6f855", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Epoch: 1: 0%| | 0/100 [00:00" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(train_report.loss, 'o', mfc='None', label=\"Train\")\n", + "plt.plot(test_report.loss, 'o', mfc='None', label=\"Test\")\n", + "\n", + "plt.xlabel(\"Epoch\")\n", + "plt.ylabel(\"Loss\")\n", + "# plt.yscale(\"log\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 384, + "id": "a6fd3a3c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(train_report.entropy, 'o', mfc='None', label=\"Entropy\")\n", + "plt.xlabel(\"Epoch\")\n", + "plt.ylabel(\"Entropy\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 385, + "id": "f8eea5f3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(train_report.trace, 'o', mfc='None', label=\"Trace\")\n", + "plt.xlabel(\"Epoch\")\n", + "plt.ylabel(\"Trace\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "87c195e0", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "244cf1a9", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "jax", + "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.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}