{ "cells": [ { "cell_type": "markdown", "id": "93c2f0ba", "metadata": {}, "source": [ "# Classification with DNN and Pen&Paper\n", "\n", "In this task we will explore the analytic solution of DNN classifications.\n", "\n", "## Introduction\n", "We will create data from two Gaussian distributions and train a classification between them.\n", "In parallel we will take pen and paper to calculate the solution of the classification.\n", "Then we will compare the results of our network training and our pen and paper calculation." ] }, { "cell_type": "code", "execution_count": 43, "id": "20329dfd", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from matplotlib import pyplot as plt\n", "import tensorflow as tf" ] }, { "cell_type": "markdown", "id": "df4f97e5", "metadata": {}, "source": [ "## Creating and plotting the data\n", "First we fix the parametrisation of our Gaussian distributions (A and B) and create the data." ] }, { "cell_type": "code", "execution_count": 44, "id": "6c92b864", "metadata": {}, "outputs": [], "source": [ "# parametrisation of the underlying probability distributions\n", "loc_a, scale_a = 0, 1.5\n", "loc_b, scale_b = 1, 1.2\n", "\n", "# creating the data\n", "a = np.random.normal(loc=loc_a, scale=scale_a, size=(100000,))\n", "b = np.random.normal(loc=loc_b, scale=scale_b, size=(100000,))" ] }, { "cell_type": "markdown", "id": "2890ec5b", "metadata": {}, "source": [ "We bin the data in histograms with equidistant bins, plot the histograms and plot (parts of) the raw data." ] }, { "cell_type": "code", "execution_count": 45, "id": "f687f21b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<matplotlib.legend.Legend at 0x7f9211e57c70>" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZUAAAEGCAYAAACtqQjWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAnTUlEQVR4nO3dfXTdVZ3v8fc3OTknJzl5btKmSUsKFKS0UiRCHVBRlMEHLHJVCgzgjHNdODI+MNdLGdbScV1ZMEuWehkcZ1V0CjNYwPrEOKBWnrkCbcAi1AJWCG36kLRp0zw/nOR7/zi/hEObJqftLz05zee1VlbO2b/9279v2p58+9t7//Y2d0dERCQMedkOQEREjh9KKiIiEholFRERCY2SioiIhEZJRUREQhPJdgDH2qxZs7yhoSHbYYiI5JTnnntuj7tXT1ZvxiWVhoYGmpqash2GiEhOMbM3Mqmn7i8REQmNkoqIiIRGSUVEREIz48ZUxjM0NERLSwv9/f3ZDkXGUVhYSH19PQUFBdkORUQmoaQCtLS0UFJSQkNDA2aW7XAkjbvT3t5OS0sLCxYsyHY4IjIJJRWgv79fCWWaMjOqqqrYvXt3tkOZOR695ejbeN+NR9+G5CSNqQSUUKYv/d2I5A4lFRERCY26v8bx7XWvhtrelz94yqR18vPzWbJkCUNDQ0QiEa655hq+9KUvkZeXR1NTE3fffTe33377uOc2Nzfzu9/9jiuuuGLc4zt27OALX/gCa9euZfXq1TQ1NXHHHXdkHP/q1au58MILmTt3LgB/+7d/y/XXX8+iRYsybmMiy5cvp62tjaeffjqU9kQke3SnMk3E43E2btzIpk2bWLduHQ8++CBf//rXAWhsbDxkQoFUUvnRj3407rFkMsncuXNZu3btEce2evVqduzYMfb+zjvvDC2hdHR08Pzzz9PR0cHrr78eSpsikj1KKtNQTU0Nq1at4o477sDdeeyxx/joRz8KwOOPP87SpUtZunQpZ555Jl1dXaxcuZInn3ySpUuX8u1vf5vVq1fzyU9+kosvvpgLL7yQ5uZmFi9ePNb+tm3buOiiizj11FPHEteBdW677Tb+6Z/+ibVr19LU1MSVV17J0qVL6evr4/zzzx9b6mbNmjUsWbKExYsXc8MNN4ydn0gkuOmmmzjjjDNYtmwZra2t4/6sP/nJT7j44otZsWIF9957b+h/liJybCmpTFMnnngiIyMjtLW1vaX8tttu47vf/S4bN27kySefJB6Pc+utt/Lud7+bjRs38uUvfxmAp59+mrvuuotHHnnkoLbXr1/PPffcw8aNG/nxj3884Vpon/jEJ2hsbByrH4/Hx47t2LGDG264gUceeYSNGzeyYcMGfv7znwPQ09PDsmXLeOGFF3jPe97D97///XHbX7NmDZdffjmXX345a9asOdw/JhGZZjSmMo25+0Fl5557Ltdffz1XXnkll156KfX19eOe+8EPfpDKyspDHquqqgLg0ksv5amnnuKSSy457Pg2bNjA+eefT3V1auHSK6+8kieeeIJLLrmEaDQ6dnd11llnsW7duoPOb21tZcuWLZx33nmYGZFIhJdeeuktd0ySo452WrKmJOcsJZVp6rXXXiM/P5+amho2b948Vr5y5Uo+8pGP8OCDD7Js2TJ++9vfjnt+cXHxIds+cIru6C/0kZGRsbJMVhcYL+mNKigoGLtOfn4+yWTyoDr33Xcf+/btG3uosbOzk3vvvZdvfOMbk15bDiGMZ0xEjoK6v6ah3bt3c+2113LdddcdlAD+/Oc/s2TJEm644QYaGxt5+eWXKSkpoaurK+P2161bx969e+nr6+PnP/855557LrNnz6atrY329nYGBgb45S9/OVb/UO2fc845PP744+zZs4fh4WHWrFnDe9/73ozjWLNmDb/61a9obm6mubmZ5557TuMqIjluyu5UzOyHwEeBNndfHJR9E7gYGAT+DPy1u3cEx24EPgMMA19w918H5WcBq4E48CDwRXd3M4sBdwNnAe3AZe7eHEbsmUwBDltfXx9Lly4dm1J81VVXcf311x9U7zvf+Q6PPvoo+fn5LFq0iA996EPk5eURiUQ444wz+PSnP01FRcWE1zrvvPO46qqr2LJlC1dccQWNjY0AfPWrX+Wcc85hwYIFvO1tbxur/+lPf5prr72WeDz+lmm/tbW13HLLLbzvfe/D3fnwhz/M8uXLM/p5m5ub2bp1K8uWLRsrW7BgAaWlpTz77LOcc845GbUjItOLTdSFcVQNm70H6AbuTksqFwKPuHvSzP4ZwN1vMLNFwBrgbGAu8FvgFHcfNrP1wBeBZ0glldvd/SEz+zvg7e5+rZmtAD7u7pdNFldjY6MfODC9efNmTjvttJB+cpkK+jvK0PHS/aUx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", "text/plain": [ "<Figure size 432x288 with 2 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# creating the figure\n", "fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, sharex='col', gridspec_kw={'height_ratios': [2, 1], \"hspace\": 0})\n", "\n", "# plot histograms\n", "hist_a, bins_a, _ = ax1.hist(a, bins=np.arange(-4, 4.4, 0.4), alpha=0.5, label=\"Distribution A\")\n", "hist_b, bins_b, _ = ax1.hist(b, bins=bins_a, alpha=0.5, label=\"Distribution B\")\n", "\n", "# plot 1000 example points\n", "ax2.plot(a[:1000], np.zeros_like(a)[:1000], linestyle=\"None\", marker=\"|\", alpha=0.1)\n", "ax2.plot(b[:1000], np.zeros_like(b)[:1000], linestyle=\"None\", marker=\"|\", alpha=0.1)\n", "\n", "# styling plot\n", "ax2.axes.get_yaxis().set_visible(False)\n", "ax2.set_xlabel(\"x\")\n", "ax1.set_ylabel(\"Counts [#]\")\n", "ax2.set_xlim([-4, 4])\n", "ax1.legend()" ] }, { "cell_type": "markdown", "id": "d78ecea0", "metadata": {}, "source": [ "## DNN based Classification\n", "\n", "Now create a DNN model for the classification between Distribution A and Distribution B.\n", "- How many inputs do we have?\n", "- How many outputs do we have?\n", "- How many layers with which activation funcitons do we need?\n", "- Does the network output probabilities or logits?" ] }, { "cell_type": "code", "execution_count": 46, "id": "7dbbc75c", "metadata": {}, "outputs": [], "source": [ "\"\"\"\n", "TODO: Create the model\n", "\"\"\"\n", "model = tf.keras.Sequential(\n", " layers=[\n", " tf.keras.Input(shape=(1,)),\n", " tf.keras.layers.Dense(30, activation=\"relu\"),\n", " tf.keras.layers.Dense(30, activation=\"relu\"),\n", " tf.keras.layers.Dense(1, activation=\"sigmoid\"),\n", " ]\n", ")" ] }, { "cell_type": "markdown", "id": "3131b396", "metadata": {}, "source": [ "Now compile the model.\n", "- Which loss function do we want?\n", "- Which optimizer do we want?" ] }, { "cell_type": "code", "execution_count": 47, "id": "52114d30", "metadata": {}, "outputs": [], "source": [ "\"\"\"\n", "TODO: Compile the model\n", "\"\"\"\n", "optimizer = \"sgd\"\n", "loss = tf.keras.losses.BinaryCrossentropy(from_logits=False)\n", "model.compile(optimizer=optimizer, loss=loss, metrics=[\"accuracy\"])" ] }, { "cell_type": "markdown", "id": "51d8dee9", "metadata": {}, "source": [ "Look at the model summary to see how many trainable parameters or model has." ] }, { "cell_type": "code", "execution_count": 48, "id": "0e8cd8a5", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model: \"sequential_1\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "dense_3 (Dense) (None, 30) 60 \n", "_________________________________________________________________\n", "dense_4 (Dense) (None, 30) 930 \n", "_________________________________________________________________\n", "dense_5 (Dense) (None, 1) 31 \n", "=================================================================\n", "Total params: 1,021\n", "Trainable params: 1,021\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "model.summary()" ] }, { "cell_type": "markdown", "id": "664744b9", "metadata": {}, "source": [ "Now we prepare the data for the training by interleaving datasets A and B and shuffling the data." ] }, { "cell_type": "code", "execution_count": 49, "id": "47253403", "metadata": {}, "outputs": [], "source": [ "# prepare the data for training (interleave+shuffle)\n", "x = np.concatenate([a, b])\n", "y = np.concatenate([np.ones_like(a), np.zeros_like(b)])\n", "p = np.random.permutation(len(x))\n", "x, y = x[p], y[p]" ] }, { "cell_type": "markdown", "id": "85757895", "metadata": {}, "source": [ "Now we fit the model to the training data:" ] }, { "cell_type": "code", "execution_count": 50, "id": "7013e12d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/5\n", "5000/5000 [==============================] - 7s 1ms/step - loss: 0.6348 - accuracy: 0.6359 - val_loss: 0.6210 - val_accuracy: 0.6504\n", "Epoch 2/5\n", "5000/5000 [==============================] - 5s 1ms/step - loss: 0.6214 - accuracy: 0.6501 - val_loss: 0.6208 - val_accuracy: 0.6507\n", "Epoch 3/5\n", "5000/5000 [==============================] - 6s 1ms/step - loss: 0.6217 - accuracy: 0.6486 - val_loss: 0.6205 - val_accuracy: 0.6509\n", "Epoch 4/5\n", "5000/5000 [==============================] - 6s 1ms/step - loss: 0.6208 - accuracy: 0.6494 - val_loss: 0.6205 - val_accuracy: 0.6510\n", "Epoch 5/5\n", "5000/5000 [==============================] - 6s 1ms/step - loss: 0.6217 - accuracy: 0.6503 - val_loss: 0.6204 - val_accuracy: 0.6508\n" ] }, { "data": { "text/plain": [ "<tensorflow.python.keras.callbacks.History at 0x7f9211fa5850>" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# fit the model\n", "model.fit(x=x, y=y, epochs=5, validation_split=0.2)" ] }, { "cell_type": "markdown", "id": "31e4e01b", "metadata": {}, "source": [ "## Plotting and Results\n", "In the following cells we will plot the analytic solution, our training solution and the analytic solution using the actual data distributions which were used for the training." ] }, { "cell_type": "code", "execution_count": 51, "id": "3056147d", "metadata": {}, "outputs": [], "source": [ "# define x_values for inference and plotting\n", "x_values = np.arange(-4, 4.01, 0.01)[:, None]" ] }, { "cell_type": "code", "execution_count": 52, "id": "160928b9", "metadata": {}, "outputs": [], "source": [ "# analytic solution\n", "def gaussian(x, loc, scale):\n", " return 1 / np.sqrt(2 * np.pi * scale ** 2) * np.exp(-((x - loc) ** 2) / (2 * scale ** 2))\n", "\n", "gauss_a = gaussian(x_values, loc=loc_a, scale=scale_a)\n", "gauss_b = gaussian(x_values, loc=loc_b, scale=scale_b)\n", "analytic = gauss_a / (gauss_a + gauss_b)" ] }, { "cell_type": "code", "execution_count": 53, "id": "7d2b85be", "metadata": {}, "outputs": [], "source": [ "# classic solution by histogram division\n", "hist = hist_a / (hist_a + hist_b)" ] }, { "cell_type": "code", "execution_count": 54, "id": "eb42db1a", "metadata": {}, "outputs": [], "source": [ "# DNN based classification solution\n", "pred = model.predict(x_values)" ] }, { "cell_type": "code", "execution_count": 55, "id": "86373833", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "<matplotlib.legend.Legend at 0x7f9211204e80>" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# plot all the infered ratios\n", "plt.plot(x_values, analytic, label=\"Analytic\", color=\"black\", linestyle=\"--\")\n", "plt.plot((bins_a[1:]+bins_a[:-1])/2, hist, label=\"Hist\")\n", "plt.plot(x_values, pred, label=\"DNN\", color=\"red\")\n", "plt.xlabel(\"x\")\n", "plt.ylabel(\"Ratio A/(A+B)\")\n", "plt.xlim([-4, 4])\n", "plt.legend()" ] }, { "cell_type": "markdown", "id": "0742090c", "metadata": {}, "source": [ "As you can see, the all three distributions match quite well!" ] }, { "cell_type": "markdown", "id": "ef7e916c", "metadata": {}, "source": [ "## Summary\n", "\n", "This concludes our tutorial for today.\n", "\n", "In this tutorial you learned:\n", "- How to train a neural network based classification task\n", "- How to predict the output of the trained network using pen and paper" ] }, { "cell_type": "code", "execution_count": null, "id": "b42625de", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.8.8" } }, "nbformat": 4, "nbformat_minor": 5 }