{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import h5py\n",
    "from tensorflow.keras.layers import *\n",
    "from tensorflow.keras.models import Sequential, Model\n",
    "from tensorflow.keras.optimizers import Adam, SGD\n",
    "from tensorflow.keras.utils import to_categorical\n",
    "from tensorflow.keras.metrics import AUC\n",
    "import tensorflow as tf\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "file_electron = \"SingleElectronPt50_IMGCROPS_n249k_RHv1.hdf5\"\n",
    "file_photon = \"SinglePhotonPt50_IMGCROPS_n249k_RHv1.hdf5\"\n",
    "\n",
    "\n",
    "with h5py.File(file_electron, \"r\") as f1:\n",
    "    X_elec = np.array(f1['X'][:])\n",
    "    y_elec = np.array(f1['y'][:])\n",
    "with h5py.File(file_photon, \"r\") as f2:\n",
    "    X_phot = np.array(f2['X'][:])\n",
    "    y_phot = np.array(f2['y'][:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(249000, 32, 32, 2)\n",
      "(249000, 32, 32, 2)\n"
     ]
    }
   ],
   "source": [
    "print(X_elec.shape)\n",
    "print(X_phot.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(498000, 32, 32, 2)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = np.append(X_elec, X_phot, axis=0)\n",
    "y = np.append(y_elec, y_phot)\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(498000, 2, 32, 32)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = np.swapaxes(X, 3,1)\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(498000, 32, 32)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X[:,0].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "y = to_categorical(y, num_classes=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2022-03-24 21:10:11.762364: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n",
      "2022-03-24 21:10:11.778410: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n",
      "2022-03-24 21:10:11.781363: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n",
      "2022-03-24 21:10:11.785380: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA\n",
      "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
      "2022-03-24 21:10:11.787689: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n",
      "2022-03-24 21:10:11.790520: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n",
      "2022-03-24 21:10:11.793075: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n",
      "2022-03-24 21:10:12.725689: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n",
      "2022-03-24 21:10:12.728464: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n",
      "2022-03-24 21:10:12.731152: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n",
      "2022-03-24 21:10:12.733702: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1525] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 47216 MB memory:  -> device: 0, name: Quadro RTX 8000, pci bus id: 0000:04:00.0, compute capability: 7.5\n"
     ]
    }
   ],
   "source": [
    "input1 = Input(shape=(32,32,1))\n",
    "input2 = Input(shape=(32,32,1))\n",
    "\n",
    "conv1 = Conv2D(3, (4,4), activation='relu', input_shape=(32,32,1), padding='same')(input1)\n",
    "conv2 = Conv2D(3, (4,4), activation='relu', input_shape=(32,32,1), padding='same')(input2)\n",
    "x1 = MaxPooling2D((4,4))(conv1)\n",
    "x2 = MaxPooling2D((4,4))(conv2)\n",
    "x1 = Flatten()(x1)\n",
    "x2 = Flatten()(x2)\n",
    "\n",
    "x1 = Dense(32, activation='relu')(x1)\n",
    "\n",
    "x2 = Dense(32, activation='relu')(x2)\n",
    "\n",
    "x = Concatenate(axis=1)([x1, x2])\n",
    "x = Dense(8, activation='relu')(x)\n",
    "output = Dense(2, activation='softmax')(x)\n",
    "model = Model(inputs=[input1, input2], outputs=output)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model\"\n",
      "__________________________________________________________________________________________________\n",
      " Layer (type)                   Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      " input_1 (InputLayer)           [(None, 32, 32, 1)]  0           []                               \n",
      "                                                                                                  \n",
      " input_2 (InputLayer)           [(None, 32, 32, 1)]  0           []                               \n",
      "                                                                                                  \n",
      " conv2d (Conv2D)                (None, 32, 32, 3)    51          ['input_1[0][0]']                \n",
      "                                                                                                  \n",
      " conv2d_1 (Conv2D)              (None, 32, 32, 3)    51          ['input_2[0][0]']                \n",
      "                                                                                                  \n",
      " max_pooling2d (MaxPooling2D)   (None, 8, 8, 3)      0           ['conv2d[0][0]']                 \n",
      "                                                                                                  \n",
      " max_pooling2d_1 (MaxPooling2D)  (None, 8, 8, 3)     0           ['conv2d_1[0][0]']               \n",
      "                                                                                                  \n",
      " flatten (Flatten)              (None, 192)          0           ['max_pooling2d[0][0]']          \n",
      "                                                                                                  \n",
      " flatten_1 (Flatten)            (None, 192)          0           ['max_pooling2d_1[0][0]']        \n",
      "                                                                                                  \n",
      " dense (Dense)                  (None, 32)           6176        ['flatten[0][0]']                \n",
      "                                                                                                  \n",
      " dense_1 (Dense)                (None, 32)           6176        ['flatten_1[0][0]']              \n",
      "                                                                                                  \n",
      " concatenate (Concatenate)      (None, 64)           0           ['dense[0][0]',                  \n",
      "                                                                  'dense_1[0][0]']                \n",
      "                                                                                                  \n",
      " dense_2 (Dense)                (None, 8)            520         ['concatenate[0][0]']            \n",
      "                                                                                                  \n",
      " dense_3 (Dense)                (None, 2)            18          ['dense_2[0][0]']                \n",
      "                                                                                                  \n",
      "==================================================================================================\n",
      "Total params: 12,992\n",
      "Trainable params: 12,992\n",
      "Non-trainable params: 0\n",
      "__________________________________________________________________________________________________\n"
     ]
    },
    {
     "data": {
      "image/png": "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ePFiTZw4saXKBdCC/KXvvvTSS4qMjGzV52gIfdwTfdy3WCaBBh06dEjl5eU644wz/C4IS9Lzzz+v2tpapaWlNTguOTlZxhhL18I1xfEcd4fDoZtuukmS9Mwzz7RGeQBaka/7rpVBWKKPe0Mf9y3CcCvav3+/Zs2apV69eikiIkLdunXTyJEj9eqrr6q8vNzruPDwcHXo0EEXX3yxPv74Y9eYpUuXui2237Vrl9LT09W+fXt17NhRY8eOdZ1YUFhY6LE4/4EHHpAkVVdXu20fP358g68hKytLkjRnzhyP+7Zt26bLLrtMsbGxioqK0rBhw7Rq1arjPm5NsXLlSklS//79m/zYQD3ujTF06FBJ0tq1a1VVVdWsfQCBiL4beOjj3tHHfcjKRRqBojlrb37++Wdz0kknmYSEBLN8+XJTXFxs8vLyzP33328kmfnz57uNi4+PN8uXLzdFRUVm+/btZty4ccbhcJgXXnjBbb+pqamudUZr1qwxpaWlZsWKFSYyMtIMGjTIbexFF11kQkJCzLfffutRX3JysnnttdcafA15eXkmPj7eXHfddR737dy507Rv394kJiaa//znP6akpMRs3rzZjBo1ypx44ok+WzPcpUsXI8l89tlnTXqeQD3uxhx7rZkxxpSXlxtJRpLZs2dPg893NNaawR/Qd33Xd49kxZph+rh39HGfySQMN0JzJtWUKVPqbQgXXXSRqynXjXv99dfdxhw+fNh07drVREZGmry8PNf2ujfz8uXLPWqUZPLz813bPvjgAyPJzJgxw23sqlWrTI8ePRo8CaGgoMAMGDDApKenm+rqao/709LSjCSzZMkSt+0//fSTiYiI8HkY/vzzz5v0PIF63I1pXBMtKyujiSKg0Xd913ePZGUYpo+7o4/7TCbLJFrJm2++KUm6+OKLPe577733NHPmTLdxY8aMcRsTERGhlJQUlZeX69///rfHPgYNGuT2c/fu3SVJe/bscW1LSUnRmWeeqVdffVX79+93bZ83b55mzpxZ77qrQ4cOafTo0TrttNO0aNEihYaGeox5//33JUmjR4922961a1f17dvX635bQ9euXSVJBQUFTXpcoB73xvr5558lSU6nUyeccEKz9wMEEvpuYKKPe0cf9x3CcCuoqKhQUVGR2rRpo5iYmGaPi4+PlyTl5eV53BcbG+v2c3h4uKRfrtV4pD/84Q8qKytzLcDfsWOHVq5cqeuuu85rTdXV1UpLS1NiYqIWLlzo9Y1cUVGhkpIStWnTRtHR0R73d+7c2eu+W8Pw4cMlSZs3b270YwL1uDdF3RrC5ORkOZ3O49oXEAjou77ruy2NPu4dfdx3CMOtICIiQrGxsTp8+LBKSkqaPa7u4ucJCQnNriU9PV3du3fXU089pYqKCj322GOaNm1avf+zmD59uioqKpSZmen2m2/v3r21du1aV90xMTE6fPiwSktLPfZx4MCBZtfbVNOnT1dYWJiWLFnS4Lg777xTISEh2rZtW8Ae98aqra3V008/LUm68cYbm/0agEBC3/Vd321p9HFP9HHfIgy3kssvv1zSL19vebQzzzxTt912m9u4d955x21MRUWFPvzwQ0VGRnr8SawpwsLCdOutt2rfvn167LHHtHjxYt1yyy1ex86dO1dbtmzRsmXLFBER0eB+6/4MWfdnuzoFBQXavn17s+ttqr59++pPf/qT1q9fr5dfftnrmO3bt+u5557ThAkTdOqpp0oK3OPeGLNnz9bnn3+uyy+//JiXKgKCCX03MNHHPdHHfczqVcuB4HjOau7SpYt5++23TXFxsfnxxx/NDTfcYOLj483333/vNq7ubNji4mK3s2GP/jaeuhMAysvL3bbfddddRpLZuHGjRy3FxcUmNjbWOBwOc9VVV3mt95VXXnEt1K/vlpOT4xr/7bffmri4OLezmrds2WJGjx5tOnfu7NNvoDPGmLvvvts4nU5z1113me3bt5uKigqze/du8+KLL5ouXbqYoUOHmtLSUtf4QD3uxnieeFFTU2P27t1rli5dakaMGGEkmalTp5qysrImH0djOPEC/oG+67u+eySrvoHOGPo4fdwyXE2iMZo7qQoKCszMmTPNSSedZJxOp+nSpYu54oorzI4dOxocFxsba0aPHm0+/PBD15icnByPN9ecOXOMMcZj+5gxYzxqueOOO4wks2nTJq+1jhkzpslv5u3bt5vLLrvMtGvXznVpmrffftukpKS4HnPttdc26Zg1t4kaY8znn39urrzyStO9e3fjdDpNTEyMGTx4sHniiSdMRUWFx/hAPO5RUVEe9zscDhMbG2v69etnbrjhBrNhw4ZmHb86NFH4A/qu7/ru8uXL633+oy9P1hj0cfp4gMl0GGOM0KC6P1HUXUAbrcfhcCgj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w8eVNU5ISIjuvvtu3XDDDXrggQe0dOlSjzGFhYV69tln9fjjj2vKlCm+L7IeF1xwgSRpy5YtKiwsVPv27X36/ME05x5++GF9+umneuutt7R48WJNnDixpcpFkAqm+d8cL730kiIjI1v1OZqCXt58wTSXW6uX88kwmuXQoUMqLy/XGWec4bdBuM4111yjxMREvfXWW9q8edD4tM8AACAASURBVLPH/U8++aR+85vfqFevXhZUV78jf+v192PsC8cz5xwOh2666SZJ0jPPPNMa5QGtytc915+CcB16eXDwx15+3GF46dKlboudv//+e6WnpysmJkYdO3bUlVdeqYMHD2rXrl265JJLFBMToy5dumjatGkqKSlx21d1dbUyMjJ04YUXKiEhQZGRkerXr5+eeOIJt4/3hw4d6vackydPliSNHDnSbXthYWGjXsPRC8/XrVunlJQUxcTEqG3btrrgggu0evVqj8ft379fs2bNUq9evRQeHq4OHTro4osv1scff3xcY491jA8fPux1+65du5Senq727durY8eOGjt2rNffBrdt26bLLrtMsbGxatu2rX7961/r7bffdjt+1113XYM1ZWVlSZLmzJnT4P6joqI0bNgwrVq16pivs7VERETojjvukDFGf/3rX93uKy0t1d///nfdc8899T7eqnn5ySefSJJOP/10xcbGSmLOSd7nXGMMHTpUkrR27VpVVVU1ax/+gJ7L/G9o//7Qc1sLvTz453JjtEovb8IC4walpqYaSWbcuHFm/fr1prS01PzjH/9wLXhPTU01GzduNCUlJWbBggVGkrntttvc9rF8+XIjyTz44IPmwIEDJj8/3zz55JMmJCTE3H777W5jv/zySxMVFWWSkpJMaWmpMcaYw4cPm3POOce8/vrrTa7fmF8WnkdFRZnk5GSzZs0aU1paatatW2f69+9vwsPDzSeffOIa+/PPP5uTTjrJxMfHm+XLl5uioiKzfft2M27cOONwOMwLL7zQrLF1dRy9AP7IY1xeXu51e2pqqqvuFStWmMjISDNo0CC3sTt37jTt27c3iYmJ5j//+Y8pKSkxX3/9tRk5cqTp1KlTo062yMvLM/Hx8ea6667zuM/b/jdv3mxGjRplTjzxRJ+fQBcVFWWMMaasrMzEx8ebkJAQs3XrVteYhx9+2EyYMMEYY0x2drbXky5ac156O+miqKjI60kXzDnvc66+43i08vJy10k4e/bsOeZzHqk586+190/PZf7Xt/+W6LlHSkxMtPwEOnp58M/l+o7j0Zrbyxs6ga7Fw/A777zjtv300083ksynn37qtv2kk04yp5xyitu25cuXm/PPP99j35MnTzZOp9MUFRW5V5+Z6fqfQW1trbn66qvNPffc0+Ta6yQlJRlJZuPGjW7bN2/ebCSZpKQk17YpU6YYSR5visOHD5uuXbuayMhIk5eX1+SxdXU0ZzIvX77cbfv48eONJJOfn+/alpaWZiSZJUuWuI3dt2+fadu27TEnc0FBgRkwYIBJT0831dXVHvfXt/+ffvrJREREWBaGjTHmkUceMZLM5MmTjTHGHDp0yMTHx5tNmzYZYxpuoK01L488S7ru5nA4TMeOHc2ll15qPv/8c9dY5pz3OWdM4xpoWVlZUIZheq69539r9dwj+VMYNoZeXt9YYwJ7LhvTur3cp2F47969btsvvPBCI8njMhhDhw41MTExjdr3vHnzjCSzZs0aj/vmzJljJJkhQ4aYsWPHmpqamibXXqfuUwpvunbt6nbgY2NjjSRTXFzsMfbKK680kszChQubPLaujuZM5iPfEMYYc9tttxlJrgZhjDExMTFGkikpKfHY/1lnndXgZC4tLTUDBw40v/vd7+qdyA3tv1+/fpaG4ZKSEtOxY0cTGhpqdu7caR5//HG3N1x9DbQ+LTEvG/PGr8Oc8z7njGnccczNzTWSjNPpNJWVlfWO88afwzA9197zv7V67pH8LQzTy72PNSaw57IxrdvLfXpptXbt2rn9HBISotDQULVt29Zte2hoqMdlPoqKinTfffepX79+6tChg2v9yR133CFJKisr83i++++/X+ecc47WrFmjtLQ0hYQc30uq7yzPzp07S5L27duniooKFRUVqU2bNl4vORMfHy9JysvLa9LY41W3FqlOeHi4JLmOc0VFhUpKStSmTRtFR0d7PL5Dhw717ru6ulppaWlKTEzUwoULFRoa6jHmWPuvO4ZWiY6O1syZM1VTU6M//elPevTRR/XHP/7xmI/zh3nJnPM+55qibg1lcnKynE7nce3Ln9Bz7Tv//b3nthZ6uefY42X1XG6K1ujlfnU1iUsuuUT333+/pk2bph07dqi2tlbGGM2fP1+SvF5T7pNPPlFRUZH69eunGTNmNPobeuqzf/9+r8+zb98+Sb80l4iICMXGxurw4cMeJ6RI0t69eyVJCQkJTRrb2iIiIhQTE6PDhw+rtLTU4/661+jN9OnTVVFRoczMTLdvIurdu7fWrl3bqP0fOHCgBV7F8bn55psVGxur1157TUlJSTr77LOP+Rh/mJfMOe9zrrFqa2v19NNPS5JuvPHGJj02mPnD3KbnehcsPbe10MuDay43Vmv1cr8JwzU1NVq9erUSEhJ0yy23qFOnTq5LbpSXl3t9zH//+19de+21+te//qW33npLkZGRSk1NVX5+frPrOHz4sMfXJn711Vfas2ePkpKS1KVLF0nS5ZdfLkl655133MZWVFToww8/VGRkpEaPHt3ksa3t4osvliS9//77btvz8vK0Y8cOr4+ZO3eutmzZomXLlikiIqJZ+y8oKND27dubW3aLiY2N1axZsxQbG9uoTxL8ZV5KzLnjMXv2bH3++ee6/PLLlZaWdtz7Cwb+MrfpuZ6Cqee2Fnp58M3lxmi1Xt6ENRUNqm89yujRo72uNRo+fLjHWrERI0YYSeb//b//Z/Lz801ZWZn56KOPTI8ePYwkt68yLCkpMf379zfLli1zbfvkk0+M0+k05513XpPXBBrzy1qb2NhYk5KS0uQzm4uLi93O8Hz++eebNbaujuas+Tl6+1133eVxcsq3335r4uLi3M4G/eqrr8xFF11kevbs6bHm55VXXvE4KeDoW05OToP737Jlixk9erTp3LmzpWuGj6W+dWatOS+bss6MOed9znk7jjU1NWbv3r1m6dKlrn+/qVOnmrKysmMeZ2+aM/9ae//0XOZ/fftviZ57JH9bM3ws9PLAnMvejmNL9vJWPYEuJyfH48XNmTPHrFu3zmP7Qw895JqkR97+9Kc/GWOMyc/PN9OnTzfdu3c3TqfTxMfHmylTppi7777bNXbgwIHmxhtvdHv8V199ZfLz8z32e//99zfpQNVNoq1bt5rRo0ebmJgYExkZaYYPH25WrVrlMb6goMDMnDnTnHTSScbpdJrY2FgzevRo8+GHHzZrbN0i/qOP5ZtvvumxfdKkSfUee2OMx/Yjv5N8+/bt5rLLLjPt2rUzbdu2NUOGDDGffvqpOf/8803btm3d6h4zZkyTJ/OR+6+7PMvbb79tUlJSXI+59tprm/Rv09SwEBUV5Vbj6NGjj7n/o29///vfjTGtNy+PrlGSx9n+R2POec45b8fR4XCY2NhY069fP3PDDTeYDRs2NHhcj6Wp868190/PZf77oufWXYbM2+3oy3k1VnPCML3cPnO5tXt5Q2HY8b8X7pKZman09PQW/c7nQDFgwAAVFBRo9+7dVpdiiVNPPVXl5eX6/vvvrS7Fg8PhUEZGhiZMmGB1KWhB/jznjtTa88+u85ueGxjzv6XYOV8Eu0CYyw3Mvyy/WTMM38jLy1NcXJzHt7bs2rVLubm5GjFihEWVIVgx52BnzH8Ei2Cey4RhGzp48KCmT5+uH3/8UWVlZfr888+Vnp6udu3a6d5777W6PAQh5hzsjPmPYBGscznow/CR371d3y06OloOh0ObNm3STz/9JIfD0aizUwNRQkKCPvjgAxUWFuq8885Thw4ddOmll6pPnz76/PPPdfLJJ1tdIoIMc85e6Lnu/Gn+N+bfZu7cuT6rB4HFn+ZySws79pDAxtokTykpKUpJSbG6DNgIc84+6Lme/GX+82+D4+Uvc7mlBf0nwwAAAEB9CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2wuq7w+Fw+LIO4JjS09OVnp5udRlAq2B+wy7IF/A3HmF4yJAhysjIsKIWoFXk5uZqzpw5mj59ui644AKry0GAGjJkSKvtm54Lf/H5559r/vz5euaZZ9ShQwerywF8wmGMMVYXAbS2e+65R/Pnz9fKlSs1aNAgq8sBAL80atQohYWF6d1337W6FMBXsgjDsIXa2lqNHTtWX3/9tTZs2KBOnTpZXRIA+JXc3Fz17dtXb775pi699FKrywF8JYsT6GALISEh+uc//ymn06krrrhC1dXVVpcEAH5lwYIFSkxM1JgxY6wuBfApwjBsIy4uTm+88YbWrl2rOXPmWF0OAPiNiooKLVy4UNOmTVNoaKjV5QA+RRiGrSQlJen555/XvHnzlJmZaXU5AOAXsrKydPDgQU2dOtXqUgCfY80wbOnGG2/UP/7xD61du1ann3661eUAgKXOPfdcde3aVVlZWVaXAvgaJ9DBnqqqqpSSkqK8vDytW7dOsbGxVpcEAJbYvHmzkpKS9MEHHyglJcXqcgBf4wQ62JPT6VRmZqYOHTqkK6+8UvxOCMCuFixYoN69e2vEiBFWlwJYgjAM20pISNCSJUv073//Ww8++KDV5QCAz5WWlmrRokW64YYb+GY42BZhGLaWnJysefPm6b777tN7771ndTkA4FOLFi1SVVWVrr76aqtLASzDmmFA0jXXXKNly5Zp3bp16tWrl9XlAIBPDBw4UP369dOrr75qdSmAVTiBDpCkw4cPa+jQoaqqqlJOTo7atm1rdUkA0KrWrl2r5ORk5eTkaPDgwVaXA1iFE+gASWrTpo3+9a9/ac+ePZo2bZrV5QBAq3v22WfVv39/gjBsjzAM/E/Pnj31+uuvKyMjQ3//+9+tLgcAWk1hYaGWLFmiGTNmWF0KYDnCMHCEkSNHau7cufrDH/6glStXWl0OALSKl19+WaGhoZo4caLVpQCWY80wcBRjjNLS0rRq1Spt2LBBiYmJVpcEAC3GGKNTTz1VI0eO1NNPP211OYDVWDMMHM3hcOiVV15Rx44dNX78eFVWVlpdEgC0mI8++kg7duzQddddZ3UpgF8gDANexMTE6I033tDWrVs1a9Ysq8sBgBazYMECnXvuuTrzzDOtLgXwC4RhoB6nnHKKFi5cqGeeeUYvv/yy1eUAwHHLy8vTsmXLdP3111tdCuA3CMNAAy677DLdfvvtuvHGG7V+/XqrywGA4/LCCy+oXbt2Gj9+vNWlAH6DE+iAY6ipqdGYMWP0zTffaMOGDTrhhBOsLgkAmqympka9evVSWlqa5s2bZ3U5gL/gBDrgWEJDQ/Xaa68pNDRUV1xxhWpqaqwuCQCa7J133tEPP/zAFwsBRyEMA40QFxenN954Q2vWrNF9991ndTkA0GQLFizQyJEj1bdvX6tLAfwKYRhopAEDBui5557TQw89pCVLllhdDgA02vfff6///Oc/uuGGG6wuBfA7YVYXAASSK6+8UqtXr9Y111yj0047TaeddprVJQHAMS1YsECdO3fW2LFjrS4F8DucQAc0UVVVlUaMGKH8/Hx99tlnio2NtbokAKhXZWWlevTooeuvv15z5861uhzA33ACHdBUTqdTmZmZKi4u1tVXXy1+nwTgz/71r3+poKBAU6dOtboUwC8RhoFm6NKli5YsWaL33ntPjzzyiNXlAEC9FixYoEsuuUQ9evSwuhTALxGGgWYaMmSIHn74Yc2ZM0fvv/++1eUAgIdvvvlG2dnZfOMc0ADWDAPHacqUKVq+fLnWrVunk08+2epyAMDllltu0TvvvKOdO3cqJITPvwAvWDMMHK9nn31WPXv21Lhx41RWVmZ1OQAgSSorK9M///lPXX/99QRhoAG8O4DjFBkZqTfeeEO7d+/W9OnTrS4HACRJr732mg4dOqSrr77a6lIAv0YYBlrAiSeeqNdee02vv/66nnnmGavLAWAj1dXVXrc/99xzSktLU+fOnX1cERBYCMNACxk1apT++Mc/aubMmcrOzva4v7a2Vl988YUFlQEIZm+99ZbOPvtsvfTSS66lWuvWrdP69es5cQ5oBE6gA1qQMUa//e1vlZOTow0bNqhr166SpAMHDmjixIn6/vvvtW3bNourBBBMFi5cqGuuuUYOh0Nt27bV1KlTtXv3bm3btk1ff/21HA6H1SUC/owT6ICW5HA4tHDhQrVv315paWmqrKzUpk2bNGDAAH344Yfavn27vvrqK6vLBBBESkpKFBYWptraWpWWlmrBggV64403dPjwYb3wwgsqLy+3ukTArxGGgRYWExOjzMxMbdq0SZdffrnOOecc/fzzz6qpqVF4eLgyMjKsLhFAECkpKXG7WkRlZaUkadeuXbr++uvVtWtXzZ49W//973+tKhHwa4RhoBX86le/0ujRo/Xuu++qsrLSdYJLZWWlFi5cyFc4A2gxJSUlXrfX1tbKGKPCwkI9/PDDuv7661VbW+vj6gD/RxgGWlh+fr5SUlK0bNkySfIIvrt379b69eutKA1AECouLm4w5IaFhemUU05RRkYG1xsGvOBdAbSgNWvW6PTTT1dOTo5qamq8jgkPD9fixYt9XBmAYFVSUlJvGA4LC1NcXJxWrFih9u3b+7gyIDAQhoEWUnfFiPz8fFVVVdU7rrKyUosWLeLPlQBaRHFxsddfvkNCQhQREaEVK1aoe/fuFlQGBAbCMNBC4uLitHnzZt18881yOBwKCwurd+zevXu1evVqH1YHIFgVFhZ6bHM4HAoJCdGyZcvUv39/C6oCAgdhGGhBsbGxevLJJ5Wdna2TTz5ZoaGhXsc5nU6uKgGgRRQVFXnd/sorryglJcXH1QCBhzAMtIJzzz1XX3/9tf7617/K6XTK6XS63V9VVaVFixbV+zWqANBYxcXFbj87HA499thjmjx5skUVAYGFMAy0EqfTqbvuuktbtmzR4MGDPc7iLiws1Mcff2xRdQCCRWlpqeu/Q0JCNHPmTN12220WVgQEFsIw0Mr69OmjTz/9VK+88oratWvn+pTY6XRyVQkAx+3QoUOSfrlyxGWXXaZHH33U4oqAwOIwXP0f8Jk9e/bohhtu0FtvvSWHw6Ho6GgVFBQoPDzc6tIABKiwsDDV1NQoOTlZH330kdq0aWN1SUAgyar/dHegBeXk5Ojxxx+3ugy/EB4eriFDhmjDhg0qKSnRiBEj1KVLF6vLQgOSk5M1a9Ysq8vwGd6vgaOmpkY1NTWKjo5Wp06ddOWVV1pdUtDKysqyugS0EpZJwCd+/PFHLVmyxOoy/EbXrl110UUXqVevXvrxxx+b/Pjdu3dzPH1k7dq1ysnJsboMn+L9GhiWLFmiH374QW3atNF5553HX5haCf02+PHJMHyK36w9bd68ucnXAc3MzFR6ejrH0wfS0tKsLsEyzC//5nA4NG3aNJ1zzjkaMGCA1eUErbp+i+DFJ8OAxbggPoDm6tChA0EYOE6EYQAAANgWYRgAAAC2RRgGAACAbRGGAQAAYFuEYQAAANgWYRgAAAC2RRgGAACAbRGGAQAAYFuEYQAAANgWYRgAAAC2RRgGAACAbRGGAQAAYFuEYfi977//Xtdcc4169Oih8PBwORwO1+2BBx6wuryAER0d7XbsGrq9+OKLevTRR10/d+vWzeryESB4vzbs3XffVd++fRUWFubz56YHAN4RhuHX8vPzNXjwYH3xxRfKzMxUYWGhjDHKycmxurSAU1paqo0bN0qSUlNTZYzxehs+fLgk6fbbb5cxRklJSVaWjQDC+7V+ubm5uvTSSzV79mzt3bvXkhroAYB3hGH4tRdffFF5eXmaP3++Bg8erLZt27bYvqOjozV06NBm34/G41jbA+/X+t17770aMmSINmzYoJiYGKvL8blA//dDcPP932mAJvjqq68kSf369bO4Evv45JNPrC4BAYr3a/1eeuklRUZGWl1Go9ADYDd8Mgy/VlZWJkm2/CTF12666SbNnDnT6jIQwHi/1i8QgjA9AHZFGIZfWrp0qRwOh5YtWybpl/+ROByOBv+MVl1drYyMDF144YVKSEhQZGSk+vXrpyeeeEK1tbWucXUnhRw6dEirV692nSBSd0LLse6vk5+fr1tuuUUnnniiwsPD1alTJ40bN05ffvmlx+uou+3atUvp6elq3769OnbsqLFjxyo3N7clD51PcKxxJN6v9sO/H4KKAXwgIyPDNGe6paamGkmmvLzcbXtOTo6RZO6//37XtuXLlxtJ5sEHHzQHDhww+fn55sknnzQhISHm9ttv99h3VFSUOffcc+t97obu37Nnj+nZs6eJj48377zzjikpKTFff/21GT58uGnTpo1Zs2aN19eRmppq1qxZY0pLS82KFStMZGSkGTRoUFMOiTGm+cdz48aNRlK9t1tvvdXjMUlJSSYxMdFtm52O9fjx48348eOb/LhAxvu1ZefQ0RITE01oaOhx70eSycjIaNJj6AG+67cIGJl8Moygcv7552v27Nnq0KGDTjjhBN1888363e9+pyeeeELFxcUt9jyzZ8/W999/r8cff1y/+c1vFB0drdNPP12LFy+WMUY333yz18ddd911Sk5OVlRUlEaOHKkxY8Zo3bp1KigoaLHaGsPbmeQ33nhjk/bBscbxYg5Zhx4A/B/CMILG2LFj9fHHH3tsT0pKUlVVlbZs2dJiz7V06VKFhIRo7NixbtsTEhJ0+umna8OGDdq9e7fH4wYNGuT2c/fu3SVJe/bsabHafIFjjePFHAps/PshmHA1CQSNoqIiPfbYY3rzzTe1e/duFRYWut1fd3LP8aqoqFBRUZEkKTY2tt5xO3fu9LhQ/dHjw8PDJcltjZ1VnnrqqUaP5VjjeDGH/A89AHbFJ8MIGpdcconuv/9+TZs2TTt27FBtba2MMZo/f74kyRjjNt7hcDS4v/ruj4iIUPv27RUWFqaqqqp6L1x/wQUXtMwL80Mcaxwv5lBg498PwYQwjKBQU1Oj1atXKyEhQbfccos6derkaq7l5eVeH9O2bVtVVla6fj7llFP0/PPPN+r+cePGqbq6WqtXr/bY7yOPPKIePXqourq6RV6bv+FY43gxhwIb/34INoRhBIXQ0FCdf/75ysvL07x581RQUKDy8nJ9/PHHWrBggdfHnHXWWdqxY4d+/PFH5eTk6LvvvtOwYcMadf9DDz2kXr16aerUqXrvvfdUVFSkAwcO6LnnntNf/vIXPfroox6XBgoWHGscL+ZQYOPfD0Gnda5SAbhr6qVp3nzzTY9L/kyaNMkYY0yvXr087vvxxx9Nfn6+mT59uunevbtxOp0mPj7eTJkyxdx9992ucQMHDnQ9x7Zt28ywYcNMVFSU6d69u3n66afdajjW/fv37zezZs0yJ598snE6naZTp05m1KhRZsWKFa4xdZeUOvI2Z84cY4zx2D5mzJhWO57G/HLpoqOfMz4+vt7x8+bNq7d2Ox1rLq12bLxfj63uUmTebi+88EKT9lVHTby0Gj3Ad/0WASXTYcxRC3uAVpCZman09HSPdWRoHo6n76SlpUmSsrKyLK7Ed5hfgcHhcCgjI0MTJkywupSgxvsh6GWxTAIAAAC2RRgGAACAbRGGAQBoBofDcczb3LlzrS4TwDFw+iUAAM3AGlIgOPDJMAAAAGyLMAwAAADbIgwDAADAtgjDAAAAsC3CMAAAAGyLMAwAAADbIgwDAADAtgjDAAAAsC3CMAAAAGyLMAwAAADbIgwDAADAtgjDAAAAsC3CMAAAAGwrzOoCYC9paWlWlxAUdu/eLYnj6Qtr167V4MGDrS7DEswv/zd//nxlZWVZXUZQq+u3CF6hc+fOnWt1EQh+xcXFKioqsrqMoNGuXTuddtppbtv27dun9evX68QTT7SmqCDVrVs3JScnKzk52epSfIb3q+99+umnatOmjaKjoxv9mNNOO03t2rVrxaog/V+/nTBhgtWloHVsdRhjjNVVADh+b7/9ti655BKVlZUpMjLS6nIANFJubq569+6tVatW6dxzz7W6HMBuslgzDASJuLg4SdKBAwcsrgRAU6xcuVJt2rTRwIEDrS4FsCXCMBAkCMNAYMrOztY555yjNm3aWF0KYEuEYSBIEIaBwJSdna1hw4ZZXQZgW4RhIEjExcXJ4XBo//79VpcCoJHy8vL07bffEoYBCxGGgSARFhammJgYPhkGAsjKlSsVFhZmq6uVAP6GMAwEkbi4OMIwEECys7M1YMAAxcTEWF0KYFuEYSCIxMXF6eDBg1aXAaCRWC8MWI8wDAQRPhkGAkdRUZG+/vprwjBgMcIwEEQIw0DgWLVqlWpra/miDcBihGEgiBCGgcCRnZ2tU089VZ07d7a6FMDWCMNAECEMA4EjOztb5513ntVlALZHGAaCSIcOHQjDQAAoLy/X+vXrWS8M+AHCMBBE+GQYCAyfffaZKisrCcOAHyAMA0EkLi5OpaWlqqystLoUAA1YuXKlunfvrh49elhdCmB7hGEgiMTFxUkSnw4Dfi47O1vDhw+3ugwAIgwDQYUwDPi/6upqffbZZyyRAPwEYRgIIoRhwP998cUXKikpIQwDfoIwDASRjh07SiIMA/4sOztbJ5xwgk499VSrSwEgwjAQVCIiItS2bVvCMODHsrOzNWzYMDkcDqtLASDCMBB0uLwa4L+MMVqzZg1LJAA/QhgGgkxcXJwOHjxodRkAvNi6davy8/MJw4AfIQwDQYZPhgH/lZ2drejoaA0YMMDqUgD8D2EYCDKEYcB/ZWdna8iQIQoLC7O6FAD/QxgGggxhGPBfq1atYokE4GcIw0CQ6dixI2EY8EO7du3SDz/8oPPOO8/qUgAcgTAMBJkOHToQhgE/lJ2drYiICA0aNMjqUgAcgTAMBBmWSQD+KTs7W4MGDVJkZKTVpQA4AmEYfW4OMAAAIABJREFUCDJxcXEqKipSdXW11aUAOMLKlStZLwz4IcIwEGTi4uJkjFFhYaHVpQD4n/z8fO3YsYMwDPghwjAQZOLi4iSJpRKAH1m5cqUcDoeSk5OtLgXAUQjDQJAhDAP+Jzs7W0lJSWrfvr3VpQA4CmEYCDKEYcD/ZGdns0QC8FOEYSDIREVFKSIiwiMMG2NUWVlpUVWAPZSXl+uBBx7QypUrdfjwYUlScXGxNm3aRBgG/JTDGGOsLgJA82VnZ+u///2vDhw44Lr985//VLdu3RQWFqYDBw6osLBQJSUl2rhxowYMGGB1yUDQMsaoTZs2qqyslNPp1FlnnaUTTzxRGRkZ2r59u/r27Wt1iQDcZRGGgQB333336f7775fT6VRISIiMMaqurlZtba3buLi4OBUUFMjhcFhUKWAPXbt21c8//+z62el0qqqqSiEhIerbt69GjRqlYcOGaejQoUpISLCwUgCSslgmAQS4G264QWFhYaqqqlJFRYUqKys9gnBYWJguvvhigjDgA4mJiW4/V1VVSZJqa2u1bds2PfPMM0pLS9OLL75oRXkAjkIYBgJcly5dNH78eDmdznrH1NbWatSoUT6sCrCvnj17HvMXz1/96le66667fFQRgIYQhoEg8Ic//MH16ZM3xhiNHDnShxUB9tWtW7cGfzmtqanRSy+91OAYAL5DGAaCwNlnn62zzjpLoaGhXu/v27evunbt6uOqAHvq0qVLvZ8Mh4WF6bbbbuPLNwA/QhgGgsSsWbM81gpLUnh4uMaOHWtBRYA9de3a1etfakJCQhQfH68///nPFlQFoD6EYSBITJgwQZ06dfLYXllZqQsvvNCCigB76tq1q9dfTGtra/Xyyy8rOjragqoA1IcwDAQJp9OpG2+8UWFhYR7budg/4DveliQ5nU5dddVVnMgK+CGuMwwEkfz8fCUmJrr+ROtwOHT++efro48+srgywD6Ki4sVGxvr+tnhcCg2NlY7d+7UCSecYGFlALzgOsNAMOnUqZMmTpzoOku97vrCAHynXbt2ioyMdP1sjNFzzz1HEAb8FGEYCDIzZ850fTJcVVXFn2UBC3Tu3FnSL8sjLrroIk2YMMHiigDUhzAMBJkzzzxT55xzjqRfvoK5f//+FlcE2E+3bt0k/XI1F75pDvBvYcceAlhn9+7dWrNmjdVlBJzk5GR99tlnOu2005SVlWV1OQEvUD/Vy8zMtLoE25s4caJWr15tdRlBY8iQIa5fNICWwgl08GuZmZlKT0+3ugzYXKC2yWN9JTAQaDIyMgL2l1P4LU6gQ2AwxnBr4u2MM87Q2LFjLa8jkG8ZGRlWT/3jlpGRYflxtOPtqaee0tatW93mkdU1BfoNaC0skwCCVJ8+fer9emYArWvatGkKDw+3ugwAjcAnw0CQIggD1iEIA4GDMAwAAADbIgwDAADAtgjDAAAAsC3CMAAAAGyLMAz8//buPDqqMkH/+HOzJwQqBCFBBAEdBFzoFmgFQZbINoAJMQvIjspqI9JutK1Ng6PC2Nh6BBWXoW1QKsEhAgEEhHYhIBpBWjARcegxBjCABEIgZnl/f/ijxrICnYQkN8n9fs6pc8xbbxVPVd0bHi/vvQUAAByLMgwAAADHogwDAADAsSjDAAAAcCzKMAAAAByLMgwAAADHogwDAADAsSjDcISVK1fKsixZlqWQkBC749RZ4eHhnvfp/M3Pz09NmzZVly5dNH36dGVmZtodE7XIyfvO+vXr1aFDBwUEBNT6n82+CNQeyjAcYeTIkTLGKCYmxu4odVpBQYF2794tSYqNjZUxRsXFxcrKytK8efOUlZWlbt26aeLEiSosLLQ5LWqDE/edgwcP6vbbb9ecOXN09OhRWzKwLwK1hzIM4KL8/f0VFRWl2NhYbd26VQ899JCWLVumUaNGyRhjdzyg2j322GPq2bOnMjMz1bhxY7vjeLAvAjWDMgygUp5++mnddNNNWrNmjVauXGl3HKDavfbaa3rkkUdsWR5RGeyLQPWgDAOoFMuydO+990qSlixZYnMaoPqFhobaHaFC2BeB6kEZRoOUlZWluLg4uVwuNWrUSL1799ZHH310wfl5eXmaOXOm2rZtq6CgIDVv3lzx8fHas2ePZ05aWprXySyHDh1ScnKyIiIi1KxZMw0bNkwHDx70et6ioiI9/vjj6tixo8LCwhQZGanhw4drzZo1Ki0trXSGuqJXr16SpJ07d6q4uNgzzvtY/7Hv1C/si0A1MEAd5na7TWU30wMHDpiIiAjTqlUrs2nTJnP69Gmzd+9eM3DgQNO2bVsTHBzsNT83N9dceeWVJioqyqSnp5vTp0+bL774wvTp08eEhISYjIwMr/mxsbFGkomNjTUZGRmmoKDAbN682YSGhpru3bt7zb377ruNy+UymzZtMoWFhebIkSPmgQceMJLMtm3bqpyhIhISEkxCQkKlH7d7927P67uQs2fPGklGksnNza3Sa6gP72NVtr+6RJJxu90Vns++46tVq1bG39//kp6jqtsR+6K3ym7PQAWl1N/f8nCEqvwlkpiYaCSZVatWeY1/9913Jjg42Ocv9PHjxxtJZsWKFV7jhw8fNsHBwaZr165e4+f/4li7dq3XeEJCgpFk8vLyPGPt2rUzPXv29MnYoUMHr784KpuhImqyDBcWFvr8BdwQ30enlWH2HV91vQw7ZV80hjKMGpPCMgk0OBs3bpQkDRo0yGv88ssvV4cOHXzmp6Wlyc/PT8OGDfMaj46O1rXXXqvMzEzl5OT4PK579+5eP7du3VqSlJub6xkbPHiwMjIyNHnyZO3cudPzz4jZ2dnq27fvJWewy+HDhyVJgYGBuuyyyyTxPjYE7Dv1D/sicOkow2hQioqKdPr0aYWEhCg8PNzn/hYtWvjMz8/PV1lZmVwul89F7j/77DNJ0oEDB3yey+Vyef0cFBQkSSorK/OMLV68WG+88Ya++eYbxcTEqEmTJho8eLBWr15dLRnscn4NaY8ePRQYGMj72ACw79RP7IvApaMMo0EJDg5W48aNde7cORUUFPjcf+LECZ/5ERERCggIUHFxsYwx5d769etXpTyWZWns2LHasmWLTp48qbS0NBljFB8fr0WLFtVKhupWVlamxYsXS5JmzJghifexIWDfqX/YF4HqQRlGgzNkyBBJ//dPvucdO3ZM2dnZPvPj4+NVUlKi7du3+9y3YMECtWnTRiUlJVXKEhERoaysLEk//TPmgAEDPGdwp6en10qG6jZnzhzt2rVLI0aMUGJiomec97H+Y9+pX9gXgWpSvWuQgepVlRNPvv76axMZGel1Rvy+ffvMoEGDTIsWLXxOAjp69Ki56qqrTPv27c369evNyZMnzfHjx81LL71kwsLCfE7YOH+yydmzZ73GH374YSPJ7N692zPmcrlMnz59zOeff27OnTtnjh49aubOnWskmSeeeKLKGSqiuk6gKy0tNUePHjVpaWmmf//+RpKZNGmSKSws9HpcQ3wfnXYCHfuOr7p0Ap2T90VjOIEONYarSaBuq+pfItnZ2SYuLs40adLEc3mgdevWmZiYGM+Z13fddZdn/vHjx83s2bNN+/btTWBgoGnevLkZOHCg2bx5s2fOjh07PI89f3v00UeNMcZnfOjQocYYY/bs2WOmTJliOnXqZMLCwkxkZKS5+eabzSuvvGLKysq8MlckQ2VUpQw3atTI57VYlmVcLpe5/vrrzbRp00xmZuYFH9/Q3kenlWFj2HeMMWbt2rU+uc7fXnnllUo/X1W2I/ZFX5Rh1JAUyxi+0Bx1V0pKipKTk8VmWnnn/9k0NTXV5iT1V33f/izLktvtVlJSkt1RHK2+b0d1Bdszakgqa4YBAADgWJRhAAAAOBZlGADQ4P3yWrfl3ebOnWt3TAA2CLA7AAAANY31ugAuhCPDAAAAcCzKMAAAAByLMgwAAADHogwDAADAsSjDAAAAcCzKMAAAAByLMgwAAADHogwDAADAsSjDAAAAcCzKMAAAAByLMgwAAADHogwDAADAsSjDAAAAcKwAuwMAFZGSkmJ3hHonJydHEu/dpdixY4fdES5ZQ3gN9d35z4B9EaibLGOMsTsEcCEpKSlKTk62OwYcrr7+mrQsy+4IQLVyu91KSkqyOwYallTKMIAq27NnjwYMGKDrrrtOa9euVXh4uN2R4EBFRUW67777tHTpUs2ZM0f/8R//YXckAPUHZRjApfnyyy8VExOj9u3ba/369WrSpIndkeAg3333nRISErRv3z69/vrrSkhIsDsSgPollRPoAFySTp06adu2bTp06JD69++v48eP2x0JDvHhhx+qW7duOnHihHbs2EERBlAllGEAl+yaa67Rhx9+qBMnTmjAgAE6duyY3ZHQwC1dulQxMTHq3r27du3apWuvvdbuSADqKcowgGrRrl07bdu2TadOndKtt96qw4cP2x0JDdC5c+c0ceJETZ8+Xb///e+VlpYml8tldywA9RhrhgFUq2+//VYxMTHy8/PTe++9p1atWtkdCQ3E119/rfj4eOXm5urNN9/UwIED7Y4EoP5jzTCA6tW6dWt98MEHCggIUL9+/TzXOwYuxfr16/Wb3/xG/v7++uSTTyjCAKoNZRhAtYuOjtbWrVsVEhKiXr166ZtvvrE7EuopY4wWLFig4cOHa+jQodq+fbvatWtndywADQhlGECNaNGihd5//321aNFC/fr109dff213JNQzp06d0h133KE//OEPevLJJ/W3v/1NYWFhdscC0MCwZhhAjTp58qQGDx6sf/7zn9qyZQtn/aNCsrKyFB8fr/z8fKWmpqpnz552RwLQMLFmGEDNioiI0Lvvvqv27durf//++sc//mF3JNRxK1euVLdu3dSsWTN9+umnFGEANYoyDKDGuVwubdq0Sdddd5369OmjTz/91O5IqINKS0v1yCOP6M4779To0aP13nvvqWXLlnbHAtDAsUwCQK0pLCxUXFycPvnkE23cuFE33XST3ZFQRxw7dkyjRo3SRx99pCVLlmjixIl2RwLgDCyTAFB7wsLCtHbtWt16660aNGiQduzYYXck1AGfffaZunXrpq+++koffvghRRhAraIMA6hVwcHBSk1NVf/+/TVgwABt3brV7kiw0RtvvKFevXqpU6dO2r17t7p162Z3JAAOQxkGUOuCgoLkdrs1ZMgQDR8+XFu2bLE7EmpZUVGRJk+erAkTJmjmzJlat26dIiMj7Y4FwIFYMwzANqWlpZo0aZLcbrdSU1M1fPhwuyOhFuTk5CgxMVH79u3TsmXLFB8fb3ckAM6VGmB3AgDO5e/vr9dff13+/v5KSEiQ2+1WXFyc3bFQgz744AMlJSUpIiJCO3fuVOfOne2OBMDhWCYBwFb+/v567bXXNHnyZCUlJentt9+2OxJqyNKlS3Xbbbfppptu0scff0wRBlAnUIYB2M6yLD3//POaPn26kpOT9be//c3uSKhGBQUFSk5O1vTp0zV//nylpaXJ5XLZHQsAJEkskwBQJ1iWpb/85S8KDw/XxIkTVVpaqgkTJtgdC5fo66+/Vnx8vHJzc7VhwwYNGDDA7kgA4IUyDKBOeeKJJ+Tv769JkybpzJkzmjFjht2RUEXp6ekaM2aM2rVrp08//VRt27a1OxIA+KAMA6hz/vSnPyksLEy//e1vVVpaqpkzZ9odCZVgjNHChQv1+9//XqNHj9bLL7+s0NBQu2MBQLkowwDqpIcfflh+fn6aNWuWSkpKNHv2bLsjoQJOnTql8ePHa8OGDVq0aJHuu+8+uyMBwEVRhgHUWQ8++KDCw8M1Y8YMFRQU6PHHH7c7Ei5i7969io+P17lz57Rt2zb16NHD7kgA8C9RhgHUadOmTZO/v7+mTZumwsJCPf3003ZHQjneeust3XPPPbrxxhuVkpKi6OhouyMBQIVQhgHUeZMnT5a/v78mT54sY4wWLFhgdyT8fyUlJfrDH/6gBQsWaPLkyXrhhRcUGBhodywAqDDKMIB64a677lJYWJjGjRungoICvfDCC7Isy+5YjpaXl6eRI0cqIyND//Vf/8Wl8ADUS5RhAPXGqFGj5O/vrzFjxqi0tFRLliyRnx/fHWSHzMxM3XHHHQoMDNTHH3+sG264we5IAFAl/C0CoF5JSkrSf//3f2vZsmWaMmWKysrK7I7kOEuXLlXPnj3VuXNn7dq1iyIMoF6jDAOod4YNG6bVq1dr+fLlGjNmjEpKSuyO5AhFRUW65557NHXqVN1///1at26dmjZtancsALgkljHG2B0CAKri3Xff1YgRIzR8+HAtX76cE7dqUE5Oju644w5lZWVp2bJlGjFihN2RAKA6pHJkGEC9NWjQIG3cuFEbNmzQHXfcoaKiIrsjNUjvv/++unXrplOnTmnnzp0UYQANCmUYQL126623asOGDXr//fc9X/iA6mGM0XPPPafbbrtNffv21aeffqpOnTrZHQsAqhVlGEC9d8stt2jr1q3auXOn4uLidPbs2QvOZX1xxRQUFCg5OVm/+93v9MQTT+itt95So0aN7I4FANWONcMAGozdu3dr4MCB6ty5s9LT0xUeHu51//PPP6+8vDzNnz/fpoR1w/Hjx+Xn53fBk98OHDig+Ph4HTlyRG+99ZZuu+22Wk4IALUmlTIMoEHZv3+/YmJidPXVVys9PV1NmjSRJL344ouaMWOGQkND9e233yoyMtLmpPYZO3asjh07pvT0dJ/rNK9bt05jx45V+/bt9fbbb6tt27b2hASA2sEJdAAals6dO2vbtm365ptvFBMToxMnTui1117TjBkzZIzRjz/+qEWLFtkd0zabN2/W8uXL9e6772revHme8fNfcx0bG6vhw4fro48+oggDcASODANokLKzsxUTE6NmzZrpiy++8PpyjrCwMEceHT579qw6duyo7777TqWlpbIsS2+//bb69OmjO++8U3//+9/1/PPPa/LkyXZHBYDawpFhAA3TNddcozlz5vgUYUkqLi7WX/7yF5uS2eePf/yjcnNzVVpaKkmyLEujR49Wly5dtH//fn3wwQcUYQCOw5FhAA1SWlqaEhISVFZWpvJ+zTnt6PDevXt14403eorweYGBgQoPD1dmZqbatWtnUzoAsA1HhgE0PO+++66SkpJkjCm3CEs/HR1+7rnnajmZPUpLSzVu3DhZluVzX3FxsQoKCvTII4/YkAwA7EcZBtCgbNu2TbGxsSopKfFZHvFzxcXF+vOf/6wffvihFtPZ47nnntM//vGPC15jubi4WKtWrXL0iYUAnMt/7ty5c+0OAQDVpWXLloqOjtbevXt16tQp+fv7X/DosDFGAQEB6tevXy2nrD2HDh1SfHy8iouLLzrPGKMtW7aoT58+XEUCgJPs58gwgAYlJCREU6dO1f/8z//onXfeUZcuXSRJAQEBPnNLSkq0aNGiBn10ePLkyT7rhH8pKChIktS2bVvt27evNmIBQJ1BGQbQIPn5+Wn48OHKzMzUhx9+qNtuu02WZSkwMNBrXlFRUYNdO7xixQpt2bKl3KPC59+HqKgoTZ06VR9++KEOHjyoGTNm1HZMALAVV5MA4Biff/65/vM//1MrV66Un5+fpyQ2atRI33777QW/nrg+OnHihK6++mqdPHnSs0wkKChIP/74o1wul5KTkzV27Fjdcsst5Z5YBwAOwdUkADhHly5dtHz5cmVnZ2vSpEkKCgqSn5+fzpw50+CODt9///364YcfPF+37HK5NGHCBG3btk0nTpzQyy+/rF69elGEATgeR4aBKkhJSVFycrLdMQA0QAkJCUpNTbU7BuAUqb5nlACoMLfbbXcEVINz585p69atCg0NrdYrSyQnJ2vWrFnq0aNHtT3nv1JWVqbU1FS1b99ev/rVr3zWSKNue/bZZ+2OADgOR4aBKjh/ZJjdBxdjWZbcbreSkpLsjoJ6IjExUZI4MgzUHtYMAwAAwLkowwAAAHAsyjAAAAAcizIMAAAAx6IMAwAAwLEowwAAAHAsyjAAAAAcizIMAAAAx6IMAwAAwLEowwAAAHAsyjAAAAAcizIMAAAAx6IMAwAAwLEowwBQB33yySeaMGGC2rVrp9DQUEVGRuq6667THXfcoRdffFEHDx60OyIANAiUYQCoQ8rKyvTggw+qZ8+eatGihTZs2KCTJ0/qyy+/1LPPPqtTp05p+vTpuvrqq1VSUmJ3XACo9yjDAC5ZeHi4evXqZXeMf6k+5Hzsscf0zDPPaMmSJVq4cKE6duyo4OBgRUVFacCAAdq4caOGDBlid8xLVh8+C6n+5ARQdZRhAKgjsrKy9PTTT6tr16665557yp3j7++vxx57rJaTAUDDFWB3AADAT5YuXaqysjIlJiZedF6PHj1kjKmlVADQsHFkGKhFx48f1+zZs3XVVVcpODhYV1xxhW677TYtW7ZMZ8+eLXdeUFCQmjZtqiFDhmjbtm2eOWlpabIsy3M7dOiQkpOTFRERoWbNmmnYsGHlnmRVkQwlJSVyu90aMGCAoqOjFRoaquuvv17PPfecysrKPM/1zDPPyLIsnTlzRtu3b/dkCQjw/v/svLw8zZw5U23btlVQUJCaN2+u+Ph47dmz55Jejx05a9IHH3wgSbrhhhsq/Vi2GWduMwCqgQFQaW6321R29zl8+LBp166diY6ONmvXrjWnTp0yR44cMfPnzzeSzLPPPus1Lyoqyqxdu9bk5+eb7OxsEx8fbyzLMq+88orX88bGxhpJJjY21mRkZJiCggKzefNmExoaarp3716lDGvXrjWSzJNPPmlOnDhh8vLyzPPPP2/8/PzMAw884PPaGjVqZG655ZZyX3dubq658sorTVRUlElPTzenT582X3zxhenTp48JCQkxGRkZVX49duasCEnG7XZXeH7Lli2NJPPxxx9X6s9hm2k420xCQoJJSEio9OMAVFkKZRiogqqU4QkTJlywHA0ePNhTKs7Pe+utt7zmnDt3zlx++eUmNDTUHDlyxDN+vgisXbvWa35CQoKRZPLy8iqdYe3ataZv374+c8aMGWMCAwNNfn6+1/jFCsP48eONJLNixQqv8cOHD5vg4GDTtWtXr/HKvB47c1ZEVcvwrl27KvXnsM00nG2GMgzUuhSWSQC1ZPXq1ZJU7pUANmzYoFmzZnnNGzp0qNec4OBgxcTE6OzZs3r33Xd9nqN79+5eP7du3VqSlJubW+kMw4YN8/rn9fO6dOmi4uJi7du37wKv0ldaWpr8/Pw0bNgwr/Ho6Ghde+21yszMVE5OTpVeT13IWZ0uv/xySdKxY8cq9Ti2mYq/nrqQE0Ddwgl0QC0oKipSfn6+QkJC1Lhx4yrPi4qKkiQdOXLE5z6Xy+X1c1BQkCR51kFWNIMk5efn689//rNWr16tnJwcnTx50uv+wsLCiz7+l6+nvHw/d+DAAV1xxRWVej11JWd16tOnjzIzM7V3794KXz6Nbabir6eu5ARQt3BkGKgFwcHBcrlcOnfunE6fPl3leUePHpX005GnmsogScOHD9f8+fN1zz336KuvvlJZWZmMMXr22WclyedKBpZlXfDPjIiIUEBAgIqLi2WMKffWr1+/Sr+e+pSzoqZMmaKAgACtWrXqovMeeugh+fn5KSsri22mkupLTgC1hzIM1JIRI0ZIktavX+9z369//Wvdf//9XvPS09O95hQVFem9995TaGioBg0aVGMZSktLtX37dkVHR2vmzJlq3ry5pxD8/IoXPxcWFqYff/zR8/M111yjpUuXSpLi4+NVUlKi7du3+zxuwYIFatOmTZW+Sa2+5KyMDh066I9//KM+/fRTvf766+XOyc7O1ssvv6ykpCR17NhREttMRdWXnABqWc2vSwYanku5mkTLli3NunXrzKlTp8y3335rpk2bZqKiosw///lPr3nnrwxw6tQprysDLF261Ot5z588dPbsWa/xhx9+2Egyu3fvrnSG/v37G0lm4cKFJi8vzxQWFpqtW7eaNm3aGElm8+bNXn/W4MGDjcvlMv/7v/9rMjIyTEBAgNm/f78xxpijR4+aq666yrRv396sX7/enDx50hw/fty89NJLJiwszOfErMq8HjtzVoQqeQLdeY888ogJDAw0Dz/8sMnOzjZFRUUmJyfHvPrqq6Zly5amV69epqCgwDOfbabhbDOcQAfUOq4mAVRFVcqwMcYcO3bMzJo1y7Rr184EBgaali1bmpEjR5qvvvrqovNcLpcZNGiQee+99zxzduzYYSR53R599FFjjPEZHzp0aKUy5OXlmSlTppjWrVubwMBAExUVZSZMmGAeeeQRz3P+/Ez5rKws07t3b9OoUSPTunVrs3jxYq/Xc/z4cTN79mzTvn17ExgYaJo3b24GDhzoVTyq8nrsyFkZVS3Dxhiza9cuM3bsWM9ra9y4sbn55pvNc889Z4qKinzms800jG2GMgzUuhTLGL7GCKislJQUJScn8y1g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IY0bN9bw4cMl/fStc+f/GwBQdwTYHQCAfVJSUuyO0OC1bdtWknTjjTcqPT3d3jAO0LNnT11xxRV2xwBQj1jm/II2AI5zsa8MBuojt9td7pU8AOACUlkmATic2+2WMYZbDd5+97vfqaio6IL3u91uSbI9Z32/AUBVUIYBoIbNnz9fQUFBdscAAJSDMgwANSw0NNTuCACAC6AMAwAAwLEowwAAAHAsyjAAAAAcizIMAAAAx6IMAwAAwLEowwAAAHAsyjAAAAAcizIMAAAAx6IMAwAAwLEowwAAAHAsyjAAAAAcizIM4JKsXLlSlmXJsiyFhITYHafGGWO0fft2zZgxQx06dFBwcLBatGihXr16afny5TLG1EqO8PBwz/t+/ubn56emTZuqS5cumj59ujIzM2slCwDUZ5RhAJdk5MiRMsYoJibG7ii1Ijs7W7169dJXX32lVatWKT8/Xzt37lSbNm00duxYPfjgg7WSo6CgQLt375YkxcbGyhij4uJiZWVlad68ecrKylK3bt00ceJEFRYW1komAKiPKMMAUEkBAQFKSUnRDTfcoJCQELVv317Lli1Ts2bN9MILL6ioqMiWXP7+/oqKilJsbKy2bt2qhx56SMuWLdOoUaNq7Yg1ANQ3lGEAqISOHTuquLhYTZs29RoPCgpS69atVVRUpHPnztmUztvTTz+tm266SWvWrNHKlSvtjgMAdRJlGACqwcmTJ3XgwAH9+te/lsvlsjuOJMmyLN17772SpCVLlticBgDqJsowgErJyspSXFycXC6XGjVqpN69e+ujjz664Py8vDzNnDlTbdu2VVBQkJo3b674+Hjt2bPHMyctLc3rRLBDhw4pOTlZERERatasmYYNG6aDBw96PW9RUZEef/xxdezYUWFhYYqMjNTw4cO1Zs0alZaWVjpDVZ06dUrbt2/X7bffrujoaL3xxhuX/JzVqVevXpKknTt3qri42DPe0D8XAKgwA8CxJBm3213h+QcOHDARERGmVatWZtOmTeb06dNm7969ZuDAgaZt27YmODjYa35ubq658sorTVRUlElPTzenT582X3zxhenTp48JCQkxGRkZXvNjY2ONJBMbG2syMjJMQUGB2bx5swkNDTXdu3f3mnv33Xcbl8tlNm3aZAoLC82RI0fMAw88YCSZbdu2VTlDZcyfP99IMpJM3759zd69e6v0PG6321Tl1/Hu3bs979eFnD171pMxNzfXGNNwP5fKbs8AYIxJoQwDDlbZ8pCYmGgkmVWrVnmNf/fddyY4ONinDI8fP95IMitWrPAaP3z4sAkODjZdu3b1Gj9futauXes1npCQYCSZvLw8z1i7du1Mz549fTJ26NDBq3RVNkNlFRUVmS+//NJMnTrV+Pv7m3nz5lX6OWqyDBcWFvqU4Yb6uVCGAVRBCsskAFTYxo0bJUmDBg3yGr/88svVoUMHn/lpaWny8/PTsGHDvMajo6N17bXXKjMzUzk5OT6P6969u9fPrVu3liTl5uZ6xgYPHqyMjAxNnjxZO3fu9PwTfHZ2tvr27XvJGSoqKChIHTt21Isvvqjbb79djz/+uLZs2VLl56tuhw8fliQFBgbqsssuk+SMzwUAKooyDKBCioqKdPr0aYWEhCg8PNzn/hYtWvjMz8/PV1lZmVwul88XRHz22WeSpAMHDvg81y9PQAsKCpIklZWVecYWL16sN954Q998841iYmLUpEkTDR48WKtXr66WDFUxfPhwSdK6deuq5fmqw/n13D169FBgYKAjPxcAuBjKMIAKCQ4OVuPGjXXu3DkVFBT43H/ixAmf+REREQoICFBxcbGMMeXe+vXrV6U8lmVp7Nix2rJli06ePKm0tDQZYxQfH69FixbVSoZfCg4OluT7XtilrKxMixcvliTNmDFDkjM/FwC4GMowgAobMmSIpP9bLnHesWPHlJ2d7TM/Pj5eJSUl2r59u899CxYsUJs2bVRSUlKlLBEREcrKypL00xKAAQMGeK5+kJ6eXmMZHnjgAY0ZM6bc+zZs2CDJdzmBXebMmaNdu3ZpxIgRSkxM9Iw3xM8FAKqKMgygwp588klFRkZq1qxZ2rx5swoKCrR//36NGTOm3KUTTz31lK666ipNmjRJGzZsUH5+vk6cOKGXX35Z8+bN0zPPPKOAgIAq55k6dar27t2roqIiff/991q4cKGMMerfv3+NZnjzzTc1b948HTp0SEVFRTp06JAefvhhLV++XF27dtXdd99d5dd0KcrKyvT999/rnXfeUUxMjBYuXKhJkyZpxYoVsizLM6+hfi4AUCW1c6IegLpIVTj7Pjs728TFxZkmTZp4Lq21bt06ExMT47lqwV133eWZf/z4cTN79mzTvn17ExgYaJo3b24GDhxoNm/e7JmzY8cOz2PP3x599FFPxp/fhg4daowxZs+ePWbKlCmmU6dOJiwszERGRpqbb77ZvPLKK6asrMwrc0UyVFR+fr559dVXzaBBg0zbtm1NUFCQCQ8PN127djVPPfWUKSwsrPRzVuVqEo0aNfJ5byzLMi6Xy1x//fVm2rRpJjMz84KPb2ify/lMXE0CQCWlWMbwhfWAU1mWJbfbraSkJLujOFpKSoqSk5PFr+NLw/YMoApSWSYBAAAAx6IMAwAAwLEowwAg+Vzrtrzb3Llz7Y4JAKhmnKoLABLrdQHAoTgyDAAAAMeiDAMAAMCxKMMAAABwLMowAAAAHIsyDAAAAMeiDAMAAMCxKMMAAABwLMowAAAAHIsyDAAAAMeiDAMAAMCxKMMAAABwLMowAAAAHIsyDAAAAMcKsDsAAHvt2LHD7giOd/4zSElJsTkJADiPZYwxdocAYA/LsuyOAFQrt9utpKQku2MAqD9SOTIMOBj/LwwAcDrWDAMAAMCxKMMAAABwLMowAAAAHIsyDAAAAMf6fxgyhDJCmw/FAAAAAElFTkSuQmCC",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.summary()\n",
    "tf.keras.utils.plot_model(model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(loss=\"categorical_crossentropy\", optimizer=Adam(learning_rate=0.002), metrics=[AUC()])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/40\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2022-03-24 21:10:26.309691: I tensorflow/stream_executor/cuda/cuda_dnn.cc:368] Loaded cuDNN version 8101\n",
      "2022-03-24 21:10:26.992375: I tensorflow/core/platform/default/subprocess.cc:304] Start cannot spawn child process: No such file or directory\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1751/1751 [==============================] - 23s 11ms/step - loss: 0.6147 - auc: 0.7237 - val_loss: 0.6780 - val_auc: 0.6438\n",
      "Epoch 2/40\n",
      "1751/1751 [==============================] - 18s 10ms/step - loss: 0.5762 - auc: 0.7693 - val_loss: 0.6275 - val_auc: 0.7102\n",
      "Epoch 3/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5684 - auc: 0.7772 - val_loss: 0.6662 - val_auc: 0.6667\n",
      "Epoch 4/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5651 - auc: 0.7804 - val_loss: 0.6387 - val_auc: 0.6958\n",
      "Epoch 5/40\n",
      "1751/1751 [==============================] - 18s 10ms/step - loss: 0.5627 - auc: 0.7826 - val_loss: 0.6389 - val_auc: 0.7044\n",
      "Epoch 6/40\n",
      "1751/1751 [==============================] - 19s 11ms/step - loss: 0.5610 - auc: 0.7840 - val_loss: 0.6710 - val_auc: 0.6637\n",
      "Epoch 7/40\n",
      "1751/1751 [==============================] - 19s 11ms/step - loss: 0.5599 - auc: 0.7851 - val_loss: 0.7462 - val_auc: 0.5803\n",
      "Epoch 8/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5581 - auc: 0.7868 - val_loss: 0.6585 - val_auc: 0.6805\n",
      "Epoch 9/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5568 - auc: 0.7880 - val_loss: 0.6209 - val_auc: 0.7258\n",
      "Epoch 10/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5553 - auc: 0.7894 - val_loss: 0.7347 - val_auc: 0.5997\n",
      "Epoch 11/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5544 - auc: 0.7903 - val_loss: 0.6659 - val_auc: 0.6735\n",
      "Epoch 12/40\n",
      "1751/1751 [==============================] - 19s 11ms/step - loss: 0.5537 - auc: 0.7909 - val_loss: 0.7014 - val_auc: 0.6419\n",
      "Epoch 13/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5530 - auc: 0.7916 - val_loss: 0.6000 - val_auc: 0.7503\n",
      "Epoch 14/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5522 - auc: 0.7924 - val_loss: 0.7512 - val_auc: 0.5937\n",
      "Epoch 15/40\n",
      "1751/1751 [==============================] - 19s 11ms/step - loss: 0.5518 - auc: 0.7927 - val_loss: 0.6323 - val_auc: 0.7137\n",
      "Epoch 16/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5507 - auc: 0.7937 - val_loss: 0.6436 - val_auc: 0.6975\n",
      "Epoch 17/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5502 - auc: 0.7942 - val_loss: 0.5775 - val_auc: 0.7711\n",
      "Epoch 18/40\n",
      "1751/1751 [==============================] - 19s 11ms/step - loss: 0.5499 - auc: 0.7944 - val_loss: 0.6683 - val_auc: 0.6782\n",
      "Epoch 19/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5496 - auc: 0.7947 - val_loss: 0.6449 - val_auc: 0.7063\n",
      "Epoch 20/40\n",
      "1751/1751 [==============================] - 19s 11ms/step - loss: 0.5489 - auc: 0.7954 - val_loss: 0.6737 - val_auc: 0.6672\n",
      "Epoch 21/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5483 - auc: 0.7959 - val_loss: 0.6284 - val_auc: 0.7216\n",
      "Epoch 22/40\n",
      "1751/1751 [==============================] - 19s 11ms/step - loss: 0.5478 - auc: 0.7964 - val_loss: 0.6332 - val_auc: 0.7055\n",
      "Epoch 23/40\n",
      "1751/1751 [==============================] - 19s 11ms/step - loss: 0.5479 - auc: 0.7963 - val_loss: 0.5650 - val_auc: 0.7794\n",
      "Epoch 24/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5469 - auc: 0.7972 - val_loss: 0.6223 - val_auc: 0.7202\n",
      "Epoch 25/40\n",
      "1751/1751 [==============================] - 19s 11ms/step - loss: 0.5466 - auc: 0.7975 - val_loss: 0.5512 - val_auc: 0.7895\n",
      "Epoch 26/40\n",
      "1751/1751 [==============================] - 19s 11ms/step - loss: 0.5461 - auc: 0.7979 - val_loss: 0.6686 - val_auc: 0.6779\n",
      "Epoch 27/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5458 - auc: 0.7982 - val_loss: 0.6803 - val_auc: 0.6745\n",
      "Epoch 28/40\n",
      "1751/1751 [==============================] - 19s 11ms/step - loss: 0.5458 - auc: 0.7982 - val_loss: 0.6163 - val_auc: 0.7340\n",
      "Epoch 29/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5453 - auc: 0.7986 - val_loss: 0.6896 - val_auc: 0.6546\n",
      "Epoch 30/40\n",
      "1751/1751 [==============================] - 19s 11ms/step - loss: 0.5453 - auc: 0.7986 - val_loss: 0.6515 - val_auc: 0.6950\n",
      "Epoch 31/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5448 - auc: 0.7991 - val_loss: 0.6805 - val_auc: 0.6602\n",
      "Epoch 32/40\n",
      "1751/1751 [==============================] - 19s 11ms/step - loss: 0.5445 - auc: 0.7993 - val_loss: 0.6648 - val_auc: 0.6725\n",
      "Epoch 33/40\n",
      "1751/1751 [==============================] - 19s 11ms/step - loss: 0.5441 - auc: 0.7996 - val_loss: 0.7336 - val_auc: 0.6115\n",
      "Epoch 34/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5440 - auc: 0.7998 - val_loss: 0.7102 - val_auc: 0.6259\n",
      "Epoch 35/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5441 - auc: 0.7997 - val_loss: 0.6525 - val_auc: 0.6959\n",
      "Epoch 36/40\n",
      "1751/1751 [==============================] - 19s 11ms/step - loss: 0.5435 - auc: 0.8001 - val_loss: 0.6577 - val_auc: 0.6891\n",
      "Epoch 37/40\n",
      "1751/1751 [==============================] - 19s 11ms/step - loss: 0.5434 - auc: 0.8003 - val_loss: 0.6273 - val_auc: 0.7217\n",
      "Epoch 38/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5431 - auc: 0.8005 - val_loss: 0.6503 - val_auc: 0.7009\n",
      "Epoch 39/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5433 - auc: 0.8003 - val_loss: 0.7254 - val_auc: 0.6194\n",
      "Epoch 40/40\n",
      "1751/1751 [==============================] - 18s 11ms/step - loss: 0.5427 - auc: 0.8008 - val_loss: 0.6816 - val_auc: 0.6805\n"
     ]
    }
   ],
   "source": [
    "with tf.device('/gpu:0'):\n",
    "    model.fit([X[:,0], X[:,1]], y, epochs=40, batch_size=256, validation_split=0.1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As seen from the epoch metrics, we got:\n",
    "\n",
    "Train AUC Score: 0.8008\n",
    "\n",
    "Validation AUC Score: 0.6805\n",
    "\n",
    "Best Validation AUC Score: 0.7895\n",
    "\n",
    "We can save model, based on best `val_auc` score epoch.\n"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "3a4565eb6215a326995d9cfd00f1782ebb9ab334d122fb684360bfee2e0fdc62"
  },
  "kernelspec": {
   "display_name": "Python 3.9.4 64-bit",
   "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.10"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}