[0f681c]: / scripts / ECG_1dCNN.ipynb

Download this file

905 lines (905 with data), 103.3 kB

{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "ECG_1dCNNipynb",
      "provenance": [],
      "collapsed_sections": [],
      "authorship_tag": "ABX9TyPDo0xJQuzXoEUgF0XbpVKM",
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/hardikroutray/ECG/blob/main/ECG_1dCNN.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "g4s82uBJWlj7",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "93ef18aa-bf07-466f-ebc0-15c0b8bd1f84"
      },
      "source": [
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib as plt\n",
        "import matplotlib.pyplot as plt\n",
        "import seaborn as sn\n",
        "%matplotlib inline\n",
        "%pylab inline\n",
        "%config InlineBackend.figure_formats = ['retina']\n",
        "from imutils import paths\n",
        "import time   # time1 = time.time(); print('Time taken: {:.1f} sec'.format(time.time() - time1))\n",
        "import cv2\n",
        "import pickle\n",
        "import warnings\n",
        "warnings.filterwarnings(\"ignore\")\n",
        "import pickle\n"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Populating the interactive namespace from numpy and matplotlib\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "pluEuqpFYD0V"
      },
      "source": [
        "\n",
        "import keras\n",
        "import keras.utils\n",
        "from keras.models import Sequential\n",
        "from keras.layers import Dense, Dropout, Flatten\n",
        "from keras.layers import Conv2D, MaxPooling2D\n",
        "from keras.optimizers import Adam\n",
        "\n",
        "from tensorflow.keras import utils as np_utils\n",
        "\n",
        "from keras.utils import to_categorical\n",
        "from keras.preprocessing import image\n",
        "from sklearn.model_selection import train_test_split\n",
        "from keras.utils import to_categorical\n",
        "from tqdm import tqdm\n",
        "from sklearn.metrics import plot_confusion_matrix\n",
        "from sklearn.model_selection import train_test_split\n"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "cwJWpDYHJ0Fs"
      },
      "source": [
        "from tensorflow import keras \n",
        "from tensorflow.keras.models import Model\n",
        "from tensorflow.keras.models import Sequential\n",
        "from tensorflow.keras.layers import Conv1D\n",
        "from tensorflow.keras.layers import Convolution1D, ZeroPadding1D, MaxPooling1D, BatchNormalization, Activation, Dropout, Flatten, Dense"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "JSElyJujYOGQ",
        "outputId": "13fc9c76-cdd3-4c95-82d9-162713d3940c"
      },
      "source": [
        "from google.colab import drive\n",
        "drive.mount._DEBUG = True\n",
        "drive.mount('/content/MyDrive', force_remount=True)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "unset HISTFILE; export PS1=\"root@c7fba1111d0b-06c45ba497424d989d006178dd991ba2: \"\n",
            "bash: cannot set terminal process group (-1): Inappropriate ioctl for device\n",
            "bash: no job control in this shell\n",
            "\u001b[01;34m/content\u001b[00m# root@c7fba1111d0b-06c45ba497424d989d006178dd991ba2: umount -f /content/MyDrive || umount /content/MyDrive; pkill -9 -x drive\n",
            "root@c7fba1111d0b-06c45ba497424d989d006178dd991ba2: pkill -9 -f /opt/google/drive/directoryprefetcher_binary\n",
            "root@c7fba1111d0b-06c45ba497424d989d006178dd991ba2: ( while `sleep 0.5`; do if [[ -d \"/content/MyDrive\" && \"$(ls -A /content/MyDrive)\" != \"\" ]]; then echo \"google.colab.drive MOUNTED\"; break; fi; done ) &\n",
            "[1] 323\n",
            "root@c7fba1111d0b-06c45ba497424d989d006178dd991ba2: cat /tmp/tmp4kvs3n2n/drive.fifo | head -1 | ( /opt/google/drive/drive --features=fuse_max_background:1000,max_read_qps:1000,max_write_qps:1000,max_operation_batch_size:15,max_parallel_push_task_instances:10,opendir_timeout_ms:120000,virtual_folders_omit_spaces:true --inet_family=IPV4_ONLY --preferences=trusted_root_certs_file_path:/opt/google/drive/roots.pem,mount_point_path:/content/MyDrive --console_auth 2>&1 | grep --line-buffered -E \"(Go to this URL in a browser: https://.*)$|Drive File Stream encountered a problem and has stopped|Authorization failed|The domain policy has disabled Drive File Stream\"; echo \"drive EXITED\"; ) &\n",
            "[2] 327\n",
            "root@c7fba1111d0b-06c45ba497424d989d006178dd991ba2: google.colab.drive MOUNTED\n",
            "fuser -kw \"/root/.config/Google/DriveFS/Logs/timeouts.txt\" ; rm -rf \"/root/.config/Google/DriveFS/Logs/timeouts.txt\"\n",
            "/root/.config/Google/DriveFS/Logs/timeouts.txt:   246\n",
            "root@c7fba1111d0b-06c45ba497424d989d006178dd991ba2: nohup bash -c 'tail -n +0 -F \"/root/.config/Google/DriveFS/Logs/drive_fs.txt\" | python3 /opt/google/drive/drive-filter.py > \"/root/.config/Google/DriveFS/Logs/timeouts.txt\" ' < /dev/null > /dev/null 2>&1 &\n",
            "[3] 374\n",
            "root@c7fba1111d0b-06c45ba497424d989d006178dd991ba2: disown -a\n",
            "root@c7fba1111d0b-06c45ba497424d989d006178dd991ba2: exit\n",
            "Mounted at /content/MyDrive\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "OneI2FHXYF8H"
      },
      "source": [
        "# Enter the directory\n",
        "!cd /content/MyDrive/MyDrive/ECG/\n"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "DlqItrd6XNnX"
      },
      "source": [
        "with open('/content/MyDrive/MyDrive/ECG/dataset_dict.pickle', 'rb') as file:\n",
        "    dataset_dict = pickle.load(file)\n",
        "    "
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "NhNlh62VjOfY",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "7a6796b2-61fc-453c-d7a0-229c91982435"
      },
      "source": [
        "dataset_dict.keys()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "dict_keys(['X_train', 'X_test', 'y_train', 'y_test'])"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 42
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "OAKau2s0iv40"
      },
      "source": [
        "x_train1=dataset_dict['X_train']\n",
        "x_test1=dataset_dict['X_test']\n",
        "\n",
        "y_train1=dataset_dict['y_train']\n",
        "y_test1=dataset_dict['y_test']\n",
        "\n",
        "y_test = to_categorical(y_test1)[:,1:5] # Since labeling is [1,2,3,4] instead \\\n",
        "# of [0,1,2,3]\n",
        "y_train = to_categorical(y_train1)[:,1:5] #one-hot encoding"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "WmaABnOEBPng",
        "outputId": "b59400b6-5fdc-4a1c-9102-f1a7d7366cee"
      },
      "source": [
        "y_train.shape"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(696, 4)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 125
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ejmMjREWjbnF"
      },
      "source": [
        "comb_x=np.concatenate([x_train1, x_test1],axis=0)\n",
        "comb_y=np.concatenate([y_train, y_test],axis=0)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "egYjhsPLj25f"
      },
      "source": [
        "x_train, x_test, y_train, y_test = train_test_split(comb_x, comb_y, random_state=100, test_size=0.2, stratify=comb_y)\n",
        "\n",
        "x_train=x_train[:,:,1]\n",
        "x_test=x_test[:,:,1]\n",
        "\n",
        "\n",
        "x_train=np.expand_dims(x_train,2)\n",
        "x_test=np.expand_dims(x_test,2)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "whti8wEQOmQU",
        "outputId": "1caa33ea-b309-4c75-bfb0-e6755a01d7a3"
      },
      "source": [
        "# x_test.reshape(742,1980,1)\n",
        "print(x_test.shape)\n",
        "\n",
        "y_test.shape"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "(186, 1980)\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(186, 4)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 184
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "uUAeR8Q8_q92"
      },
      "source": [
        "num_classes=4"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "yi63jA2WJsC2",
        "outputId": "4f75f062-434e-426c-a5ea-5d127817baf6"
      },
      "source": [
        "model_m = Sequential()\n",
        "input_shape=(x_train.shape[1], 1)\n",
        "model_m.add(Conv1D(128, kernel_size=3,padding = 'same',activation='relu', input_shape=input_shape))\n",
        "model_m.add(BatchNormalization())\n",
        "model_m.add(MaxPooling1D(pool_size=(2)))\n",
        "\n",
        "## CONV2\n",
        "model_m.add(Conv1D(64,kernel_size=3,padding = 'same', activation='relu'))\n",
        "model_m.add(BatchNormalization())\n",
        "model_m.add(MaxPooling1D(pool_size=(2)))\n",
        "## End CONV2\n",
        "\n",
        "model_m.add(Flatten())\n",
        "model_m.add(Dense(64, activation='tanh'))\n",
        "model_m.add(Dropout(0.1))\n",
        "# model_m.add(Dense(32, activation='tanh'))\n",
        "# model_m.add(Dropout(0.2))\n",
        "model_m.add(Dense(16, activation='relu'))\n",
        "model_m.add(Dropout(0.2))\n",
        "model_m.add(Dense(num_classes, activation='softmax'))\n",
        "model_m.summary()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Model: \"sequential_6\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "conv1d_9 (Conv1D)            (None, 1980, 128)         512       \n",
            "_________________________________________________________________\n",
            "batch_normalization_9 (Batch (None, 1980, 128)         512       \n",
            "_________________________________________________________________\n",
            "max_pooling1d_9 (MaxPooling1 (None, 990, 128)          0         \n",
            "_________________________________________________________________\n",
            "conv1d_10 (Conv1D)           (None, 990, 64)           24640     \n",
            "_________________________________________________________________\n",
            "batch_normalization_10 (Batc (None, 990, 64)           256       \n",
            "_________________________________________________________________\n",
            "max_pooling1d_10 (MaxPooling (None, 495, 64)           0         \n",
            "_________________________________________________________________\n",
            "flatten_5 (Flatten)          (None, 31680)             0         \n",
            "_________________________________________________________________\n",
            "dense_16 (Dense)             (None, 64)                2027584   \n",
            "_________________________________________________________________\n",
            "dropout_12 (Dropout)         (None, 64)                0         \n",
            "_________________________________________________________________\n",
            "dense_17 (Dense)             (None, 16)                1040      \n",
            "_________________________________________________________________\n",
            "dropout_13 (Dropout)         (None, 16)                0         \n",
            "_________________________________________________________________\n",
            "dense_18 (Dense)             (None, 4)                 68        \n",
            "=================================================================\n",
            "Total params: 2,054,612\n",
            "Trainable params: 2,054,228\n",
            "Non-trainable params: 384\n",
            "_________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "wbKysc8lOX7n"
      },
      "source": [
        ""
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "1hAXD7g5J5B6",
        "outputId": "1006d15d-8f78-4fe0-8e6b-3f19c39e498c"
      },
      "source": [
        "model_m.compile(loss='categorical_crossentropy',\n",
        "                optimizer='adam', metrics=['accuracy'])\n",
        "\n",
        "# Hyper-parameters\n",
        "BATCH_SIZE = 50\n",
        "EPOCHS = 50\n",
        "\n",
        "# Enable validation to use ModelCheckpoint and EarlyStopping callbacks.\n",
        "shape=x_train.shape\n",
        "history = model_m.fit(x_train,\n",
        "                      y_train,\n",
        "                      batch_size=BATCH_SIZE,\n",
        "                      epochs=EPOCHS,\n",
        "                      validation_split=0.1,\n",
        "                      verbose=1)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch 1/50\n",
            "14/14 [==============================] - 10s 640ms/step - loss: 1.6063 - accuracy: 0.3721 - val_loss: 2.5756 - val_accuracy: 0.1867\n",
            "Epoch 2/50\n",
            "14/14 [==============================] - 9s 618ms/step - loss: 0.8650 - accuracy: 0.6528 - val_loss: 2.4498 - val_accuracy: 0.2533\n",
            "Epoch 3/50\n",
            "14/14 [==============================] - 9s 619ms/step - loss: 0.7838 - accuracy: 0.7108 - val_loss: 1.9524 - val_accuracy: 0.3467\n",
            "Epoch 4/50\n",
            "14/14 [==============================] - 9s 619ms/step - loss: 0.6789 - accuracy: 0.7389 - val_loss: 1.6581 - val_accuracy: 0.4267\n",
            "Epoch 5/50\n",
            "14/14 [==============================] - 9s 618ms/step - loss: 0.5891 - accuracy: 0.7666 - val_loss: 1.4544 - val_accuracy: 0.4667\n",
            "Epoch 6/50\n",
            "14/14 [==============================] - 9s 621ms/step - loss: 0.5472 - accuracy: 0.8045 - val_loss: 1.2917 - val_accuracy: 0.4800\n",
            "Epoch 7/50\n",
            "14/14 [==============================] - 9s 623ms/step - loss: 0.5672 - accuracy: 0.7684 - val_loss: 1.0611 - val_accuracy: 0.6133\n",
            "Epoch 8/50\n",
            "14/14 [==============================] - 9s 617ms/step - loss: 0.4768 - accuracy: 0.8273 - val_loss: 0.8566 - val_accuracy: 0.7200\n",
            "Epoch 9/50\n",
            "14/14 [==============================] - 9s 614ms/step - loss: 0.4432 - accuracy: 0.8616 - val_loss: 0.9283 - val_accuracy: 0.6800\n",
            "Epoch 10/50\n",
            "14/14 [==============================] - 9s 614ms/step - loss: 0.4070 - accuracy: 0.8582 - val_loss: 0.9806 - val_accuracy: 0.6667\n",
            "Epoch 11/50\n",
            "14/14 [==============================] - 9s 615ms/step - loss: 0.3740 - accuracy: 0.8871 - val_loss: 0.8416 - val_accuracy: 0.7200\n",
            "Epoch 12/50\n",
            "14/14 [==============================] - 9s 621ms/step - loss: 0.3320 - accuracy: 0.8879 - val_loss: 0.7742 - val_accuracy: 0.7600\n",
            "Epoch 13/50\n",
            "14/14 [==============================] - 9s 615ms/step - loss: 0.2903 - accuracy: 0.9121 - val_loss: 0.6900 - val_accuracy: 0.7867\n",
            "Epoch 14/50\n",
            "14/14 [==============================] - 9s 617ms/step - loss: 0.3190 - accuracy: 0.9051 - val_loss: 0.7770 - val_accuracy: 0.7333\n",
            "Epoch 15/50\n",
            "14/14 [==============================] - 9s 618ms/step - loss: 0.2384 - accuracy: 0.9318 - val_loss: 0.6733 - val_accuracy: 0.7733\n",
            "Epoch 16/50\n",
            "14/14 [==============================] - 9s 621ms/step - loss: 0.2280 - accuracy: 0.9356 - val_loss: 0.6953 - val_accuracy: 0.7867\n",
            "Epoch 17/50\n",
            "14/14 [==============================] - 9s 612ms/step - loss: 0.2017 - accuracy: 0.9294 - val_loss: 0.6745 - val_accuracy: 0.7600\n",
            "Epoch 18/50\n",
            "14/14 [==============================] - 9s 614ms/step - loss: 0.2223 - accuracy: 0.9432 - val_loss: 0.6732 - val_accuracy: 0.7600\n",
            "Epoch 19/50\n",
            "14/14 [==============================] - 9s 622ms/step - loss: 0.2236 - accuracy: 0.9299 - val_loss: 0.5754 - val_accuracy: 0.8000\n",
            "Epoch 20/50\n",
            "14/14 [==============================] - 9s 615ms/step - loss: 0.1554 - accuracy: 0.9610 - val_loss: 0.6373 - val_accuracy: 0.8133\n",
            "Epoch 21/50\n",
            "14/14 [==============================] - 9s 618ms/step - loss: 0.1461 - accuracy: 0.9728 - val_loss: 0.6432 - val_accuracy: 0.8133\n",
            "Epoch 22/50\n",
            "14/14 [==============================] - 9s 618ms/step - loss: 0.1290 - accuracy: 0.9644 - val_loss: 0.6336 - val_accuracy: 0.8133\n",
            "Epoch 23/50\n",
            "14/14 [==============================] - 9s 622ms/step - loss: 0.1297 - accuracy: 0.9584 - val_loss: 0.6052 - val_accuracy: 0.8133\n",
            "Epoch 24/50\n",
            "14/14 [==============================] - 9s 615ms/step - loss: 0.1371 - accuracy: 0.9641 - val_loss: 0.5995 - val_accuracy: 0.8133\n",
            "Epoch 25/50\n",
            "14/14 [==============================] - 9s 616ms/step - loss: 0.1239 - accuracy: 0.9521 - val_loss: 0.6691 - val_accuracy: 0.7867\n",
            "Epoch 26/50\n",
            "14/14 [==============================] - 9s 612ms/step - loss: 0.1222 - accuracy: 0.9625 - val_loss: 0.6311 - val_accuracy: 0.8000\n",
            "Epoch 27/50\n",
            "14/14 [==============================] - 9s 612ms/step - loss: 0.1012 - accuracy: 0.9690 - val_loss: 0.6649 - val_accuracy: 0.8400\n",
            "Epoch 28/50\n",
            "14/14 [==============================] - 9s 618ms/step - loss: 0.0938 - accuracy: 0.9699 - val_loss: 0.6243 - val_accuracy: 0.8400\n",
            "Epoch 29/50\n",
            "14/14 [==============================] - 9s 618ms/step - loss: 0.0990 - accuracy: 0.9627 - val_loss: 0.5824 - val_accuracy: 0.8267\n",
            "Epoch 30/50\n",
            "14/14 [==============================] - 9s 615ms/step - loss: 0.0934 - accuracy: 0.9710 - val_loss: 0.6045 - val_accuracy: 0.8400\n",
            "Epoch 31/50\n",
            "14/14 [==============================] - 9s 614ms/step - loss: 0.0831 - accuracy: 0.9766 - val_loss: 0.6379 - val_accuracy: 0.8133\n",
            "Epoch 32/50\n",
            "14/14 [==============================] - 9s 615ms/step - loss: 0.0976 - accuracy: 0.9719 - val_loss: 0.6728 - val_accuracy: 0.8133\n",
            "Epoch 33/50\n",
            "14/14 [==============================] - 9s 616ms/step - loss: 0.0722 - accuracy: 0.9815 - val_loss: 0.6648 - val_accuracy: 0.8133\n",
            "Epoch 34/50\n",
            "14/14 [==============================] - 9s 615ms/step - loss: 0.0715 - accuracy: 0.9732 - val_loss: 0.6822 - val_accuracy: 0.8000\n",
            "Epoch 35/50\n",
            "14/14 [==============================] - 9s 613ms/step - loss: 0.0696 - accuracy: 0.9734 - val_loss: 0.6404 - val_accuracy: 0.8133\n",
            "Epoch 36/50\n",
            "14/14 [==============================] - 9s 618ms/step - loss: 0.0800 - accuracy: 0.9755 - val_loss: 0.5953 - val_accuracy: 0.8133\n",
            "Epoch 37/50\n",
            "14/14 [==============================] - 9s 616ms/step - loss: 0.0605 - accuracy: 0.9784 - val_loss: 0.6624 - val_accuracy: 0.8000\n",
            "Epoch 38/50\n",
            "14/14 [==============================] - 9s 621ms/step - loss: 0.0764 - accuracy: 0.9857 - val_loss: 0.7842 - val_accuracy: 0.8133\n",
            "Epoch 39/50\n",
            "14/14 [==============================] - 9s 613ms/step - loss: 0.0829 - accuracy: 0.9769 - val_loss: 0.5785 - val_accuracy: 0.7867\n",
            "Epoch 40/50\n",
            "14/14 [==============================] - 9s 616ms/step - loss: 0.0669 - accuracy: 0.9830 - val_loss: 0.8319 - val_accuracy: 0.7867\n",
            "Epoch 41/50\n",
            "14/14 [==============================] - 9s 612ms/step - loss: 0.0753 - accuracy: 0.9755 - val_loss: 0.7327 - val_accuracy: 0.8133\n",
            "Epoch 42/50\n",
            "14/14 [==============================] - 9s 616ms/step - loss: 0.0678 - accuracy: 0.9761 - val_loss: 0.7903 - val_accuracy: 0.8133\n",
            "Epoch 43/50\n",
            "14/14 [==============================] - 9s 620ms/step - loss: 0.0595 - accuracy: 0.9894 - val_loss: 0.7530 - val_accuracy: 0.8267\n",
            "Epoch 44/50\n",
            "14/14 [==============================] - 9s 610ms/step - loss: 0.0693 - accuracy: 0.9833 - val_loss: 0.7748 - val_accuracy: 0.8267\n",
            "Epoch 45/50\n",
            "14/14 [==============================] - 9s 623ms/step - loss: 0.0489 - accuracy: 0.9885 - val_loss: 0.7993 - val_accuracy: 0.8133\n",
            "Epoch 46/50\n",
            "14/14 [==============================] - 9s 615ms/step - loss: 0.0659 - accuracy: 0.9771 - val_loss: 0.7741 - val_accuracy: 0.8000\n",
            "Epoch 47/50\n",
            "14/14 [==============================] - 9s 616ms/step - loss: 0.0633 - accuracy: 0.9756 - val_loss: 0.7824 - val_accuracy: 0.7867\n",
            "Epoch 48/50\n",
            "14/14 [==============================] - 9s 620ms/step - loss: 0.0517 - accuracy: 0.9809 - val_loss: 0.8049 - val_accuracy: 0.8133\n",
            "Epoch 49/50\n",
            "14/14 [==============================] - 9s 616ms/step - loss: 0.0627 - accuracy: 0.9771 - val_loss: 0.7845 - val_accuracy: 0.8133\n",
            "Epoch 50/50\n",
            "14/14 [==============================] - 9s 619ms/step - loss: 0.0499 - accuracy: 0.9886 - val_loss: 0.7332 - val_accuracy: 0.8267\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "OZNS-3wQOR0g",
        "outputId": "c11f08e0-c510-424e-c4ca-d9bf47cd4d2f"
      },
      "source": [
        "sh=x_test\n",
        "score = model_m.evaluate(x_test, y_test, verbose=0)\n",
        "print('Test loss:', score[0])\n",
        "print('Test accuracy:', score[1])"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Test loss: 0.4567793607711792\n",
            "Test accuracy: 0.8655914068222046\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "5YVe7K1KWDek"
      },
      "source": [
        "# 0.85 when two 64 conv used"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "W9QJ3T1UTsqg"
      },
      "source": [
        "\n",
        "import sklearn.metrics as metrics\n",
        "\n",
        "y_test_pred = model_m.predict(x_test)  \n",
        "y_test_pred_labels = np.argmax(y_test_pred, axis=1)  # only necessary if output has one-hot-encoding, shape=(n_samples)\n",
        "# print(y_test_pred_labels)\n",
        "y_test_labels = np.argmax(y_test, axis=1)\n",
        "# print(y_test_labels)\n",
        "confusion_matrix = metrics.confusion_matrix(y_true=y_test_labels, y_pred=y_test_pred_labels)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 293
        },
        "id": "Yckg6V0OP7hI",
        "outputId": "86f7828a-da1c-4e78-e9dd-7f67a4158a9b"
      },
      "source": [
        "import matplotlib.pyplot as plt\n",
        "import seaborn as sn\n",
        "df_cm = pd.DataFrame(confusion_matrix, range(4), range(4))\n",
        "# plt.figure(figsize=(10,7))\n",
        "sn.set(font_scale=1.4) # for label size\n",
        "sn.heatmap(df_cm, annot=True, annot_kws={\"size\": 16}, fmt='g') # font size\n",
        "\n",
        "plt.xlabel(\"Target Class\")\n",
        "plt.ylabel(\"Output Class\")\n",
        "\n",
        "plt.show()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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fDhGjx4NFxcXZGVl4cSJE7h48SIAwMDAAMuXL2dtbi2QkZGB3377rdRrWVlZpd738fEp9b6TkxNGjRolSnwkvh9++AF+fn7C9fjx4xEbG1tlYYCWLVuidevWqg6P1CQgIAArV66Ek5MTevfujbZt28La2hp6enrIyMjA3bt3cfr0acTFxQn3TJkyhaf3ktaQKBQKhbqDICopJycHH3/8MU6ePFlhH0tLS3h7e6N///7iBUZqExsbC09Pzxrd07NnT2zbtk1FEZG6jR8/HgEBATW+b8aMGZg5c6YKIiJNMH36dJw6dapafS0sLDBv3jyMGTNGxVERaQ7O+JPGMTExwc8//4yzZ8/C398fISEhSEpKgomJCRwdHTFw4EC89dZbsLGxUXeoRESkQVauXInLly8jMDAQd+7cQWxsLNLS0iCVSmFiYgI7Ozu0b98effr0weDBg0tV9iHSBpzxJyIiIiLSAtzcS0RERESkBZj4ExERERFpASb+RERERERagIk/EREREZEWYOJPRERERKQFmPgTEREREWkBJv5ERERERFqAiT8RERERkRZg4k9EREREpAWY+BMRERERaQEm/kREREREWoCJPxERERGRFmDiT0RERESkBfTUHQARETV87dq1E9oRERFqjISISHsx8SeiGouNjYWnp6dSx/Ty8sI333yj1DGp7m7cuIGLFy8iICAAjx8/RkpKCvLz82Fubg5bW1t06tQJHh4eeOWVV2Bubq7ucImIqBJM/ImI6oH9+/fj008/BSDOh6TLly/jhx9+QHBwcLnvp6SkICUlBXfv3sWBAwewdOlSvP7665g1axYcHBxUGhsREdUOE38iqjEzMzOMGzeu0j4hISG4desWAMDU1BTDhw+vtH+XLl2UFh/VnkKhwOrVq7Fp06ZSrxsZGcHNzQ12dnYwMzNDSkoK4uPjERYWBrlcjoKCAuzbtw9///13hR8WiIhIvZj4E1GNWVpa4vPPP6+0z5o1a4TEvzr9STN8/PHHOHjwoHDt7OyMWbNmwdPTE4aGhmX6p6Sk4MSJE/jll18QFxeHvLw8McMlIqIaYFUfIiICAGzdurVU0j948GAcPHgQQ4YMKTfpBwBra2uMGTMGR48excyZM6Gjw/+tEBFpKs74ExER4uLisGrVKuG6T58+8PHxqXYib2BggBkzZqBr166qCpGIiOqIiT8R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\n",
            "text/plain": [
              "<Figure size 432x288 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "image/png": {
              "width": 383,
              "height": 276
            }
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "krcz_SyPciwF"
      },
      "source": [
        "import numpy as np\n",
        "import tensorflow as tf\n",
        "import tensorflow.keras.layers as keras\n",
        "\n",
        "# tf.enable_eager_execution()\n",
        "\n",
        "  \n",
        "def parameter_count():\n",
        "    total = 0\n",
        "    #for v in tf.trainable_variables():\n",
        "    for v in tf.Variable():\n",
        "        v_elements = 1\n",
        "        for dim in v.get_shape():\n",
        "            v_elements *= dim.value\n",
        "\n",
        "        total += v_elements\n",
        "    return total"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "K4-Kj7xth9Sm"
      },
      "source": [
        "\n",
        "def combined_dataset(features, labels):\n",
        "    assert features.shape[0] == labels.shape[0]\n",
        "    dataset = tf.data.Dataset.from_tensor_slices(({'time_series': features}, labels))\n",
        "    return dataset\n",
        "\n",
        "def class_for_element(features, labels):\n",
        "    return labels\n",
        "\n",
        "# For training\n",
        "def train_input_fn():\n",
        "    print(\"I am here\")\n",
        "    dataset = combined_dataset(x_train, y_train)\n",
        "    print( x_train.shape )\n",
        "    return dataset.repeat().shuffle(5000).batch(50).prefetch(1)\n",
        "\n",
        "# For evaluation and metrics\n",
        "def eval_input_fn():\n",
        "    dataset = combined_dataset(x_test, y_test)\n",
        "    return dataset.batch(1000).prefetch(1)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "yWxLTMOEiFKs"
      },
      "source": [
        "\n",
        "\n",
        "def conv_unit(unit, input_layer):\n",
        "    s = '_' + str(unit)\n",
        "    layer = keras.Conv1D(name='Conv1' + s, filters=32, kernel_size=5, strides=1, padding='same', activation='relu')(input_layer)\n",
        "    layer = keras.Conv1D(name='Conv2' + s, filters=32, kernel_size=5, strides=1, padding='same', activation=None)(layer )\n",
        "    layer = keras.Add(name='ResidualSum' + s)([layer, input_layer])\n",
        "    layer = keras.Activation(\"relu\", name='Act' + s)(layer)\n",
        "    layer = keras.MaxPooling1D(name='MaxPool' + s, pool_size=5, strides=2)(layer)\n",
        "    return layer\n",
        "\n",
        "def cnn_model(input_layer, mode, params):\n",
        "    current_layer = keras.Conv1D(filters=32, kernel_size=5, strides=1)(input_layer)\n",
        "\n",
        "    for i in range(5):\n",
        "        current_layer = conv_unit(i + 1, current_layer)\n",
        "\n",
        "    current_layer = keras.Flatten()(current_layer)\n",
        "    current_layer = keras.Dense(32, name='FC1', activation='relu')(current_layer)\n",
        "    logits = keras.Dense(5, name='Output')(current_layer)\n",
        "    \n",
        "    print('Parameter count:', parameter_count())\n",
        "    return logits"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ODv4vafil6Bt"
      },
      "source": [
        "CNN_MODEL_DIR = './Models/CNN-P1'"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ARqE7v0nmKE8"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "hRdGvHRyiKfM"
      },
      "source": [
        "# Initial learning rate\n",
        "INITIAL_LEARNING_RATE = 0.001\n",
        "\n",
        "# Learning rate decay per LR_DECAY_STEPS steps (1.0 = no decay)\n",
        "LR_DECAY_RATE = 0.5\n",
        "\n",
        "# Number of steps for LR to decay by LR_DECAY_RATE\n",
        "LR_DECAY_STEPS = 4000\n",
        "\n",
        "# Threshold for gradient clipping\n",
        "GRADIENT_NORM_THRESH = 10.0\n",
        "\n",
        "# Select model to train\n",
        "MODEL_DIR = CNN_MODEL_DIR\n",
        "MODEL_FN = cnn_model\n",
        "\n",
        "def classifier_fn(features, labels, mode, params):\n",
        "    is_training = mode == tf.estimator.ModeKeys.TRAIN\n",
        "    #input_layer=tf.keras.layers.DenseFeatures(feature_columns=features)\n",
        "    input_layer = tf.compat.v1.feature_column.input_layer(features, params['feature_columns'])\n",
        "    input_layer = tf.expand_dims(input_layer, -1)\n",
        "\n",
        "    logits = MODEL_FN(input_layer, mode, params)\n",
        "\n",
        "    # For prediction, exit here\n",
        "    predicted_classes = tf.argmax(logits, 1)\n",
        "    if mode == tf.estimator.ModeKeys.PREDICT:\n",
        "        predictions = {\n",
        "            'class_ids': predicted_classes[:, tf.newaxis],\n",
        "            'probabilities': tf.nn.softmax(logits),\n",
        "            'logits': logits,\n",
        "        }\n",
        "        return tf.estimator.EstimatorSpec(mode, predictions=predictions)\n",
        "\n",
        "    # For training and evaluation, compute the loss (MSE)\n",
        "    loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)\n",
        "\n",
        "    accuracy = tf.metrics.accuracy(labels=labels, predictions=predicted_classes, name='acc_op')\n",
        "    metrics = {'accuracy': accuracy}\n",
        "    tf.summary.scalar('accuracy', accuracy[1])\n",
        "\n",
        "    if mode == tf.estimator.ModeKeys.EVAL:\n",
        "        return tf.estimator.EstimatorSpec(mode, loss=loss, eval_metric_ops=metrics)\n",
        "\n",
        "    # For training...\n",
        "    global_step = tf.train.get_global_step()\n",
        "    learning_rate = tf.train.exponential_decay(INITIAL_LEARNING_RATE, global_step, LR_DECAY_STEPS, LR_DECAY_RATE)\n",
        "\n",
        "    optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)\n",
        "    #optimizer = tf.contrib.estimator.clip_gradients_by_norm(optimizer, GRADIENT_NORM_THRESH)\n",
        "    \n",
        "    train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())\n",
        "    return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)\n"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "gTlrASB7iMnw",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 599
        },
        "outputId": "bce45161-8bf4-4f22-a11f-b11c90dc85cf"
      },
      "source": [
        "feature_columns = [tf.feature_column.numeric_column('time_series', [187])]\n",
        "\n",
        "estimator = tf.compat.v1.estimator.Estimator(\n",
        "    model_fn=classifier_fn,\n",
        "    model_dir=MODEL_DIR,\n",
        "    params={\n",
        "        'feature_columns': feature_columns,\n",
        "    })\n",
        "\n",
        "estimator.train(train_input_fn, steps=4000)\n",
        "info = estimator.evaluate(input_fn=eval_input_fn)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "INFO:tensorflow:Using default config.\n",
            "INFO:tensorflow:Using config: {'_model_dir': './Models/CNN-P1', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true\n",
            "graph_options {\n",
            "  rewrite_options {\n",
            "    meta_optimizer_iterations: ONE\n",
            "  }\n",
            "}\n",
            ", '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}\n",
            "I am here\n",
            "(742, 1980)\n",
            "INFO:tensorflow:Calling model_fn.\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "error",
          "ename": "ValueError",
          "evalue": "ignored",
          "traceback": [
            "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
            "\u001b[0;32m<ipython-input-147-bbd015fa12fc>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      8\u001b[0m     })\n\u001b[1;32m      9\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mestimator\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrain_input_fn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msteps\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m4000\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     11\u001b[0m \u001b[0minfo\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mestimator\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput_fn\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0meval_input_fn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py\u001b[0m in \u001b[0;36mtrain\u001b[0;34m(self, input_fn, hooks, steps, max_steps, saving_listeners)\u001b[0m\n\u001b[1;32m    347\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    348\u001b[0m       \u001b[0msaving_listeners\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_check_listeners_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msaving_listeners\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 349\u001b[0;31m       \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_train_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput_fn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhooks\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msaving_listeners\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    350\u001b[0m       \u001b[0mlogging\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Loss for final step: %s.'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mloss\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    351\u001b[0m       \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py\u001b[0m in \u001b[0;36m_train_model\u001b[0;34m(self, input_fn, hooks, saving_listeners)\u001b[0m\n\u001b[1;32m   1173\u001b[0m       \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_train_model_distributed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput_fn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhooks\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msaving_listeners\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1174\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1175\u001b[0;31m       \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_train_model_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput_fn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhooks\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msaving_listeners\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1176\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1177\u001b[0m   \u001b[0;32mdef\u001b[0m \u001b[0m_train_model_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput_fn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhooks\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msaving_listeners\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py\u001b[0m in \u001b[0;36m_train_model_default\u001b[0;34m(self, input_fn, hooks, saving_listeners)\u001b[0m\n\u001b[1;32m   1202\u001b[0m       \u001b[0mworker_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput_hooks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1203\u001b[0m       estimator_spec = self._call_model_fn(features, labels, ModeKeys.TRAIN,\n\u001b[0;32m-> 1204\u001b[0;31m                                            self.config)\n\u001b[0m\u001b[1;32m   1205\u001b[0m       \u001b[0mglobal_step_tensor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompat\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mv1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_global_step\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1206\u001b[0m       return self._train_with_estimator_spec(estimator_spec, worker_hooks,\n",
            "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py\u001b[0m in \u001b[0;36m_call_model_fn\u001b[0;34m(self, features, labels, mode, config)\u001b[0m\n\u001b[1;32m   1161\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1162\u001b[0m     \u001b[0mlogging\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Calling model_fn.'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1163\u001b[0;31m     \u001b[0mmodel_fn_results\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_model_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfeatures\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfeatures\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1164\u001b[0m     \u001b[0mlogging\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Done calling model_fn.'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1165\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m<ipython-input-144-6a50a43dea33>\u001b[0m in \u001b[0;36mclassifier_fn\u001b[0;34m(features, labels, mode, params)\u001b[0m\n\u001b[1;32m     21\u001b[0m     \u001b[0minput_layer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpand_dims\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput_layer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     22\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 23\u001b[0;31m     \u001b[0mlogits\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMODEL_FN\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput_layer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     24\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     25\u001b[0m     \u001b[0;31m# For prediction, exit here\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m<ipython-input-142-097b7344958d>\u001b[0m in \u001b[0;36mcnn_model\u001b[0;34m(input_layer, mode, params)\u001b[0m\n\u001b[1;32m     20\u001b[0m     \u001b[0mlogits\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkeras\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDense\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Output'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcurrent_layer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     21\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 22\u001b[0;31m     \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Parameter count:'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparameter_count\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     23\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mlogits\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m<ipython-input-140-76b5b5965783>\u001b[0m in \u001b[0;36mparameter_count\u001b[0;34m()\u001b[0m\n\u001b[1;32m      9\u001b[0m     \u001b[0mtotal\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     10\u001b[0m     \u001b[0;31m#for v in tf.trainable_variables():\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m     \u001b[0;32mfor\u001b[0m \u001b[0mv\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mVariable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     12\u001b[0m         \u001b[0mv_elements\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     13\u001b[0m         \u001b[0;32mfor\u001b[0m \u001b[0mdim\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_shape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/variables.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(cls, *args, **kwargs)\u001b[0m\n\u001b[1;32m    260\u001b[0m       \u001b[0;32mreturn\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_variable_v1_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    261\u001b[0m     \u001b[0;32melif\u001b[0m \u001b[0mcls\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mVariable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 262\u001b[0;31m       \u001b[0;32mreturn\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_variable_v2_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    263\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    264\u001b[0m       \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mVariableMetaclass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/variables.py\u001b[0m in \u001b[0;36m_variable_v2_call\u001b[0;34m(cls, initial_value, trainable, validate_shape, caching_device, name, variable_def, dtype, import_scope, constraint, synchronization, aggregation, shape)\u001b[0m\n\u001b[1;32m    254\u001b[0m         \u001b[0msynchronization\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msynchronization\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    255\u001b[0m         \u001b[0maggregation\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maggregation\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 256\u001b[0;31m         shape=shape)\n\u001b[0m\u001b[1;32m    257\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    258\u001b[0m   \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/variables.py\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(**kws)\u001b[0m\n\u001b[1;32m    235\u001b[0m                         shape=None):\n\u001b[1;32m    236\u001b[0m     \u001b[0;34m\"\"\"Call on Variable class. Useful to force the signature.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 237\u001b[0;31m     \u001b[0mprevious_getter\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkws\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdefault_variable_creator_v2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkws\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    238\u001b[0m     \u001b[0;32mfor\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgetter\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mops\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_default_graph\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_variable_creator_stack\u001b[0m\u001b[0;34m:\u001b[0m  \u001b[0;31m# pylint: disable=protected-access\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    239\u001b[0m       \u001b[0mprevious_getter\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_make_getter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgetter\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprevious_getter\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/variable_scope.py\u001b[0m in \u001b[0;36mdefault_variable_creator_v2\u001b[0;34m(next_creator, **kwargs)\u001b[0m\n\u001b[1;32m   2665\u001b[0m       \u001b[0msynchronization\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msynchronization\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2666\u001b[0m       \u001b[0maggregation\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maggregation\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2667\u001b[0;31m       shape=shape)\n\u001b[0m\u001b[1;32m   2668\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2669\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/variables.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(cls, *args, **kwargs)\u001b[0m\n\u001b[1;32m    262\u001b[0m       \u001b[0;32mreturn\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_variable_v2_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    263\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 264\u001b[0;31m       \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mVariableMetaclass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    265\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    266\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/resource_variable_ops.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, initial_value, trainable, collections, validate_shape, caching_device, name, dtype, variable_def, import_scope, constraint, distribute_strategy, synchronization, aggregation, shape)\u001b[0m\n\u001b[1;32m   1583\u001b[0m           \u001b[0maggregation\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maggregation\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1584\u001b[0m           \u001b[0mshape\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1585\u001b[0;31m           distribute_strategy=distribute_strategy)\n\u001b[0m\u001b[1;32m   1586\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1587\u001b[0m   def _init_from_args(self,\n",
            "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/resource_variable_ops.py\u001b[0m in \u001b[0;36m_init_from_args\u001b[0;34m(self, initial_value, trainable, collections, caching_device, name, dtype, constraint, synchronization, aggregation, distribute_strategy, shape)\u001b[0m\n\u001b[1;32m   1660\u001b[0m             synchronization, aggregation, trainable, name))\n\u001b[1;32m   1661\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0minitial_value\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1662\u001b[0;31m       \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"initial_value must be specified.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1663\u001b[0m     \u001b[0minit_from_fn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minitial_value\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1664\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;31mValueError\u001b[0m: initial_value must be specified."
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "usNMpUTQs3E9"
      },
      "source": [
        ""
      ],
      "execution_count": null,
      "outputs": []
    }
  ]
}