{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# phygnn binary classification example\n", "\n", "Here's an example of how to make a binary classifier using a phygnn model without a p_fun." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import tensorflow as tf\n", "from rex import init_logger\n", "\n", "from phygnn import PhysicsGuidedNeuralNetwork" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "init_logger('phygnn', log_level='INFO', log_file=None)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
x1x2
0-250-250
1-249-250
2-248-250
3-247-250
4-246-250
\n", "
" ], "text/plain": [ " x1 x2\n", "0 -250 -250\n", "1 -249 -250\n", "2 -248 -250\n", "3 -247 -250\n", "4 -246 -250" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x1 = np.arange(500) - 250\n", "x2 = np.arange(500) - 250\n", "x1, x2 = np.meshgrid(x1, x2)\n", "x1 = x1.flatten()\n", "x2 = x2.flatten()\n", "x3 = x1 * x2\n", "features = pd.DataFrame({'x1': x1, 'x2': x2})\n", "features.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
y
01.0
11.0
21.0
31.0
41.0
\n", "
" ], "text/plain": [ " y\n", "0 1.0\n", "1 1.0\n", "2 1.0\n", "3 1.0\n", "4 1.0" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y = ((x1 * x2) > 0).astype(bool).astype(float)\n", "labels = pd.DataFrame({'y': y})\n", "labels.head()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "hidden_layers = [{'units': 16},\n", " {'activation': 'relu'},\n", " {'units': 16}, \n", " {'activation': 'relu'},\n", " ]\n", "output_layer = [{'units': 1}, \n", " {'activation': 'sigmoid'},\n", " ]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO - 2021-11-01 11:35:25,245 [phygnn.py:498] : Epoch 0 train loss: 1.26e+01 val loss: 8.18e+00 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:25,409 [phygnn.py:498] : Epoch 1 train loss: 8.26e+00 val loss: 1.73e+00 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:25,581 [phygnn.py:498] : Epoch 2 train loss: 1.75e+00 val loss: 3.29e+00 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:25,758 [phygnn.py:498] : Epoch 3 train loss: 3.31e+00 val loss: 3.03e+00 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:25,916 [phygnn.py:498] : Epoch 4 train loss: 3.06e+00 val loss: 1.59e+00 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:26,053 [phygnn.py:498] : Epoch 5 train loss: 1.63e+00 val loss: 6.06e-01 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:26,227 [phygnn.py:498] : Epoch 6 train loss: 6.22e-01 val loss: 1.46e-01 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:26,392 [phygnn.py:498] : Epoch 7 train loss: 1.44e-01 val loss: 1.58e-01 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:26,584 [phygnn.py:498] : Epoch 8 train loss: 1.55e-01 val loss: 3.75e-01 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:26,748 [phygnn.py:498] : Epoch 9 train loss: 3.59e-01 val loss: 4.78e-01 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:26,916 [phygnn.py:498] : Epoch 10 train loss: 4.50e-01 val loss: 4.42e-01 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:27,088 [phygnn.py:498] : Epoch 11 train loss: 4.09e-01 val loss: 4.50e-01 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:27,232 [phygnn.py:498] : Epoch 12 train loss: 4.17e-01 val loss: 3.86e-01 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:27,374 [phygnn.py:498] : Epoch 13 train loss: 3.60e-01 val loss: 3.39e-01 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:27,556 [phygnn.py:498] : Epoch 14 train loss: 3.25e-01 val loss: 2.54e-01 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:27,704 [phygnn.py:498] : Epoch 15 train loss: 2.46e-01 val loss: 1.08e-01 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:27,836 [phygnn.py:498] : Epoch 16 train loss: 1.03e-01 val loss: 9.77e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:27,971 [phygnn.py:498] : Epoch 17 train loss: 9.36e-02 val loss: 6.76e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:28,110 [phygnn.py:498] : Epoch 18 train loss: 6.63e-02 val loss: 1.33e-01 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:28,241 [phygnn.py:498] : Epoch 19 train loss: 1.33e-01 val loss: 6.92e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:28,390 [phygnn.py:498] : Epoch 20 train loss: 6.98e-02 val loss: 7.40e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:28,552 [phygnn.py:498] : Epoch 21 train loss: 7.37e-02 val loss: 7.44e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:28,688 [phygnn.py:498] : Epoch 22 train loss: 7.48e-02 val loss: 6.11e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:28,833 [phygnn.py:498] : Epoch 23 train loss: 6.13e-02 val loss: 5.84e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:29,018 [phygnn.py:498] : Epoch 24 train loss: 5.72e-02 val loss: 4.71e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:29,190 [phygnn.py:498] : Epoch 25 train loss: 4.42e-02 val loss: 8.04e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:29,342 [phygnn.py:498] : Epoch 26 train loss: 7.55e-02 val loss: 5.56e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:29,493 [phygnn.py:498] : Epoch 27 train loss: 5.27e-02 val loss: 5.29e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:29,650 [phygnn.py:498] : Epoch 28 train loss: 5.14e-02 val loss: 2.71e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:29,790 [phygnn.py:498] : Epoch 29 train loss: 2.64e-02 val loss: 3.21e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:29,956 [phygnn.py:498] : Epoch 30 train loss: 3.15e-02 val loss: 3.60e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:30,114 [phygnn.py:498] : Epoch 31 train loss: 3.62e-02 val loss: 3.07e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:30,249 [phygnn.py:498] : Epoch 32 train loss: 3.20e-02 val loss: 4.04e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:30,391 [phygnn.py:498] : Epoch 33 train loss: 4.18e-02 val loss: 3.16e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:30,547 [phygnn.py:498] : Epoch 34 train loss: 3.29e-02 val loss: 3.54e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:30,687 [phygnn.py:498] : Epoch 35 train loss: 3.54e-02 val loss: 2.00e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:30,831 [phygnn.py:498] : Epoch 36 train loss: 2.03e-02 val loss: 2.21e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:30,988 [phygnn.py:498] : Epoch 37 train loss: 2.22e-02 val loss: 2.38e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:31,125 [phygnn.py:498] : Epoch 38 train loss: 2.34e-02 val loss: 2.39e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:31,321 [phygnn.py:498] : Epoch 39 train loss: 2.30e-02 val loss: 2.59e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:31,633 [phygnn.py:498] : Epoch 40 train loss: 2.44e-02 val loss: 2.26e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:31,796 [phygnn.py:498] : Epoch 41 train loss: 2.17e-02 val loss: 2.71e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:31,976 [phygnn.py:498] : Epoch 42 train loss: 2.63e-02 val loss: 1.94e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:32,158 [phygnn.py:498] : Epoch 43 train loss: 1.89e-02 val loss: 1.86e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:32,335 [phygnn.py:498] : Epoch 44 train loss: 1.77e-02 val loss: 1.62e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:32,611 [phygnn.py:498] : Epoch 45 train loss: 1.59e-02 val loss: 1.83e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:32,786 [phygnn.py:498] : Epoch 46 train loss: 1.86e-02 val loss: 1.82e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:32,954 [phygnn.py:498] : Epoch 47 train loss: 1.87e-02 val loss: 1.65e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:33,113 [phygnn.py:498] : Epoch 48 train loss: 1.70e-02 val loss: 1.85e-02 for \"phygnn\"\n", "INFO - 2021-11-01 11:35:33,374 [phygnn.py:498] : Epoch 49 train loss: 1.87e-02 val loss: 1.64e-02 for \"phygnn\"\n" ] } ], "source": [ "PhysicsGuidedNeuralNetwork.seed(0)\n", "model = PhysicsGuidedNeuralNetwork(p_fun=None, \n", " hidden_layers=hidden_layers,\n", " output_layer=output_layer,\n", " loss_weights=(1.0, 0.0), \n", " metric='binary_crossentropy',\n", " learning_rate=0.05,\n", " n_features=2, n_labels=1)\n", "model.fit(features, labels, features, n_batch=1, n_epoch=50)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 99.49%\n" ] } ], "source": [ "model.history[['training_loss', 'validation_loss']].plot()\n", "plt.ylabel('Loss')\n", "plt.show()\n", "plt.close()\n", "\n", "y_pred = model.predict(features)\n", "accuracy = 100 * (np.round(y_pred) == labels.values).sum() / len(labels)\n", "print('Accuracy: {:.2f}%'.format(accuracy))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.5" } }, "nbformat": 4, "nbformat_minor": 4 }