From b65b4b98dd03c1c3c8d4506cdf6dbb5d485f2ec2 Mon Sep 17 00:00:00 2001 From: Fabian Roth Date: Wed, 27 Aug 2025 23:53:53 +0200 Subject: [PATCH 1/5] Started a draft for the new trianing framework. --- klax/_new_training.py | 129 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 klax/_new_training.py diff --git a/klax/_new_training.py b/klax/_new_training.py new file mode 100644 index 0000000..4858239 --- /dev/null +++ b/klax/_new_training.py @@ -0,0 +1,129 @@ +from abc import ABC, abstractmethod +from collections.abc import Callable, Iterable +from dataclasses import dataclass +from typing import Any + +import equinox as eqx +import jax +import optax +from jaxtyping import PRNGKeyArray, PyTree, Scalar + +from ._wrappers import apply, unwrap + + +class DataHandler[T](ABC): + train_data: PyTree[Any, "T"] + validation_data: PyTree[Any, "T"] | None + batch_axes: PyTree[int | None, "T ..."] # type: ignore + batch_size: int + ... + + @abstractmethod + def get_training_batch( + self, + ) -> PyTree[Any, "T"]: + pass + + +class Loss(ABC): + @abstractmethod + def value[T]( + self, + model: PyTree, + batch: PyTree[Any, "T"], + batch_axis: PyTree[int | None, "T ..."], # type: ignore + ) -> Scalar: + pass + + def value_and_grad[T, M]( + self, + model: PyTree[Any, "M"], + batch: PyTree[Any, "T"], + batch_axis: PyTree[int | None, "T ..."], # type: ignore + ) -> tuple[Scalar, PyTree[Any, "M"]]: + return jax.value_and_grad(self.value)(model, batch, batch_axis) + + +class DefaultLoss(Loss): + loss_fn: Callable + + def value(self, model, batch, batch_axis): + model = unwrap(model) + return self.loss_fn(model, batch, batch_axis=batch_axis) + + +@dataclass +class TrainingState: + # Replaces CallbackArgs -> Enables modifying every training aspect through callbacks + model: PyTree + datahandler: DataHandler + optimizer: optax.GradientTransformation + optimizer_state: PyTree + loss: Loss + step: int + steps: int + + +class Callback(ABC): + """An abstract callback. + + Inherit from this class to create a custom callback. + """ + + def __call__(self, training_state: TrainingState) -> bool | None: + """Call after each step during training.""" + pass + + def on_training_end(self, training_state: TrainingState) -> None: + """Call when training ends.""" + pass + + def on_training_start(self, training_state: TrainingState) -> None: + """Call when training starts.""" + pass + + +def training_loop( + training_state: TrainingState, callbacks: Iterable[Callback] = [] +): + @eqx.filter_jit + def make_step(batch, model, optimizer, optimizer_state): + # Where can this function go? Seems wrong to put it here + # Can we make it a method of training state without interfering with jit? + value, grad = training_state.loss.value_and_grad( + model, batch, training_state.datahandler.batch_axes + ) + updates, optimizer_state = optimizer.update( + grad, optimizer_state, value=value + ) + model = optax.apply_updates(model, updates) + model = apply(model) + return model, optimizer_state + + for callback in callbacks: + callback.on_training_start(training_state) + + for training_state.step in range(1, training_state.steps + 1): + batch = training_state.datahandler.get_training_batch() + training_state.model, training_state.optimizer_state = make_step( + batch, + training_state.model, + training_state.optimizer, + training_state.optimizer_state, + ) + if any([callback(training_state) for callback in callbacks]): + break + + for callback in callbacks: + callback.on_training_end(training_state) + + return training_state + + +def fit(model, data, validation_data, loss_fn): + # Initialize training state and callbacks + loss = DefaultLoss(loss_fn) + training_state = TrainingState(model, loss=loss) + callbacks.append(history) + training_state = training_loop(training_state, callbacks) + return training_state.model, history From 7e1d3b3a72bbb49d4759877811f4893f777c668a Mon Sep 17 00:00:00 2001 From: Fabian Roth Date: Thu, 28 Aug 2025 21:53:57 +0200 Subject: [PATCH 2/5] Fixed typo and typing in training_without_data example --- docs/examples/training_without_data.ipynb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/examples/training_without_data.ipynb b/docs/examples/training_without_data.ipynb index edaab4d..73b34d5 100644 --- a/docs/examples/training_without_data.ipynb +++ b/docs/examples/training_without_data.ipynb @@ -78,7 +78,7 @@ " return self.mlp(x)\n", "\n", " @staticmethod\n", - " def residural_loss(model, batch, batch_axis):\n", + " def residual_loss(model, data, batch_axis):\n", " \"\"\"Residual loss definition.\n", "\n", " We define a loss function that penalizes the residual of the ODE\n", @@ -136,7 +136,7 @@ " batch_axis=None,\n", " steps=100_000,\n", " optimizer=optax.adam(1e-5),\n", - " loss_fn=model.residural_loss,\n", + " loss_fn=model.residual_loss,\n", " history=klax.HistoryCallback(log_every=1000, verbose=False),\n", " key=training_key,\n", ")\n", @@ -235,7 +235,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.3" + "version": "3.12.9" } }, "nbformat": 4, From a9f044a1867cd5b38b4b8a90a0485b920c347058 Mon Sep 17 00:00:00 2001 From: Fabian Roth Date: Thu, 28 Aug 2025 23:28:43 +0200 Subject: [PATCH 3/5] Added sample_weighting example. --- docs/examples/sample_weighting.ipynb | 663 +++++++++++++++++++++++++++ 1 file changed, 663 insertions(+) create mode 100644 docs/examples/sample_weighting.ipynb diff --git a/docs/examples/sample_weighting.ipynb b/docs/examples/sample_weighting.ipynb new file mode 100644 index 0000000..3da2609 --- /dev/null +++ b/docs/examples/sample_weighting.ipynb @@ -0,0 +1,663 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ee932761", + "metadata": {}, + "source": [ + "# Sample weighting \n", + "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Drenderer/klax/blob/main/docs/examples/sample_weighting.ipynb) \n", + "\n", + "This example illustrates how to assign individual weights to training samples by using [`klax.fit`][] together with a custom loss function.\n", + "\n", + "To run it locally install klax with plotting capability via `pip install 'klax[plot]'`.\n", + "\n", + "We'll start by importing the required packages for model creation, optimization and plotting." + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "f53f18d7", + "metadata": {}, + "outputs": [], + "source": [ + "import jax\n", + "from jax import numpy as jnp\n", + "from jax import random as jr\n", + "from matplotlib import pyplot as plt\n", + "\n", + "import klax\n", + "\n", + "key = jr.key(0)" + ] + }, + { + "cell_type": "markdown", + "id": "f4d704b2", + "metadata": {}, + "source": [ + "First, we generate some dummy data along with sample weights.\n", + "\n", + "Assume our data comes from the function $f(x) = \\sin(x) + \\mathcal{N}(0, 0.2)$.\n", + "In practice, we don’t have direct access to the underlying function and only observe sampled points. \n", + "Importantly, our samples are **not uniformly distributed**: we have many more data points in the region $x \\in [0, 4]$ than in $x \\in [4, 10]$. \n", + "To prevent the model from focusing disproportionately on the dense region, we assign **larger sample weights** to points in the sparser region." + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "id": "e36d4a15", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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M+VrFEIIEWwUGhOee4Xyw6JFi8z69eutR+jXX381FSpUSNnahBBCBB8pQsJX9O7d22zfvt3UqlVLSpAQQohCs0eE0h2Raz7KAQccYDZt2mT70gghhBAiONdv5QiJfIPuvGzZMhuiEkIIIfyMFCGRb95++23TtWtX06VLF7Nx40avlyOEEEIUGClCIt+QpLxjxw6zZcsW88cff3i9HCGEEKLAKFla7MYvv/xi46oMLo1Fr169zH777WeqVq2qhGUhhBC+Rh4hkY3x48eb1q1bmx49esQde8FU97PPPtu0atUq7esTQgghkokUIZGNpUuX2tAXydCUqQshhBBBRqExkY1LL73UFCtWzDRt2tSOvhBCCCGCjPoI5YH6CAkhhBD+Q32EROiZM2eOad++vbnlllts7yMhhBAiJ1KEhC9AkZkyZYqZMWNGwu955513zNy5c82rr75qLQMhhBAiJ8oREr7g448/Nn379jV77rmnVWyaNGmS53u6d+9uvv76azutHveoEEIIkRMpQsIX0Ldor732sooQydyJUL9+fTNu3LiUr00IIYR/kSIkfEGLFi3MhAkTbJPH2rVre70cIYQQAUGKkPAN9erV83oJQgghAoaSpUWB+euvv8zs2bPN77//7vVShBBCiAIhRUgUmOHDh9uE5J49e6o8XQghhC/xlSI0ffp007VrVzvoc4899jBvvvlmnu+ZNm2arTAqWrSoqVmzpnnuuefSstYwQEn6n3/+aZtVxVKEdu3aFXdemRBCCJEJ+EoR2rZtm2nYsKF57LHHEnr9qlWrTJcuXUy7du3M559/bq6++mpz0UUXmf/+978pX2sYGDBggBkxYoR54YUXbDVXNN988405+uijTadOncxvv/3m2RqFEEKIwCRLn3jiifaWKE8++aQ59NBDbQgHDj/8cPPJJ5+Yhx56yHTs2DGFKw0HtCw/66yzYv7fwoULrSLKpHrXy8eB92jUqFHmq6++Mtdff72pWLFi1v/hQXKepL333tuWzAshRLJBDv39999W1mDIIW+INIjw4StFKL/MmjXLdOjQIdtzKEB4huKxc+dOe3OoI3HBQGG95JJLrLLUrFkzqwzR04ftT2jz/vvvt54ilKDzzz/fTrxfsGCB+fDDD0316tVNmzZt7OcgnEqWLGlKlSplDj74YNtPSAghCqL4bN261fzyyy+2wIMI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yCOKFi1qhgwZYu9FatG2Tg/azulB2zk9aDuHZzsrWVoIIYQQoUUeISGEEEKEFilCQgghhAgtUoSEEEIIEVqkCAkhhBAitEgR8ojHHnvMVKtWzRQrVsy0bNnSzJkzx+slBYphw4aZ5s2b247gZcuWNd26dTPLly/3elmB55577rEd2K+++mqvlxJI1qxZY3r16mVKly5t9t13X1O/fn0zb948r5cVKHbt2mUGDx5sDj30ULuNa9SoYYYOHZrnvCqRO9OnTzddu3a1XZ6REW+++Wa2/2f73nrrraZ8+fJ2u3fo0MF88803Jh1IEfKAcePGmWuvvdaWDC5YsMA0bNjQdOzY0axfv97rpQWGjz/+2PTv39/Mnj3bTJo0yfz111/mhBNOMNu2bfN6aYFl7ty55qmnnjINGjTweimB5PfffzdHHXWU2Weffcz7779vli1bZoYPH24OPPBAr5cWKO69917zxBNPmEcffdR8+eWX9vF9991nRo4c6fXSfM22bdvstQ4nQCzYxo888oh58sknzWeffWaKFy9ur4s7duxI/eIonxfppUWLFpH+/ftnPd61a1ekQoUKkWHDhnm6riCzfv16zLnIxx9/7PVSAsmWLVsitWrVikyaNCnStm3byFVXXeX1kgLHTTfdFDn66KO9Xkbg6dKlS6RPnz7ZnjvttNMiPXv29GxNQcMYE5kwYULW43/++SdSrly5yP3335/13MaNGyNFixaNvPLKKylfjzxCaebPP/808+fPt26/6HlmPJ41a5anawsymzZtsvcHHXSQ10sJJHjfunTpku24Fsnl7bffNs2aNTNnnnmmDfc2btzYPP30014vK3C0bt3aTJkyxXz99df28aJFi8wnn3xiTjzxRK+XFlhWrVpl1q1bl01+MCOMtJF0XBc1dDXN/PLLLzYGfcghh2R7nsdfffWVZ+sKMv/884/NWSGsUK9ePa+XEzjGjh1rQ7yExkTqWLlypQ3ZEFYfNGiQ3d5XXnmlKVKkiDnvvPO8Xl5gGDBggJ2IXqdOHbPXXntZeX3XXXeZnj17er20wLJu3Tp7H+u66P4vlUgREqHwVixdutRadSK5rF692lx11VU2D4vEf5FahR6P0N13320f4xHiuCanQopQ8nj11VfNSy+9ZF5++WVzxBFHmM8//9waUiT5ajsHE4XG0kyZMmWslfHzzz9ne57H5cqV82xdQeXyyy83EydONFOnTjWVKlXyejmBgzAvSf5NmjQxe++9t72RqE7SI39jTYvkQDVN3bp1sz13+OGHmx9++MGzNQWRG264wXqFzj77bFuVd+6555prrrnGVqKK1OCufV5dF6UIpRnc2E2bNrUx6GhLj8etWrXydG1Bgnw8lKAJEyaYjz76yJbCiuTTvn17s2TJEms1uxteC8II/I3SL5IDod2cLSDIY6latapnawoif/zxh83bjIbjGDktUgPyGYUn+rpIeJLqsXRcFxUa8wBi/LhYuWC0aNHCPPzww7a08IILLvB6aYEKh+Hafuutt2wvIRdnJgGPHhUiObBtc+ZdUfZKnxvlYyUXvBIk8hIa6969u+09NmrUKHsTyYNeN+QEValSxYbGFi5caB588EHTp08fr5fma7Zu3WpWrFiRLUEaY4kCFrY14cc777zT1KpVyypG9HIiHEkPuJST8ro0EZORI0dGqlSpEilSpIgtp589e7bXSwoUHNqxbqNHj/Z6aYFH5fOp45133onUq1fPlhXXqVMnMmrUKK+XFDg2b95sj1/kc7FixSLVq1eP3HzzzZGdO3d6vTRfM3Xq1Jgy+bzzzssqoR88eHDkkEMOscd3+/btI8uXL0/L2vbgn9SrW0IIIYQQmYdyhIQQQggRWqQICSGEECK0SBESQgghRGiRIiSEEEKI0CJFSAghhBChRYqQEEIIIUKLFCEhhBBChBYpQkIIIYQILVKEhBBCCBFapAgJIYQQIrRIERJChIoNGzbYSdcML3XMnDnTFClSJNv0ayFEONCsMSFE6HjvvffsVGsUoNq1a5tGjRqZU045xU4ZF0KECylCQohQ0r9/fzN58mTTrFkzs2TJEjN37lxTtGhRr5clhEgzUoSEEKFk+/btpl69emb16tVm/vz5pn79+l4vSQjhAcoREkKEkm+//dasXbvW/PPPP+a7777zejlCCI+QR0gIETr+/PNP06JFC5sbRI7Qww8/bMNjZcuW9XppQog0I0VICBE6brjhBjN+/HizaNEiU6JECdO2bVtzwAEHmIkTJ3q9NCFEmlFoTAgRKqZNm2Y9QGPGjDH777+/2XPPPe3fM2bMME888YTXyxNCpBl5hIQQQggRWuQREkIIIURokSIkhBBCiNAiRUgIIYQQoUWKkBBCCCFCixQhIYQQQoQWKUJCCCGECC1ShIQQQggRWqQICSGEECK0SBESQgghRGiRIiSEEEKI0CJFSAghhBChRYqQEEIIIUxY+T9neSiPKAppXAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def f(x):\n", + " return jnp.sin(x)\n", + "\n", + "\n", + "x_samples = jnp.concat([jnp.linspace(0, 4, 100), jnp.linspace(4, 10, 5)])\n", + "y_samples = f(x_samples) + 0.2 * jr.normal(key, shape=x_samples.shape)\n", + "sample_weights = jnp.where(x_samples > 4, 20, 1)\n", + "\n", + "x_dense = jnp.linspace(0, 10, 1000)\n", + "y_dense = f(x_dense)\n", + "\n", + "# Plot the data\n", + "plt.plot(x_dense, y_dense, c=\"grey\", label=\"True function\", alpha=0.5)\n", + "plt.scatter(\n", + " x_samples, y_samples, c=\"k\", s=sample_weights, alpha=0.8, label=\"Samples\"\n", + ")\n", + "plt.gca().set(\n", + " xlabel=\"x\",\n", + " ylabel=\"f(x)\",\n", + " title=\"Data samples with size indicating the sample weight\",\n", + ")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "9416cde6", + "metadata": {}, + "source": [ + "Let's fit a simple [`klax.nn.MLP`][] to this data. \n", + "Let's first create a custom loss function that computes a weighted mean squared error. To pass the weights to the loss function we integrate the sample weights into the dataset. \n", + "For comparison we also train an identical model without the sample weighting." + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "id": "1d8491d7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Step: 0, Loss: 1.662e+01\n", + "Step: 100, Loss: 3.327e+00\n", + "Step: 200, Loss: 8.098e-01\n", + "Step: 300, Loss: 6.101e-01\n", + "Step: 400, Loss: 5.927e-01\n", + "Step: 500, Loss: 5.834e-01\n", + "Step: 600, Loss: 5.772e-01\n", + "Step: 700, Loss: 5.718e-01\n", + "Step: 800, Loss: 5.664e-01\n", + "Step: 900, Loss: 5.613e-01\n", + "Step: 1000, Loss: 5.557e-01\n", + "Step: 1100, Loss: 5.503e-01\n", + "Step: 1200, Loss: 5.447e-01\n", + "Step: 1300, Loss: 5.388e-01\n", + "Step: 1400, Loss: 5.322e-01\n", + "Step: 1500, Loss: 5.251e-01\n", + "Step: 1600, Loss: 5.174e-01\n", + "Step: 1700, Loss: 5.099e-01\n", + "Step: 1800, Loss: 5.008e-01\n", + "Step: 1900, Loss: 4.919e-01\n", + "Step: 2000, Loss: 4.828e-01\n", + "Step: 2100, Loss: 4.738e-01\n", + "Step: 2200, Loss: 4.651e-01\n", + "Step: 2300, Loss: 4.573e-01\n", + "Step: 2400, Loss: 4.512e-01\n", + "Step: 2500, Loss: 4.447e-01\n", + "Step: 2600, Loss: 4.384e-01\n", + "Step: 2700, Loss: 4.331e-01\n", + "Step: 2800, Loss: 4.292e-01\n", + "Step: 2900, Loss: 4.258e-01\n", + "Step: 3000, Loss: 4.216e-01\n", + "Step: 3100, Loss: 4.190e-01\n", + "Step: 3200, Loss: 4.162e-01\n", + "Step: 3300, Loss: 4.147e-01\n", + "Step: 3400, Loss: 4.091e-01\n", + "Step: 3500, Loss: 4.094e-01\n", + "Step: 3600, Loss: 4.102e-01\n", + "Step: 3700, Loss: 4.026e-01\n", + "Step: 3800, Loss: 3.995e-01\n", + "Step: 3900, Loss: 3.970e-01\n", + "Step: 4000, Loss: 3.958e-01\n", + "Step: 4100, Loss: 3.925e-01\n", + "Step: 4200, Loss: 3.906e-01\n", + "Step: 4300, Loss: 3.887e-01\n", + "Step: 4400, Loss: 3.866e-01\n", + "Step: 4500, Loss: 3.845e-01\n", + "Step: 4600, Loss: 3.825e-01\n", + "Step: 4700, Loss: 3.815e-01\n", + "Step: 4800, Loss: 3.791e-01\n", + "Step: 4900, Loss: 3.768e-01\n", + "Step: 5000, Loss: 3.754e-01\n", + "Step: 5100, Loss: 3.742e-01\n", + "Step: 5200, Loss: 3.711e-01\n", + "Step: 5300, Loss: 3.716e-01\n", + "Step: 5400, Loss: 3.673e-01\n", + "Step: 5500, Loss: 3.657e-01\n", + "Step: 5600, Loss: 3.636e-01\n", + "Step: 5700, Loss: 3.623e-01\n", + "Step: 5800, Loss: 3.600e-01\n", + "Step: 5900, Loss: 3.582e-01\n", + "Step: 6000, Loss: 3.568e-01\n", + "Step: 6100, Loss: 3.548e-01\n", + "Step: 6200, Loss: 3.557e-01\n", + "Step: 6300, Loss: 3.512e-01\n", + "Step: 6400, Loss: 3.490e-01\n", + "Step: 6500, Loss: 3.470e-01\n", + "Step: 6600, Loss: 3.465e-01\n", + "Step: 6700, Loss: 3.434e-01\n", + "Step: 6800, Loss: 3.420e-01\n", + "Step: 6900, Loss: 3.397e-01\n", + "Step: 7000, Loss: 3.375e-01\n", + "Step: 7100, Loss: 3.354e-01\n", + "Step: 7200, Loss: 3.330e-01\n", + "Step: 7300, Loss: 3.308e-01\n", + "Step: 7400, Loss: 3.322e-01\n", + "Step: 7500, Loss: 3.266e-01\n", + "Step: 7600, Loss: 3.245e-01\n", + "Step: 7700, Loss: 3.235e-01\n", + "Step: 7800, Loss: 3.202e-01\n", + "Step: 7900, Loss: 3.180e-01\n", + "Step: 8000, Loss: 3.160e-01\n", + "Step: 8100, Loss: 3.136e-01\n", + "Step: 8200, Loss: 3.111e-01\n", + "Step: 8300, Loss: 3.131e-01\n", + "Step: 8400, Loss: 3.059e-01\n", + "Step: 8500, Loss: 3.031e-01\n", + "Step: 8600, Loss: 3.003e-01\n", + "Step: 8700, Loss: 2.984e-01\n", + "Step: 8800, Loss: 2.987e-01\n", + "Step: 8900, Loss: 2.937e-01\n", + "Step: 9000, Loss: 2.903e-01\n", + "Step: 9100, Loss: 2.876e-01\n", + "Step: 9200, Loss: 2.846e-01\n", + "Step: 9300, Loss: 2.835e-01\n", + "Step: 9400, Loss: 2.798e-01\n", + "Step: 9500, Loss: 2.768e-01\n", + "Step: 9600, Loss: 2.743e-01\n", + "Step: 9700, Loss: 2.723e-01\n", + "Step: 9800, Loss: 2.686e-01\n", + "Step: 9900, Loss: 2.660e-01\n", + "Step: 10000, Loss: 2.635e-01\n", + "Step: 10100, Loss: 2.603e-01\n", + "Step: 10200, Loss: 2.577e-01\n", + "Step: 10300, Loss: 2.550e-01\n", + "Step: 10400, Loss: 2.521e-01\n", + "Step: 10500, Loss: 2.492e-01\n", + "Step: 10600, Loss: 2.502e-01\n", + "Step: 10700, Loss: 2.435e-01\n", + "Step: 10800, Loss: 2.408e-01\n", + "Step: 10900, Loss: 2.380e-01\n", + "Step: 11000, Loss: 2.372e-01\n", + "Step: 11100, Loss: 2.307e-01\n", + "Step: 11200, Loss: 2.290e-01\n", + "Step: 11300, Loss: 2.256e-01\n", + "Step: 11400, Loss: 2.212e-01\n", + "Step: 11500, Loss: 2.208e-01\n", + "Step: 11600, Loss: 2.159e-01\n", + "Step: 11700, Loss: 2.117e-01\n", + "Step: 11800, Loss: 2.083e-01\n", + "Step: 11900, Loss: 2.052e-01\n", + "Step: 12000, Loss: 2.021e-01\n", + "Step: 12100, Loss: 1.986e-01\n", + "Step: 12200, Loss: 1.951e-01\n", + "Step: 12300, Loss: 1.918e-01\n", + "Step: 12400, Loss: 1.882e-01\n", + "Step: 12500, Loss: 1.850e-01\n", + "Step: 12600, Loss: 1.815e-01\n", + "Step: 12700, Loss: 1.787e-01\n", + "Step: 12800, Loss: 1.758e-01\n", + "Step: 12900, Loss: 1.710e-01\n", + "Step: 13000, Loss: 1.673e-01\n", + "Step: 13100, Loss: 1.672e-01\n", + "Step: 13200, Loss: 1.602e-01\n", + "Step: 13300, Loss: 1.561e-01\n", + "Step: 13400, Loss: 1.550e-01\n", + "Step: 13500, Loss: 1.493e-01\n", + "Step: 13600, Loss: 1.464e-01\n", + "Step: 13700, Loss: 1.422e-01\n", + "Step: 13800, Loss: 1.380e-01\n", + "Step: 13900, Loss: 1.340e-01\n", + "Step: 14000, Loss: 1.314e-01\n", + "Step: 14100, Loss: 1.263e-01\n", + "Step: 14200, Loss: 1.230e-01\n", + "Step: 14300, Loss: 1.200e-01\n", + "Step: 14400, Loss: 1.157e-01\n", + "Step: 14500, Loss: 1.148e-01\n", + "Step: 14600, Loss: 1.089e-01\n", + "Step: 14700, Loss: 1.073e-01\n", + "Step: 14800, Loss: 1.019e-01\n", + "Step: 14900, Loss: 9.818e-02\n", + "Step: 15000, Loss: 9.810e-02\n", + "Step: 15100, Loss: 9.263e-02\n", + "Step: 15200, Loss: 8.850e-02\n", + "Step: 15300, Loss: 8.527e-02\n", + "Step: 15400, Loss: 8.330e-02\n", + "Step: 15500, Loss: 7.932e-02\n", + "Step: 15600, Loss: 7.720e-02\n", + "Step: 15700, Loss: 7.426e-02\n", + "Step: 15800, Loss: 7.204e-02\n", + "Step: 15900, Loss: 7.087e-02\n", + "Step: 16000, Loss: 6.838e-02\n", + "Step: 16100, Loss: 6.509e-02\n", + "Step: 16200, Loss: 6.314e-02\n", + "Step: 16300, Loss: 6.199e-02\n", + "Step: 16400, Loss: 6.055e-02\n", + "Step: 16500, Loss: 6.041e-02\n", + "Step: 16600, Loss: 5.785e-02\n", + "Step: 16700, Loss: 5.606e-02\n", + "Step: 16800, Loss: 5.640e-02\n", + "Step: 16900, Loss: 5.396e-02\n", + "Step: 17000, Loss: 5.453e-02\n", + "Step: 17100, Loss: 5.300e-02\n", + "Step: 17200, Loss: 5.170e-02\n", + "Step: 17300, Loss: 5.153e-02\n", + "Step: 17400, Loss: 5.079e-02\n", + "Step: 17500, Loss: 4.996e-02\n", + "Step: 17600, Loss: 4.965e-02\n", + "Step: 17700, Loss: 4.947e-02\n", + "Step: 17800, Loss: 5.032e-02\n", + "Step: 17900, Loss: 4.826e-02\n", + "Step: 18000, Loss: 4.789e-02\n", + "Step: 18100, Loss: 4.759e-02\n", + "Step: 18200, Loss: 4.704e-02\n", + "Step: 18300, Loss: 4.764e-02\n", + "Step: 18400, Loss: 4.638e-02\n", + "Step: 18500, Loss: 4.614e-02\n", + "Step: 18600, Loss: 4.577e-02\n", + "Step: 18700, Loss: 4.513e-02\n", + "Step: 18800, Loss: 4.519e-02\n", + "Step: 18900, Loss: 4.574e-02\n", + "Step: 19000, Loss: 4.410e-02\n", + "Step: 19100, Loss: 4.693e-02\n", + "Step: 19200, Loss: 4.540e-02\n", + "Step: 19300, Loss: 4.365e-02\n", + "Step: 19400, Loss: 4.307e-02\n", + "Step: 19500, Loss: 4.339e-02\n", + "Step: 19600, Loss: 4.273e-02\n", + "Step: 19700, Loss: 4.223e-02\n", + "Step: 19800, Loss: 4.204e-02\n", + "Step: 19900, Loss: 4.237e-02\n", + "Step: 20000, Loss: 4.159e-02\n", + "Training took: 0:00:06.424294\n", + "Step: 0, Loss: 6.613e+00\n", + "Step: 100, Loss: 1.318e+00\n", + "Step: 200, Loss: 4.042e-01\n", + "Step: 300, Loss: 3.137e-01\n", + "Step: 400, Loss: 2.854e-01\n", + "Step: 500, Loss: 2.690e-01\n", + "Step: 600, Loss: 2.577e-01\n", + "Step: 700, Loss: 2.488e-01\n", + "Step: 800, Loss: 2.412e-01\n", + "Step: 900, Loss: 2.340e-01\n", + "Step: 1000, Loss: 2.273e-01\n", + "Step: 1100, Loss: 2.211e-01\n", + "Step: 1200, Loss: 2.148e-01\n", + "Step: 1300, Loss: 2.085e-01\n", + "Step: 1400, Loss: 2.020e-01\n", + "Step: 1500, Loss: 1.950e-01\n", + "Step: 1600, Loss: 1.877e-01\n", + "Step: 1700, Loss: 1.800e-01\n", + "Step: 1800, Loss: 1.720e-01\n", + "Step: 1900, Loss: 1.636e-01\n", + "Step: 2000, Loss: 1.553e-01\n", + "Step: 2100, Loss: 1.472e-01\n", + "Step: 2200, Loss: 1.392e-01\n", + "Step: 2300, Loss: 1.320e-01\n", + "Step: 2400, Loss: 1.255e-01\n", + "Step: 2500, Loss: 1.190e-01\n", + "Step: 2600, Loss: 1.132e-01\n", + "Step: 2700, Loss: 1.080e-01\n", + "Step: 2800, Loss: 1.029e-01\n", + "Step: 2900, Loss: 9.867e-02\n", + "Step: 3000, Loss: 9.437e-02\n", + "Step: 3100, Loss: 9.102e-02\n", + "Step: 3200, Loss: 8.724e-02\n", + "Step: 3300, Loss: 8.490e-02\n", + "Step: 3400, Loss: 8.150e-02\n", + "Step: 3500, Loss: 7.937e-02\n", + "Step: 3600, Loss: 7.779e-02\n", + "Step: 3700, Loss: 7.558e-02\n", + "Step: 3800, Loss: 7.429e-02\n", + "Step: 3900, Loss: 7.290e-02\n", + "Step: 4000, Loss: 7.181e-02\n", + "Step: 4100, Loss: 7.066e-02\n", + "Step: 4200, Loss: 6.984e-02\n", + "Step: 4300, Loss: 6.909e-02\n", + "Step: 4400, Loss: 6.848e-02\n", + "Step: 4500, Loss: 6.794e-02\n", + "Step: 4600, Loss: 6.746e-02\n", + "Step: 4700, Loss: 6.718e-02\n", + "Step: 4800, Loss: 6.661e-02\n", + "Step: 4900, Loss: 6.640e-02\n", + "Step: 5000, Loss: 6.605e-02\n", + "Step: 5100, Loss: 6.559e-02\n", + "Step: 5200, Loss: 6.524e-02\n", + "Step: 5300, Loss: 6.529e-02\n", + "Step: 5400, Loss: 6.465e-02\n", + "Step: 5500, Loss: 6.435e-02\n", + "Step: 5600, Loss: 6.410e-02\n", + "Step: 5700, Loss: 6.386e-02\n", + "Step: 5800, Loss: 6.361e-02\n", + "Step: 5900, Loss: 6.357e-02\n", + "Step: 6000, Loss: 6.327e-02\n", + "Step: 6100, Loss: 6.295e-02\n", + "Step: 6200, Loss: 6.355e-02\n", + "Step: 6300, Loss: 6.255e-02\n", + "Step: 6400, Loss: 6.232e-02\n", + "Step: 6500, Loss: 6.263e-02\n", + "Step: 6600, Loss: 6.205e-02\n", + "Step: 6700, Loss: 6.173e-02\n", + "Step: 6800, Loss: 6.183e-02\n", + "Step: 6900, Loss: 6.145e-02\n", + "Step: 7000, Loss: 6.121e-02\n", + "Step: 7100, Loss: 6.130e-02\n", + "Step: 7200, Loss: 6.079e-02\n", + "Step: 7300, Loss: 6.078e-02\n", + "Step: 7400, Loss: 6.058e-02\n", + "Step: 7500, Loss: 6.034e-02\n", + "Step: 7600, Loss: 6.016e-02\n", + "Step: 7700, Loss: 6.025e-02\n", + "Step: 7800, Loss: 5.990e-02\n", + "Step: 7900, Loss: 5.964e-02\n", + "Step: 8000, Loss: 5.945e-02\n", + "Step: 8100, Loss: 5.944e-02\n", + "Step: 8200, Loss: 5.918e-02\n", + "Step: 8300, Loss: 5.914e-02\n", + "Step: 8400, Loss: 5.880e-02\n", + "Step: 8500, Loss: 5.873e-02\n", + "Step: 8600, Loss: 5.863e-02\n", + "Step: 8700, Loss: 5.862e-02\n", + "Step: 8800, Loss: 5.862e-02\n", + "Step: 8900, Loss: 5.814e-02\n", + "Step: 9000, Loss: 5.800e-02\n", + "Step: 9100, Loss: 5.802e-02\n", + "Step: 9200, Loss: 5.771e-02\n", + "Step: 9300, Loss: 5.759e-02\n", + "Step: 9400, Loss: 5.758e-02\n", + "Step: 9500, Loss: 5.729e-02\n", + "Step: 9600, Loss: 5.717e-02\n", + "Step: 9700, Loss: 5.733e-02\n", + "Step: 9800, Loss: 5.694e-02\n", + "Step: 9900, Loss: 5.681e-02\n", + "Step: 10000, Loss: 5.674e-02\n", + "Step: 10100, Loss: 5.658e-02\n", + "Step: 10200, Loss: 5.655e-02\n", + "Step: 10300, Loss: 5.637e-02\n", + "Step: 10400, Loss: 5.626e-02\n", + "Step: 10500, Loss: 5.614e-02\n", + "Step: 10600, Loss: 5.636e-02\n", + "Step: 10700, Loss: 5.589e-02\n", + "Step: 10800, Loss: 5.584e-02\n", + "Step: 10900, Loss: 5.618e-02\n", + "Step: 11000, Loss: 5.579e-02\n", + "Step: 11100, Loss: 5.547e-02\n", + "Step: 11200, Loss: 5.541e-02\n", + "Step: 11300, Loss: 5.553e-02\n", + "Step: 11400, Loss: 5.514e-02\n", + "Step: 11500, Loss: 5.533e-02\n", + "Step: 11600, Loss: 5.499e-02\n", + "Step: 11700, Loss: 5.478e-02\n", + "Step: 11800, Loss: 5.466e-02\n", + "Step: 11900, Loss: 5.472e-02\n", + "Step: 12000, Loss: 5.469e-02\n", + "Step: 12100, Loss: 5.463e-02\n", + "Step: 12200, Loss: 5.430e-02\n", + "Step: 12300, Loss: 5.412e-02\n", + "Step: 12400, Loss: 5.411e-02\n", + "Step: 12500, Loss: 5.431e-02\n", + "Step: 12600, Loss: 5.382e-02\n", + "Step: 12700, Loss: 5.375e-02\n", + "Step: 12800, Loss: 5.363e-02\n", + "Step: 12900, Loss: 5.346e-02\n", + "Step: 13000, Loss: 5.338e-02\n", + "Step: 13100, Loss: 5.354e-02\n", + "Step: 13200, Loss: 5.326e-02\n", + "Step: 13300, Loss: 5.314e-02\n", + "Step: 13400, Loss: 5.309e-02\n", + "Step: 13500, Loss: 5.300e-02\n", + "Step: 13600, Loss: 5.299e-02\n", + "Step: 13700, Loss: 5.272e-02\n", + "Step: 13800, Loss: 5.259e-02\n", + "Step: 13900, Loss: 5.260e-02\n", + "Step: 14000, Loss: 5.262e-02\n", + "Step: 14100, Loss: 5.234e-02\n", + "Step: 14200, Loss: 5.231e-02\n", + "Step: 14300, Loss: 5.225e-02\n", + "Step: 14400, Loss: 5.214e-02\n", + "Step: 14500, Loss: 5.221e-02\n", + "Step: 14600, Loss: 5.205e-02\n", + "Step: 14700, Loss: 5.220e-02\n", + "Step: 14800, Loss: 5.163e-02\n", + "Step: 14900, Loss: 5.155e-02\n", + "Step: 15000, Loss: 5.183e-02\n", + "Step: 15100, Loss: 5.161e-02\n", + "Step: 15200, Loss: 5.120e-02\n", + "Step: 15300, Loss: 5.135e-02\n", + "Step: 15400, Loss: 5.162e-02\n", + "Step: 15500, Loss: 5.096e-02\n", + "Step: 15600, Loss: 5.097e-02\n", + "Step: 15700, Loss: 5.092e-02\n", + "Step: 15800, Loss: 5.080e-02\n", + "Step: 15900, Loss: 5.078e-02\n", + "Step: 16000, Loss: 5.066e-02\n", + "Step: 16100, Loss: 5.035e-02\n", + "Step: 16200, Loss: 5.028e-02\n", + "Step: 16300, Loss: 5.033e-02\n", + "Step: 16400, Loss: 5.014e-02\n", + "Step: 16500, Loss: 5.041e-02\n", + "Step: 16600, Loss: 5.004e-02\n", + "Step: 16700, Loss: 4.979e-02\n", + "Step: 16800, Loss: 5.005e-02\n", + "Step: 16900, Loss: 4.960e-02\n", + "Step: 17000, Loss: 4.992e-02\n", + "Step: 17100, Loss: 4.986e-02\n", + "Step: 17200, Loss: 4.932e-02\n", + "Step: 17300, Loss: 4.948e-02\n", + "Step: 17400, Loss: 4.925e-02\n", + "Step: 17500, Loss: 4.905e-02\n", + "Step: 17600, Loss: 4.898e-02\n", + "Step: 17700, Loss: 4.917e-02\n", + "Step: 17800, Loss: 4.901e-02\n", + "Step: 17900, Loss: 4.894e-02\n", + "Step: 18000, Loss: 4.861e-02\n", + "Step: 18100, Loss: 4.855e-02\n", + "Step: 18200, Loss: 4.847e-02\n", + "Step: 18300, Loss: 4.909e-02\n", + "Step: 18400, Loss: 4.838e-02\n", + "Step: 18500, Loss: 4.852e-02\n", + "Step: 18600, Loss: 4.804e-02\n", + "Step: 18700, Loss: 4.839e-02\n", + "Step: 18800, Loss: 4.787e-02\n", + "Step: 18900, Loss: 4.778e-02\n", + "Step: 19000, Loss: 4.779e-02\n", + "Step: 19100, Loss: 4.769e-02\n", + "Step: 19200, Loss: 4.796e-02\n", + "Step: 19300, Loss: 4.762e-02\n", + "Step: 19400, Loss: 4.754e-02\n", + "Step: 19500, Loss: 4.722e-02\n", + "Step: 19600, Loss: 4.724e-02\n", + "Step: 19700, Loss: 4.700e-02\n", + "Step: 19800, Loss: 4.730e-02\n", + "Step: 19900, Loss: 4.693e-02\n", + "Step: 20000, Loss: 4.703e-02\n", + "Training took: 0:00:06.616118\n" + ] + } + ], + "source": [ + "def custom_loss(model, data, batch_axis):\n", + " inputs, targets, weights = data\n", + " input_batch_axis, _, _ = batch_axis\n", + " predictions = jax.vmap(model, in_axes=input_batch_axis)(inputs)\n", + " weighted_mse = jnp.mean(weights * (predictions - targets) ** 2)\n", + " return weighted_mse\n", + "\n", + "\n", + "model_key, training_key = jr.split(key)\n", + "\n", + "model = klax.nn.MLP(\n", + " in_size=\"scalar\", out_size=\"scalar\", width_sizes=[8, 8], key=model_key\n", + ")\n", + "\n", + "model, history = klax.fit(\n", + " model,\n", + " data=(x_samples, y_samples, sample_weights),\n", + " loss_fn=custom_loss,\n", + " batch_size=32,\n", + " steps=20_000,\n", + " history=klax.HistoryCallback(log_every=100),\n", + " key=training_key,\n", + ")\n", + "\n", + "baseline_model = klax.nn.MLP(\n", + " in_size=\"scalar\", out_size=\"scalar\", width_sizes=[8, 8], key=model_key\n", + ")\n", + "\n", + "baseline_model, baseline_history = klax.fit(\n", + " baseline_model,\n", + " data=(x_samples, y_samples),\n", + " batch_size=32,\n", + " steps=20_000,\n", + " history=klax.HistoryCallback(log_every=100),\n", + " key=training_key,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "id": "fa7fcf60", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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8+fPba6DeW2KFSumng8cjI3HiEsYipkhQwb1mJkyZVKnERwYcPD88MMP1TBVfCAbN26sPvCesG/Wli1bpl63o0eP2pzvia8fHsfRexJDro0h9F9++aU6SGCfatSoEWG/b968qQ6aSZIkUcN127Vrpw5e1jAHUaVKldR94L2BAMve9OnTtTx58qh9xjDfRYsWxen+ITCI7DNpzAu1c+dONUQaB6oECRJo+fPn17777jubIMLM/YtuH3EwxcERB0UctDGMHHPD2B/YPPU1NCBgwecJAY09d38NJZrjgqu/O51xLPV7sWNEREREPoc1QkREROSzGAgRERGRz2IgRERERD6LgRARERH5LAZCRERE5LMYCBEREZHPYiBEREREPouBEBG5vWzZssmPP/4Y4+tjgU4/P78I6x0REdljIEREToPgI6pt4MCBL3W/27dvl06dOsX4+hUqVJDLly9L8uTJxSwMxog8Q6DZDSAi74HgwzBt2jTp37+/WnDRkCRJEsvfmNQ+LCxMAgOj/xoKDg6OVTuwIKMZK6UTkedhRoiInAbBh7EhG4OMiHH6yJEjkjRpUlmyZIlaNTp+/PiyYcMGOXnypDRs2FDSpUunAqXSpUurldWj6hrD/U6YMEEaN24siRIlkty5c8v8+fMjzcZMnjxZUqRIIcuWLZP8+fOrx6lTp45N4BYaGioff/yxuh5Wde/Tp4+0adNGGjVqFOn+nj17Vho0aKBW/E6cOLEULFhQFi9eLGfOnJHq1aur6+AytKVt27aWFbIHDRqkVu1OmDChWn185syZEdq+aNEiKVKkiCRIkEDKlSsnBw4ccMprRES2GAgRkUt9/vnnMnjwYDl8+LA60D948EDq1asnq1atkt27d6sABcHFuXPnoryfr776Slq0aCH79u1Tt3/nnXfk1q1bkV7/0aNHMmzYMPnjjz9k3bp16v579eplufz777+XqVOnyqRJk2Tjxo1y7949mTt3bpRt6Nq1qzx9+lTd3/79+9V9IMgKCQmRWbNmqesgI4aA66efflKnEQRNmTJFxo4dKwcPHpRPP/1U3n33XVm7dq3Nfffu3Vt++OEH1S2IjBiek+fPn8foOSaiWIj1Mq1ERDGAlaKxgrb9qtxz586N9rZYKRurShuwCvmIESMsp3E/X3zxheX0gwcP1HlLliyxeazbt29b2oLTJ06csNxm1KhRapV6A/4eOnSo5XRoaKha1bphw4aRtrNw4cLawIEDHV5m3wbACuJYjXvTpk021+3QoYNaTd36dv/884/NautYpXvatGlRPGtE9DJYI0RELlWqVCmb08gIoYgaXUHInKCL6vHjx9FmhJBNMqBbKlmyZHLt2rVIr48utJw5c1pOZ8iQwXL9u3fvytWrV6VMmTKWywMCAlQXHrqyIoOutC5dusjy5culZs2a0rRpU5t22Ttx4oTKTNWqVcvm/GfPnknx4sVtzitfvrzl71SpUknevHlVFo2InIuBEBG5FIIWa+ieWrFiheq2ypUrl6qbadasmQoOohIvXjyb06iriSpocXR9Pbn08t5//32pXbu2CuIQDKHbC91ZH330kcPrI+gDXD9Tpkw2l6FmiohcjzVCRGQq1OOgkBiFz4ULF1aF1Sg2diUUdqNYG/U4Boxo27VrV7S3RT1Q586dZfbs2dKzZ0/59ddfLSPXjPsxFChQQAU8yHYh6LPecD/WtmzZYvn79u3bcuzYMVXoTUTOxYwQEZkKI74QRKAYGFmaL7/8MsrMTlxBFgcZHQQl+fLlk19++UUFIGhTZD755BOpW7eu5MmTR1139erVlmAla9as6rYLFy5UxdzIdGHUHDJgKJDGPlaqVEl1yyEYRNceRqkZvv76azV6DQFav379JE2aNFGOYCOil8OMEBGZavjw4WqIOSZBRDCErqYSJUq4vB0YLt+qVStp3bq1qs/B6C+0BcPXI4NsD0aOIfjBaDcERKNHj1aXoesLI9swSg7BTLdu3dT533zzjQr2EHQZt0NXGYbTW8PIuu7du6s6pStXrsiCBQssWSYich4/VEw78f6IiLwCMjYIVDBEH8GLq2AeIcxBhAwT5jQiorjFrjEioheTI6LguWrVqmpuoJEjR8rp06fl7bffNrtpRBSH2DVGRIQvQ39/NQM1ZrauWLGimiARM1yzQJnIu7FrjIiIiHwWM0JERETksxgIERERkc9iIEREREQ+i4EQERER+SwGQkREROSzGAgRERGRz2IgRERERD6LgRARERH5LAZCREREJL7q/wESpWPgImFKEAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ax = plt.subplot()\n", + "history.plot(ax=ax, loss_options={\"label\": \"weighted loss\", \"c\": \"red\"})\n", + "baseline_history.plot(\n", + " ax=ax, loss_options={\"label\": \"baseline loss\", \"ls\": \"--\", \"c\": \"grey\"}\n", + ")\n", + "ax.set(\n", + " xlabel=\"Training step\",\n", + " ylabel=\"Loss\",\n", + " title=\"Training loss with and without sample weighting\",\n", + " yscale=\"log\",\n", + ")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "ba5d51c8", + "metadata": {}, + "source": [ + "Let's plot the model predictions." + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "id": "aca3b841", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot the data\n", + "y_pred = jax.vmap(model)(x_dense)\n", + "y_pred_baseline = jax.vmap(baseline_model)(x_dense)\n", + "\n", + "plt.plot(x_dense, y_dense, c=\"grey\", label=\"True function\", alpha=0.5)\n", + "plt.scatter(\n", + " x_samples, y_samples, c=\"k\", s=sample_weights, alpha=0.8, label=\"Samples\"\n", + ")\n", + "plt.plot(x_dense, y_pred, c=\"red\", label=\"Model with sample weights\")\n", + "plt.plot(\n", + " x_dense,\n", + " y_pred_baseline,\n", + " c=\"red\",\n", + " label=\"Model without sample weights\",\n", + " ls=\"--\",\n", + ")\n", + "plt.gca().set(\n", + " xlabel=\"x\",\n", + " ylabel=\"f(x)\",\n", + " title=\"Model predictions with and without sample weighting\",\n", + ")\n", + "plt.legend(loc=3)\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "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.12.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 458fee0dca423ac761f7a8fea4f8f85c1f2d1b49 Mon Sep 17 00:00:00 2001 From: Fabian Roth Date: Thu, 28 Aug 2025 23:31:01 +0200 Subject: [PATCH 4/5] Changed example fit verbosity. --- docs/examples/sample_weighting.ipynb | 423 +-------------------------- 1 file changed, 6 insertions(+), 417 deletions(-) diff --git a/docs/examples/sample_weighting.ipynb b/docs/examples/sample_weighting.ipynb index 3da2609..dbb61d4 100644 --- a/docs/examples/sample_weighting.ipynb +++ b/docs/examples/sample_weighting.ipynb @@ -100,421 +100,10 @@ }, { "cell_type": "code", - "execution_count": 144, + "execution_count": 6, "id": "1d8491d7", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Step: 0, Loss: 1.662e+01\n", - "Step: 100, Loss: 3.327e+00\n", - "Step: 200, Loss: 8.098e-01\n", - "Step: 300, Loss: 6.101e-01\n", - "Step: 400, Loss: 5.927e-01\n", - "Step: 500, Loss: 5.834e-01\n", - "Step: 600, Loss: 5.772e-01\n", - "Step: 700, Loss: 5.718e-01\n", - "Step: 800, Loss: 5.664e-01\n", - "Step: 900, Loss: 5.613e-01\n", - "Step: 1000, Loss: 5.557e-01\n", - "Step: 1100, Loss: 5.503e-01\n", - "Step: 1200, Loss: 5.447e-01\n", - "Step: 1300, Loss: 5.388e-01\n", - "Step: 1400, Loss: 5.322e-01\n", - "Step: 1500, Loss: 5.251e-01\n", - "Step: 1600, Loss: 5.174e-01\n", - "Step: 1700, Loss: 5.099e-01\n", - "Step: 1800, Loss: 5.008e-01\n", - "Step: 1900, Loss: 4.919e-01\n", - "Step: 2000, Loss: 4.828e-01\n", - "Step: 2100, Loss: 4.738e-01\n", - "Step: 2200, Loss: 4.651e-01\n", - "Step: 2300, Loss: 4.573e-01\n", - "Step: 2400, Loss: 4.512e-01\n", - "Step: 2500, Loss: 4.447e-01\n", - "Step: 2600, Loss: 4.384e-01\n", - "Step: 2700, Loss: 4.331e-01\n", - "Step: 2800, Loss: 4.292e-01\n", - "Step: 2900, Loss: 4.258e-01\n", - "Step: 3000, Loss: 4.216e-01\n", - "Step: 3100, Loss: 4.190e-01\n", - "Step: 3200, Loss: 4.162e-01\n", - "Step: 3300, Loss: 4.147e-01\n", - "Step: 3400, Loss: 4.091e-01\n", - "Step: 3500, Loss: 4.094e-01\n", - "Step: 3600, Loss: 4.102e-01\n", - "Step: 3700, Loss: 4.026e-01\n", - "Step: 3800, Loss: 3.995e-01\n", - "Step: 3900, Loss: 3.970e-01\n", - "Step: 4000, Loss: 3.958e-01\n", - "Step: 4100, Loss: 3.925e-01\n", - "Step: 4200, Loss: 3.906e-01\n", - "Step: 4300, Loss: 3.887e-01\n", - "Step: 4400, Loss: 3.866e-01\n", - "Step: 4500, Loss: 3.845e-01\n", - "Step: 4600, Loss: 3.825e-01\n", - "Step: 4700, Loss: 3.815e-01\n", - "Step: 4800, Loss: 3.791e-01\n", - "Step: 4900, Loss: 3.768e-01\n", - "Step: 5000, Loss: 3.754e-01\n", - "Step: 5100, Loss: 3.742e-01\n", - "Step: 5200, Loss: 3.711e-01\n", - "Step: 5300, Loss: 3.716e-01\n", - "Step: 5400, Loss: 3.673e-01\n", - "Step: 5500, Loss: 3.657e-01\n", - "Step: 5600, Loss: 3.636e-01\n", - "Step: 5700, Loss: 3.623e-01\n", - "Step: 5800, Loss: 3.600e-01\n", - "Step: 5900, Loss: 3.582e-01\n", - "Step: 6000, Loss: 3.568e-01\n", - "Step: 6100, Loss: 3.548e-01\n", - "Step: 6200, Loss: 3.557e-01\n", - "Step: 6300, Loss: 3.512e-01\n", - "Step: 6400, Loss: 3.490e-01\n", - "Step: 6500, Loss: 3.470e-01\n", - "Step: 6600, Loss: 3.465e-01\n", - "Step: 6700, Loss: 3.434e-01\n", - "Step: 6800, Loss: 3.420e-01\n", - "Step: 6900, Loss: 3.397e-01\n", - "Step: 7000, Loss: 3.375e-01\n", - "Step: 7100, Loss: 3.354e-01\n", - "Step: 7200, Loss: 3.330e-01\n", - "Step: 7300, Loss: 3.308e-01\n", - "Step: 7400, Loss: 3.322e-01\n", - "Step: 7500, Loss: 3.266e-01\n", - "Step: 7600, Loss: 3.245e-01\n", - "Step: 7700, Loss: 3.235e-01\n", - "Step: 7800, Loss: 3.202e-01\n", - "Step: 7900, Loss: 3.180e-01\n", - "Step: 8000, Loss: 3.160e-01\n", - "Step: 8100, Loss: 3.136e-01\n", - "Step: 8200, Loss: 3.111e-01\n", - "Step: 8300, Loss: 3.131e-01\n", - "Step: 8400, Loss: 3.059e-01\n", - "Step: 8500, Loss: 3.031e-01\n", - "Step: 8600, Loss: 3.003e-01\n", - "Step: 8700, Loss: 2.984e-01\n", - "Step: 8800, Loss: 2.987e-01\n", - "Step: 8900, Loss: 2.937e-01\n", - "Step: 9000, Loss: 2.903e-01\n", - "Step: 9100, Loss: 2.876e-01\n", - "Step: 9200, Loss: 2.846e-01\n", - "Step: 9300, Loss: 2.835e-01\n", - "Step: 9400, Loss: 2.798e-01\n", - "Step: 9500, Loss: 2.768e-01\n", - "Step: 9600, Loss: 2.743e-01\n", - "Step: 9700, Loss: 2.723e-01\n", - "Step: 9800, Loss: 2.686e-01\n", - "Step: 9900, Loss: 2.660e-01\n", - "Step: 10000, Loss: 2.635e-01\n", - "Step: 10100, Loss: 2.603e-01\n", - "Step: 10200, Loss: 2.577e-01\n", - "Step: 10300, Loss: 2.550e-01\n", - "Step: 10400, Loss: 2.521e-01\n", - "Step: 10500, Loss: 2.492e-01\n", - "Step: 10600, Loss: 2.502e-01\n", - "Step: 10700, Loss: 2.435e-01\n", - "Step: 10800, Loss: 2.408e-01\n", - "Step: 10900, Loss: 2.380e-01\n", - "Step: 11000, Loss: 2.372e-01\n", - "Step: 11100, Loss: 2.307e-01\n", - "Step: 11200, Loss: 2.290e-01\n", - "Step: 11300, Loss: 2.256e-01\n", - "Step: 11400, Loss: 2.212e-01\n", - "Step: 11500, Loss: 2.208e-01\n", - "Step: 11600, Loss: 2.159e-01\n", - "Step: 11700, Loss: 2.117e-01\n", - "Step: 11800, Loss: 2.083e-01\n", - "Step: 11900, Loss: 2.052e-01\n", - "Step: 12000, Loss: 2.021e-01\n", - "Step: 12100, Loss: 1.986e-01\n", - "Step: 12200, Loss: 1.951e-01\n", - "Step: 12300, Loss: 1.918e-01\n", - "Step: 12400, Loss: 1.882e-01\n", - "Step: 12500, Loss: 1.850e-01\n", - "Step: 12600, Loss: 1.815e-01\n", - "Step: 12700, Loss: 1.787e-01\n", - "Step: 12800, Loss: 1.758e-01\n", - "Step: 12900, Loss: 1.710e-01\n", - "Step: 13000, Loss: 1.673e-01\n", - "Step: 13100, Loss: 1.672e-01\n", - "Step: 13200, Loss: 1.602e-01\n", - "Step: 13300, Loss: 1.561e-01\n", - "Step: 13400, Loss: 1.550e-01\n", - "Step: 13500, Loss: 1.493e-01\n", - "Step: 13600, Loss: 1.464e-01\n", - "Step: 13700, Loss: 1.422e-01\n", - "Step: 13800, Loss: 1.380e-01\n", - "Step: 13900, Loss: 1.340e-01\n", - "Step: 14000, Loss: 1.314e-01\n", - "Step: 14100, Loss: 1.263e-01\n", - "Step: 14200, Loss: 1.230e-01\n", - "Step: 14300, Loss: 1.200e-01\n", - "Step: 14400, Loss: 1.157e-01\n", - "Step: 14500, Loss: 1.148e-01\n", - "Step: 14600, Loss: 1.089e-01\n", - "Step: 14700, Loss: 1.073e-01\n", - "Step: 14800, Loss: 1.019e-01\n", - "Step: 14900, Loss: 9.818e-02\n", - "Step: 15000, Loss: 9.810e-02\n", - "Step: 15100, Loss: 9.263e-02\n", - "Step: 15200, Loss: 8.850e-02\n", - "Step: 15300, Loss: 8.527e-02\n", - "Step: 15400, Loss: 8.330e-02\n", - "Step: 15500, Loss: 7.932e-02\n", - "Step: 15600, Loss: 7.720e-02\n", - "Step: 15700, Loss: 7.426e-02\n", - "Step: 15800, Loss: 7.204e-02\n", - "Step: 15900, Loss: 7.087e-02\n", - "Step: 16000, Loss: 6.838e-02\n", - "Step: 16100, Loss: 6.509e-02\n", - "Step: 16200, Loss: 6.314e-02\n", - "Step: 16300, Loss: 6.199e-02\n", - "Step: 16400, Loss: 6.055e-02\n", - "Step: 16500, Loss: 6.041e-02\n", - "Step: 16600, Loss: 5.785e-02\n", - "Step: 16700, Loss: 5.606e-02\n", - "Step: 16800, Loss: 5.640e-02\n", - "Step: 16900, Loss: 5.396e-02\n", - "Step: 17000, Loss: 5.453e-02\n", - "Step: 17100, Loss: 5.300e-02\n", - "Step: 17200, Loss: 5.170e-02\n", - "Step: 17300, Loss: 5.153e-02\n", - "Step: 17400, Loss: 5.079e-02\n", - "Step: 17500, Loss: 4.996e-02\n", - "Step: 17600, Loss: 4.965e-02\n", - "Step: 17700, Loss: 4.947e-02\n", - "Step: 17800, Loss: 5.032e-02\n", - "Step: 17900, Loss: 4.826e-02\n", - "Step: 18000, Loss: 4.789e-02\n", - "Step: 18100, Loss: 4.759e-02\n", - "Step: 18200, Loss: 4.704e-02\n", - "Step: 18300, Loss: 4.764e-02\n", - "Step: 18400, Loss: 4.638e-02\n", - "Step: 18500, Loss: 4.614e-02\n", - "Step: 18600, Loss: 4.577e-02\n", - "Step: 18700, Loss: 4.513e-02\n", - "Step: 18800, Loss: 4.519e-02\n", - "Step: 18900, Loss: 4.574e-02\n", - "Step: 19000, Loss: 4.410e-02\n", - "Step: 19100, Loss: 4.693e-02\n", - "Step: 19200, Loss: 4.540e-02\n", - "Step: 19300, Loss: 4.365e-02\n", - "Step: 19400, Loss: 4.307e-02\n", - "Step: 19500, Loss: 4.339e-02\n", - "Step: 19600, Loss: 4.273e-02\n", - "Step: 19700, Loss: 4.223e-02\n", - "Step: 19800, Loss: 4.204e-02\n", - "Step: 19900, Loss: 4.237e-02\n", - "Step: 20000, Loss: 4.159e-02\n", - "Training took: 0:00:06.424294\n", - "Step: 0, Loss: 6.613e+00\n", - "Step: 100, Loss: 1.318e+00\n", - "Step: 200, Loss: 4.042e-01\n", - "Step: 300, Loss: 3.137e-01\n", - "Step: 400, Loss: 2.854e-01\n", - "Step: 500, Loss: 2.690e-01\n", - "Step: 600, Loss: 2.577e-01\n", - "Step: 700, Loss: 2.488e-01\n", - "Step: 800, Loss: 2.412e-01\n", - "Step: 900, Loss: 2.340e-01\n", - "Step: 1000, Loss: 2.273e-01\n", - "Step: 1100, Loss: 2.211e-01\n", - "Step: 1200, Loss: 2.148e-01\n", - "Step: 1300, Loss: 2.085e-01\n", - "Step: 1400, Loss: 2.020e-01\n", - "Step: 1500, Loss: 1.950e-01\n", - "Step: 1600, Loss: 1.877e-01\n", - "Step: 1700, Loss: 1.800e-01\n", - "Step: 1800, Loss: 1.720e-01\n", - "Step: 1900, Loss: 1.636e-01\n", - "Step: 2000, Loss: 1.553e-01\n", - "Step: 2100, Loss: 1.472e-01\n", - "Step: 2200, Loss: 1.392e-01\n", - "Step: 2300, Loss: 1.320e-01\n", - "Step: 2400, Loss: 1.255e-01\n", - "Step: 2500, Loss: 1.190e-01\n", - "Step: 2600, Loss: 1.132e-01\n", - "Step: 2700, Loss: 1.080e-01\n", - "Step: 2800, Loss: 1.029e-01\n", - "Step: 2900, Loss: 9.867e-02\n", - "Step: 3000, Loss: 9.437e-02\n", - "Step: 3100, Loss: 9.102e-02\n", - "Step: 3200, Loss: 8.724e-02\n", - "Step: 3300, Loss: 8.490e-02\n", - "Step: 3400, Loss: 8.150e-02\n", - "Step: 3500, Loss: 7.937e-02\n", - "Step: 3600, Loss: 7.779e-02\n", - "Step: 3700, Loss: 7.558e-02\n", - "Step: 3800, Loss: 7.429e-02\n", - "Step: 3900, Loss: 7.290e-02\n", - "Step: 4000, Loss: 7.181e-02\n", - "Step: 4100, Loss: 7.066e-02\n", - "Step: 4200, Loss: 6.984e-02\n", - "Step: 4300, Loss: 6.909e-02\n", - "Step: 4400, Loss: 6.848e-02\n", - "Step: 4500, Loss: 6.794e-02\n", - "Step: 4600, Loss: 6.746e-02\n", - "Step: 4700, Loss: 6.718e-02\n", - "Step: 4800, Loss: 6.661e-02\n", - "Step: 4900, Loss: 6.640e-02\n", - "Step: 5000, Loss: 6.605e-02\n", - "Step: 5100, Loss: 6.559e-02\n", - "Step: 5200, Loss: 6.524e-02\n", - "Step: 5300, Loss: 6.529e-02\n", - "Step: 5400, Loss: 6.465e-02\n", - "Step: 5500, Loss: 6.435e-02\n", - "Step: 5600, Loss: 6.410e-02\n", - "Step: 5700, Loss: 6.386e-02\n", - "Step: 5800, Loss: 6.361e-02\n", - "Step: 5900, Loss: 6.357e-02\n", - "Step: 6000, Loss: 6.327e-02\n", - "Step: 6100, Loss: 6.295e-02\n", - "Step: 6200, Loss: 6.355e-02\n", - "Step: 6300, Loss: 6.255e-02\n", - "Step: 6400, Loss: 6.232e-02\n", - "Step: 6500, Loss: 6.263e-02\n", - "Step: 6600, Loss: 6.205e-02\n", - "Step: 6700, Loss: 6.173e-02\n", - "Step: 6800, Loss: 6.183e-02\n", - "Step: 6900, Loss: 6.145e-02\n", - "Step: 7000, Loss: 6.121e-02\n", - "Step: 7100, Loss: 6.130e-02\n", - "Step: 7200, Loss: 6.079e-02\n", - "Step: 7300, Loss: 6.078e-02\n", - "Step: 7400, Loss: 6.058e-02\n", - "Step: 7500, Loss: 6.034e-02\n", - "Step: 7600, Loss: 6.016e-02\n", - "Step: 7700, Loss: 6.025e-02\n", - "Step: 7800, Loss: 5.990e-02\n", - "Step: 7900, Loss: 5.964e-02\n", - "Step: 8000, Loss: 5.945e-02\n", - "Step: 8100, Loss: 5.944e-02\n", - "Step: 8200, Loss: 5.918e-02\n", - "Step: 8300, Loss: 5.914e-02\n", - "Step: 8400, Loss: 5.880e-02\n", - "Step: 8500, Loss: 5.873e-02\n", - "Step: 8600, Loss: 5.863e-02\n", - "Step: 8700, Loss: 5.862e-02\n", - "Step: 8800, Loss: 5.862e-02\n", - "Step: 8900, Loss: 5.814e-02\n", - "Step: 9000, Loss: 5.800e-02\n", - "Step: 9100, Loss: 5.802e-02\n", - "Step: 9200, Loss: 5.771e-02\n", - "Step: 9300, Loss: 5.759e-02\n", - "Step: 9400, Loss: 5.758e-02\n", - "Step: 9500, Loss: 5.729e-02\n", - "Step: 9600, Loss: 5.717e-02\n", - "Step: 9700, Loss: 5.733e-02\n", - "Step: 9800, Loss: 5.694e-02\n", - "Step: 9900, Loss: 5.681e-02\n", - "Step: 10000, Loss: 5.674e-02\n", - "Step: 10100, Loss: 5.658e-02\n", - "Step: 10200, Loss: 5.655e-02\n", - "Step: 10300, Loss: 5.637e-02\n", - "Step: 10400, Loss: 5.626e-02\n", - "Step: 10500, Loss: 5.614e-02\n", - "Step: 10600, Loss: 5.636e-02\n", - "Step: 10700, Loss: 5.589e-02\n", - "Step: 10800, Loss: 5.584e-02\n", - "Step: 10900, Loss: 5.618e-02\n", - "Step: 11000, Loss: 5.579e-02\n", - "Step: 11100, Loss: 5.547e-02\n", - "Step: 11200, Loss: 5.541e-02\n", - "Step: 11300, Loss: 5.553e-02\n", - "Step: 11400, Loss: 5.514e-02\n", - "Step: 11500, Loss: 5.533e-02\n", - "Step: 11600, Loss: 5.499e-02\n", - "Step: 11700, Loss: 5.478e-02\n", - "Step: 11800, Loss: 5.466e-02\n", - "Step: 11900, Loss: 5.472e-02\n", - "Step: 12000, Loss: 5.469e-02\n", - "Step: 12100, Loss: 5.463e-02\n", - "Step: 12200, Loss: 5.430e-02\n", - "Step: 12300, Loss: 5.412e-02\n", - "Step: 12400, Loss: 5.411e-02\n", - "Step: 12500, Loss: 5.431e-02\n", - "Step: 12600, Loss: 5.382e-02\n", - "Step: 12700, Loss: 5.375e-02\n", - "Step: 12800, Loss: 5.363e-02\n", - "Step: 12900, Loss: 5.346e-02\n", - "Step: 13000, Loss: 5.338e-02\n", - "Step: 13100, Loss: 5.354e-02\n", - "Step: 13200, Loss: 5.326e-02\n", - "Step: 13300, Loss: 5.314e-02\n", - "Step: 13400, Loss: 5.309e-02\n", - "Step: 13500, Loss: 5.300e-02\n", - "Step: 13600, Loss: 5.299e-02\n", - "Step: 13700, Loss: 5.272e-02\n", - "Step: 13800, Loss: 5.259e-02\n", - "Step: 13900, Loss: 5.260e-02\n", - "Step: 14000, Loss: 5.262e-02\n", - "Step: 14100, Loss: 5.234e-02\n", - "Step: 14200, Loss: 5.231e-02\n", - "Step: 14300, Loss: 5.225e-02\n", - "Step: 14400, Loss: 5.214e-02\n", - "Step: 14500, Loss: 5.221e-02\n", - "Step: 14600, Loss: 5.205e-02\n", - "Step: 14700, Loss: 5.220e-02\n", - "Step: 14800, Loss: 5.163e-02\n", - "Step: 14900, Loss: 5.155e-02\n", - "Step: 15000, Loss: 5.183e-02\n", - "Step: 15100, Loss: 5.161e-02\n", - "Step: 15200, Loss: 5.120e-02\n", - "Step: 15300, Loss: 5.135e-02\n", - "Step: 15400, Loss: 5.162e-02\n", - "Step: 15500, Loss: 5.096e-02\n", - "Step: 15600, Loss: 5.097e-02\n", - "Step: 15700, Loss: 5.092e-02\n", - "Step: 15800, Loss: 5.080e-02\n", - "Step: 15900, Loss: 5.078e-02\n", - "Step: 16000, Loss: 5.066e-02\n", - "Step: 16100, Loss: 5.035e-02\n", - "Step: 16200, Loss: 5.028e-02\n", - "Step: 16300, Loss: 5.033e-02\n", - "Step: 16400, Loss: 5.014e-02\n", - "Step: 16500, Loss: 5.041e-02\n", - "Step: 16600, Loss: 5.004e-02\n", - "Step: 16700, Loss: 4.979e-02\n", - "Step: 16800, Loss: 5.005e-02\n", - "Step: 16900, Loss: 4.960e-02\n", - "Step: 17000, Loss: 4.992e-02\n", - "Step: 17100, Loss: 4.986e-02\n", - "Step: 17200, Loss: 4.932e-02\n", - "Step: 17300, Loss: 4.948e-02\n", - "Step: 17400, Loss: 4.925e-02\n", - "Step: 17500, Loss: 4.905e-02\n", - "Step: 17600, Loss: 4.898e-02\n", - "Step: 17700, Loss: 4.917e-02\n", - "Step: 17800, Loss: 4.901e-02\n", - "Step: 17900, Loss: 4.894e-02\n", - "Step: 18000, Loss: 4.861e-02\n", - "Step: 18100, Loss: 4.855e-02\n", - "Step: 18200, Loss: 4.847e-02\n", - "Step: 18300, Loss: 4.909e-02\n", - "Step: 18400, Loss: 4.838e-02\n", - "Step: 18500, Loss: 4.852e-02\n", - "Step: 18600, Loss: 4.804e-02\n", - "Step: 18700, Loss: 4.839e-02\n", - "Step: 18800, Loss: 4.787e-02\n", - "Step: 18900, Loss: 4.778e-02\n", - "Step: 19000, Loss: 4.779e-02\n", - "Step: 19100, Loss: 4.769e-02\n", - "Step: 19200, Loss: 4.796e-02\n", - "Step: 19300, Loss: 4.762e-02\n", - "Step: 19400, Loss: 4.754e-02\n", - "Step: 19500, Loss: 4.722e-02\n", - "Step: 19600, Loss: 4.724e-02\n", - "Step: 19700, Loss: 4.700e-02\n", - "Step: 19800, Loss: 4.730e-02\n", - "Step: 19900, Loss: 4.693e-02\n", - "Step: 20000, Loss: 4.703e-02\n", - "Training took: 0:00:06.616118\n" - ] - } - ], + "outputs": [], "source": [ "def custom_loss(model, data, batch_axis):\n", " inputs, targets, weights = data\n", @@ -536,7 +125,7 @@ " loss_fn=custom_loss,\n", " batch_size=32,\n", " steps=20_000,\n", - " history=klax.HistoryCallback(log_every=100),\n", + " history=klax.HistoryCallback(log_every=100, verbose=False),\n", " key=training_key,\n", ")\n", "\n", @@ -549,14 +138,14 @@ " data=(x_samples, y_samples),\n", " batch_size=32,\n", " steps=20_000,\n", - " history=klax.HistoryCallback(log_every=100),\n", + " history=klax.HistoryCallback(log_every=100, verbose=False),\n", " key=training_key,\n", ")" ] }, { "cell_type": "code", - "execution_count": 145, + "execution_count": 7, "id": "fa7fcf60", "metadata": {}, "outputs": [ @@ -597,7 +186,7 @@ }, { "cell_type": "code", - "execution_count": 147, + "execution_count": 8, "id": "aca3b841", "metadata": {}, "outputs": [ From 29563b20b78a20e3d87527c83aedee96a8902e03 Mon Sep 17 00:00:00 2001 From: Fabian Roth Date: Wed, 29 Oct 2025 15:32:24 +0100 Subject: [PATCH 5/5] Removed _new_training.py mock up for the modularized training that was pushed in here by accident. --- klax/_new_training.py | 129 ------------------------------------------ 1 file changed, 129 deletions(-) delete mode 100644 klax/_new_training.py diff --git a/klax/_new_training.py b/klax/_new_training.py deleted file mode 100644 index 4858239..0000000 --- a/klax/_new_training.py +++ /dev/null @@ -1,129 +0,0 @@ -from abc import ABC, abstractmethod -from collections.abc import Callable, Iterable -from dataclasses import dataclass -from typing import Any - -import equinox as eqx -import jax -import optax -from jaxtyping import PRNGKeyArray, PyTree, Scalar - -from ._wrappers import apply, unwrap - - -class DataHandler[T](ABC): - train_data: PyTree[Any, "T"] - validation_data: PyTree[Any, "T"] | None - batch_axes: PyTree[int | None, "T ..."] # type: ignore - batch_size: int - ... - - @abstractmethod - def get_training_batch( - self, - ) -> PyTree[Any, "T"]: - pass - - -class Loss(ABC): - @abstractmethod - def value[T]( - self, - model: PyTree, - batch: PyTree[Any, "T"], - batch_axis: PyTree[int | None, "T ..."], # type: ignore - ) -> Scalar: - pass - - def value_and_grad[T, M]( - self, - model: PyTree[Any, "M"], - batch: PyTree[Any, "T"], - batch_axis: PyTree[int | None, "T ..."], # type: ignore - ) -> tuple[Scalar, PyTree[Any, "M"]]: - return jax.value_and_grad(self.value)(model, batch, batch_axis) - - -class DefaultLoss(Loss): - loss_fn: Callable - - def value(self, model, batch, batch_axis): - model = unwrap(model) - return self.loss_fn(model, batch, batch_axis=batch_axis) - - -@dataclass -class TrainingState: - # Replaces CallbackArgs -> Enables modifying every training aspect through callbacks - model: PyTree - datahandler: DataHandler - optimizer: optax.GradientTransformation - optimizer_state: PyTree - loss: Loss - step: int - steps: int - - -class Callback(ABC): - """An abstract callback. - - Inherit from this class to create a custom callback. - """ - - def __call__(self, training_state: TrainingState) -> bool | None: - """Call after each step during training.""" - pass - - def on_training_end(self, training_state: TrainingState) -> None: - """Call when training ends.""" - pass - - def on_training_start(self, training_state: TrainingState) -> None: - """Call when training starts.""" - pass - - -def training_loop( - training_state: TrainingState, callbacks: Iterable[Callback] = [] -): - @eqx.filter_jit - def make_step(batch, model, optimizer, optimizer_state): - # Where can this function go? Seems wrong to put it here - # Can we make it a method of training state without interfering with jit? - value, grad = training_state.loss.value_and_grad( - model, batch, training_state.datahandler.batch_axes - ) - updates, optimizer_state = optimizer.update( - grad, optimizer_state, value=value - ) - model = optax.apply_updates(model, updates) - model = apply(model) - return model, optimizer_state - - for callback in callbacks: - callback.on_training_start(training_state) - - for training_state.step in range(1, training_state.steps + 1): - batch = training_state.datahandler.get_training_batch() - training_state.model, training_state.optimizer_state = make_step( - batch, - training_state.model, - training_state.optimizer, - training_state.optimizer_state, - ) - if any([callback(training_state) for callback in callbacks]): - break - - for callback in callbacks: - callback.on_training_end(training_state) - - return training_state - - -def fit(model, data, validation_data, loss_fn): - # Initialize training state and callbacks - loss = DefaultLoss(loss_fn) - training_state = TrainingState(model, loss=loss) - callbacks.append(history) - training_state = training_loop(training_state, callbacks) - return training_state.model, history