{ "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, p_fun_dummy" ] }, { "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-02-02 16:35:44,812 [phygnn.py:773] : Epoch 0 train loss: 1.26e+01 val loss: 8.18e+00 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:45,011 [phygnn.py:773] : Epoch 1 train loss: 8.26e+00 val loss: 1.73e+00 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:45,189 [phygnn.py:773] : Epoch 2 train loss: 1.75e+00 val loss: 3.29e+00 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:45,334 [phygnn.py:773] : Epoch 3 train loss: 3.31e+00 val loss: 3.03e+00 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:45,505 [phygnn.py:773] : Epoch 4 train loss: 3.06e+00 val loss: 1.59e+00 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:45,651 [phygnn.py:773] : Epoch 5 train loss: 1.63e+00 val loss: 6.06e-01 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:45,817 [phygnn.py:773] : Epoch 6 train loss: 6.22e-01 val loss: 1.46e-01 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:45,995 [phygnn.py:773] : Epoch 7 train loss: 1.44e-01 val loss: 1.58e-01 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:46,180 [phygnn.py:773] : Epoch 8 train loss: 1.55e-01 val loss: 3.75e-01 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:46,367 [phygnn.py:773] : Epoch 9 train loss: 3.59e-01 val loss: 4.78e-01 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:46,571 [phygnn.py:773] : Epoch 10 train loss: 4.50e-01 val loss: 4.42e-01 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:46,731 [phygnn.py:773] : Epoch 11 train loss: 4.09e-01 val loss: 4.50e-01 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:46,882 [phygnn.py:773] : Epoch 12 train loss: 4.17e-01 val loss: 3.86e-01 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:47,051 [phygnn.py:773] : Epoch 13 train loss: 3.60e-01 val loss: 3.39e-01 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:47,196 [phygnn.py:773] : Epoch 14 train loss: 3.25e-01 val loss: 2.54e-01 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:47,338 [phygnn.py:773] : Epoch 15 train loss: 2.46e-01 val loss: 1.08e-01 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:47,475 [phygnn.py:773] : Epoch 16 train loss: 1.03e-01 val loss: 9.77e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:47,620 [phygnn.py:773] : Epoch 17 train loss: 9.36e-02 val loss: 6.76e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:47,776 [phygnn.py:773] : Epoch 18 train loss: 6.63e-02 val loss: 1.33e-01 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:47,916 [phygnn.py:773] : Epoch 19 train loss: 1.33e-01 val loss: 6.92e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:48,058 [phygnn.py:773] : Epoch 20 train loss: 6.99e-02 val loss: 7.40e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:48,217 [phygnn.py:773] : Epoch 21 train loss: 7.37e-02 val loss: 7.44e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:48,373 [phygnn.py:773] : Epoch 22 train loss: 7.48e-02 val loss: 6.11e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:48,518 [phygnn.py:773] : Epoch 23 train loss: 6.13e-02 val loss: 5.84e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:48,654 [phygnn.py:773] : Epoch 24 train loss: 5.72e-02 val loss: 4.71e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:48,794 [phygnn.py:773] : Epoch 25 train loss: 4.42e-02 val loss: 8.04e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:48,929 [phygnn.py:773] : Epoch 26 train loss: 7.55e-02 val loss: 5.56e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:49,067 [phygnn.py:773] : Epoch 27 train loss: 5.27e-02 val loss: 5.29e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:49,209 [phygnn.py:773] : Epoch 28 train loss: 5.14e-02 val loss: 2.71e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:49,348 [phygnn.py:773] : Epoch 29 train loss: 2.64e-02 val loss: 3.21e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:49,482 [phygnn.py:773] : Epoch 30 train loss: 3.15e-02 val loss: 3.60e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:49,614 [phygnn.py:773] : Epoch 31 train loss: 3.62e-02 val loss: 3.07e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:49,747 [phygnn.py:773] : Epoch 32 train loss: 3.20e-02 val loss: 4.04e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:49,889 [phygnn.py:773] : Epoch 33 train loss: 4.18e-02 val loss: 3.16e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:50,045 [phygnn.py:773] : Epoch 34 train loss: 3.29e-02 val loss: 3.54e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:50,240 [phygnn.py:773] : Epoch 35 train loss: 3.54e-02 val loss: 2.00e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:50,413 [phygnn.py:773] : Epoch 36 train loss: 2.03e-02 val loss: 2.21e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:50,550 [phygnn.py:773] : Epoch 37 train loss: 2.22e-02 val loss: 2.38e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:50,691 [phygnn.py:773] : Epoch 38 train loss: 2.34e-02 val loss: 2.39e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:50,839 [phygnn.py:773] : Epoch 39 train loss: 2.30e-02 val loss: 2.59e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:50,972 [phygnn.py:773] : Epoch 40 train loss: 2.44e-02 val loss: 2.26e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:51,121 [phygnn.py:773] : Epoch 41 train loss: 2.17e-02 val loss: 2.71e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:51,262 [phygnn.py:773] : Epoch 42 train loss: 2.63e-02 val loss: 1.94e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:51,399 [phygnn.py:773] : Epoch 43 train loss: 1.89e-02 val loss: 1.86e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:51,535 [phygnn.py:773] : Epoch 44 train loss: 1.77e-02 val loss: 1.62e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:51,666 [phygnn.py:773] : Epoch 45 train loss: 1.59e-02 val loss: 1.83e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:51,806 [phygnn.py:773] : Epoch 46 train loss: 1.86e-02 val loss: 1.82e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:51,937 [phygnn.py:773] : Epoch 47 train loss: 1.87e-02 val loss: 1.65e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:52,071 [phygnn.py:773] : Epoch 48 train loss: 1.70e-02 val loss: 1.85e-02 for \"phygnn\"\n", "INFO - 2021-02-02 16:35:52,209 [phygnn.py:773] : Epoch 49 train loss: 1.87e-02 val loss: 1.64e-02 for \"phygnn\"\n" ] } ], "source": [ "PhysicsGuidedNeuralNetwork.seed(0)\n", "model = PhysicsGuidedNeuralNetwork(p_fun=p_fun_dummy, \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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UXQi6PLAb2YzgCnAJJfOPJOvrCCb6jqvbEMsGk737kSkGyopKTkh0j3t1aXTOc1sMvAd4HLn3IGu2Gdp/sGrd0VEJL3TOZ8CFgDDzGyzmd2AN8unAHjNzJaY2UPp2n8jXb0rItJc2lI9zrmrW2j+dbr215qmwK+LuEREgG5+5S54s3pAqR4RkUbdPvCX5CnHL9KdNdbD37p1K1OnTm1xmYsuuohPuhbopz/9KQcOHDz12J76/kdjxowZzJ49u9O2dyy6feCPRcMUxCLK8Yt0c3369DmmwHp44G9Pff8TVbeuztmorCBbhdpEOuLlO+Dj9zp3m70/BZf8sNWP77jjDvr168fNN98MwL/8y78QiUSYO3cue/bsIR6Pc88993DFFVc0W2/Dhg1MmTKF5cuXU1tby8yZM1m6dCnDhw+ntra2abmbbrqJd955h9raWqZOncpdd93F/fffz9atW/n0pz9NaWkpc+fObarvX1payn333ccjjzwCwI033shtt93Ghg0bWq37/0nmzJnDt7/9bRKJBGeffTYPPvgg2dnZ3HHHHbz00ktEIhEuvvhi7r33Xp577jnuuusuwuEwRUVFzJs3ryM/9WYCEfhL87OpVKpH5IQwffp0brvttqbA/+yzz/LKK69wyy23UFhYyM6dOxk7diyXX345ZtbiNh588EFyc3NZtWoVy5Yt46yzzmr67Ac/+AE9e/YkmUwyadIkli1bxi233MJ9993H3Llzj7jhyqJFi3j00Ud56623cM5x7rnncuGFF1JcXMyaNWt46qmn+OUvf8lVV13F888/z7XXXtvm8dXV1TFjxgzmzJnD0KFD+cpXvsKDDz7Iddddx4svvsjq1asxs6Y00913380rr7xCeXl5p6WeAhH4y/KzWfWxyjaIHLU2RubpMnr0aHbs2MHWrVuprKykuLiY3r17861vfYt58+YRCoXYsmUL27dvp3fv3i1uY968edxyyy0AnHnmmZx55plNnz377LM8/PDDJBIJtm3bxsqVK5t9frj58+fzhS98oak89Be/+EXeeOMNLr/88nbX/T/U+++/z8CBAxk6dCgA119/PQ888ADf+MY3iMVi3HDDDUyZMoUpU6YAXrXQGTNmcNVVVzXdP+BYdfscP/gVOpXqETlhTJs2jdmzZ/PMM88wffp0nnjiCSorK1m0aBFLliyhV69eLdbh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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 }