{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "name": "Course 3 - Week 2 - Exercise - Question.ipynb",
      "provenance": [],
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "metadata": {
        "id": "zX4Kg8DUTKWO"
      },
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/lmoroney/dlaicourse/blob/master/TensorFlow%20In%20Practice/Course%203%20-%20NLP/Course%203%20-%20Week%202%20-%20Exercise%20-%20Question.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "gnwiOnGyW5JK",
        "outputId": "323e7fe2-d261-4cc7-f364-f9d89f43c921"
      },
      "source": [
        "import csv\n",
        "import tensorflow as tf\n",
        "import numpy as np\n",
        "from tensorflow.keras.preprocessing.text import Tokenizer\n",
        "from tensorflow.keras.preprocessing.sequence import pad_sequences\n",
        "\n",
        "!wget --no-check-certificate \\\n",
        "    https://storage.googleapis.com/laurencemoroney-blog.appspot.com/bbc-text.csv \\\n",
        "    -O /tmp/bbc-text.csv"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "--2021-07-05 10:41:32--  https://storage.googleapis.com/laurencemoroney-blog.appspot.com/bbc-text.csv\n",
            "Resolving storage.googleapis.com (storage.googleapis.com)... 108.177.121.128, 108.177.120.128, 142.250.128.128, ...\n",
            "Connecting to storage.googleapis.com (storage.googleapis.com)|108.177.121.128|:443... connected.\n",
            "HTTP request sent, awaiting response... 200 OK\n",
            "Length: 5057493 (4.8M) [application/octet-stream]\n",
            "Saving to: ‘/tmp/bbc-text.csv’\n",
            "\n",
            "/tmp/bbc-text.csv   100%[===================>]   4.82M  --.-KB/s    in 0.08s   \n",
            "\n",
            "2021-07-05 10:41:32 (60.0 MB/s) - ‘/tmp/bbc-text.csv’ saved [5057493/5057493]\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "EYo6A4v5ZABQ"
      },
      "source": [
        "vocab_size = 1000\n",
        "embedding_dim = 16\n",
        "max_length = 120\n",
        "trunc_type = 'post'\n",
        "padding_type = 'post'\n",
        "oov_tok = '<OOV>'\n",
        "training_portion = .8"
      ],
      "execution_count": 2,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "iU1qq3_SZBx_",
        "outputId": "26ae57ea-5638-4b30-89ba-30c2a2b0d5a7"
      },
      "source": [
        "sentences = []\n",
        "labels = []\n",
        "stopwords = [ \"a\", \"about\", \"above\", \"after\", \"again\", \"against\", \"all\", \"am\", \"an\", \"and\", \"any\", \"are\", \"as\", \"at\", \"be\", \"because\", \"been\", \"before\", \"being\", \"below\", \"between\", \"both\", \"but\", \"by\", \"could\", \"did\", \"do\", \"does\", \"doing\", \"down\", \"during\", \"each\", \"few\", \"for\", \"from\", \"further\", \"had\", \"has\", \"have\", \"having\", \"he\", \"he'd\", \"he'll\", \"he's\", \"her\", \"here\", \"here's\", \"hers\", \"herself\", \"him\", \"himself\", \"his\", \"how\", \"how's\", \"i\", \"i'd\", \"i'll\", \"i'm\", \"i've\", \"if\", \"in\", \"into\", \"is\", \"it\", \"it's\", \"its\", \"itself\", \"let's\", \"me\", \"more\", \"most\", \"my\", \"myself\", \"nor\", \"of\", \"on\", \"once\", \"only\", \"or\", \"other\", \"ought\", \"our\", \"ours\", \"ourselves\", \"out\", \"over\", \"own\", \"same\", \"she\", \"she'd\", \"she'll\", \"she's\", \"should\", \"so\", \"some\", \"such\", \"than\", \"that\", \"that's\", \"the\", \"their\", \"theirs\", \"them\", \"themselves\", \"then\", \"there\", \"there's\", \"these\", \"they\", \"they'd\", \"they'll\", \"they're\", \"they've\", \"this\", \"those\", \"through\", \"to\", \"too\", \"under\", \"until\", \"up\", \"very\", \"was\", \"we\", \"we'd\", \"we'll\", \"we're\", \"we've\", \"were\", \"what\", \"what's\", \"when\", \"when's\", \"where\", \"where's\", \"which\", \"while\", \"who\", \"who's\", \"whom\", \"why\", \"why's\", \"with\", \"would\", \"you\", \"you'd\", \"you'll\", \"you're\", \"you've\", \"your\", \"yours\", \"yourself\", \"yourselves\" ]\n",
        "print(len(stopwords))\n",
        "# Expected Output\n",
        "# 153"
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "153\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "eutB2xMiZD0e",
        "outputId": "62815ffb-8e67-4b77-e455-72c7b29cb1af"
      },
      "source": [
        "with open(\"/tmp/bbc-text.csv\", 'r') as csvfile:\n",
        "    csv_reader = csv.reader(csvfile, delimiter=',')\n",
        "    next(csv_reader, None)\n",
        "    \n",
        "    for row in csv_reader:\n",
        "        labels.append(row[0])\n",
        "        sentence = row[1]\n",
        "        \n",
        "        for word in stopwords:\n",
        "            token = ' ' + word + ' '\n",
        "            sentence = sentence.replace(token, ' ').replace('  ', ' ')\n",
        "            \n",
        "        sentences.append(sentence)\n",
        "    \n",
        "print(len(labels))\n",
        "print(len(sentences))\n",
        "print(sentences[0])\n",
        "# Expected Output\n",
        "# 2225\n",
        "# 2225\n",
        "# tv future hands viewers home theatre systems  plasma high-definition tvs  digital video recorders moving living room  way people watch tv will radically different five years  time.  according expert panel gathered annual consumer electronics show las vegas discuss new technologies will impact one favourite pastimes. us leading trend  programmes content will delivered viewers via home networks  cable  satellite  telecoms companies  broadband service providers front rooms portable devices.  one talked-about technologies ces digital personal video recorders (dvr pvr). set-top boxes  like us s tivo uk s sky+ system  allow people record  store  play  pause forward wind tv programmes want.  essentially  technology allows much personalised tv. also built-in high-definition tv sets  big business japan us  slower take off europe lack high-definition programming. not can people forward wind adverts  can also forget abiding network channel schedules  putting together a-la-carte entertainment. us networks cable satellite companies worried means terms advertising revenues well  brand identity  viewer loyalty channels. although us leads technology moment  also concern raised europe  particularly growing uptake services like sky+.  happens today  will see nine months years  time uk   adam hume  bbc broadcast s futurologist told bbc news website. likes bbc  no issues lost advertising revenue yet. pressing issue moment commercial uk broadcasters  brand loyalty important everyone.  will talking content brands rather network brands   said tim hanlon  brand communications firm starcom mediavest.  reality broadband connections  anybody can producer content.  added:  challenge now hard promote programme much choice.   means  said stacey jolna  senior vice president tv guide tv group  way people find content want watch simplified tv viewers. means networks  us terms  channels take leaf google s book search engine future  instead scheduler help people find want watch. kind channel model might work younger ipod generation used taking control gadgets play them. might not suit everyone  panel recognised. older generations comfortable familiar schedules channel brands know getting. perhaps not want much choice put hands  mr hanlon suggested.  end  kids just diapers pushing buttons already - everything possible available   said mr hanlon.  ultimately  consumer will tell market want.   50 000 new gadgets technologies showcased ces  many enhancing tv-watching experience. high-definition tv sets everywhere many new models lcd (liquid crystal display) tvs launched dvr capability built  instead external boxes. one example launched show humax s 26-inch lcd tv 80-hour tivo dvr dvd recorder. one us s biggest satellite tv companies  directtv  even launched branded dvr show 100-hours recording capability  instant replay  search function. set can pause rewind tv 90 hours. microsoft chief bill gates announced pre-show keynote speech partnership tivo  called tivotogo  means people can play recorded programmes windows pcs mobile devices. reflect increasing trend freeing multimedia people can watch want  want."
      ],
      "execution_count": 4,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "2225\n",
            "2225\n",
            "tv future hands viewers home theatre systems plasma high-definition tvs digital video recorders moving living room way people watch tv will radically different five years time. according expert panel gathered annual consumer electronics show las vegas discuss new technologies will impact one favourite pastimes. us leading trend programmes content will delivered viewers via home networks cable satellite telecoms companies broadband service providers front rooms portable devices. one talked-about technologies ces digital personal video recorders (dvr pvr). set-top boxes like us s tivo uk s sky+ system allow people record store play pause forward wind tv programmes want. essentially technology allows much personalised tv. also built-in high-definition tv sets big business japan us slower take off europe lack high-definition programming. not can people forward wind adverts can also forget abiding network channel schedules putting together a-la-carte entertainment. us networks cable satellite companies worried means terms advertising revenues well brand identity viewer loyalty channels. although us leads technology moment also concern raised europe particularly growing uptake services like sky+. happens today will see nine months years time uk adam hume bbc broadcast s futurologist told bbc news website. likes bbc no issues lost advertising revenue yet. pressing issue moment commercial uk broadcasters brand loyalty important everyone. will talking content brands rather network brands said tim hanlon brand communications firm starcom mediavest. reality broadband connections anybody can producer content. added: challenge now hard promote programme much choice. means said stacey jolna senior vice president tv guide tv group way people find content want watch simplified tv viewers. means networks us terms channels take leaf google s book search engine future instead scheduler help people find want watch. kind channel model might work younger ipod generation used taking control gadgets play them. might not suit everyone panel recognised. older generations comfortable familiar schedules channel brands know getting. perhaps not want much choice put hands mr hanlon suggested. end kids just diapers pushing buttons already - everything possible available said mr hanlon. ultimately consumer will tell market want. 50 000 new gadgets technologies showcased ces many enhancing tv-watching experience. high-definition tv sets everywhere many new models lcd (liquid crystal display) tvs launched dvr capability built instead external boxes. one example launched show humax s 26-inch lcd tv 80-hour tivo dvr dvd recorder. one us s biggest satellite tv companies directtv even launched branded dvr show 100-hours recording capability instant replay search function. set can pause rewind tv 90 hours. microsoft chief bill gates announced pre-show keynote speech partnership tivo called tivotogo means people can play recorded programmes windows pcs mobile devices. reflect increasing trend freeing multimedia people can watch want want.\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "XfdaWh06ZGe3",
        "outputId": "566f6c34-7db7-46c9-d179-cbdf8c626675"
      },
      "source": [
        "train_size = int(len(sentences) * training_portion)\n",
        "\n",
        "train_sentences = sentences[:train_size]\n",
        "train_labels = labels[:train_size]\n",
        "\n",
        "validation_sentences = sentences[train_size:]\n",
        "validation_labels = labels[train_size:]\n",
        "\n",
        "print(train_size)\n",
        "print(len(train_sentences))\n",
        "print(len(train_labels))\n",
        "print(len(validation_sentences))\n",
        "print(len(validation_labels))\n",
        "\n",
        "# Expected output (if training_portion=.8)\n",
        "# 1780\n",
        "# 1780\n",
        "# 1780\n",
        "# 445\n",
        "# 445"
      ],
      "execution_count": 5,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "1780\n",
            "1780\n",
            "1780\n",
            "445\n",
            "445\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ULzA8xhwZI22",
        "outputId": "27bb6d57-09f7-44fb-bc93-022ae237426f"
      },
      "source": [
        "\n",
        "tokenizer = Tokenizer(\n",
        "    num_words=vocab_size,\n",
        "    oov_token=oov_tok\n",
        ")\n",
        "tokenizer.fit_on_texts(train_sentences)\n",
        "word_index = tokenizer.word_index\n",
        "\n",
        "train_sequences = tokenizer.texts_to_sequences(train_sentences)\n",
        "\n",
        "train_padded = pad_sequences(\n",
        "    train_sequences,\n",
        "    padding=padding_type,\n",
        "    maxlen=max_length\n",
        ")\n",
        "\n",
        "print(len(train_sequences[0]))\n",
        "print(len(train_padded[0]))\n",
        "\n",
        "print(len(train_sequences[1]))\n",
        "print(len(train_padded[1]))\n",
        "\n",
        "print(len(train_sequences[10]))\n",
        "print(len(train_padded[10]))\n",
        "\n",
        "# Expected Ouput\n",
        "# 449\n",
        "# 120\n",
        "# 200\n",
        "# 120\n",
        "# 192\n",
        "# 120"
      ],
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "449\n",
            "120\n",
            "200\n",
            "120\n",
            "192\n",
            "120\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "c8PeFWzPZLW_",
        "outputId": "0d39865d-201e-4010-8385-c7ae218468f8"
      },
      "source": [
        "validation_sequences = tokenizer.texts_to_sequences(validation_sentences)\n",
        "validation_padded = pad_sequences(\n",
        "    validation_sequences,\n",
        "    padding=padding_type,\n",
        "    maxlen=max_length\n",
        ")\n",
        "\n",
        "print(len(validation_sequences))\n",
        "print(validation_padded.shape)\n",
        "\n",
        "# Expected output\n",
        "# 445\n",
        "# (445, 120)"
      ],
      "execution_count": 7,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "445\n",
            "(445, 120)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "XkWiQ_FKZNp2",
        "outputId": "0eb57f87-81f0-4552-fd6d-a69b42cf62d2"
      },
      "source": [
        "label_tokenizer = Tokenizer()\n",
        "label_tokenizer.fit_on_texts(labels)\n",
        "\n",
        "training_label_seq = np.array(label_tokenizer.texts_to_sequences(train_labels))\n",
        "validation_label_seq = np.array(label_tokenizer.texts_to_sequences(validation_labels))\n",
        "\n",
        "print(training_label_seq[0])\n",
        "print(training_label_seq[1])\n",
        "print(training_label_seq[2])\n",
        "print(training_label_seq.shape)\n",
        "\n",
        "print(validation_label_seq[0])\n",
        "print(validation_label_seq[1])\n",
        "print(validation_label_seq[2])\n",
        "print(validation_label_seq.shape)\n",
        "\n",
        "# Expected output\n",
        "# [4]\n",
        "# [2]\n",
        "# [1]\n",
        "# (1780, 1)\n",
        "# [5]\n",
        "# [4]\n",
        "# [3]\n",
        "# (445, 1)"
      ],
      "execution_count": 8,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "[4]\n",
            "[2]\n",
            "[1]\n",
            "(1780, 1)\n",
            "[5]\n",
            "[4]\n",
            "[3]\n",
            "(445, 1)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "HZ5um4MWZP-W",
        "outputId": "002ed475-d3da-44cd-fcc4-7fbbae10ec1e"
      },
      "source": [
        "model = tf.keras.Sequential([\n",
        "    tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length),\n",
        "    tf.keras.layers.GlobalAveragePooling1D(),\n",
        "    tf.keras.layers.Dense(24, activation='relu'),\n",
        "    tf.keras.layers.Dense(6, activation='softmax')\n",
        "])\n",
        "model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['accuracy'])\n",
        "model.summary()\n",
        "\n",
        "# Expected Output\n",
        "# Layer (type)                 Output Shape              Param #   \n",
        "# =================================================================\n",
        "# embedding (Embedding)        (None, 120, 16)           16000     \n",
        "# _________________________________________________________________\n",
        "# global_average_pooling1d (Gl (None, 16)                0         \n",
        "# _________________________________________________________________\n",
        "# dense (Dense)                (None, 24)                408       \n",
        "# _________________________________________________________________\n",
        "# dense_1 (Dense)              (None, 6)                 150       \n",
        "# =================================================================\n",
        "# Total params: 16,558\n",
        "# Trainable params: 16,558\n",
        "# Non-trainable params: 0"
      ],
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Model: \"sequential\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "embedding (Embedding)        (None, 120, 16)           16000     \n",
            "_________________________________________________________________\n",
            "global_average_pooling1d (Gl (None, 16)                0         \n",
            "_________________________________________________________________\n",
            "dense (Dense)                (None, 24)                408       \n",
            "_________________________________________________________________\n",
            "dense_1 (Dense)              (None, 6)                 150       \n",
            "=================================================================\n",
            "Total params: 16,558\n",
            "Trainable params: 16,558\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "XsfdxySKZSXu",
        "outputId": "24c7781e-dade-4444-f7b1-e53bfe01f2ee"
      },
      "source": [
        "num_epochs = 30\n",
        "history = model.fit(\n",
        "    train_padded,\n",
        "    training_label_seq,\n",
        "    epochs=num_epochs,\n",
        "    validation_data=(validation_padded, validation_label_seq),\n",
        "    verbose=2\n",
        ")"
      ],
      "execution_count": 10,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch 1/30\n",
            "56/56 - 3s - loss: 1.7585 - accuracy: 0.2326 - val_loss: 1.7226 - val_accuracy: 0.2270\n",
            "Epoch 2/30\n",
            "56/56 - 0s - loss: 1.6793 - accuracy: 0.2303 - val_loss: 1.6335 - val_accuracy: 0.2270\n",
            "Epoch 3/30\n",
            "56/56 - 0s - loss: 1.5700 - accuracy: 0.2871 - val_loss: 1.5083 - val_accuracy: 0.4652\n",
            "Epoch 4/30\n",
            "56/56 - 0s - loss: 1.4154 - accuracy: 0.5287 - val_loss: 1.3429 - val_accuracy: 0.5640\n",
            "Epoch 5/30\n",
            "56/56 - 0s - loss: 1.2312 - accuracy: 0.5837 - val_loss: 1.1711 - val_accuracy: 0.6022\n",
            "Epoch 6/30\n",
            "56/56 - 0s - loss: 1.0544 - accuracy: 0.6590 - val_loss: 1.0142 - val_accuracy: 0.7236\n",
            "Epoch 7/30\n",
            "56/56 - 0s - loss: 0.8968 - accuracy: 0.7876 - val_loss: 0.8735 - val_accuracy: 0.8135\n",
            "Epoch 8/30\n",
            "56/56 - 0s - loss: 0.7487 - accuracy: 0.8730 - val_loss: 0.7390 - val_accuracy: 0.8427\n",
            "Epoch 9/30\n",
            "56/56 - 0s - loss: 0.6087 - accuracy: 0.9090 - val_loss: 0.6135 - val_accuracy: 0.8831\n",
            "Epoch 10/30\n",
            "56/56 - 0s - loss: 0.4956 - accuracy: 0.9303 - val_loss: 0.5223 - val_accuracy: 0.8944\n",
            "Epoch 11/30\n",
            "56/56 - 0s - loss: 0.4074 - accuracy: 0.9416 - val_loss: 0.4533 - val_accuracy: 0.9034\n",
            "Epoch 12/30\n",
            "56/56 - 0s - loss: 0.3409 - accuracy: 0.9489 - val_loss: 0.3962 - val_accuracy: 0.9056\n",
            "Epoch 13/30\n",
            "56/56 - 0s - loss: 0.2898 - accuracy: 0.9545 - val_loss: 0.3547 - val_accuracy: 0.9079\n",
            "Epoch 14/30\n",
            "56/56 - 0s - loss: 0.2504 - accuracy: 0.9596 - val_loss: 0.3234 - val_accuracy: 0.9213\n",
            "Epoch 15/30\n",
            "56/56 - 0s - loss: 0.2196 - accuracy: 0.9652 - val_loss: 0.2997 - val_accuracy: 0.9281\n",
            "Epoch 16/30\n",
            "56/56 - 0s - loss: 0.1922 - accuracy: 0.9674 - val_loss: 0.2785 - val_accuracy: 0.9258\n",
            "Epoch 17/30\n",
            "56/56 - 0s - loss: 0.1719 - accuracy: 0.9725 - val_loss: 0.2661 - val_accuracy: 0.9258\n",
            "Epoch 18/30\n",
            "56/56 - 0s - loss: 0.1531 - accuracy: 0.9747 - val_loss: 0.2492 - val_accuracy: 0.9258\n",
            "Epoch 19/30\n",
            "56/56 - 0s - loss: 0.1372 - accuracy: 0.9798 - val_loss: 0.2364 - val_accuracy: 0.9258\n",
            "Epoch 20/30\n",
            "56/56 - 0s - loss: 0.1234 - accuracy: 0.9803 - val_loss: 0.2308 - val_accuracy: 0.9258\n",
            "Epoch 21/30\n",
            "56/56 - 0s - loss: 0.1108 - accuracy: 0.9837 - val_loss: 0.2204 - val_accuracy: 0.9281\n",
            "Epoch 22/30\n",
            "56/56 - 0s - loss: 0.0998 - accuracy: 0.9860 - val_loss: 0.2121 - val_accuracy: 0.9258\n",
            "Epoch 23/30\n",
            "56/56 - 0s - loss: 0.0905 - accuracy: 0.9888 - val_loss: 0.2094 - val_accuracy: 0.9258\n",
            "Epoch 24/30\n",
            "56/56 - 0s - loss: 0.0821 - accuracy: 0.9888 - val_loss: 0.2065 - val_accuracy: 0.9281\n",
            "Epoch 25/30\n",
            "56/56 - 0s - loss: 0.0747 - accuracy: 0.9916 - val_loss: 0.2030 - val_accuracy: 0.9281\n",
            "Epoch 26/30\n",
            "56/56 - 0s - loss: 0.0676 - accuracy: 0.9933 - val_loss: 0.1972 - val_accuracy: 0.9281\n",
            "Epoch 27/30\n",
            "56/56 - 0s - loss: 0.0617 - accuracy: 0.9949 - val_loss: 0.1931 - val_accuracy: 0.9281\n",
            "Epoch 28/30\n",
            "56/56 - 0s - loss: 0.0562 - accuracy: 0.9961 - val_loss: 0.1923 - val_accuracy: 0.9281\n",
            "Epoch 29/30\n",
            "56/56 - 0s - loss: 0.0510 - accuracy: 0.9966 - val_loss: 0.1906 - val_accuracy: 0.9281\n",
            "Epoch 30/30\n",
            "56/56 - 0s - loss: 0.0466 - accuracy: 0.9972 - val_loss: 0.1886 - val_accuracy: 0.9258\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 541
        },
        "id": "dQ0BX2apXS9u",
        "outputId": "6c7105ce-b263-4203-a5d4-62cf2499c8fa"
      },
      "source": [
        "import matplotlib.pyplot as plt\n",
        "\n",
        "\n",
        "def plot_graphs(history, string):\n",
        "  plt.plot(history.history[string])\n",
        "  plt.plot(history.history['val_'+string])\n",
        "  plt.xlabel(\"Epochs\")\n",
        "  plt.ylabel(string)\n",
        "  plt.legend([string, 'val_'+string])\n",
        "  plt.show()\n",
        "  \n",
        "plot_graphs(history, \"accuracy\")\n",
        "plot_graphs(history, \"loss\")"
      ],
      "execution_count": 12,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYMAAAEGCAYAAACHGfl5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de3hU1bn48e+bmdwTIAnhYsJd7iIiEUV7FEErWgWxRbxWqcqpFUU9p2qtR62nv1NP7U1P1RYrXqotWi2K1kJRUWy9ERBREi7hHoQkJCQk5J55f3/MTpzAJExCNpNJ3s/zzDOz196z590Z2O/stdZeS1QVY4wx3VtUuAMwxhgTfpYMjDHGWDIwxhhjycAYYwyWDIwxxgDecAfQVr1799bBgweHOwxjjIkoa9as2a+q6S2tj7hkMHjwYLKzs8MdhjHGRBQR2dnaeqsmMsYYY8nAGGOMJQNjjDFYMjDGGIOLyUBEFolIoYh82cJ6EZHHRCRPRNaLyKluxWKMMaZ1bl4ZPAtMb2X9hcBw5zEPeNLFWIwxxrTCtWSgqquAklY2mQk8r34fA71EpL9b8RhjjGlZOO8zyAB2ByznO2V7wxOOMcaERlWpbfBRW+88Al7XOMsNPg36qPcpPnWefc2fG1RpaPDRoNDg89Hga/48bXRfxg/o5coxRcRNZyIyD39VEgMHDgxzNMaYzq623kd5dR1VdQ1U1TZQVddApfNcVRv4up6qWh+VdfVUO+WVdQ1Nrw9/f01dQ9PJPhz69IjrkslgDzAgYDnTKTuCqi4EFgJkZWXZbDzGRLCa+gbKquooq6yjrKqO0so6KusaQnqvqlJRU0+p896yyjpKq2qb9nOwqo7Sqjoqa0PbX6MYbxTx0R4SYjzER3uIj/G/To7z0rdHrFPmJS46ihhvFLEe/3OMN4oYTxSx0R5iDivzegRPlOARwesRokTwRkURFQXeqCg8UeCJisIjgsfj384T1fzhjWp8nxAVJe35c4csnMlgKTBfRBYDpwNlqmpVRMZ0Yj6fUl5dT3lNHRU19VRU11PuPB++XF7tnLADHqWV/l/rHSHWG0WvhGh6xcfQMz6aAakJ9IyPpld8NL0SokmOiybeObkHnuTjYzwkRHuJi4kiIcZLnDcKr8d62buWDETkz8AUoLeI5AMPANEAqvo74C3gIiAPqATmuhWLMd2RqlJd56Ped1j9tSr1DV+/bvD5l0uraik55H8UVwS8PlTT9PpAZR0NvtYvzkUgKcZLYqyXXgnR9IiPZmDjiTohmp7x0fRMiKFXfHRTWUKMBwjtl29ynJee8dHERXs64K9kGrmWDFT1yqOsV+AWtz7fmK5OVSmqqCH/QBV7DlT5n0sryW98faDqmH6F90qIJjUxhrTEGIb0TmTioFTSEmP8J/i4aJLivCTFekmK89IjzktSrL8sIdrjepWG6XgR0YBsTFemqpQcqqWwvIby6noqauqc56+rXwKXD1bXsa+smj2lVdTUN2/I7JUQTWZKPCemJ3HOiHTSk2PxHlYP3VLddI+4aFKTYkhNjCElIYZoqzrpViwZGOOyYL/g8w9Usqc0tF/wIpAU6yXZ+RWeFOtlVP9kzhvTl8yUeDJ6xZOZkkBGSjxJsfZf2rSP/csxpg3KqurYVVzJvoPVTb/gg/+Kr2t6va+susVf8MPSEzlnRDoZveLp1zOuWfVLsvOcEONBxKpdjLssGRgTQFUpLK9hZ3ElO4sPsauk0v+6xL9cWlkX9H3eKPGfvJ268+RYL32S4xja28sFY+OcX+/2C950XvYv0nQrqkrxodoWq2t2lVQ2q7KJEjihVzyD0xK5aFx/BqUmMCgtgf494+kRH930Cz7WG2W/3k1Es2RgupxDNfXsLK5kV8kh57nS6WnjP/lX1zWvsukR5yUjJYEBqQl8Y3hvBqUlMDA1gUFpiWT0iifGaw2ppuuzZGAi0oFDtWzbf+jrE35AVc7+itpm2wb2sJkyIp2MxuqaXvFkpMTTMz46TEdhTOdhycB0ajX1DeQVVrBpXzkb95WTu/cgm/aVU1he07SNCPTvEcfAtASmjerLwLQEBqcl+n/hpyXQI85O9sYcjSUD02mUVtaydtcBcvf6T/yb9h1ka9GhpjteY7xRjOibxL8NT2dUv2SG9UlkYGoimSnxdjeqMcfIkoEJm7oGH+t2l/LB5iLe37Kf9fmlqDPSQUaveEb3T+abY/oxsl8yo/snMzgt0caQMcYllgzMcbWz+BCrtuzng81FfLS1mPKaeqIEThnQi9umDufMYWmMPqGHVe0Yc5xZMjCuUlXe31zE27kFfLBlPzuLKwH/L/+Lx5/AOSN6M3lYb2vENSbMLBkYV6gqH2zZzy/+sYn1+WUkxniYPCyN7501hLNHpDM4LSFy+uXX10LJVijMhaJNULQRDhVBTBLEJgc8ehy27DyiIuG/mUJtJdSUO4+DAa8PK2uoC3KcwY69B0SF2Jbjq/96/9UHW49DwzOxjGuivEf+7eJ6BP+bpgyBhFRXwoiEf6UmwmTvKOGR5Zv4ZHsJGb3ieeQ7JzPzlIzO31+/vgb2b/Gf7Jsem6B4K2jjjWgCqUMguT9UFEBx3tcnqfqqsIbvColyTko9mie3in1QvCXg2Kvd+fzohOYnw5ikCEmubdBQF/rf81u/gtNucCWMLvZXNeH05Z4yfvmPTazcVETvpFgemjmWOacNINbbiXv61JTD5uWwYQnkvf31f0LxQOpQSB8Jo2dA+ijoMwrSToTo+OD7aqgL/ovW1zGTubguJuGwX/k9/McayhVcfS3UVhz5Sz7UY4/yOr+GA0/8yeDppqeolv6e6aNc+8hu+pc2HSmvsIJfr9jM377YS8/4aO6ePorrzhxEQkwn/edVXQablkHOa5D3DjTU+H/pn/pdGHgGpI+GtGHgjW3bfj3R/kt4ly7jOzVvDHi76bG7IQx/z076v9VEgvwDlTz69hZeXZtPXLSH26aeyA3/NrRzNgZXlcKmtyDnddj6LjTUQo8M/yX3mJmQOQmiOnk1ljEucjUZiMh04FHAA/xBVR8+bP0gYBGQDpQA16hqvpsxmWOnqjz1wTYeWb4JEWHuWUO4ecoweie18Zf0sfD5oO5Q8AbOw8sKN8K298BXBz0HwKR5MOZSyJhoCcAYh5tzIHuAx4HzgXxgtYgsVdWcgM1+ATyvqs+JyFTgZ8C1bsVkjl2DT3lw6Qb++PFOLhjblwdnjKV/zxbq0NuisgT2rPE32IbSo6WmHGh9Ll7A3wCZ3B/OuNlJAKeGVgduTDfj5pXBJCBPVbcBiMhiYCYQmAzGAHc6r1cCr7kYjzlGVbUN3Lb4M1bkFDDv7KHcM31U++a6baiHolzY/SnkZ0P+an9PikAxQbpoJvdr3qulWYNjkG543bkB0pg2cvN/SgawO2A5Hzj9sG0+By7DX5U0C0gWkTRVLQ7cSETmAfMABg4c6FrApmXFFTXc8Fw2n+eX8pMZY7nuzMGhv/nQfufEv9r/2LPWX8UDkJgOmafBKVf66+37joW4XlZ9Y8xxFu6fTf8J/FZErgdWAXuAI/qiqepCYCFAVlZWCHUDpiNt33+I65/5lH1l1fzumolcMLZf62+or4FdH/sbare+A/u+8JdHeaHfyTDhGn8CGHAa9Bpk1TbGdAJuJoM9wICA5UynrImqfoX/ygARSQK+raqlLsZk2mjNzgPc9Hw2AH+edwanDkw5ciNV2L/ZOfm/Czv+CXWVEBXt76o59b9g8Deg//iW++gbY8LKzWSwGhguIkPwJ4ErgKsCNxCR3kCJqvqAH+HvWWQ6iWVf7mPB4s/o1zOO5+ZOYnDvxK9X1lX7u2pufRe2roSDTiewtBNhwrUwbKo/AcQmhSd4Y0ybuJYMVLVeROYDy/F3LV2kqhtE5CEgW1WXAlOAn4mI4q8musWteEzbPPuv7fzkzRzGZ/bi6euySAvsNlpTAS/Ohl0fQmxPGHoOnPNDGHoupAwKX9DGmHYT1ciqgs/KytLs7Oxwh9Fl+XzKz/6ey1MfbOf8MX157IoJxMcEDCdRUw4vfMffEDzztzDucuuxY0wEEJE1qprV0nr7X2yaqCp3vryO19Z9xXcnD+KBS8biCew6Wn0QXvi2/36A7zwNY2eFL1hjTIeyZGCafLi1mNfWfcWtU0/kzvNHNB9iurrMnwi++gxmP+MfwsEY02VYMjBNfvtuHn2SY7nl3BObJ4KqUnjhMtj7Ocx+FkZfErYYjTHusDt7DODvQvrRtmLmnT20+eTyVQfgj5fC3vVw+R8tERjTRdmVgQHgiZV59EqI5spJAXd4V5b4E0FhLsx5AUZOD1+AxhhX2ZWBIeerg7yzsZDvnTWExFjn90FlCTw/wz/i55wXLREY08XZlYHhiffySIr1ct3kwf6CQ8Xw/Ez/XcVX/glOPC+s8Rlj3GdXBt3ctqIK/vbFXq45YxA9E6L9g8o9d4l/FNEr/2yJwJhuwpJBN/e797cS44nihm8M8bcNPHMRlGyDKxfDidPCHZ4x5jixZNCN7Smt4q9r93BFVibpuc/DwilQVQJX/wWGnRvu8Iwxx5G1GXRjC9/fSipl3FO2CNatgBPPh0ufgKQ+4Q7NGHOcWTLoporKa9iT/QbvJCwkftchuPDn/rmBbW4BY7olSwbdUV01O168jT94XqK2xyiYs8g/w5gxptuyNoPupjCXhoVTOW3fS7zXaxYxN79nicAYY8mg21CFT5+ChVOoKd3L9bU/pM/lj9nMY8YYwKqJuofKEnjtZti8jPqh53Hx9jkMGTGEMSf0CHdkxphOwpJBd7Difsh7By78Oc/WnMe2nI08cu6J4Y7KGNOJuFpNJCLTRWSTiOSJyD1B1g8UkZUi8pmIrBeRi9yMp1sq3wfrX4KJ11F96o0s/GA7k4emMXFQkIntjTHdlmvJQEQ8wOPAhcAY4EoRGXPYZvcBL6vqBOAK4Am34um2Pl0IDXUw+RZeXZtPYXkN86faVYExpjk3rwwmAXmquk1Va4HFwOHTYynQWHHdE/jKxXi6n5oKWP00jL6E+p6D+d37Wxk/oBdnDksLd2TGmE7GzWSQAewOWM53ygI9CFwjIvnAW8CtwXYkIvNEJFtEsouKityItWv67AWoLoUzb+ON9V+xu6SK+YfPYmaMMYS/a+mVwLOqmglcBPxRRI6ISVUXqmqWqmalp6cf9yAjUkM9fPw4DJyMLyOLJ1ZuZWTfZKaNsqEmjDFHcjMZ7AEGBCxnOmWBbgBeBlDVj4A4oLeLMXUfua9D6S4481ZW5BawpbCCH5w7jKgouyowxhzJzWSwGhguIkNEJAZ/A/HSw7bZBUwDEJHR+JOB1QMdK1X412OQdiKMuJAla/fQJzmWb43rH+7IjDGdlGvJQFXrgfnAciAXf6+hDSLykIjMcDb7D+AmEfkc+DNwvaqqWzF1Gzv+CXvXweT5VNUr728u4oKx/fB6wl0raIzprFy96UxV38LfMBxYdn/A6xzgLDdj6JY+fAwS02H8lazaXERVXQMXjO0X7qiMMZ2Y/VTsagpzYcs//MNRR8exfMM+esZHc/rQ1HBHZozpxCwZdDUf/ha88XDajdQ1+Hgnt5Bpo/sQbVVExphW2BmiK2kcemLCNZCQyifbSiirqrMqImPMUVky6Eo++R1oA0z+AQDLN+wjPtrD2cPt3gxjTOssGXQVNeWQvQhGXwKpQ/H5lOUb9nHOiHTiYzzhjs4Y08lZMugq1v4RqsvgzNsAWJdfSmF5DRec1DfMgRljIoElg66goR4+fgIGngmZWYC/isgbJUwdZcnAGHN0lgy6gpzXoGw3nOkf509VWf7lPiYPS6NnfHSYgzPGRAJLBpFO1X+TWdpwGDEdgM0FFewormT6SdaLyBgTGksGkW77Ktj7OZw5H6L8X+fyDfsQgfPHWBWRMSY0lgwi3Yf/5x964uQrmoqWfbmPUwem0Cc5LoyBGWMiiSWDSFaQA3krYNK/Q7T/xL+7pJKcvQeZbjeaGWPawJJBJPvotxCdAKfd0FS0fMM+ALvr2BjTJpYMIlXVAfjiL3DKVZDw9SB0yzfsY1S/ZAamJYQxOGNMpLFkEKk2vgUNtTD+qqaiovIasncesF5Expg2s2QQqTYsgV4DIePUpqIVOQWoWhWRMabtXE0GIjJdRDaJSJ6I3BNk/a9FZJ3z2CwipW7G02VUlsC2lTB2FsjXcxov37CPQWkJjOqXHMbgjDGRyLWZzkTEAzwOnA/kA6tFZKkzuxkAqnpHwPa3AhPciqdL2fgm+Or9ycBxsLqOD7fuZ+5ZQxCxSe+NMW3j5pXBJCBPVbepai2wGJjZyvZX4p8H2RzNhiWQMgT6n9JUtHJjIXUNygVj7UYzY0zbuZkMMoDdAcv5TtkRRGQQMAR418V4uoZDxbDt/aBVROnJsUwYkBLG4IwxkaqzNCBfAbyiqg3BVorIPBHJFpHsoqKi4xxaJ5O71D+BTUAVUXVdA+9tKuKbY/oSFWVVRMaYtnMzGewBBgQsZzplwVxBK1VEqrpQVbNUNSs9vZvP2rVhCaQOg37jmoo+2LKfytoG61JqjGm3kJKBiPxVRL4lIm1JHquB4SIyRERi8J/wlwbZ9yggBfioDfvuniqKYMcHcNJlR1QR9YjzcsbQtDAGZ4yJZKGe3J8ArgK2iMjDIjLyaG9Q1XpgPrAcyAVeVtUNIvKQiMwI2PQKYLGqahtj735yl4L6mlUR1Tf4eDu3gGmj+xLt6Sy1fsaYSBNS11JVfRt4W0R64u/187aI7AaeAl5Q1boW3vcW8NZhZfcftvxgO+LunjYsgd4joM+YpqJPt5dQWllnN5oZY45JyD8lRSQNuB64EfgMeBQ4FVjhSmSmufIC2PHPoL2I4qKjOGdEN29LMcYck5CuDERkCTAS+CNwiarudVa9JCLZbgVnAuQuBbRZFZHPpyzfUMDZw9OJj/GELzZjTMQL9Q7kx1R1ZbAVqprVgfGYlnz5V0gfDX1GNxWt31PGvoPV3HXSUZtwjDGmVaFWE40RkV6NCyKSIiI/cCkmc7iDX8Guj5pdFYC/isgbJUwbZXcdG2OOTajJ4CZVbRpETlUPADe5E5I5Qs6RVUSqyrIv9zF5WBo9E6LDF5sxpksINRl4JGD0M2cQuhh3QjJH2LAE+p4E6SOaiv72xV627z/ErAlBR/gwxpg2CTUZLMPfWDxNRKbhv1t4mXthmSZl+bD7Yxh7aVNRbb2PR5ZvYlS/ZGaeYsnAGHPsQm1Avhv4d+BmZ3kF8AdXIjLN5bzufx57WVPRnz/dxc7iSp65/jQ8NhaRMaYDhHrTmQ940nmY42nDEuh3MqQNA6C8uo7H3tnCGUNTmTLS7i0wxnSMUMcmGi4ir4hIjohsa3y4HVy3V7oL8lc3azh+atU2ig/V8qMLR9skNsaYDhNqm8Ez+K8K6oFzgeeBF9wKyjg2vOZ/dtoLCg9W89QH27n45P6MH9CrlTcaY0zbhJoM4lX1HUBUdaczntC33AvLAP4qov6nQOpQAH7zzhbqfT5+eIHdZGaM6VihJoMaZ/jqLSIyX0RmAUkuxmUO7ICv1vqHqwbyCit4afVurj59EIPSEsMbmzGmywk1GSwAEoDbgInANcB1bgVl+LqKaIy/iujnyzYSH+3h1qknhjEoY0xXddTeRM4NZnNU9T+BCmCu61EZ2PBXyJgIKYPI3lHCP3IK+I/zR5CWFBvuyIwxXdBRrwyceYm/cRxiMY2Kt8Lez2HsZagqP/v7Rvokx3LDvw0Jd2TGmC4q1JvOPhORpcBfgEONhar6V1ei6u5yGquIZvKPnALW7DzA/8waR0JMqF+XMca0TahtBnFAMTAVuMR5XHy0N4nIdBHZJCJ5InJPC9tc7ty/sEFE/hRq4F3ahiWQOYn65Ax+vmwjw9ITuTwrM9xRGWO6sFDvQG5zO4HT1vA4cD6QD6wWkaWqmhOwzXDgR8BZqnpARPq09XO6nP15sO8LuOBnvJydz9aiQ/z+2ol4bX5jY4yLQp3p7BngiAnrVfV7rbxtEpCnqtucfSwGZgI5AdvcBDzuDImNqhaGGHfXVFcN//gxIFQN/xa//v1mJg5K4ZtjbL4CY4y7Qq2EfjPgdRwwC/jqKO/JAHYHLOcDpx+2zQgAEfkX4AEeVNUjRkMVkXnAPICBAweGGHKEqSmHxVfB9lVw0S/4w+e1FJXX8LtrTrVhJ4wxrgu1mujVwGUR+TPwzw76/OHAFCATWCUi4wIn0nE+fyGwECArK+uIK5SIV1kCL34HvloHsxZSPOxSfv/Ie3xzTF8mDkoNd3TGmG6gvRXRw4Gj1e/vAQYELGc6ZYHygaWqWqeq24HNzr67j4N74ZmLYN+XMOcFGD+H/3s3j6q6Bu6aPirc0RljuolQRy0tF5GDjQ/gDfxzHLRmNTBcRIaISAxwBbD0sG1ew39VgIj0xl9t1H1GQy3ZBosugLLdcM0rMOoidhYf4sVPdjLntAGc2MdG/DDGHB+hVhMlt3XHqlovIvOB5fjbAxap6gYReQjIVtWlzrpvikgO0AD8UFWL2/pZEakgB/54KTTUwnVLIWMi9Q0+fviX9UR7orh9Wve6QDLGhFeovYlmAe+qapmz3AuYoqqvtfY+VX0LeOuwsvsDXitwp/PoPvKz4YVvQ3Q8zP079BkNwGPvbOHTHSX8es54+vSIC3OQxpjuJNQ2gwcaEwGA08D7gDshdXHb3oPnZkB8L/jesqZE8K+8/fzfyjxmT8xk1gS7wcwYc3yFmgyCbWdjI7RV7hvw4mxIGQTfWw4pgwEoKq9hweJ1DEtP4iczx4Y3RmNMtxRqMsgWkV+JyDDn8StgjZuBdTmfL4aXr/PPZ3z93yC5HwANPuWOl9ZRXl3H41edauMPGWPCItRkcCtQC7wELAaqgVvcCqrLKd8Hr8+HQWfCd1+HhK/vHXjyvTz+mbefn8wYy8h+bW6nN8aYDhFqb6JDQNCB5kwI1j4Pvjq45FGI/bq76KfbS/jVis3MPOUE5pw2oJUdGGOMu0K9z2CF04OocTlFRJa7F1YX0lAPa56FYVMhbVhTccmhWm7782cMTE3g/80aZ0NOGGPCKtRqot6BQ0Q4A8vZCKOh2LwMDu6B025sKvL5lP/8y+eUHKrlt1edSlKstRMYY8Ir1GTgE5GmEeJEZDBBRjE1Qaz+A/TIhOEXNBX94Z/beHdjIfddPJqTMnqGMThjjPEL9Sfpj4F/isj7gAD/hjOKqGnF/jzYthKm3gce/5967a4D/HzZJqaP7ce1ZwwKc4DGGOMXagPyMhHJwp8APsM/plCVm4F1CdmLIMoLE74LQFllHbf+6TP69Yzjf79zsrUTGGM6jVCHo7gRWIB/5NF1wBnAR/inwTTB1FbCuhdg9AxI7ouqctern1NwsJq/fH8yPeOjwx2hMcY0CbXNYAFwGrBTVc8FJgClrb+lm/vyVagua2o4fv6jnSzfUMA9F45iwsCUMAdnjDHNhZoMqlW1GkBEYlV1IzDSvbAinCqsfgrSR8OgM6lv8PG/yzZyzoh0bvjGkHBHZ4wxRwi1ATnfuc/gNWCFiBwAdroXVoTbsxb2fg4X/QJE2FF8iMraBmaMP8HaCYwxnVKoDciznJcPishKoCdwxFzFxpH9NMQkwclzANhSUA7AiL423IQxpnNq891Oqvq+G4F0GZUl/vaCU66GuB4AbCooRwSbucwY02m1dw5k05J1L0J9NZx2Q1PRloIKBqYmEB/jCWNgxhjTMleTgYhMF5FNIpInIkcMdCci14tIkYiscx43BttPxPD5YPXTMPBM6Pv1vASbC8oZ3seqiIwxnZdryUBEPMDjwIXAGOBKERkTZNOXVPUU5/EHt+I5Lra9Cwe2N7sqqK33sX3/IUb0tSoiY0zn5eaVwSQgT1W3qWot/nkQZrr4eeG3+mlITIfRlzQVbd9/iHqf2lwFxphOzc1kkAHsDljOd8oO920RWS8ir4hI0EH9RWSeiGSLSHZRUZEbsR670l3+EUpP/S54Y5uKNzs9iayayBjTmYW7AfkNYLCqngysAJ4LtpGqLlTVLFXNSk9PP64BhmzNs/7nidc3K95cUE6UwND0xOMekjHGhMrNZLAHCPyln+mUNVHVYlWtcRb/AEx0MR731Nf4ZzMbMR16DWy2anNBOYN7JxIXbT2JjDGdl5vJYDUwXESGiEgMcAWwNHADEekfsDgDyHUxHvfkvgGHipo1HDfaUlDBCKsiMsZ0cq4lA1WtB+YDy/Gf5F9W1Q0i8pCIzHA2u01ENojI58BtwPVuxeOq1U9DyhAY2nwQ1+q6BnYUW08iY0zn5+p8i6r6FvDWYWX3B7z+EfAjN2NwXcEG2PUhfPOnENU8t24tqsCnMMJ6EhljOrlwNyBHvtVPgzfOP/zEYbYUVAA2JpExpvOzZHAsqg/C+pdg7GWQkHrE6k0F5UR7hMFp1pPIGNO5WTI4FhuWQG1F0IZj8I9WOqR3IjFe+zMbYzo3O0sdiz3ZkJAGGcF7xG4uqGC4VREZYyKAJYNjUZgLfcZAkAlrKmvr2VVSyUhLBsaYCGDJoL1UoXAj9BkddHVeYWPjsXUrNcZ0fpYM2qssH2rLW0wGm52eRFZNZIyJBJYM2qvQuVm6T7BRuf3DUMR4oxiUmnAcgzLGmPaxZNBehTn+5/RRQVdvLihnWHoSXo/9iY0xnZ+dqdqrMBeST4D4XkFXbymosPYCY0zEsGTQXoU5LbYXlFfXsae0yu48NsZEDEsG7eFrgKJNLSaDLYU2DIUxJrJYMmiPku3QUNNi4/EWZ3YzqyYyxkQKSwbt0dh43MKVwaZ9FcRFRzEgxXoSGWMigyWD9ijMBQTSRwZdvaWwnOF9komKOvLOZGOM6YwsGbRHYQ6kDIaY4KORbi4oZ7hVERljIoiryUBEpovIJhHJE5F7Wtnu2yKiIpLlZjwdpnFMoiDKKusoOFhjYxIZYyKKa8lARDzA48CFwBjgShE54gwqIsnAAuATt2LpUPU1UJzX8jAUhY2Nx5YMjDGRw80rg0lAnqpuU9VaYDEwM8h2/w38L1DtYiwdZ/8W0IZWxiTyJwOrJjLGRBI3k0EGsDtgOd8payIipwIDVPVvLuYA5YQAABQRSURBVMbRsY42JtG+chJjPGT0ij+OQRljzLEJWwOyiEQBvwL+I4Rt54lItohkFxUVuR9cawpzIMoLaScGXd04oY0EmePAGGM6KzeTwR5gQMByplPWKBk4CXhPRHYAZwBLgzUiq+pCVc1S1az09HQXQw5BYS6kDQdvTNDVWwrL7WYzY0zEcTMZrAaGi8gQEYkBrgCWNq5U1TJV7a2qg1V1MPAxMENVs12M6di1MiZRcUUN+ytqrfHYGBNxXEsGqloPzAeWA7nAy6q6QUQeEpEZbn2uq2oPQenOVuYwsDGJjDGRyevmzlX1LeCtw8rub2HbKW7G0iGKNvqfWxygzrqVGmMik92B3BZNPYlaGpOonB5xXvr2iD2OQRljzLGzZNAWhbngjfcPRRGEf0Ib60lkjIk8lgzaojDHPzhdlOeIVarK5sJyhlsVkTEmAlkyaIvC3BariIrKayitrGOkdSs1xkQgSwahqiyB8r2tDENhPYmMMZHLkkGomnoStdSttHFMIksGxpjIY8kgVEeZ3WxzQTmpiTH0Tgp+Z7IxxnRmlgxCVZgLsT2gR0bQ1ZsLyhneJ8l6EhljIpIlg1A1Nh4HOdmralO3UmOMiUSWDEKh2uqYRHvLqimvqWdEP0sGxpjI5OpwFF1GRQFUHThq4/GIPtat1HQ/dXV15OfnU10dGfNTdXVxcXFkZmYSHR3dpvdZMgjFURqPt1i3UtON5efnk5yczODBg63NLMxUleLiYvLz8xkyZEib3mvVRKE4yuxmmwrKSU+OJSXRehKZ7qe6upq0tDRLBJ2AiJCWltauqzRLBqEozIHEdEjsHXT1lgKb0MZ0b5YIOo/2fheWDELRyjAUPp+ypbCC4X2sisgYE7ksGRyNzwdFm1qsItpTWkVlbQMjrSeRMSaCWTI4mrLdUFvR6p3HgFUTGdMN1NfXhzsE17jam0hEpgOPAh7gD6r68GHrvw/cAjQAFcA8Vc1xM6Y2O0rjceMAdSdaNZEx/OSNDeR8dbBD9znmhB48cMnYo2536aWXsnv3bqqrq1mwYAHz5s1j2bJl3HvvvTQ0NNC7d2/eeecdKioquPXWW8nOzkZEeOCBB/j2t79NUlISFRX+/8+vvPIKb775Js8++yzXX389cXFxfPbZZ5x11llcccUVLFiwgOrqauLj43nmmWcYOXIkDQ0N3H333SxbtoyoqChuuukmxo4dy2OPPcZrr70GwIoVK3jiiSdYsmRJh/6NOoJryUBEPMDjwPlAPrBaRJYedrL/k6r+ztl+BvArYLpbMbVLY7fS9FFBV28uKKd/zzh6xretT68xpmMtWrSI1NRUqqqqOO2005g5cyY33XQTq1atYsiQIZSUlADw3//93/Ts2ZMvvvgCgAMHDhx13/n5+Xz44Yd4PB4OHjzIBx98gNfr5e233+bee+/l1VdfZeHChezYsYN169bh9XopKSkhJSWFH/zgBxQVFZGens4zzzzD9773PVf/Du3l5pXBJCBPVbcBiMhiYCbQlAxUNfAnRCKgLsbTPoW50HMAxPUIunpzgU1oY0yjUH7Bu+Wxxx5r+sW9e/duFi5cyNlnn93U3z41NRWAt99+m8WLFze9LyUl5aj7nj17Nh6Pf1KrsrIyrrvuOrZs2YKIUFdX17Tf73//+3i93mafd+211/LCCy8wd+5cPvroI55//vkOOuKO5WYyyAB2ByznA6cfvpGI3ALcCcQAU4PtSETmAfMABg4c2OGBtqqVnkQNPiWvsILJQ9OOb0zGmGbee+893n77bT766CMSEhKYMmUKp5xyChs3bgx5H4FdMg/vp5+YmNj0+r/+678499xzWbJkCTt27GDKlCmt7nfu3LlccsklxMXFMXv27KZk0dmEvQFZVR9X1WHA3cB9LWyzUFWzVDUrPT39+AXXUA/7N7WYDHaVVFJT77MxiYwJs7KyMlJSUkhISGDjxo18/PHHVFdXs2rVKrZv3w7QVE10/vnn8/jjjze9t7GaqG/fvuTm5uLz+Vqt0y8rKyMjwz968bPPPttUfv755/P73/++qZG58fNOOOEETjjhBH76058yd+7cjjvoDuZmMtgDDAhYznTKWrIYuNTFeNquZBs01EL60XoSWTIwJpymT59OfX09o0eP5p577uGMM84gPT2dhQsXctlllzF+/HjmzJkDwH333ceBAwc46aSTGD9+PCtXrgTg4Ycf5uKLL+bMM8+kf//+LX7WXXfdxY9+9CMmTJjQrHfRjTfeyMCBAzn55JMZP348f/rTn5rWXX311QwYMIDRo4OfSzoDUXWnml5EvMBmYBr+JLAauEpVNwRsM1xVtzivLwEeUNWs1vablZWl2dnZrsR8hA2vwV+ug3nvwwmnNFulqsz/02f8I2cf6+7/JomxnfPSzxi35ebmduqTXGcwf/58JkyYwA033HBcPi/YdyIia1o7v7p2BlPVehGZDyzH37V0kapuEJGHgGxVXQrMF5HzgDrgAHCdW/G0S2EuIJA+8ohVr67dw9++2MsPLxhpicAY06KJEyeSmJjIL3/5y3CH0ipXz2Kq+hbw1mFl9we8XuDm5x+zwhxIHQrR8c2Kt+8/xP2vf8kZQ1P5/jnDwhScMSYSrFmzJtwhhCTsDcidWpCeRLX1PhYs/owYbxS/nnMKnigboMsYE/ksGbSkrhpKth5x5/GvVmxmfX4ZD192Mv17xrfwZmOMiSyWDFqyfzOor9mVwb/y9vP7VVu56vSBTD+pXxiDM8aYjmXJoCWHjUlUcqiWO15ax7D0JP7rW8HHKTLGmEhlyaAlhTkQFQ1pw1BV7nrlc0or63jsignEx3jCHZ0xxnQoSwYtKcyF3iPAE80LH+/k7dxC7rlwFGNOCD5GkTEmMiQl2XDzwVgH+ZYU5ULmJDbtK+enf8tlysh05p41ONxRGdO5/f0e2PdFx+6z3zi48OGjbxdh6uvrO9U4RXZlEExNOZTuoq73KG7782ckx0Xzi9njbZ5XYzqhe+65p9lYQw8++CA//elPmTZtGqeeeirjxo3j9ddfD2lfFRUVLb7v+eefbxpq4tprrwWgoKCAWbNmMX78eMaPH8+HH37Ijh07OOmkk5re94tf/IIHH3wQgClTpnD77beTlZXFo48+yhtvvMHpp5/OhAkTOO+88ygoKGiKY+7cuYwbN46TTz6ZV199lUWLFnH77bc37fepp57ijjvuaPff7QiqGlGPiRMnqut2r1Z9oIe+8NwTOujuN/W9TYXuf6YxESonJyesn7927Vo9++yzm5ZHjx6tu3bt0rKyMlVVLSoq0mHDhqnP51NV1cTExBb3VVdXF/R9X375pQ4fPlyLiopUVbW4uFhVVS+//HL99a9/raqq9fX1Wlpaqtu3b9exY8c27fORRx7RBx54QFVVzznnHL355pub1pWUlDTF9dRTT+mdd96pqqp33XWXLliwoNl25eXlOnToUK2trVVV1cmTJ+v69euDHkew7wT/yA8tnls7zzVKZ+JMaPO73Fhu/MYQzhlxHEdKNca0yYQJEygsLOSrr76iqKiIlJQU+vXrxx133MGqVauIiopiz549FBQU0K9f613CVZV77733iPe9++67zJ49m969ewNfz1Xw7rvvNs1P4PF46Nmz51Eny2kcMA/8k+bMmTOHvXv3Ultb2zT3QktzLkydOpU333yT0aNHU1dXx7hx49r412pZt0kGu4or2VlyiKRYL8lx0STHeUmK9ZIQ4zmi+udQ/hdEEUvPfsP44fQjxyUyxnQus2fP5pVXXmHfvn3MmTOHF198kaKiItasWUN0dDSDBw8+Yo6CYNr7vkBerxefz9e03NrcCLfeeit33nknM2bM4L333muqTmrJjTfeyP/8z/8watSoDh8Ou9skg7e+3MvDfz9yoosogcRYL8mxXpKcBHHv/k+I0UwevWoisV7rRmpMZzdnzhxuuukm9u/fz/vvv8/LL79Mnz59iI6OZuXKlezcuTOk/ZSVlQV939SpU5k1axZ33nknaWlplJSUkJqayrRp03jyySe5/fbbaWhooKKigr59+1JYWEhxcTFJSUm8+eabTJ8efDbfwLkRnnvuuabyxjkXfvOb3wD+ORdSUlI4/fTT2b17N2vXrmX9+vXH8ic7QrdJBldFv893+z6BT9V5gM8X8FoVX6XiOwR9fXsoGDKDzHTrgmZMJBg7dizl5eVkZGTQv39/rr76ai655BLGjRtHVlYWo0YFn8P8cC29b+zYsfz4xz/mnHPOwePxMGHCBJ599lkeffRR5s2bx9NPP43H4+HJJ59k8uTJ3H///UyaNImMjIxWP/vBBx9k9uzZpKSkMHXq1KaJeO677z5uueUWTjrpJDweDw888ACXXXYZAJdffjnr1q0LabrOtnBtPgO3tHs+g41/g/UvhbatRMHk+ZDZ6tQKxhhsPoPj7eKLL+aOO+5g2rRpLW7TqeYz6HRGfcv/MMaYCFRaWsqkSZMYP358q4mgvbpPMjDGGMcXX3zRdK9Ao9jYWD755JMwRXR0vXr1YvPmza7t35KBMeaYqWpE3ZQ5btw41q1bF+4wXNHeqn9X70AWkekisklE8kTkniDr7xSRHBFZLyLviMggN+MxxnS8uLg4iouL230SMh1HVSkuLiYuLq7N73XtykBEPMDjwPlAPrBaRJaqak7AZp8BWapaKSI3Az8H5hy5N2NMZ5WZmUl+fj5FRUXhDsXgT86ZmZltfp+b1USTgDxV3QYgIouBmUBTMlDVlQHbfwxc42I8xhgXREdHN905ayKXm9VEGcDugOV8p6wlNwB/D7ZCROaJSLaIZNuvD2OM6XidYtRSEbkGyAIeCbZeVReqapaqZqWn2zhBxhjT0dysJtoDDAhYznTKmhGR84AfA+eoao2L8RhjjGmBa3cgi4gX2AxMw58EVgNXqeqGgG0mAK8A01V1S4j7LQJCG2jkSL2B/e18b2fV1Y6pqx0PdL1j6mrHA13vmIIdzyBVbbFqxdXhKETkIuA3gAdYpKr/T0Qewj+u9lIReRsYB+x13rJLVWe4GE92a7djR6Kudkxd7Xig6x1TVzse6HrH1J7jcfWmM1V9C3jrsLL7A16f5+bnG2OMCU2naEA2xhgTXt0tGSwMdwAu6GrH1NWOB7reMXW144Gud0xtPp6IG8LaGGNMx+tuVwbGGGOCsGRgjDGm+ySDo42gGmlEZIeIfCEi60SkHVO/hZ+ILBKRQhH5MqAsVURWiMgW57lj5/ZzUQvH86CI7HG+p3VOd+uIISIDRGSlM7rwBhFZ4JRH5PfUyvFE7PckInEi8qmIfO4c00+c8iEi8olzzntJRGJa3U93aDNwRlDdTMAIqsCVh42gGlFEZAf+EV8j9kYZETkbqACeV9WTnLKfAyWq+rCTtFNU9e5wxhmqFo7nQaBCVX8RztjaS0T6A/1Vda2IJANrgEuB64nA76mV47mcCP2exD+RRKKqVohINPBPYAFwJ/BXVV0sIr8DPlfVJ1vaT3e5MmgaQVVVa4HGEVRNGKnqKqDksOKZwHPO6+fw/0eNCC0cT0RT1b2qutZ5XQ7k4h9wMiK/p1aOJ2KpX4WzGO08FJiKf4QHCOE76i7JoK0jqEYCBf4hImtEZF64g+lAfVW18Y70fUDfcAbTQeY7EzgtipTqlGBEZDAwAfiELvA9HXY8EMHfk4h4RGQdUAisALYCpapa72xy1HNed0kGXdE3VPVU4ELgFqeKoktRfx1mpNdjPgkMA07BP+zKL8MbTvuISBLwKnC7qh4MXBeJ31OQ44no70lVG1T1FPwDgk4CRrV1H90lGYQ0gmokUdU9znMhsAT/P4CuoMCp122s3y0MczzHRFULnP+oPuApIvB7cuqhXwVeVNW/OsUR+z0FO56u8D0BqGopsBKYDPRyBgyFEM553SUZrAaGO63rMcAVwNIwx9RuIpLoNH4hIonAN4EvW39XxFgKXOe8vg54PYyxHLPGE6ZjFhH2PTmNk08Duar6q4BVEfk9tXQ8kfw9iUi6iPRyXsfj7yiTiz8pfMfZ7KjfUbfoTQTBR1ANc0jtJiJD8V8NgH+wwT9F4vGIyJ+BKfiH2y0AHgBeA14GBuIfqvxyVY2IRtkWjmcK/qoHBXYA/x5Q197picg3gA+ALwCfU3wv/nr2iPueWjmeK4nQ70lETsbfQOzB/wP/ZVV9yDlPLAZS8c83f01rc8Z0m2RgjDGmZd2lmsgYY0wrLBkYY4yxZGCMMcaSgTHGGCwZGGOMwZKBMU1EpCFg1Mp1HTm6rYgMDhzN1JjOxnv0TYzpNqqcW/qN6XbsysCYo3Dmjvi5M3/EpyJyolM+WETedQY3e0dEBjrlfUVkiTO+/OcicqazK4+IPOWMOf8P525RROQ2Z3z99SKyOEyHabo5SwbGfC3+sGqiOQHrylR1HPBb/HeyA/wf8Jyqngy8CDzmlD8GvK+q44FTgQ1O+XDgcVUdC5QC33bK7wEmOPv5vlsHZ0xr7A5kYxwiUqGqSUHKdwBTVXWbM8jZPlVNE5H9+CdKqXPK96pqbxEpAjIDb/13hkteoarDneW7gWhV/amILMM/Kc5rwGsBY9Mbc9zYlYExodEWXrdF4LgwDXzdZvct4HH8VxGrA0aaNOa4sWRgTGjmBDx/5Lz+EP8IuABX4x8ADeAd4GZomnSkZ0s7FZEoYICqrgTuBnoCR1ydGOM2+wVizNfindmiGi1T1cbupSkish7/r/srnbJbgWdE5IdAETDXKV8ALBSRG/BfAdyMf8KUYDzAC07CEOAxZ0x6Y44razMw5iicNoMsVd0f7liMcYtVExljjLErA2OMMXZlYIwxBksGxhhjsGRgjDEGSwbGGGOwZGCMMQb4/8JjUGqclYSrAAAAAElFTkSuQmCC\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "w7Xc-uWxXhML"
      },
      "source": [
        "reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])\n",
        "\n",
        "def decode_sentence(text):\n",
        "    return ' '.join([reverse_word_index.get(i, '?') for i in text])\n"
      ],
      "execution_count": 13,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "OhnFA_TDXrih",
        "outputId": "9a7a8f6c-4f5d-4655-b591-42900d92245d"
      },
      "source": [
        "e = model.layers[0]\n",
        "weights = e.get_weights()[0]\n",
        "print(weights.shape) # shape: (vocab_size, embedding_dim)\n",
        "\n",
        "# Expected output\n",
        "# (1000, 16)"
      ],
      "execution_count": 14,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "(1000, 16)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "_POzcWWAXudL"
      },
      "source": [
        "import io\n",
        "\n",
        "out_v = io.open('vecs.tsv', 'w', encoding='utf-8')\n",
        "out_m = io.open('meta.tsv', 'w', encoding='utf-8')\n",
        "for word_num in range(1, vocab_size):\n",
        "  word = reverse_word_index[word_num]\n",
        "  embeddings = weights[word_num]\n",
        "  out_m.write(word + \"\\n\")\n",
        "  out_v.write('\\t'.join([str(x) for x in embeddings]) + \"\\n\")\n",
        "out_v.close()\n",
        "out_m.close()"
      ],
      "execution_count": 15,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 17
        },
        "id": "VmqpQMZ_XyOa",
        "outputId": "37796061-d6cc-4898-b9f4-e82676c969f5"
      },
      "source": [
        "try:\n",
        "  from google.colab import files\n",
        "except ImportError:\n",
        "  pass\n",
        "else:\n",
        "  files.download('vecs.tsv')\n",
        "  files.download('meta.tsv')"
      ],
      "execution_count": 16,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "\n",
              "    async function download(id, filename, size) {\n",
              "      if (!google.colab.kernel.accessAllowed) {\n",
              "        return;\n",
              "      }\n",
              "      const div = document.createElement('div');\n",
              "      const label = document.createElement('label');\n",
              "      label.textContent = `Downloading \"${filename}\": `;\n",
              "      div.appendChild(label);\n",
              "      const progress = document.createElement('progress');\n",
              "      progress.max = size;\n",
              "      div.appendChild(progress);\n",
              "      document.body.appendChild(div);\n",
              "\n",
              "      const buffers = [];\n",
              "      let downloaded = 0;\n",
              "\n",
              "      const channel = await google.colab.kernel.comms.open(id);\n",
              "      // Send a message to notify the kernel that we're ready.\n",
              "      channel.send({})\n",
              "\n",
              "      for await (const message of channel.messages) {\n",
              "        // Send a message to notify the kernel that we're ready.\n",
              "        channel.send({})\n",
              "        if (message.buffers) {\n",
              "          for (const buffer of message.buffers) {\n",
              "            buffers.push(buffer);\n",
              "            downloaded += buffer.byteLength;\n",
              "            progress.value = downloaded;\n",
              "          }\n",
              "        }\n",
              "      }\n",
              "      const blob = new Blob(buffers, {type: 'application/binary'});\n",
              "      const a = document.createElement('a');\n",
              "      a.href = window.URL.createObjectURL(blob);\n",
              "      a.download = filename;\n",
              "      div.appendChild(a);\n",
              "      a.click();\n",
              "      div.remove();\n",
              "    }\n",
              "  "
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "download(\"download_e841522e-9c15-468f-ab4b-c251bb68e6e6\", \"vecs.tsv\", 182035)"
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "\n",
              "    async function download(id, filename, size) {\n",
              "      if (!google.colab.kernel.accessAllowed) {\n",
              "        return;\n",
              "      }\n",
              "      const div = document.createElement('div');\n",
              "      const label = document.createElement('label');\n",
              "      label.textContent = `Downloading \"${filename}\": `;\n",
              "      div.appendChild(label);\n",
              "      const progress = document.createElement('progress');\n",
              "      progress.max = size;\n",
              "      div.appendChild(progress);\n",
              "      document.body.appendChild(div);\n",
              "\n",
              "      const buffers = [];\n",
              "      let downloaded = 0;\n",
              "\n",
              "      const channel = await google.colab.kernel.comms.open(id);\n",
              "      // Send a message to notify the kernel that we're ready.\n",
              "      channel.send({})\n",
              "\n",
              "      for await (const message of channel.messages) {\n",
              "        // Send a message to notify the kernel that we're ready.\n",
              "        channel.send({})\n",
              "        if (message.buffers) {\n",
              "          for (const buffer of message.buffers) {\n",
              "            buffers.push(buffer);\n",
              "            downloaded += buffer.byteLength;\n",
              "            progress.value = downloaded;\n",
              "          }\n",
              "        }\n",
              "      }\n",
              "      const blob = new Blob(buffers, {type: 'application/binary'});\n",
              "      const a = document.createElement('a');\n",
              "      a.href = window.URL.createObjectURL(blob);\n",
              "      a.download = filename;\n",
              "      div.appendChild(a);\n",
              "      a.click();\n",
              "      div.remove();\n",
              "    }\n",
              "  "
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "download(\"download_6655032a-6ffc-4c61-917e-7f638ec4125d\", \"meta.tsv\", 6529)"
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "y9p3xqbBRQXS"
      },
      "source": [
        ""
      ],
      "execution_count": null,
      "outputs": []
    }
  ]
}