From dc30f1a9a51f2afa3ac4157baea26a8581e997de Mon Sep 17 00:00:00 2001
From: Kumar Apurva <66004696+KUMAR-APURVA@users.noreply.github.com>
Date: Thu, 10 Jun 2021 12:05:16 +0530
Subject: [PATCH 1/4] [Ch4Nb07] Fixed path issues and version problem
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. Added try except block for window and colab and also checked if the file is already present or we need to download it.
2. Fixed the path issues.
3. Upgraded Ktrain version from ‘0.2.2’ to ‘0.26.3’
---
...Sentiment_Classification_IMDB_ktrain.ipynb | 889 ++++++++----------
1 file changed, 415 insertions(+), 474 deletions(-)
diff --git a/Ch4/07_BERT_Sentiment_Classification_IMDB_ktrain.ipynb b/Ch4/07_BERT_Sentiment_Classification_IMDB_ktrain.ipynb
index cbd8c0d..1574dfb 100644
--- a/Ch4/07_BERT_Sentiment_Classification_IMDB_ktrain.ipynb
+++ b/Ch4/07_BERT_Sentiment_Classification_IMDB_ktrain.ipynb
@@ -1,504 +1,445 @@
{
- "nbformat": 4,
- "nbformat_minor": 0,
- "metadata": {
- "colab": {
- "name": "BERT_Sentiment_Classification_IMDB.ipynb",
- "provenance": [],
- "collapsed_sections": []
- },
- "kernelspec": {
- "name": "python3",
- "display_name": "Python 3"
- },
- "accelerator": "GPU"
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "colab_type": "text",
+ "id": "ypR4NNY7oyEV"
+ },
+ "source": [
+ "#### We need to install the ktrain library. Its a light weight wrapper for keras to help train neural networks. With only a few lines of code it allows you to build models, estimate optimal learning rate, loading and preprocessing text and image data from various sources and much more. More about our approach can be found at [this](https://towardsdatascience.com/bert-text-classification-in-3-lines-of-code-using-keras-264db7e7a358) article."
+ ]
},
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "ypR4NNY7oyEV",
- "colab_type": "text"
- },
- "source": [
- "#### We need to install the ktrain library. Its a light weight wrapper for keras to help train neural networks. With only a few lines of code it allows you to build models, estimate optimal learning rate, loading and preprocessing text and image data from various sources and much more. More about our approach can be found at [this](https://towardsdatascience.com/bert-text-classification-in-3-lines-of-code-using-keras-264db7e7a358) article."
- ]
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000
},
+ "colab_type": "code",
+ "id": "58WB13Jx3rQm",
+ "outputId": "847a6286-f36b-4b32-a791-5ab6d625c701"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "metadata": {
- "id": "58WB13Jx3rQm",
- "colab_type": "code",
- "outputId": "847a6286-f36b-4b32-a791-5ab6d625c701",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 1000
- }
- },
- "source": [
- "!pip3 install ktrain==0.2.2"
- ],
- "execution_count": 1,
- "outputs": [
- {
- "output_type": "stream",
- "text": [
- "Collecting ktrain==0.2.2\n",
- "\u001b[?25l Downloading https://files.pythonhosted.org/packages/83/ce/f8dd172bec1486c02f20cc5099055fb2e8850fc414eb7bc922f29e4e13ec/ktrain-0.2.2.tar.gz (43kB)\n",
- "\r\u001b[K |███████▋ | 10kB 26.3MB/s eta 0:00:01\r\u001b[K |███████████████▎ | 20kB 1.7MB/s eta 0:00:01\r\u001b[K |██████████████████████▉ | 30kB 2.5MB/s eta 0:00:01\r\u001b[K |██████████████████████████████▌ | 40kB 1.7MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 51kB 1.8MB/s \n",
- "\u001b[?25hRequirement already satisfied: keras>=2.2.4 in /usr/local/lib/python3.6/dist-packages (from ktrain==0.2.2) (2.2.5)\n",
- "Requirement already satisfied: scikit-learn>=0.20.0 in /usr/local/lib/python3.6/dist-packages (from ktrain==0.2.2) (0.22.1)\n",
- "Requirement already satisfied: matplotlib>=3.0.0 in /usr/local/lib/python3.6/dist-packages (from ktrain==0.2.2) (3.1.2)\n",
- "Requirement already satisfied: pandas>=0.24.2 in /usr/local/lib/python3.6/dist-packages (from ktrain==0.2.2) (0.25.3)\n",
- "Requirement already satisfied: fastprogress>=0.1.21 in /usr/local/lib/python3.6/dist-packages (from ktrain==0.2.2) (0.2.2)\n",
- "Collecting keras_bert\n",
- " Downloading https://files.pythonhosted.org/packages/2c/0f/cdc886c1018943ea62d3209bc964413d5aa9d0eb7e493abd8545be679294/keras-bert-0.81.0.tar.gz\n",
- "Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from ktrain==0.2.2) (2.21.0)\n",
- "Requirement already satisfied: six>=1.9.0 in /usr/local/lib/python3.6/dist-packages (from keras>=2.2.4->ktrain==0.2.2) (1.12.0)\n",
- "Requirement already satisfied: h5py in /usr/local/lib/python3.6/dist-packages (from keras>=2.2.4->ktrain==0.2.2) (2.8.0)\n",
- "Requirement already satisfied: numpy>=1.9.1 in /usr/local/lib/python3.6/dist-packages (from keras>=2.2.4->ktrain==0.2.2) (1.17.5)\n",
- "Requirement already satisfied: keras-applications>=1.0.8 in /usr/local/lib/python3.6/dist-packages (from keras>=2.2.4->ktrain==0.2.2) (1.0.8)\n",
- "Requirement already satisfied: keras-preprocessing>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from keras>=2.2.4->ktrain==0.2.2) (1.1.0)\n",
- "Requirement already satisfied: pyyaml in /usr/local/lib/python3.6/dist-packages (from keras>=2.2.4->ktrain==0.2.2) (3.13)\n",
- "Requirement already satisfied: scipy>=0.14 in /usr/local/lib/python3.6/dist-packages (from keras>=2.2.4->ktrain==0.2.2) (1.4.1)\n",
- "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.6/dist-packages (from scikit-learn>=0.20.0->ktrain==0.2.2) (0.14.1)\n",
- "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib>=3.0.0->ktrain==0.2.2) (1.1.0)\n",
- "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib>=3.0.0->ktrain==0.2.2) (2.6.1)\n",
- "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib>=3.0.0->ktrain==0.2.2) (2.4.6)\n",
- "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib>=3.0.0->ktrain==0.2.2) (0.10.0)\n",
- "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.24.2->ktrain==0.2.2) (2018.9)\n",
- "Collecting keras-transformer>=0.30.0\n",
- " Downloading https://files.pythonhosted.org/packages/54/0c/fede535ac576c03863c44bf2e0bf051fe21f5e10103631b6b6236ae446f3/keras-transformer-0.32.0.tar.gz\n",
- "Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->ktrain==0.2.2) (2.8)\n",
- "Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->ktrain==0.2.2) (1.24.3)\n",
- "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->ktrain==0.2.2) (2019.11.28)\n",
- "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->ktrain==0.2.2) (3.0.4)\n",
- "Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from kiwisolver>=1.0.1->matplotlib>=3.0.0->ktrain==0.2.2) (45.1.0)\n",
- "Collecting keras-pos-embd>=0.10.0\n",
- " Downloading https://files.pythonhosted.org/packages/09/70/b63ed8fc660da2bb6ae29b9895401c628da5740c048c190b5d7107cadd02/keras-pos-embd-0.11.0.tar.gz\n",
- "Collecting keras-multi-head>=0.22.0\n",
- " Downloading https://files.pythonhosted.org/packages/40/3e/d0a64bb2ac5217928effe4507c26bbd19b86145d16a1948bc2d4f4c6338a/keras-multi-head-0.22.0.tar.gz\n",
- "Collecting keras-layer-normalization>=0.12.0\n",
- " Downloading https://files.pythonhosted.org/packages/a4/0e/d1078df0494bac9ce1a67954e5380b6e7569668f0f3b50a9531c62c1fc4a/keras-layer-normalization-0.14.0.tar.gz\n",
- "Collecting keras-position-wise-feed-forward>=0.5.0\n",
- " Downloading https://files.pythonhosted.org/packages/e3/59/f0faa1037c033059e7e9e7758e6c23b4d1c0772cd48de14c4b6fd4033ad5/keras-position-wise-feed-forward-0.6.0.tar.gz\n",
- "Collecting keras-embed-sim>=0.7.0\n",
- " Downloading https://files.pythonhosted.org/packages/bc/20/735fd53f6896e2af63af47e212601c1b8a7a80d00b6126c388c9d1233892/keras-embed-sim-0.7.0.tar.gz\n",
- "Collecting keras-self-attention==0.41.0\n",
- " Downloading https://files.pythonhosted.org/packages/1b/1c/01599219bef7266fa43b3316e4f55bcb487734d3bafdc60ffd564f3cfe29/keras-self-attention-0.41.0.tar.gz\n",
- "Building wheels for collected packages: ktrain, keras-bert, keras-transformer, keras-pos-embd, keras-multi-head, keras-layer-normalization, keras-position-wise-feed-forward, keras-embed-sim, keras-self-attention\n",
- " Building wheel for ktrain (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
- " Created wheel for ktrain: filename=ktrain-0.2.2-cp36-none-any.whl size=50418 sha256=30ac3da49ca22b1ec10c57ae08d3bab9756222409cd3463f85ef190fe66dc8d0\n",
- " Stored in directory: /root/.cache/pip/wheels/fa/21/6f/e0452e1564ccab53339b601dbd1f37ed81e34868826200e8f8\n",
- " Building wheel for keras-bert (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
- " Created wheel for keras-bert: filename=keras_bert-0.81.0-cp36-none-any.whl size=37913 sha256=180438bed7964563b41411bcd633f83794ceb0ac2817898291612600cfb39f3a\n",
- " Stored in directory: /root/.cache/pip/wheels/bd/27/da/ffc2d573aa48b87440ec4f98bc7c992e3a2d899edb2d22ef9e\n",
- " Building wheel for keras-transformer (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
- " Created wheel for keras-transformer: filename=keras_transformer-0.32.0-cp36-none-any.whl size=13266 sha256=4f32a5e7c46dec4f5dbeb040523f6c94b46048bb5eab2f85a4ee1c71b9b71206\n",
- " Stored in directory: /root/.cache/pip/wheels/62/f0/ce/82fa5d024d5ef8e263f26a50dcee23820efe245680ce9c922a\n",
- " Building wheel for keras-pos-embd (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
- " Created wheel for keras-pos-embd: filename=keras_pos_embd-0.11.0-cp36-none-any.whl size=7554 sha256=c6c8607ddbc95fc5c3c2412f94d41d2d6780d3b30004543791e9313492b2de49\n",
- " Stored in directory: /root/.cache/pip/wheels/5b/a1/a0/ce6b1d49ba1a9a76f592e70cf297b05c96bc9f418146761032\n",
- " Building wheel for keras-multi-head (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
- " Created wheel for keras-multi-head: filename=keras_multi_head-0.22.0-cp36-none-any.whl size=15371 sha256=05c6dc4ab2d005d29f310419143e25714eb6a7ffb169e008d1c18666019fcf5d\n",
- " Stored in directory: /root/.cache/pip/wheels/bb/df/3f/81b36f41b66e6a9cd69224c70a737de2bb6b2f7feb3272c25e\n",
- " Building wheel for keras-layer-normalization (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
- " Created wheel for keras-layer-normalization: filename=keras_layer_normalization-0.14.0-cp36-none-any.whl size=5268 sha256=affb377c258c1f72bd3be271eb6a578a1be567626b082c7d51c96af3c685707f\n",
- " Stored in directory: /root/.cache/pip/wheels/54/80/22/a638a7d406fd155e507aa33d703e3fa2612b9eb7bb4f4fe667\n",
- " Building wheel for keras-position-wise-feed-forward (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
- " Created wheel for keras-position-wise-feed-forward: filename=keras_position_wise_feed_forward-0.6.0-cp36-none-any.whl size=5623 sha256=794c37b5c74aa2d635f3581d8f1e82e8e4e08f9709c8b08beba747cc84d786a2\n",
- " Stored in directory: /root/.cache/pip/wheels/39/e2/e2/3514fef126a00574b13bc0b9e23891800158df3a3c19c96e3b\n",
- " Building wheel for keras-embed-sim (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
- " Created wheel for keras-embed-sim: filename=keras_embed_sim-0.7.0-cp36-none-any.whl size=4676 sha256=922770c4ee921ab176dd5e405a9a0c30a2abd4bbb9b02b313f81308d1c00cd3f\n",
- " Stored in directory: /root/.cache/pip/wheels/d1/bc/b1/b0c45cee4ca2e6c86586b0218ffafe7f0703c6d07fdf049866\n",
- " Building wheel for keras-self-attention (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
- " Created wheel for keras-self-attention: filename=keras_self_attention-0.41.0-cp36-none-any.whl size=17288 sha256=1ad03d750cc19684d453b79f17fcc64565051904d5c87d91d0c17fb6a9bbced4\n",
- " Stored in directory: /root/.cache/pip/wheels/cc/dc/17/84258b27a04cd38ac91998abe148203720ca696186635db694\n",
- "Successfully built ktrain keras-bert keras-transformer keras-pos-embd keras-multi-head keras-layer-normalization keras-position-wise-feed-forward keras-embed-sim keras-self-attention\n",
- "Installing collected packages: keras-pos-embd, keras-self-attention, keras-multi-head, keras-layer-normalization, keras-position-wise-feed-forward, keras-embed-sim, keras-transformer, keras-bert, ktrain\n",
- "Successfully installed keras-bert-0.81.0 keras-embed-sim-0.7.0 keras-layer-normalization-0.14.0 keras-multi-head-0.22.0 keras-pos-embd-0.11.0 keras-position-wise-feed-forward-0.6.0 keras-self-attention-0.41.0 keras-transformer-0.32.0 ktrain-0.2.2\n"
- ],
- "name": "stdout"
- }
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Requirement already satisfied: ktrain==0.26.3 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (0.26.3)\n",
+ "Requirement already satisfied: ipython in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (7.16.1)\n",
+ "Requirement already satisfied: keras-bert>=0.86.0 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (0.86.0)\n",
+ "Requirement already satisfied: joblib in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (1.0.1)\n",
+ "Requirement already satisfied: requests in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (2.25.1)\n",
+ "Collecting seqeval==0.0.19\n",
+ " Using cached seqeval-0.0.19-py3-none-any.whl\n",
+ "Requirement already satisfied: cchardet in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (2.1.7)\n",
+ "Requirement already satisfied: pandas>=1.0.1 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (1.1.5)\n",
+ "Requirement already satisfied: jieba in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (0.42.1)\n",
+ "Requirement already satisfied: sentencepiece in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (0.1.95)\n",
+ "Requirement already satisfied: langdetect in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (1.0.9)\n",
+ "Requirement already satisfied: packaging in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (20.9)\n",
+ "Requirement already satisfied: networkx>=2.3 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (2.5.1)\n",
+ "Requirement already satisfied: syntok in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (1.3.1)\n",
+ "Requirement already satisfied: scikit-learn==0.23.2 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (0.23.2)\n",
+ "Requirement already satisfied: matplotlib>=3.0.0 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (3.3.4)\n",
+ "Requirement already satisfied: transformers<=4.3.3,>=4.0.0 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (4.3.3)\n",
+ "Requirement already satisfied: fastprogress>=0.1.21 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (1.0.0)\n",
+ "Requirement already satisfied: whoosh in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ktrain==0.26.3) (2.7.4)\n",
+ "Requirement already satisfied: numpy>=1.13.3 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from scikit-learn==0.23.2->ktrain==0.26.3) (1.19.5)\n",
+ "Requirement already satisfied: scipy>=0.19.1 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from scikit-learn==0.23.2->ktrain==0.26.3) (1.4.1)\n",
+ "Requirement already satisfied: threadpoolctl>=2.0.0 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from scikit-learn==0.23.2->ktrain==0.26.3) (2.1.0)\n",
+ "Requirement already satisfied: Keras>=2.2.4 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from seqeval==0.0.19->ktrain==0.26.3) (2.4.3)\n",
+ "Requirement already satisfied: pyyaml in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from Keras>=2.2.4->seqeval==0.0.19->ktrain==0.26.3) (5.4.1)\n",
+ "Requirement already satisfied: h5py in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from Keras>=2.2.4->seqeval==0.0.19->ktrain==0.26.3) (2.10.0)\n",
+ "Requirement already satisfied: keras-transformer>=0.38.0 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from keras-bert>=0.86.0->ktrain==0.26.3) (0.38.0)\n",
+ "Requirement already satisfied: keras-pos-embd>=0.11.0 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from keras-transformer>=0.38.0->keras-bert>=0.86.0->ktrain==0.26.3) (0.11.0)\n",
+ "Requirement already satisfied: keras-layer-normalization>=0.14.0 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from keras-transformer>=0.38.0->keras-bert>=0.86.0->ktrain==0.26.3) (0.14.0)\n",
+ "Requirement already satisfied: keras-position-wise-feed-forward>=0.6.0 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from keras-transformer>=0.38.0->keras-bert>=0.86.0->ktrain==0.26.3) (0.6.0)\n",
+ "Requirement already satisfied: keras-embed-sim>=0.8.0 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from keras-transformer>=0.38.0->keras-bert>=0.86.0->ktrain==0.26.3) (0.8.0)\n",
+ "Requirement already satisfied: keras-multi-head>=0.27.0 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from keras-transformer>=0.38.0->keras-bert>=0.86.0->ktrain==0.26.3) (0.27.0)\n",
+ "Requirement already satisfied: keras-self-attention==0.46.0 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from keras-multi-head>=0.27.0->keras-transformer>=0.38.0->keras-bert>=0.86.0->ktrain==0.26.3) (0.46.0)\n",
+ "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from matplotlib>=3.0.0->ktrain==0.26.3) (2.4.7)\n",
+ "Requirement already satisfied: kiwisolver>=1.0.1 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from matplotlib>=3.0.0->ktrain==0.26.3) (1.3.1)\n",
+ "Requirement already satisfied: python-dateutil>=2.1 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from matplotlib>=3.0.0->ktrain==0.26.3) (2.8.1)\n",
+ "Requirement already satisfied: cycler>=0.10 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from matplotlib>=3.0.0->ktrain==0.26.3) (0.10.0)\n",
+ "Requirement already satisfied: pillow>=6.2.0 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from matplotlib>=3.0.0->ktrain==0.26.3) (8.2.0)\n",
+ "Requirement already satisfied: six in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from cycler>=0.10->matplotlib>=3.0.0->ktrain==0.26.3) (1.15.0)\n",
+ "Requirement already satisfied: decorator<5,>=4.3 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from networkx>=2.3->ktrain==0.26.3) (4.4.2)\n",
+ "Requirement already satisfied: pytz>=2017.2 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from pandas>=1.0.1->ktrain==0.26.3) (2021.1)\n",
+ "Requirement already satisfied: dataclasses in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from transformers<=4.3.3,>=4.0.0->ktrain==0.26.3) (0.8)\n",
+ "Requirement already satisfied: importlib-metadata in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from transformers<=4.3.3,>=4.0.0->ktrain==0.26.3) (4.4.0)\n",
+ "Requirement already satisfied: tokenizers<0.11,>=0.10.1 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from transformers<=4.3.3,>=4.0.0->ktrain==0.26.3) (0.10.3)\n",
+ "Requirement already satisfied: regex!=2019.12.17 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from transformers<=4.3.3,>=4.0.0->ktrain==0.26.3) (2021.4.4)\n",
+ "Requirement already satisfied: tqdm>=4.27 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from transformers<=4.3.3,>=4.0.0->ktrain==0.26.3) (4.61.0)\n",
+ "Requirement already satisfied: filelock in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from transformers<=4.3.3,>=4.0.0->ktrain==0.26.3) (3.0.12)\n",
+ "Requirement already satisfied: sacremoses in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from transformers<=4.3.3,>=4.0.0->ktrain==0.26.3) (0.0.45)\n",
+ "Requirement already satisfied: zipp>=0.5 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from importlib-metadata->transformers<=4.3.3,>=4.0.0->ktrain==0.26.3) (3.4.1)\n",
+ "Requirement already satisfied: typing-extensions>=3.6.4 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from importlib-metadata->transformers<=4.3.3,>=4.0.0->ktrain==0.26.3) (3.7.4.3)\n",
+ "Requirement already satisfied: pygments in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ipython->ktrain==0.26.3) (2.9.0)\n",
+ "Requirement already satisfied: setuptools>=18.5 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ipython->ktrain==0.26.3) (52.0.0.post20210125)\n",
+ "Requirement already satisfied: traitlets>=4.2 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ipython->ktrain==0.26.3) (4.3.3)\n",
+ "Requirement already satisfied: jedi>=0.10 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ipython->ktrain==0.26.3) (0.17.0)\n",
+ "Requirement already satisfied: pickleshare in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ipython->ktrain==0.26.3) (0.7.5)"
+ ]
},
{
- "cell_type": "code",
- "metadata": {
- "id": "KN6N85ah8VXf",
- "colab_type": "code",
- "outputId": "6e97b40b-ea0d-4eb1-9562-8862c525c0f3",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 82
- }
- },
- "source": [
- "#Importing\n",
- "import ktrain\n",
- "from ktrain import text"
- ],
- "execution_count": 2,
- "outputs": [
- {
- "output_type": "stream",
- "text": [
- "Using TensorFlow backend.\n"
- ],
- "name": "stderr"
- },
- {
- "output_type": "display_data",
- "data": {
- "text/html": [
- "
\n",
- "The default version of TensorFlow in Colab will soon switch to TensorFlow 2.x. \n",
- "We recommend you upgrade now \n",
- "or ensure your notebook will continue to use TensorFlow 1.x via the %tensorflow_version 1.x magic:\n",
- "more info.
\n"
- ],
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "tags": []
- }
- }
- ]
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING: Ignoring invalid distribution -pype1 (c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages)\n",
+ "WARNING: Ignoring invalid distribution -pype1 (c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages)\n",
+ "WARNING: Ignoring invalid distribution -pype1 (c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages)\n",
+ " WARNING: Ignoring invalid distribution -pype1 (c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages)\n",
+ "WARNING: Ignoring invalid distribution -pype1 (c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages)\n",
+ "WARNING: Ignoring invalid distribution -pype1 (c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages)\n",
+ "WARNING: Ignoring invalid distribution -pype1 (c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages)\n",
+ "WARNING: Ignoring invalid distribution -pype1 (c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages)\n"
+ ]
},
{
- "cell_type": "code",
- "metadata": {
- "id": "Mr1YXudk8Vti",
- "colab_type": "code",
- "outputId": "8b08004e-329e-4eb8-a21e-e4dae409fc3e",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 52
- }
- },
- "source": [
- "#obtain the dataset\n",
- "import tensorflow as tf\n",
- "dataset = tf.keras.utils.get_file(\n",
- " fname=\"aclImdb.tar.gz\", \n",
- " origin=\"http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz\", \n",
- " extract=True,\n",
- ")"
- ],
- "execution_count": 3,
- "outputs": [
- {
- "output_type": "stream",
- "text": [
- "Downloading data from http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz\n",
- "84131840/84125825 [==============================] - 4s 0us/step\n"
- ],
- "name": "stdout"
- }
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Requirement already satisfied: colorama in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ipython->ktrain==0.26.3) (0.4.4)\n",
+ "Requirement already satisfied: backcall in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ipython->ktrain==0.26.3) (0.2.0)\n",
+ "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from ipython->ktrain==0.26.3) (3.0.17)\n",
+ "Requirement already satisfied: parso>=0.7.0 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from jedi>=0.10->ipython->ktrain==0.26.3) (0.8.2)\n",
+ "Requirement already satisfied: wcwidth in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython->ktrain==0.26.3) (0.2.5)\n",
+ "Requirement already satisfied: ipython-genutils in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from traitlets>=4.2->ipython->ktrain==0.26.3) (0.2.0)\n",
+ "Requirement already satisfied: idna<3,>=2.5 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from requests->ktrain==0.26.3) (2.10)\n",
+ "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from requests->ktrain==0.26.3) (2020.12.5)\n",
+ "Requirement already satisfied: urllib3<1.27,>=1.21.1 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from requests->ktrain==0.26.3) (1.26.5)\n",
+ "Requirement already satisfied: chardet<5,>=3.0.2 in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from requests->ktrain==0.26.3) (4.0.0)\n",
+ "Requirement already satisfied: click in c:\\users\\kumar apurv\\anaconda3\\envs\\ml\\lib\\site-packages (from sacremoses->transformers<=4.3.3,>=4.0.0->ktrain==0.26.3) (7.1.2)\n",
+ "Installing collected packages: seqeval\n",
+ " Attempting uninstall: seqeval\n",
+ " Found existing installation: seqeval 0.0.12\n",
+ " Uninstalling seqeval-0.0.12:\n",
+ " Successfully uninstalled seqeval-0.0.12\n",
+ "Successfully installed seqeval-0.0.19\n"
+ ]
+ }
+ ],
+ "source": [
+ "!pip3 install ktrain==0.26.3\n",
+ "# use tensorflow 2.4.0"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 82
},
- {
- "cell_type": "code",
- "metadata": {
- "id": "2x46reXu9Kru",
- "colab_type": "code",
- "outputId": "f1ca7357-d740-492d-e482-76c8901eb04f",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 52
- }
- },
- "source": [
- "%cd /root/.keras/datasets/aclImdb\n",
- "!ls"
- ],
- "execution_count": 4,
- "outputs": [
- {
- "output_type": "stream",
- "text": [
- "/root/.keras/datasets/aclImdb\n",
- "imdbEr.txt imdb.vocab\tREADME\ttest train\n"
- ],
- "name": "stdout"
- }
- ]
+ "colab_type": "code",
+ "id": "KN6N85ah8VXf",
+ "outputId": "6e97b40b-ea0d-4eb1-9562-8862c525c0f3"
+ },
+ "outputs": [],
+ "source": [
+ "#Importing\n",
+ "import ktrain\n",
+ "from ktrain import text"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 52
},
+ "colab_type": "code",
+ "id": "Mr1YXudk8Vti",
+ "outputId": "8b08004e-329e-4eb8-a21e-e4dae409fc3e"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "metadata": {
- "id": "qnXQ-lcL8d6O",
- "colab_type": "code",
- "outputId": "4a790d12-399d-415f-d643-75e55038ea69",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 35
- }
- },
- "source": [
- "# set path to dataset\n",
- "import os.path\n",
- "dataset = '/root/.keras/datasets/aclImdb'\n",
- "IMDB_DATADIR = os.path.join(os.path.dirname(dataset), 'aclImdb')\n",
- "print(IMDB_DATADIR)"
- ],
- "execution_count": 5,
- "outputs": [
- {
- "output_type": "stream",
- "text": [
- "/root/.keras/datasets/aclImdb\n"
- ],
- "name": "stdout"
- }
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Downloading data from http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz\n",
+ "84131840/84125825 [==============================] - 4s 0us/step\n"
+ ]
+ }
+ ],
+ "source": [
+ "##obtain the dataset\n",
+ "import os\n",
+ "try :\n",
+ " from google.colab import files\n",
+ " import tensorflow as tf\n",
+ " dataset = tf.keras.utils.get_file(\n",
+ " fname=\"aclImdb.tar.gz\", \n",
+ " origin=\"http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz\", \n",
+ " extract=True,\n",
+ " )\n",
+ " IMDB_DATADIR = os.path.join(os.path.dirname(dataset), \"aclImdb\")\n",
+ "except ModuleNotFoundError :\n",
+ " if not os.path.exists(os.getcwd()+\"\\\\Data\\\\aclImdb\") :\n",
+ " import tensorflow as tf\n",
+ " dataset = tf.keras.utils.get_file(\n",
+ " fname=\"aclImdb.tar.gz\", \n",
+ " origin=\"http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz\", \n",
+ " extract=True,\n",
+ " )\n",
+ "\n",
+ " # set path to dataset\n",
+ " IMDB_DATADIR=os.getcwd()\n",
+ " else :\n",
+ "\n",
+ " # set path to dataset\n",
+ " IMDB_DATADIR=os.getcwd()+\"\\\\Data\\\\aclImdb\""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "colab_type": "text",
+ "id": "ugopbOABrmne"
+ },
+ "source": [
+ "## STEP 1: Preprocessing\n",
+ "####The texts_from_folder function will load the training and validation data from the specified folder and automatically preprocess it according to BERT's requirements. In doing so, the BERT model and vocabulary will be automatically downloaded."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 228
},
+ "colab_type": "code",
+ "id": "jELdxonN9J8v",
+ "outputId": "d32f97a7-e69f-465b-d1e5-bfef9ee204f5"
+ },
+ "outputs": [
{
- "cell_type": "markdown",
- "metadata": {
- "id": "ugopbOABrmne",
- "colab_type": "text"
- },
- "source": [
- "## STEP 1: Preprocessing\n",
- "####The texts_from_folder function will load the training and validation data from the specified folder and automatically preprocess it according to BERT's requirements. In doing so, the BERT model and vocabulary will be automatically downloaded."
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "downloading pretrained BERT model and vocabulary...\n",
+ "[██████████████████████████████████████████████████]\n",
+ "extracting pretrained BERT model and vocabulary...\n",
+ "done.\n",
+ "\n",
+ "cleanup downloaded zip...\n",
+ "done.\n",
+ "\n",
+ "preprocessing train...\n"
+ ]
},
{
- "cell_type": "code",
- "metadata": {
- "id": "jELdxonN9J8v",
- "colab_type": "code",
- "outputId": "d32f97a7-e69f-465b-d1e5-bfef9ee204f5",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 228
- }
- },
- "source": [
- "\n",
- "\n",
- "(x_train, y_train), (x_test, y_test), preproc = text.texts_from_folder(IMDB_DATADIR, \n",
- " maxlen=500, \n",
- " preprocess_mode='bert',\n",
- " train_test_names=['train', \n",
- " 'test'],\n",
- " classes=['pos', 'neg'])"
+ "data": {
+ "text/html": [
+ "done."
],
- "execution_count": 6,
- "outputs": [
- {
- "output_type": "stream",
- "text": [
- "downloading pretrained BERT model and vocabulary...\n",
- "[██████████████████████████████████████████████████]\n",
- "extracting pretrained BERT model and vocabulary...\n",
- "done.\n",
- "\n",
- "cleanup downloaded zip...\n",
- "done.\n",
- "\n",
- "preprocessing train...\n"
- ],
- "name": "stdout"
- },
- {
- "output_type": "display_data",
- "data": {
- "text/html": [
- "done."
- ],
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "tags": []
- }
- },
- {
- "output_type": "stream",
- "text": [
- "preprocessing test...\n"
- ],
- "name": "stdout"
- },
- {
- "output_type": "display_data",
- "data": {
- "text/html": [
- "done."
- ],
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "tags": []
- }
- }
+ "text/plain": [
+ ""
]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "output_type": "display_data"
},
{
- "cell_type": "markdown",
- "metadata": {
- "id": "a0SIaqHcslLZ",
- "colab_type": "text"
- },
- "source": [
- "### STEP 2: Loading a pre trained BERT and wrapping it in a ktrain.learner object"
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "preprocessing test...\n"
+ ]
},
{
- "cell_type": "code",
- "metadata": {
- "id": "90ftQ6MgAJy4",
- "colab_type": "code",
- "outputId": "a1c715b8-5d54-4405-c5e9-b7bcb042a131",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 606
- }
- },
- "source": [
- "\n",
- "model = text.text_classifier('bert', (x_train, y_train), preproc=preproc)\n",
- "learner = ktrain.get_learner(model,train_data=(x_train, y_train), val_data=(x_test, y_test), batch_size=6)"
+ "data": {
+ "text/html": [
+ "done."
],
- "execution_count": 7,
- "outputs": [
- {
- "output_type": "stream",
- "text": [
- "Is Multi-Label? False\n",
- "maxlen is 500\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:541: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.\n",
- "\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4432: The name tf.random_uniform is deprecated. Please use tf.random.uniform instead.\n",
- "\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:66: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.\n",
- "\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:148: The name tf.placeholder_with_default is deprecated. Please use tf.compat.v1.placeholder_with_default instead.\n",
- "\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3733: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\n",
- "Instructions for updating:\n",
- "Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4479: The name tf.truncated_normal is deprecated. Please use tf.random.truncated_normal instead.\n",
- "\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:190: The name tf.get_default_session is deprecated. Please use tf.compat.v1.get_default_session instead.\n",
- "\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:197: The name tf.ConfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead.\n",
- "\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:203: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.\n",
- "\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:207: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.\n",
- "\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:216: The name tf.is_variable_initialized is deprecated. Please use tf.compat.v1.is_variable_initialized instead.\n",
- "\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:223: The name tf.variables_initializer is deprecated. Please use tf.compat.v1.variables_initializer instead.\n",
- "\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/optimizers.py:793: The name tf.train.Optimizer is deprecated. Please use tf.compat.v1.train.Optimizer instead.\n",
- "\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3576: The name tf.log is deprecated. Please use tf.math.log instead.\n",
- "\n",
- "done.\n"
- ],
- "name": "stdout"
- }
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "nN6zWQgys0c_",
- "colab_type": "text"
- },
- "source": [
- "### STEP 3: Training and Tuning the model's parameters"
+ "text/plain": [
+ ""
]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "(x_train, y_train), (x_test, y_test), preproc = text.texts_from_folder(IMDB_DATADIR, \n",
+ " maxlen=500, \n",
+ " preprocess_mode='bert',\n",
+ " train_test_names=['train', \n",
+ " 'test'],\n",
+ " classes=['pos', 'neg'])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "colab_type": "text",
+ "id": "a0SIaqHcslLZ"
+ },
+ "source": [
+ "### STEP 2: Loading a pre trained BERT and wrapping it in a ktrain.learner object"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 606
},
+ "colab_type": "code",
+ "id": "90ftQ6MgAJy4",
+ "outputId": "a1c715b8-5d54-4405-c5e9-b7bcb042a131"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "metadata": {
- "id": "Fxdw88YjAfvF",
- "colab_type": "code",
- "outputId": "663b6e29-8bd0-4fed-cbf6-c8cc361b5244",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 392
- }
- },
- "source": [
- "learner.fit_onecycle(2e-5, 4)"
- ],
- "execution_count": 8,
- "outputs": [
- {
- "output_type": "stream",
- "text": [
- "\n",
- "\n",
- "begin training using onecycle policy with max lr of 2e-05...\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/math_grad.py:1424: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
- "Instructions for updating:\n",
- "Use tf.where in 2.0, which has the same broadcast rule as np.where\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:1033: The name tf.assign_add is deprecated. Please use tf.compat.v1.assign_add instead.\n",
- "\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:1020: The name tf.assign is deprecated. Please use tf.compat.v1.assign instead.\n",
- "\n",
- "Train on 25000 samples, validate on 25000 samples\n",
- "Epoch 1/4\n",
- "25000/25000 [==============================] - 4557s 182ms/step - loss: 0.2551 - acc: 0.8944 - val_loss: 0.1694 - val_acc: 0.9342\n",
- "Epoch 2/4\n",
- "25000/25000 [==============================] - 4545s 182ms/step - loss: 0.1607 - acc: 0.9419 - val_loss: 0.1692 - val_acc: 0.9362\n",
- "Epoch 3/4\n",
- "25000/25000 [==============================] - 4545s 182ms/step - loss: 0.0875 - acc: 0.9706 - val_loss: 0.1860 - val_acc: 0.9378\n",
- "Epoch 4/4\n",
- "25000/25000 [==============================] - 4543s 182ms/step - loss: 0.0242 - acc: 0.9932 - val_loss: 0.2394 - val_acc: 0.9385\n"
- ],
- "name": "stdout"
- },
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "tags": []
- },
- "execution_count": 8
- }
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Is Multi-Label? False\n",
+ "maxlen is 500\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:541: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.\n",
+ "\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4432: The name tf.random_uniform is deprecated. Please use tf.random.uniform instead.\n",
+ "\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:66: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.\n",
+ "\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:148: The name tf.placeholder_with_default is deprecated. Please use tf.compat.v1.placeholder_with_default instead.\n",
+ "\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3733: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\n",
+ "Instructions for updating:\n",
+ "Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4479: The name tf.truncated_normal is deprecated. Please use tf.random.truncated_normal instead.\n",
+ "\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:190: The name tf.get_default_session is deprecated. Please use tf.compat.v1.get_default_session instead.\n",
+ "\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:197: The name tf.ConfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead.\n",
+ "\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:203: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.\n",
+ "\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:207: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.\n",
+ "\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:216: The name tf.is_variable_initialized is deprecated. Please use tf.compat.v1.is_variable_initialized instead.\n",
+ "\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:223: The name tf.variables_initializer is deprecated. Please use tf.compat.v1.variables_initializer instead.\n",
+ "\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/optimizers.py:793: The name tf.train.Optimizer is deprecated. Please use tf.compat.v1.train.Optimizer instead.\n",
+ "\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3576: The name tf.log is deprecated. Please use tf.math.log instead.\n",
+ "\n",
+ "done.\n"
+ ]
+ }
+ ],
+ "source": [
+ "model = text.text_classifier('bert', (x_train, y_train), preproc=preproc)\n",
+ "learner = ktrain.get_learner(model,train_data=(x_train, y_train), val_data=(x_test, y_test), batch_size=6)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "colab_type": "text",
+ "id": "nN6zWQgys0c_"
+ },
+ "source": [
+ "### STEP 3: Training and Tuning the model's parameters"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 392
},
+ "colab_type": "code",
+ "id": "Fxdw88YjAfvF",
+ "outputId": "663b6e29-8bd0-4fed-cbf6-c8cc361b5244"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "metadata": {
- "id": "ihOn7ztsAnaL",
- "colab_type": "code",
- "colab": {}
- },
- "source": [
- ""
- ],
- "execution_count": 0,
- "outputs": []
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "\n",
+ "begin training using onecycle policy with max lr of 2e-05...\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/math_grad.py:1424: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
+ "Instructions for updating:\n",
+ "Use tf.where in 2.0, which has the same broadcast rule as np.where\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:1033: The name tf.assign_add is deprecated. Please use tf.compat.v1.assign_add instead.\n",
+ "\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:1020: The name tf.assign is deprecated. Please use tf.compat.v1.assign instead.\n",
+ "\n",
+ "Train on 25000 samples, validate on 25000 samples\n",
+ "Epoch 1/4\n",
+ "25000/25000 [==============================] - 4557s 182ms/step - loss: 0.2551 - acc: 0.8944 - val_loss: 0.1694 - val_acc: 0.9342\n",
+ "Epoch 2/4\n",
+ "25000/25000 [==============================] - 4545s 182ms/step - loss: 0.1607 - acc: 0.9419 - val_loss: 0.1692 - val_acc: 0.9362\n",
+ "Epoch 3/4\n",
+ "25000/25000 [==============================] - 4545s 182ms/step - loss: 0.0875 - acc: 0.9706 - val_loss: 0.1860 - val_acc: 0.9378\n",
+ "Epoch 4/4\n",
+ "25000/25000 [==============================] - 4543s 182ms/step - loss: 0.0242 - acc: 0.9932 - val_loss: 0.2394 - val_acc: 0.9385\n"
+ ]
},
{
- "cell_type": "code",
- "metadata": {
- "id": "mPVhsfj3TwHf",
- "colab_type": "code",
- "colab": {}
- },
- "source": [
- ""
- ],
- "execution_count": 0,
- "outputs": []
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {
+ "tags": []
+ },
+ "output_type": "execute_result"
}
- ]
-}
\ No newline at end of file
+ ],
+ "source": [
+ "learner.fit_onecycle(2e-5, 4)"
+ ]
+ }
+ ],
+ "metadata": {
+ "accelerator": "GPU",
+ "colab": {
+ "collapsed_sections": [],
+ "name": "BERT_Sentiment_Classification_IMDB.ipynb",
+ "provenance": []
+ },
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.6.13"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
From 15a90ef58c6048032c423501abb4e2641f52342e Mon Sep 17 00:00:00 2001
From: jatinpapreja <47968703+jatinpapreja@users.noreply.github.com>
Date: Thu, 10 Jun 2021 12:35:50 +0530
Subject: [PATCH 2/4] [Ch4Nb09] Fixed some errors and path issues
1. Updated tensorflow from '1.14.0' to '2.4.0 '.
2. Fixed 'tf.gfile.GFile' to 'tf.io.gfile.GFile'.
3. 'from keras.utils.np_utils import to_categorical' is the change.
4. Added try block for windows and colab users and specified the path for downloading files for windows users.
---
Ch4/09_Lime_RNN.ipynb | 1096 +++++++++++++++++++----------------------
1 file changed, 515 insertions(+), 581 deletions(-)
diff --git a/Ch4/09_Lime_RNN.ipynb b/Ch4/09_Lime_RNN.ipynb
index 5b5ab24..b95992a 100644
--- a/Ch4/09_Lime_RNN.ipynb
+++ b/Ch4/09_Lime_RNN.ipynb
@@ -1,606 +1,540 @@
{
- "nbformat": 4,
- "nbformat_minor": 0,
- "metadata": {
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "colab_type": "text",
+ "id": "hjoUGDuyTdh5"
+ },
+ "source": [
+ "In this notebook we will demonstrate how to interpret a Deep Learning Model using [LIME](https://github.com/marcotcr/lime)(local interpretable model-agnostic explanations), a python package for explaining machine learning classifiers. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
"colab": {
- "name": "Lime_RNN.ipynb",
- "provenance": []
- },
- "kernelspec": {
- "name": "python3",
- "display_name": "Python 3"
+ "base_uri": "https://localhost:8080/",
+ "height": 680
},
- "accelerator": "GPU"
+ "colab_type": "code",
+ "id": "qiGdNSat-V2i",
+ "outputId": "0cfc1f68-7585-4454-be5f-96647c677020"
+ },
+ "outputs": [],
+ "source": [
+ "!pip install tensorflow==2.4.0"
+ ]
},
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "hjoUGDuyTdh5",
- "colab_type": "text"
- },
- "source": [
- "In this notebook we will demonstrate how to interpret a Deep Learning Model using [LIME](https://github.com/marcotcr/lime)(local interpretable model-agnostic explanations), a python package for explaining machine learning classifiers. "
- ]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "qiGdNSat-V2i",
- "colab_type": "code",
- "outputId": "0cfc1f68-7585-4454-be5f-96647c677020",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 680
- }
- },
- "source": [
- "!pip install tensorflow==1.14.0"
- ],
- "execution_count": 0,
- "outputs": [
- {
- "output_type": "stream",
- "text": [
- "Collecting tensorflow==1.14.0\n",
- "\u001b[?25l Downloading https://files.pythonhosted.org/packages/de/f0/96fb2e0412ae9692dbf400e5b04432885f677ad6241c088ccc5fe7724d69/tensorflow-1.14.0-cp36-cp36m-manylinux1_x86_64.whl (109.2MB)\n",
- "\u001b[K |████████████████████████████████| 109.2MB 89kB/s \n",
- "\u001b[?25hRequirement already satisfied: protobuf>=3.6.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (3.10.0)\n",
- "Requirement already satisfied: gast>=0.2.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (0.3.3)\n",
- "Requirement already satisfied: google-pasta>=0.1.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (0.2.0)\n",
- "Requirement already satisfied: astor>=0.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (0.8.1)\n",
- "Requirement already satisfied: numpy<2.0,>=1.14.5 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (1.18.4)\n",
- "Collecting tensorboard<1.15.0,>=1.14.0\n",
- "\u001b[?25l Downloading https://files.pythonhosted.org/packages/91/2d/2ed263449a078cd9c8a9ba50ebd50123adf1f8cfbea1492f9084169b89d9/tensorboard-1.14.0-py3-none-any.whl (3.1MB)\n",
- "\u001b[K |████████████████████████████████| 3.2MB 36.5MB/s \n",
- "\u001b[?25hRequirement already satisfied: absl-py>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (0.9.0)\n",
- "Requirement already satisfied: grpcio>=1.8.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (1.28.1)\n",
- "Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (1.12.0)\n",
- "Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (1.1.0)\n",
- "Requirement already satisfied: wrapt>=1.11.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (1.12.1)\n",
- "Requirement already satisfied: wheel>=0.26 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (0.34.2)\n",
- "Collecting tensorflow-estimator<1.15.0rc0,>=1.14.0rc0\n",
- "\u001b[?25l Downloading https://files.pythonhosted.org/packages/3c/d5/21860a5b11caf0678fbc8319341b0ae21a07156911132e0e71bffed0510d/tensorflow_estimator-1.14.0-py2.py3-none-any.whl (488kB)\n",
- "\u001b[K |████████████████████████████████| 491kB 33.6MB/s \n",
- "\u001b[?25hRequirement already satisfied: keras-applications>=1.0.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (1.0.8)\n",
- "Requirement already satisfied: keras-preprocessing>=1.0.5 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (1.1.0)\n",
- "Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from protobuf>=3.6.1->tensorflow==1.14.0) (46.1.3)\n",
- "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.6/dist-packages (from tensorboard<1.15.0,>=1.14.0->tensorflow==1.14.0) (3.2.1)\n",
- "Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.6/dist-packages (from tensorboard<1.15.0,>=1.14.0->tensorflow==1.14.0) (1.0.1)\n",
- "Requirement already satisfied: h5py in /usr/local/lib/python3.6/dist-packages (from keras-applications>=1.0.6->tensorflow==1.14.0) (2.10.0)\n",
- "Installing collected packages: tensorboard, tensorflow-estimator, tensorflow\n",
- " Found existing installation: tensorboard 2.2.1\n",
- " Uninstalling tensorboard-2.2.1:\n",
- " Successfully uninstalled tensorboard-2.2.1\n",
- " Found existing installation: tensorflow-estimator 2.2.0\n",
- " Uninstalling tensorflow-estimator-2.2.0:\n",
- " Successfully uninstalled tensorflow-estimator-2.2.0\n",
- " Found existing installation: tensorflow 2.2.0rc4\n",
- " Uninstalling tensorflow-2.2.0rc4:\n",
- " Successfully uninstalled tensorflow-2.2.0rc4\n",
- "Successfully installed tensorboard-1.14.0 tensorflow-1.14.0 tensorflow-estimator-1.14.0\n"
- ],
- "name": "stdout"
- }
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "F5S86uIWZKVO",
- "colab_type": "text"
- },
- "source": [
- "We will be building an LSTM model with an embedding layer trained on the fly. We will be following all the preprocessing steps as in the [DeepNN_Example.ipynb](https://github.com/practical-nlp/practical-nlp/blob/master/Ch4/DeepNN_Example.ipynb) notebook in this repo."
- ]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "UsCn1xlo_MMX",
- "colab_type": "code",
- "outputId": "a5f0393a-0812-4fd0-c593-1479a8a6ed76",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 98
- }
- },
- "source": [
- "import tensorflow as tf\n",
- "from tensorflow import keras\n",
- "import os\n",
- "import re\n",
- "import pandas as pd\n",
- "\n",
- "#helper functions to lead the data\n",
- "def load_directory_data(directory):\n",
- " data = {}\n",
- " data[\"sentence\"] = []\n",
- " data[\"sentiment\"] = []\n",
- " for file_path in os.listdir(directory):\n",
- " with tf.gfile.GFile(os.path.join(directory, file_path), \"r\") as f:\n",
- " data[\"sentence\"].append(f.read())\n",
- " data[\"sentiment\"].append(re.match(\"\\d+_(\\d+)\\.txt\", file_path).group(1))\n",
- " return pd.DataFrame.from_dict(data)\n",
- "\n",
- "# Merge positive and negative examples, add a polarity column and shuffle.\n",
- "def load_dataset(directory):\n",
- " pos_df = load_directory_data(os.path.join(directory, \"pos\"))\n",
- " neg_df = load_directory_data(os.path.join(directory, \"neg\"))\n",
- " pos_df[\"polarity\"] = 1\n",
- " neg_df[\"polarity\"] = 0\n",
- " return pd.concat([pos_df, neg_df]).sample(frac=1).reset_index(drop=True)\n",
- "\n",
- "def download_and_load_datasets(force_download=False):\n",
- " dataset = tf.keras.utils.get_file(\n",
- " fname=\"aclImdb.tar.gz\", \n",
- " origin=\"http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz\", \n",
- " extract=True)\n",
- " \n",
- " train_df = load_dataset(os.path.join(os.path.dirname(dataset), \n",
- " \"aclImdb\", \"train\"))\n",
- " test_df = load_dataset(os.path.join(os.path.dirname(dataset), \n",
- " \"aclImdb\", \"test\"))\n",
- " \n",
- " return train_df, test_df\n",
- "\n",
- "train,test = download_and_load_datasets()"
- ],
- "execution_count": 0,
- "outputs": [
- {
- "output_type": "display_data",
- "data": {
- "text/html": [
- "
\n",
- "The default version of TensorFlow in Colab will soon switch to TensorFlow 2.x. \n",
- "We recommend you upgrade now \n",
- "or ensure your notebook will continue to use TensorFlow 1.x via the %tensorflow_version 1.x magic:\n",
- "more info.
\n"
- ],
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "tags": []
- }
- },
- {
- "output_type": "stream",
- "text": [
- "Downloading data from http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz\n",
- "84131840/84125825 [==============================] - 8s 0us/step\n"
- ],
- "name": "stdout"
- }
- ]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "hEpQWHnF-hOX",
- "colab_type": "code",
- "outputId": "75afbee2-0a05-4028-ed8f-86e50605201e",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 34
- }
- },
- "source": [
- "import warnings\n",
- "warnings.filterwarnings(\"ignore\")\n",
- "\n",
- "import os\n",
- "import sys\n",
- "import numpy as np\n",
- "from keras.preprocessing.text import Tokenizer\n",
- "from keras.preprocessing.sequence import pad_sequences\n",
- "from keras.utils import to_categorical\n",
- "from keras.layers import Dense, Input, GlobalMaxPooling1D\n",
- "from keras.layers import Conv1D, MaxPooling1D, Embedding, LSTM\n",
- "from keras.models import Model, Sequential\n",
- "from keras.initializers import Constant\n",
- "\n",
- "MAX_SEQUENCE_LENGTH = 1000\n",
- "MAX_NUM_WORDS = 20000 \n",
- "EMBEDDING_DIM = 100 \n",
- "VALIDATION_SPLIT = 0.2\n",
- "\n",
- "vocab_size = 20000 # Max number of different word, i.e. model input dimension\n",
- "maxlen = 1000 # Max number of words kept at the end of each text"
- ],
- "execution_count": 0,
- "outputs": [
- {
- "output_type": "stream",
- "text": [
- "Using TensorFlow backend.\n"
- ],
- "name": "stderr"
- }
- ]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "830AVGaZBfnf",
- "colab_type": "code",
- "outputId": "c5fdd29a-b8fe-44a1-d81e-ddb0f1c57be0",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 34
- }
- },
- "source": [
- "train.columns"
- ],
- "execution_count": 0,
- "outputs": [
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [
- "Index(['sentence', 'sentiment', 'polarity'], dtype='object')"
- ]
- },
- "metadata": {
- "tags": []
- },
- "execution_count": 4
- }
- ]
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "colab_type": "text",
+ "id": "F5S86uIWZKVO"
+ },
+ "source": [
+ "We will be building an LSTM model with an embedding layer trained on the fly. We will be following all the preprocessing steps as in the [DeepNN_Example.ipynb](https://github.com/practical-nlp/practical-nlp/blob/master/Ch4/DeepNN_Example.ipynb) notebook in this repo."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 98
},
- {
- "cell_type": "code",
- "metadata": {
- "id": "FJo_FLISBhx6",
- "colab_type": "code",
- "colab": {}
- },
- "source": [
- "train_texts = train['sentence'].values\n",
- "train_labels = train['polarity'].values\n",
- "test_texts = test['sentence'].values\n",
- "# test_labels = test['polarity'].values\n",
- "\n",
- "labels_index = {'pos':1, 'neg':0} "
- ],
- "execution_count": 0,
- "outputs": []
+ "colab_type": "code",
+ "id": "UsCn1xlo_MMX",
+ "outputId": "a5f0393a-0812-4fd0-c593-1479a8a6ed76"
+ },
+ "outputs": [],
+ "source": [
+ "import tensorflow as tf\n",
+ "from tensorflow import keras\n",
+ "import os\n",
+ "import re\n",
+ "import pandas as pd\n",
+ "\n",
+ "#helper functions to lead the data\n",
+ "def load_directory_data(directory):\n",
+ " data = {}\n",
+ " data[\"sentence\"] = []\n",
+ " data[\"sentiment\"] = []\n",
+ " for file_path in os.listdir(directory):\n",
+ " with tf.io.gfile.GFile(os.path.join(directory, file_path), \"r\") as f:\n",
+ " data[\"sentence\"].append(f.read())\n",
+ " data[\"sentiment\"].append(re.match(\"\\d+_(\\d+)\\.txt\", file_path).group(1))\n",
+ " return pd.DataFrame.from_dict(data)\n",
+ "\n",
+ "# Merge positive and negative examples, add a polarity column and shuffle.\n",
+ "def load_dataset(directory):\n",
+ " pos_df = load_directory_data(os.path.join(directory, \"pos\"))\n",
+ " neg_df = load_directory_data(os.path.join(directory, \"neg\"))\n",
+ " pos_df[\"polarity\"] = 1\n",
+ " neg_df[\"polarity\"] = 0\n",
+ " return pd.concat([pos_df, neg_df]).sample(frac=1).reset_index(drop=True)\n",
+ "\n",
+ "def download_and_load_datasets(force_download=False):\n",
+ " dataset = tf.keras.utils.get_file(\n",
+ " fname=\"aclImdb.tar.gz\", \n",
+ " origin=\"http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz\", \n",
+ " extract=True)\n",
+ "\n",
+ " train_df = load_dataset(os.path.join(os.path.dirname(dataset), \n",
+ " \"aclImdb\", \"train\"))\n",
+ " test_df = load_dataset(os.path.join(os.path.dirname(dataset), \n",
+ " \"aclImdb\", \"test\"))\n",
+ " \n",
+ " return train_df, test_df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "try:\n",
+ " from google.colab import files\n",
+ " \n",
+ " if not os.path.exists('aclImdb'):\n",
+ " train,test = download_and_load_datasets()\n",
+ " else:\n",
+ " train = load_dataset('aclImdb/train')\n",
+ " test = load_dataset('aclImdb/test')\n",
+ " \n",
+ "except ModuleNotFoundError:\n",
+ " if not os.path.exists('Data/aclImdb'):\n",
+ " train,test = download_and_load_datasets()\n",
+ " else:\n",
+ " train = load_dataset('Data/aclImdb/train')\n",
+ " test = load_dataset('Data/aclImdb/test')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 34
},
- {
- "cell_type": "code",
- "metadata": {
- "id": "rZ1G3DH3dDQ4",
- "colab_type": "code",
- "outputId": "8d6a5449-9d67-4ab5-d984-4eb80c971c4b",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 34
- }
- },
- "source": [
- "test.columns\n"
- ],
- "execution_count": 0,
- "outputs": [
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [
- "Index(['sentence', 'sentiment', 'polarity'], dtype='object')"
- ]
- },
- "metadata": {
- "tags": []
- },
- "execution_count": 37
- }
- ]
+ "colab_type": "code",
+ "id": "hEpQWHnF-hOX",
+ "outputId": "75afbee2-0a05-4028-ed8f-86e50605201e"
+ },
+ "outputs": [],
+ "source": [
+ "import warnings\n",
+ "warnings.filterwarnings(\"ignore\")\n",
+ "\n",
+ "import os\n",
+ "import sys\n",
+ "import numpy as np\n",
+ "from keras.preprocessing.text import Tokenizer\n",
+ "from keras.preprocessing.sequence import pad_sequences\n",
+ "from keras.utils.np_utils import to_categorical\n",
+ "from keras.layers import Dense, Input, GlobalMaxPooling1D\n",
+ "from keras.layers import Conv1D, MaxPooling1D, Embedding, LSTM\n",
+ "from keras.models import Model, Sequential\n",
+ "from keras.initializers import Constant\n",
+ "\n",
+ "MAX_SEQUENCE_LENGTH = 1000\n",
+ "MAX_NUM_WORDS = 20000 \n",
+ "EMBEDDING_DIM = 100 \n",
+ "VALIDATION_SPLIT = 0.2\n",
+ "\n",
+ "vocab_size = 20000 # Max number of different word, i.e. model input dimension\n",
+ "maxlen = 1000 # Max number of words kept at the end of each text"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 34
},
+ "colab_type": "code",
+ "id": "830AVGaZBfnf",
+ "outputId": "c5fdd29a-b8fe-44a1-d81e-ddb0f1c57be0"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "metadata": {
- "id": "g8I6QgXldKd0",
- "colab_type": "code",
- "outputId": "e251c62f-451f-48cb-cce1-e46bd5dd9796",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 34
- }
- },
- "source": [
- "test_labels = test['polarity'].values\n",
- "test_labels"
- ],
- "execution_count": 0,
- "outputs": [
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [
- "array([1, 0, 1, ..., 0, 0, 0])"
- ]
- },
- "metadata": {
- "tags": []
- },
- "execution_count": 42
- }
+ "data": {
+ "text/plain": [
+ "Index(['sentence', 'sentiment', 'polarity'], dtype='object')"
]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "train.columns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "colab": {},
+ "colab_type": "code",
+ "id": "FJo_FLISBhx6"
+ },
+ "outputs": [],
+ "source": [
+ "train_texts = train['sentence'].values\n",
+ "train_labels = train['polarity'].values\n",
+ "test_texts = test['sentence'].values\n",
+ "# test_labels = test['polarity'].values\n",
+ "\n",
+ "labels_index = {'pos':1, 'neg':0} "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 34
},
+ "colab_type": "code",
+ "id": "rZ1G3DH3dDQ4",
+ "outputId": "8d6a5449-9d67-4ab5-d984-4eb80c971c4b"
+ },
+ "outputs": [
{
- "cell_type": "markdown",
- "metadata": {
- "id": "VfPAZEEKajly",
- "colab_type": "text"
- },
- "source": [
- "We need to design an sklearn pipeline with our model.\n",
- "What is a pipeline? \n",
- "\n",
- "**Transformer** in scikit-learn - some class that have fit and transform method, or fit_transform method.\n",
- "\n",
- "**Predictor** - some class that has fit and predict methods, or fit_predict method.\n",
- "\n",
- "**Pipeline** is just an abstract notion, it's not some existing ml algorithm. Often in ML tasks you need to perform sequence of different transformations (find set of features, generate new features, select only some good features) of raw dataset before applying final estimator. Pipeline gives you a single interface for all 3 steps of transformation and resulting estimator. It encapsulates transformers and predictors inside"
+ "data": {
+ "text/plain": [
+ "Index(['sentence', 'sentiment', 'polarity'], dtype='object')"
]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "test.columns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 34
},
+ "colab_type": "code",
+ "id": "g8I6QgXldKd0",
+ "outputId": "e251c62f-451f-48cb-cce1-e46bd5dd9796"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "metadata": {
- "id": "ibekacAMMTsr",
- "colab_type": "code",
- "colab": {}
- },
- "source": [
- "from keras.preprocessing.text import Tokenizer\n",
- "from keras.preprocessing.sequence import pad_sequences\n",
- "from sklearn.pipeline import TransformerMixin\n",
- "from sklearn.base import BaseEstimator\n",
- "\n",
- "\n",
- "class TextsToSequences(Tokenizer, BaseEstimator, TransformerMixin):\n",
- " \"\"\" Sklearn transformer to convert texts to indices list \n",
- " (e.g. [[\"the cute cat\"], [\"the dog\"]] -> [[1, 2, 3], [1, 4]])\"\"\"\n",
- " def __init__(self, **kwargs):\n",
- " super().__init__(**kwargs)\n",
- " \n",
- " def fit(self, texts, y=None):\n",
- " self.fit_on_texts(texts)\n",
- " return self\n",
- " \n",
- " def transform(self, texts, y=None):\n",
- " return np.array(self.texts_to_sequences(texts))\n",
- " \n",
- "sequencer = TextsToSequences(num_words=vocab_size)\n",
- "\n",
- "\n",
- "\n",
- "\n",
- "class Padder(BaseEstimator, TransformerMixin):\n",
- " \"\"\" Pad and crop uneven lists to the same length. \n",
- " Only the end of lists longernthan the maxlen attribute are\n",
- " kept, and lists shorter than maxlen are left-padded with zeros\n",
- " \n",
- " Attributes\n",
- " ----------\n",
- " maxlen: int\n",
- " sizes of sequences after padding\n",
- " max_index: int\n",
- " maximum index known by the Padder, if a higher index is met during \n",
- " transform it is transformed to a 0\n",
- " \"\"\"\n",
- " def __init__(self, maxlen=500):\n",
- " self.maxlen = maxlen\n",
- " self.max_index = None\n",
- " \n",
- " def fit(self, X, y=None):\n",
- " self.max_index = pad_sequences(X, maxlen=self.maxlen).max()\n",
- " return self\n",
- " \n",
- " def transform(self, X, y=None):\n",
- " X = pad_sequences(X, maxlen=self.maxlen)\n",
- " X[X > self.max_index] = 0\n",
- " return X\n",
- "\n",
- "padder = Padder(maxlen)"
- ],
- "execution_count": 0,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "8mtEN5BjbyKM",
- "colab_type": "text"
- },
- "source": [
- "We will only train for 2 epochs. A better model could be trained with more epochs and early stopping."
+ "data": {
+ "text/plain": [
+ "array([1, 1, 0, ..., 0, 1, 1])"
]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "test_labels = test['polarity'].values\n",
+ "test_labels"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "colab_type": "text",
+ "id": "VfPAZEEKajly"
+ },
+ "source": [
+ "We need to design an sklearn pipeline with our model.\n",
+ "What is a pipeline? \n",
+ "\n",
+ "**Transformer** in scikit-learn - some class that have fit and transform method, or fit_transform method.\n",
+ "\n",
+ "**Predictor** - some class that has fit and predict methods, or fit_predict method.\n",
+ "\n",
+ "**Pipeline** is just an abstract notion, it's not some existing ml algorithm. Often in ML tasks you need to perform sequence of different transformations (find set of features, generate new features, select only some good features) of raw dataset before applying final estimator. Pipeline gives you a single interface for all 3 steps of transformation and resulting estimator. It encapsulates transformers and predictors inside"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 0,
+ "metadata": {
+ "colab": {},
+ "colab_type": "code",
+ "id": "ibekacAMMTsr"
+ },
+ "outputs": [],
+ "source": [
+ "from keras.preprocessing.text import Tokenizer\n",
+ "from keras.preprocessing.sequence import pad_sequences\n",
+ "from sklearn.pipeline import TransformerMixin\n",
+ "from sklearn.base import BaseEstimator\n",
+ "\n",
+ "\n",
+ "class TextsToSequences(Tokenizer, BaseEstimator, TransformerMixin):\n",
+ " \"\"\" Sklearn transformer to convert texts to indices list \n",
+ " (e.g. [[\"the cute cat\"], [\"the dog\"]] -> [[1, 2, 3], [1, 4]])\"\"\"\n",
+ " def __init__(self, **kwargs):\n",
+ " super().__init__(**kwargs)\n",
+ " \n",
+ " def fit(self, texts, y=None):\n",
+ " self.fit_on_texts(texts)\n",
+ " return self\n",
+ " \n",
+ " def transform(self, texts, y=None):\n",
+ " return np.array(self.texts_to_sequences(texts))\n",
+ " \n",
+ "sequencer = TextsToSequences(num_words=vocab_size)\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "class Padder(BaseEstimator, TransformerMixin):\n",
+ " \"\"\" Pad and crop uneven lists to the same length. \n",
+ " Only the end of lists longernthan the maxlen attribute are\n",
+ " kept, and lists shorter than maxlen are left-padded with zeros\n",
+ " \n",
+ " Attributes\n",
+ " ----------\n",
+ " maxlen: int\n",
+ " sizes of sequences after padding\n",
+ " max_index: int\n",
+ " maximum index known by the Padder, if a higher index is met during \n",
+ " transform it is transformed to a 0\n",
+ " \"\"\"\n",
+ " def __init__(self, maxlen=500):\n",
+ " self.maxlen = maxlen\n",
+ " self.max_index = None\n",
+ " \n",
+ " def fit(self, X, y=None):\n",
+ " self.max_index = pad_sequences(X, maxlen=self.maxlen).max()\n",
+ " return self\n",
+ " \n",
+ " def transform(self, X, y=None):\n",
+ " X = pad_sequences(X, maxlen=self.maxlen)\n",
+ " X[X > self.max_index] = 0\n",
+ " return X\n",
+ "\n",
+ "padder = Padder(maxlen)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "colab_type": "text",
+ "id": "8mtEN5BjbyKM"
+ },
+ "source": [
+ "We will only train for 2 epochs. A better model could be trained with more epochs and early stopping."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 0,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 86
},
+ "colab_type": "code",
+ "id": "6XvXEYGBMWlW",
+ "outputId": "a546a0c7-169a-4ca9-fb0d-c054250f740a"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "metadata": {
- "id": "6XvXEYGBMWlW",
- "colab_type": "code",
- "outputId": "a546a0c7-169a-4ca9-fb0d-c054250f740a",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 86
- }
- },
- "source": [
- "from keras.models import Sequential\n",
- "from keras.layers import Dense, Embedding, Bidirectional, LSTM\n",
- "from keras.wrappers.scikit_learn import KerasClassifier\n",
- "from sklearn.pipeline import make_pipeline\n",
- "\n",
- "batch_size = 64\n",
- "max_features = vocab_size + 1\n",
- "\n",
- "#Training an LSTM with embedding on the fly\n",
- "def create_model(max_features):\n",
- " \"\"\" Model creation function: returns a compiled LSTM\"\"\"\n",
- "\n",
- "\n",
- " rnnmodel = Sequential()\n",
- " rnnmodel.add(Embedding(MAX_NUM_WORDS, 128))\n",
- " rnnmodel.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))\n",
- " rnnmodel.add(Dense(1, activation='sigmoid'))\n",
- " rnnmodel.compile(loss='binary_crossentropy',\n",
- " optimizer='adam',\n",
- " metrics=['accuracy'])\n",
- " return rnnmodel\n",
- "\n",
- "\n",
- "# Use Keras Scikit-learn wrapper to instantiate a LSTM with all methods\n",
- "# required by Scikit-learn for the last step of a Pipeline\n",
- "sklearn_lstm = KerasClassifier(build_fn=create_model, epochs=2, batch_size=32, \n",
- " max_features=max_features, verbose=1)\n",
- "\n",
- "# Build the Scikit-learn pipeline\n",
- "pipeline = make_pipeline(sequencer, padder, sklearn_lstm)\n",
- "\n",
- "pipeline.fit(train_texts, train_labels);"
- ],
- "execution_count": 0,
- "outputs": [
- {
- "output_type": "stream",
- "text": [
- "Epoch 1/2\n",
- "25000/25000 [==============================] - 1486s 59ms/step - loss: 0.5025 - acc: 0.7597\n",
- "Epoch 2/2\n",
- "25000/25000 [==============================] - 1475s 59ms/step - loss: 0.3441 - acc: 0.8572\n"
- ],
- "name": "stdout"
- }
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/2\n",
+ "25000/25000 [==============================] - 1486s 59ms/step - loss: 0.5025 - acc: 0.7597\n",
+ "Epoch 2/2\n",
+ "25000/25000 [==============================] - 1475s 59ms/step - loss: 0.3441 - acc: 0.8572\n"
+ ]
+ }
+ ],
+ "source": [
+ "from keras.models import Sequential\n",
+ "from keras.layers import Dense, Embedding, Bidirectional, LSTM\n",
+ "from keras.wrappers.scikit_learn import KerasClassifier\n",
+ "from sklearn.pipeline import make_pipeline\n",
+ "\n",
+ "batch_size = 64\n",
+ "max_features = vocab_size + 1\n",
+ "\n",
+ "#Training an LSTM with embedding on the fly\n",
+ "def create_model(max_features):\n",
+ " \"\"\" Model creation function: returns a compiled LSTM\"\"\"\n",
+ "\n",
+ "\n",
+ " rnnmodel = Sequential()\n",
+ " rnnmodel.add(Embedding(MAX_NUM_WORDS, 128))\n",
+ " rnnmodel.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))\n",
+ " rnnmodel.add(Dense(1, activation='sigmoid'))\n",
+ " rnnmodel.compile(loss='binary_crossentropy',\n",
+ " optimizer='adam',\n",
+ " metrics=['accuracy'])\n",
+ " return rnnmodel\n",
+ "\n",
+ "\n",
+ "# Use Keras Scikit-learn wrapper to instantiate a LSTM with all methods\n",
+ "# required by Scikit-learn for the last step of a Pipeline\n",
+ "sklearn_lstm = KerasClassifier(build_fn=create_model, epochs=2, batch_size=32, \n",
+ " max_features=max_features, verbose=1)\n",
+ "\n",
+ "# Build the Scikit-learn pipeline\n",
+ "pipeline = make_pipeline(sequencer, padder, sklearn_lstm)\n",
+ "\n",
+ "pipeline.fit(train_texts, train_labels);"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 0,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 34
},
+ "colab_type": "code",
+ "id": "2KKnIf5BcnQn",
+ "outputId": "bef294a5-b7bb-4b60-812b-91f843b8a04b"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "metadata": {
- "id": "2KKnIf5BcnQn",
- "colab_type": "code",
- "outputId": "bef294a5-b7bb-4b60-812b-91f843b8a04b",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 34
- }
- },
- "source": [
- "print('Test accuracy: {:.2f} %'.format(100*metrics.accuracy_score(y_preds, test_labels)))"
- ],
- "execution_count": 0,
- "outputs": [
- {
- "output_type": "stream",
- "text": [
- "Test accuracy: 83.70 %\n"
- ],
- "name": "stdout"
- }
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Test accuracy: 83.70 %\n"
+ ]
+ }
+ ],
+ "source": [
+ "print('Test accuracy: {:.2f} %'.format(100*metrics.accuracy_score(y_preds, test_labels)))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 0,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 477
},
+ "colab_type": "code",
+ "id": "jd9mzgXrZ9ys",
+ "outputId": "9a640266-ef6d-40cc-8d6c-07023424b69c"
+ },
+ "outputs": [
{
- "cell_type": "code",
- "metadata": {
- "id": "jd9mzgXrZ9ys",
- "colab_type": "code",
- "outputId": "9a640266-ef6d-40cc-8d6c-07023424b69c",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 477
- }
- },
- "source": [
- "\n",
- "\n",
- "# We choose a sample from test set\n",
- "idx = 11\n",
- "text_sample = test_texts[idx]\n",
- "class_names = ['negative', 'positive']\n",
- "\n",
- "print('Sample {}: last 1000 words (only part used by the model)'.format(idx))\n",
- "print('-'*50)\n",
- "print(\" \".join(text_sample.split()[-1000:]))\n",
- "print('-'*50)\n",
- "print('Probability(positive) =', pipeline.predict_proba([text_sample])[0,1])\n",
- "print('True class: %s' % class_names[test_labels[idx]])\n",
- "\n",
- "\n",
- "\n",
- "import matplotlib.pyplot as plt\n",
- "import seaborn as sns\n",
- "%matplotlib inline\n",
- "from collections import OrderedDict\n",
- "from lime.lime_text import LimeTextExplainer\n",
- "\n",
- "explainer = LimeTextExplainer(class_names=class_names)\n",
- "explanation = explainer.explain_instance(text_sample, pipeline.predict_proba, num_features=10)\n",
- "\n",
- "weights = OrderedDict(explanation.as_list())\n",
- "lime_weights = pd.DataFrame({'words': list(weights.keys()), 'weights': list(weights.values())})\n",
- "\n",
- "sns.barplot(x=\"words\", y=\"weights\", data=lime_weights);\n",
- "plt.xticks(rotation=45)\n",
- "plt.title('Sample {} features weights given by LIME'.format(idx));"
- ],
- "execution_count": 0,
- "outputs": [
- {
- "output_type": "stream",
- "text": [
- "Sample 11: last 1000 words (only part used by the model)\n",
- "--------------------------------------------------\n",
- "The film starts out with a narration of the protagonist explaining certain crimes occurring all over the city and then we get to know that the hero is a cop who is either suspended or has probably retired. I did not have the patience or the interest to verify the above before commenting. If there is a stereotype for narrators to have a deep, sleep-inducing voice then, it is high time to put an end to it. I seriously fell asleep and did not bother to shut the movie down either. Am still trying to figure out what the movie was all about and why there were no outdoor shootings. A third rate TV Serial will have more number of sets compared to this crap of a movie and I still pity the actors and producers involved in this huge bullshit of a movie. It ought to have been produced as a normal TV serial or maybe even as a local theater drama instead of putting it out on the big screen. Total waste of time and money. The movie was supposed to be in production for a long time and it would have been better to have left it that way.With redundant sleep inducing dialogs and sets, this is the worst movie I have come across.\n",
- "--------------------------------------------------\n",
- "1/1 [==============================] - 0s 347ms/step\n",
- "Probability(positive) = 0.07630403\n",
- "True class: negative\n",
- "5000/5000 [==============================] - 63s 13ms/step\n"
- ],
- "name": "stdout"
- },
- {
- "output_type": "display_data",
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAEtCAYAAAAm6zZnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3dedxUZf3/8ddbEM0dAhFBxK9Lamou\nqJklrrgUQqYlbmgaaVG55E/LSjM1Lc20ssK0ULM0M8XcQnNLy7xxNzM0RUAEBNw30M/vj+uaHIe5\nb4bDPQvc7+fjMY97zpkz5/rMmbnP51zLOUcRgZmZ2aJaptkBmJnZkskJxMzMCnECMTOzQpxAzMys\nECcQMzMrxAnEzMwKcQKxBUg6RdJlLRBHX0l3SnpF0jnNjqeVSDpQ0l9qXPZQSX+rd0xVyh0o6VVJ\n3Rpc7u2SjmhkmV2VE0gLkfRxSfdIeknSHEl3S9q62XEtCkljJLVJekvSbype6yHpKknPSApJOy5k\ndaOBF4BVIuK4xYzrN5JOW5x1tJKI+G1EDO2MddVrhxsRz0bEShHxTmevuxEkDcq/0+5VXnvfQVZe\nbmb5spKWzfOibN7tkt7MibX0uK7+n6Y+nEBahKRVgD8DPwF6Af2B7wJvNTOuAp4DTgMubuf1vwEH\nAc/XsK61gX9FC5ztWm0nYlZhLrBn2fSeeV6lMTmxlh7DGhNe53MCaR0bAETE7yLinYh4IyL+EhEP\nA0haV9JfJc2W9IKk30parfTmfFR/vKSHJb0m6aLcBHRjbgK6RVLPvGzpyGq0pOckTZf09fYCk/TR\nXDN6UdJDHdUcIuLqiLgGmF3ltbcj4scR8Tegw6PSXHsZBfy/fJS2q6RlJJ0o6am8Ha6U1KvsPX+Q\n9Hyuwd0p6cN5/mjgwLJ1XZfnh6T1ysss1VIk7ShpqqQTJD0P/DrP/5SkB/O2uEfSZmXvP0HStLy9\nn5C0S5XPtU5+7zJ5+kJJM8tev1TS0fn5qvl7nJ7Xe1qpOaiyWUrS0FzmS5IukHRHZa1C0tmS5kp6\nWtKeed7pwCeAn+Zt81Ml5+aj55clPSJpk3a+p3X0XjPjLZJ+VjoyLz+Cl/Q5SW0V7z1G0vj8fLkc\n37OSZkj6haQPVHwXx+WYpks6rFo8ZdaV9M8c/7Wl34mk6yV9pSKOhyV9eiHrq8WlwCFl04cAl3TC\n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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "tags": []
- }
- }
- ]
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Sample 11: last 1000 words (only part used by the model)\n",
+ "--------------------------------------------------\n",
+ "The film starts out with a narration of the protagonist explaining certain crimes occurring all over the city and then we get to know that the hero is a cop who is either suspended or has probably retired. I did not have the patience or the interest to verify the above before commenting. If there is a stereotype for narrators to have a deep, sleep-inducing voice then, it is high time to put an end to it. I seriously fell asleep and did not bother to shut the movie down either. Am still trying to figure out what the movie was all about and why there were no outdoor shootings. A third rate TV Serial will have more number of sets compared to this crap of a movie and I still pity the actors and producers involved in this huge bullshit of a movie. It ought to have been produced as a normal TV serial or maybe even as a local theater drama instead of putting it out on the big screen. Total waste of time and money. The movie was supposed to be in production for a long time and it would have been better to have left it that way.With redundant sleep inducing dialogs and sets, this is the worst movie I have come across.\n",
+ "--------------------------------------------------\n",
+ "1/1 [==============================] - 0s 347ms/step\n",
+ "Probability(positive) = 0.07630403\n",
+ "True class: negative\n",
+ "5000/5000 [==============================] - 63s 13ms/step\n"
+ ]
},
{
- "cell_type": "markdown",
- "metadata": {
- "id": "3tdpfNvHcaDB",
- "colab_type": "text"
- },
- "source": [
- "We have used the LIME interpretation to provide explanations for a recurrent neural network. Looking at the graph we understand that the sentence is negative and the word \"worst\" affects it the most.\n",
- "\n"
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAEtCAYAAAAm6zZnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3dedxUZf3/8ddbEM0dAhFBxK9Lamou\nqJklrrgUQqYlbmgaaVG55E/LSjM1Lc20ssK0ULM0M8XcQnNLy7xxNzM0RUAEBNw30M/vj+uaHIe5\nb4bDPQvc7+fjMY97zpkz5/rMmbnP51zLOUcRgZmZ2aJaptkBmJnZkskJxMzMCnECMTOzQpxAzMys\nECcQMzMrxAnEzMwKcQKxBUg6RdJlLRBHX0l3SnpF0jnNjqeVSDpQ0l9qXPZQSX+rd0xVyh0o6VVJ\n3Rpc7u2SjmhkmV2VE0gLkfRxSfdIeknSHEl3S9q62XEtCkljJLVJekvSbype6yHpKknPSApJOy5k\ndaOBF4BVIuK4xYzrN5JOW5x1tJKI+G1EDO2MddVrhxsRz0bEShHxTmevuxEkDcq/0+5VXnvfQVZe\nbmb5spKWzfOibN7tkt7MibX0uK7+n6Y+nEBahKRVgD8DPwF6Af2B7wJvNTOuAp4DTgMubuf1vwEH\nAc/XsK61gX9FC5ztWm0nYlZhLrBn2fSeeV6lMTmxlh7DGhNe53MCaR0bAETE7yLinYh4IyL+EhEP\nA0haV9JfJc2W9IKk30parfTmfFR/vKSHJb0m6aLcBHRjbgK6RVLPvGzpyGq0pOckTZf09fYCk/TR\nXDN6UdJDHdUcIuLqiLgGmF3ltbcj4scR8Tegw6PSXHsZBfy/fJS2q6RlJJ0o6am8Ha6U1KvsPX+Q\n9Hyuwd0p6cN5/mjgwLJ1XZfnh6T1ysss1VIk7ShpqqQTJD0P/DrP/5SkB/O2uEfSZmXvP0HStLy9\nn5C0S5XPtU5+7zJ5+kJJM8tev1TS0fn5qvl7nJ7Xe1qpOaiyWUrS0FzmS5IukHRHZa1C0tmS5kp6\nWtKeed7pwCeAn+Zt81Ml5+aj55clPSJpk3a+p3X0XjPjLZJ+VjoyLz+Cl/Q5SW0V7z1G0vj8fLkc\n37OSZkj6haQPVHwXx+WYpks6rFo8ZdaV9M8c/7Wl34mk6yV9pSKOhyV9eiHrq8WlwCFl04cAl3TC\n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\n",
+ "text/plain": [
+ ""
]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "A3JGXJF2aIFJ",
- "colab_type": "code",
- "colab": {}
- },
- "source": [
- ""
- ],
- "execution_count": 0,
- "outputs": []
+ },
+ "metadata": {
+ "tags": []
+ },
+ "output_type": "display_data"
}
- ]
-}
\ No newline at end of file
+ ],
+ "source": [
+ "# We choose a sample from test set\n",
+ "idx = 11\n",
+ "text_sample = test_texts[idx]\n",
+ "class_names = ['negative', 'positive']\n",
+ "\n",
+ "print('Sample {}: last 1000 words (only part used by the model)'.format(idx))\n",
+ "print('-'*50)\n",
+ "print(\" \".join(text_sample.split()[-1000:]))\n",
+ "print('-'*50)\n",
+ "print('Probability(positive) =', pipeline.predict_proba([text_sample])[0,1])\n",
+ "print('True class: %s' % class_names[test_labels[idx]])\n",
+ "\n",
+ "\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "import seaborn as sns\n",
+ "%matplotlib inline\n",
+ "from collections import OrderedDict\n",
+ "from lime.lime_text import LimeTextExplainer\n",
+ "\n",
+ "explainer = LimeTextExplainer(class_names=class_names)\n",
+ "explanation = explainer.explain_instance(text_sample, pipeline.predict_proba, num_features=10)\n",
+ "\n",
+ "weights = OrderedDict(explanation.as_list())\n",
+ "lime_weights = pd.DataFrame({'words': list(weights.keys()), 'weights': list(weights.values())})\n",
+ "\n",
+ "sns.barplot(x=\"words\", y=\"weights\", data=lime_weights);\n",
+ "plt.xticks(rotation=45)\n",
+ "plt.title('Sample {} features weights given by LIME'.format(idx));"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "colab_type": "text",
+ "id": "3tdpfNvHcaDB"
+ },
+ "source": [
+ "We have used the LIME interpretation to provide explanations for a recurrent neural network. Looking at the graph we understand that the sentence is negative and the word \"worst\" affects it the most.\n",
+ "\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "accelerator": "GPU",
+ "colab": {
+ "name": "Lime_RNN.ipynb",
+ "provenance": []
+ },
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.4"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
From e60001c89b2c9edd183d68944a60924322a825b8 Mon Sep 17 00:00:00 2001
From: jatinpapreja <47968703+jatinpapreja@users.noreply.github.com>
Date: Thu, 10 Jun 2021 12:52:55 +0530
Subject: [PATCH 3/4] [Ch4Nb10] Fixed path issues
1. Specified the version for tensorflow installation.
2. Added try block for windows and colab users and specified the path for downloading files for windows users.
---
Ch4/10_ShapDemo.ipynb | 375 +++++++++++++++---------------------------
1 file changed, 132 insertions(+), 243 deletions(-)
diff --git a/Ch4/10_ShapDemo.ipynb b/Ch4/10_ShapDemo.ipynb
index 93c3e3e..706a8c4 100644
--- a/Ch4/10_ShapDemo.ipynb
+++ b/Ch4/10_ShapDemo.ipynb
@@ -3,7 +3,6 @@
{
"cell_type": "markdown",
"metadata": {
- "colab_type": "text",
"id": "q53fZJ-eqcgX"
},
"source": [
@@ -12,43 +11,20 @@
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 1,
"metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 187
- },
- "colab_type": "code",
- "id": "2IH_HuQYqSE9",
- "outputId": "c9c0952b-1a4c-4380-bb1b-16b01dd7291d"
+ "id": "2IH_HuQYqSE9"
},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Requirement already satisfied: shap in /usr/local/lib/python3.6/dist-packages (0.35.0)\n",
- "Requirement already satisfied: scipy in /usr/local/lib/python3.6/dist-packages (from shap) (1.4.1)\n",
- "Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from shap) (1.18.4)\n",
- "Requirement already satisfied: pandas in /usr/local/lib/python3.6/dist-packages (from shap) (1.0.3)\n",
- "Requirement already satisfied: tqdm>4.25.0 in /usr/local/lib/python3.6/dist-packages (from shap) (4.41.1)\n",
- "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.6/dist-packages (from shap) (0.22.2.post1)\n",
- "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas->shap) (2018.9)\n",
- "Requirement already satisfied: python-dateutil>=2.6.1 in /usr/local/lib/python3.6/dist-packages (from pandas->shap) (2.8.1)\n",
- "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.6/dist-packages (from scikit-learn->shap) (0.14.1)\n",
- "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil>=2.6.1->pandas->shap) (1.12.0)\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"#installing shap\n",
- "!pip install shap"
+ "!pip install shap\n",
+ "!pip install tensorflow==1.14.0"
]
},
{
"cell_type": "markdown",
"metadata": {
- "colab_type": "text",
"id": "ohVsijBFqmSS"
},
"source": [
@@ -58,27 +34,14 @@
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 2,
"metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 71
- },
- "colab_type": "code",
- "id": "TtQ_PdWZqiyE",
- "outputId": "27e840b8-804c-4627-e283-a158ad376d59"
+ "id": "TtQ_PdWZqiyE"
},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/usr/local/lib/python3.6/dist-packages/sklearn/utils/deprecation.py:144: FutureWarning: The sklearn.feature_extraction.stop_words module is deprecated in version 0.22 and will be removed in version 0.24. The corresponding classes / functions should instead be imported from sklearn.feature_extraction.text. Anything that cannot be imported from sklearn.feature_extraction.text is now part of the private API.\n",
- " warnings.warn(message, FutureWarning)\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
+ "import warnings\n",
+ "warnings.filterwarnings('ignore')\n",
"import numpy as np\n",
"import pandas as pd #to work with csv files\n",
"\n",
@@ -102,21 +65,19 @@
"from sklearn.metrics import accuracy_score\n",
"from sklearn.model_selection import train_test_split\n",
"#import time function from time module to track the training duration\n",
- "from time import time\n",
- "\n"
+ "from time import time"
]
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 102
},
- "colab_type": "code",
"id": "3h3XkJDhq2-R",
- "outputId": "d0be0712-175e-469d-e313-62199cf9a088"
+ "outputId": "7fe6d5de-7766-41f8-e089-2e55af04c1ae"
},
"outputs": [
{
@@ -168,21 +129,18 @@
" doc = \"\".join([char for char in doc if char not in string.punctuation and not char.isdigit()])\n",
" doc = \" \".join([token for token in doc.split() if token not in stopwords])\n",
" #remove punctuation and numbers\n",
- " return doc\n",
- "\n"
+ " return doc"
]
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 4,
"metadata": {
"colab": {
- "base_uri": "https://localhost:8080/",
- "height": 68
+ "base_uri": "https://localhost:8080/"
},
- "colab_type": "code",
"id": "fLZR3emyq3RO",
- "outputId": "ea870f92-55d9-4a53-f224-0d974595cd80"
+ "outputId": "0e8550ff-ec82-47d2-a515-f38b4a2e21b0"
},
"outputs": [
{
@@ -206,16 +164,13 @@
"#random_state=1 for reproducibility\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)\n",
"print(X_train.shape, y_train.shape)\n",
- "print(X_test.shape, y_test.shape)\n",
- "\n"
+ "print(X_test.shape, y_test.shape)"
]
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 5,
"metadata": {
- "colab": {},
- "colab_type": "code",
"id": "lGOIy920q5xG"
},
"outputs": [],
@@ -224,20 +179,18 @@
"\n",
"vect = TfidfVectorizer(min_df=5)\n",
"X_train_dtm = vect.fit_transform(X_train)\n",
- "X_test_dtm = vect.transform(X_test)\n"
+ "X_test_dtm = vect.transform(X_test)"
]
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 6,
"metadata": {
"colab": {
- "base_uri": "https://localhost:8080/",
- "height": 34
+ "base_uri": "https://localhost:8080/"
},
- "colab_type": "code",
"id": "cjs6qDTIq7tT",
- "outputId": "3b4551ab-ca45-45a5-f34b-40f97d3ec5af"
+ "outputId": "90d1c5c0-edef-4f2f-f48e-61f7cff4fada"
},
"outputs": [
{
@@ -258,15 +211,13 @@
"y_pred_class = model.predict(X_test_dtm)\n",
"\n",
"#calculate evaluation measures:\n",
- "print(\"Accuracy: \", accuracy_score(y_test, y_pred_class))\n"
+ "print(\"Accuracy: \", accuracy_score(y_test, y_pred_class))"
]
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 7,
"metadata": {
- "colab": {},
- "colab_type": "code",
"id": "AvnDPwzprKUi"
},
"outputs": [],
@@ -279,15 +230,13 @@
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 8,
"metadata": {
"colab": {
- "base_uri": "https://localhost:8080/",
- "height": 272
+ "base_uri": "https://localhost:8080/"
},
- "colab_type": "code",
"id": "pHwr6uFdrcTv",
- "outputId": "14b1a7d8-0764-43ad-a7b1-f66f7e1d0c2a"
+ "outputId": "42f5a6b1-75e6-4dcf-e04c-23e21d0ccd7a"
},
"outputs": [
{
@@ -319,15 +268,14 @@
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 9,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 611
},
- "colab_type": "code",
"id": "dfQPVQ-xrjSN",
- "outputId": "b117d191-ed8f-4352-b506-9220cbd1a3e8"
+ "outputId": "e0def5ef-3bc3-444a-ac46-d65bc1681b3c"
},
"outputs": [
{
@@ -376,7 +324,7 @@
},
{
"data": {
- "image/png": "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\n",
+ "image/png": "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\n",
"text/plain": [
""
]
@@ -396,7 +344,6 @@
{
"cell_type": "markdown",
"metadata": {
- "colab_type": "text",
"id": "WE0JzAqV1Icg"
},
"source": [
@@ -411,15 +358,14 @@
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 10,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 193
},
- "colab_type": "code",
"id": "f587yWgnrr8r",
- "outputId": "b294b926-7ffc-434c-d017-c7973002236a"
+ "outputId": "52cb0af4-d23b-4739-d1df-da91f4bb71dd"
},
"outputs": [
{
@@ -470,7 +416,7 @@
"data": {
"text/html": [
"\n",
- "
\n",
+ "
\n",
"
\n",
" Visualization omitted, Javascript library not loaded! \n",
" Have you run `initjs()` in this notebook? If this notebook was from another\n",
@@ -480,13 +426,13 @@
"
\n",
" "
],
"text/plain": [
- ""
+ ""
]
},
"execution_count": 10,
@@ -508,7 +454,6 @@
{
"cell_type": "markdown",
"metadata": {
- "colab_type": "text",
"id": "SnKH7AYQ3R0_"
},
"source": [
@@ -522,7 +467,6 @@
{
"cell_type": "markdown",
"metadata": {
- "colab_type": "text",
"id": "dxbf2VQar-nr"
},
"source": [
@@ -531,25 +475,11 @@
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 11,
"metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 34
- },
- "colab_type": "code",
- "id": "cMdGM1_9ry6R",
- "outputId": "c89ba309-296c-4816-86cc-b4af89abaa89"
+ "id": "cMdGM1_9ry6R"
},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Using TensorFlow backend.\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"from sklearn.preprocessing import LabelEncoder\n",
"\n",
@@ -559,15 +489,16 @@
"import os\n",
"import sys\n",
"import numpy as np\n",
- "from keras.preprocessing.text import Tokenizer\n",
- "from keras.preprocessing.sequence import pad_sequences\n",
- "from keras.utils import to_categorical\n",
- "from keras.layers import Dense, Input, GlobalMaxPooling1D\n",
- "from keras.layers import Conv1D, MaxPooling1D, Embedding, LSTM\n",
- "from keras.models import Model, Sequential\n",
- "from keras.initializers import Constant\n",
- "import tensorflow as tf\n",
"from tensorflow import keras\n",
+ "from tensorflow.keras.preprocessing.text import Tokenizer\n",
+ "from tensorflow.keras.preprocessing.sequence import pad_sequences\n",
+ "from tensorflow.keras.utils import to_categorical\n",
+ "from tensorflow.keras.layers import Dense, Input, GlobalMaxPooling1D\n",
+ "from tensorflow.keras.layers import Conv1D, MaxPooling1D, Embedding, LSTM\n",
+ "from tensorflow.keras.models import Model, Sequential\n",
+ "from tensorflow.keras.initializers import Constant\n",
+ "import tensorflow as tf\n",
+ "\n",
"\n",
"\n",
"MAX_SEQUENCE_LENGTH = 1000\n",
@@ -576,108 +507,78 @@
"VALIDATION_SPLIT = 0.2\n",
"\n",
"vocab_size = 20000 # Max number of different word, i.e. model input dimension\n",
- "maxlen = 1000 # Max number of words kept at the end of each text\n"
+ "maxlen = 1000 # Max number of words kept at the end of each text"
]
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 12,
"metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 374
- },
- "colab_type": "code",
- "id": "1moJm0VJsM2r",
- "outputId": "d9c23ceb-cf5d-4fcb-e43d-10ebaaab5d2b"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\u001b[33mWARNING: Skipping tensorflow as it is not installed.\u001b[0m\n",
- "Requirement already satisfied: tensorflow-gpu==1.14.0 in /usr/local/lib/python3.6/dist-packages (1.14.0)\n",
- "Requirement already satisfied: gast>=0.2.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gpu==1.14.0) (0.3.3)\n",
- "Requirement already satisfied: keras-applications>=1.0.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gpu==1.14.0) (1.0.8)\n",
- "Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gpu==1.14.0) (1.1.0)\n",
- "Requirement already satisfied: wrapt>=1.11.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gpu==1.14.0) (1.12.1)\n",
- "Requirement already satisfied: wheel>=0.26 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gpu==1.14.0) (0.34.2)\n",
- "Requirement already satisfied: google-pasta>=0.1.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gpu==1.14.0) (0.2.0)\n",
- "Requirement already satisfied: astor>=0.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gpu==1.14.0) (0.8.1)\n",
- "Requirement already satisfied: keras-preprocessing>=1.0.5 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gpu==1.14.0) (1.1.0)\n",
- "Requirement already satisfied: grpcio>=1.8.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gpu==1.14.0) (1.28.1)\n",
- "Requirement already satisfied: tensorflow-estimator<1.15.0rc0,>=1.14.0rc0 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gpu==1.14.0) (1.14.0)\n",
- "Requirement already satisfied: absl-py>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gpu==1.14.0) (0.9.0)\n",
- "Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gpu==1.14.0) (1.12.0)\n",
- "Requirement already satisfied: tensorboard<1.15.0,>=1.14.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gpu==1.14.0) (1.14.0)\n",
- "Requirement already satisfied: protobuf>=3.6.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gpu==1.14.0) (3.10.0)\n",
- "Requirement already satisfied: numpy<2.0,>=1.14.5 in /usr/local/lib/python3.6/dist-packages (from tensorflow-gpu==1.14.0) (1.18.4)\n",
- "Requirement already satisfied: h5py in /usr/local/lib/python3.6/dist-packages (from keras-applications>=1.0.6->tensorflow-gpu==1.14.0) (2.10.0)\n",
- "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.6/dist-packages (from tensorboard<1.15.0,>=1.14.0->tensorflow-gpu==1.14.0) (3.2.1)\n",
- "Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.6/dist-packages (from tensorboard<1.15.0,>=1.14.0->tensorflow-gpu==1.14.0) (46.1.3)\n",
- "Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.6/dist-packages (from tensorboard<1.15.0,>=1.14.0->tensorflow-gpu==1.14.0) (1.0.1)\n"
- ]
- }
- ],
- "source": [
- "%tensorflow_version 2.x\n",
- "!pip uninstall -y tensorflow\n",
- "!pip install tensorflow-gpu==1.14.0"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 0,
- "metadata": {
- "colab": {},
- "colab_type": "code",
"id": "G8UECSj1sSlt"
},
"outputs": [],
"source": [
- "\n",
- "\n",
"def load_directory_data(directory):\n",
- " data = {}\n",
- " data[\"sentence\"] = []\n",
- " data[\"sentiment\"] = []\n",
- " for file_path in os.listdir(directory):\n",
- " with tf.gfile.GFile(os.path.join(directory, file_path), \"r\") as f:\n",
- " data[\"sentence\"].append(f.read())\n",
- " data[\"sentiment\"].append(re.match(\"\\d+_(\\d+)\\.txt\", file_path).group(1))\n",
- " return pd.DataFrame.from_dict(data)\n",
+ " data = {}\n",
+ " data[\"sentence\"] = []\n",
+ " data[\"sentiment\"] = []\n",
+ " for file_path in os.listdir(directory):\n",
+ " with tf.io.gfile.GFile(os.path.join(directory, file_path), \"r\") as f:\n",
+ " data[\"sentence\"].append(f.read())\n",
+ " data[\"sentiment\"].append(re.match(\"\\d+_(\\d+)\\.txt\", file_path).group(1))\n",
+ " return pd.DataFrame.from_dict(data)\n",
"\n",
"# Merge positive and negative examples, add a polarity column and shuffle.\n",
"def load_dataset(directory):\n",
- " pos_df = load_directory_data(os.path.join(directory, \"pos\"))\n",
- " neg_df = load_directory_data(os.path.join(directory, \"neg\"))\n",
- " pos_df[\"polarity\"] = 1\n",
- " neg_df[\"polarity\"] = 0\n",
- " return pd.concat([pos_df, neg_df]).sample(frac=1).reset_index(drop=True)\n",
+ " pos_df = load_directory_data(os.path.join(directory, \"pos\"))\n",
+ " neg_df = load_directory_data(os.path.join(directory, \"neg\"))\n",
+ " pos_df[\"polarity\"] = 1\n",
+ " neg_df[\"polarity\"] = 0\n",
+ " return pd.concat([pos_df, neg_df]).sample(frac=1).reset_index(drop=True)\n",
"\n",
"def download_and_load_datasets(force_download=False):\n",
- " dataset = tf.keras.utils.get_file(\n",
+ " dataset = tf.keras.utils.get_file(\n",
" fname=\"aclImdb.tar.gz\", \n",
" origin=\"http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz\", \n",
" extract=True)\n",
- " \n",
- " train_df = load_dataset(os.path.join(os.path.dirname(dataset), \n",
+ "\n",
+ " train_df = load_dataset(os.path.join(os.path.dirname(dataset), \n",
" \"aclImdb\", \"train\"))\n",
- " test_df = load_dataset(os.path.join(os.path.dirname(dataset), \n",
+ " test_df = load_dataset(os.path.join(os.path.dirname(dataset), \n",
" \"aclImdb\", \"test\"))\n",
- " \n",
- " return train_df, test_df\n",
"\n",
- "train,test = download_and_load_datasets()"
+ " return train_df, test_df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "id": "yVlCL4IWgrUV"
+ },
+ "outputs": [],
+ "source": [
+ "try:\n",
+ " from google.colab import files\n",
+ " \n",
+ " if not os.path.exists('aclImdb'):\n",
+ " train,test = download_and_load_datasets()\n",
+ " else:\n",
+ " train = load_dataset('aclImdb/train')\n",
+ " test = load_dataset('aclImdb/test')\n",
+ " \n",
+ "except ModuleNotFoundError:\n",
+ " if not os.path.exists('Data/aclImdb'):\n",
+ " train,test = download_and_load_datasets()\n",
+ " else:\n",
+ " train = load_dataset('Data/aclImdb/train')\n",
+ " test = load_dataset('Data/aclImdb/test')"
]
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 14,
"metadata": {
- "colab": {},
- "colab_type": "code",
"id": "fRM5iANksS52"
},
"outputs": [],
@@ -692,15 +593,13 @@
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 15,
"metadata": {
"colab": {
- "base_uri": "https://localhost:8080/",
- "height": 51
+ "base_uri": "https://localhost:8080/"
},
- "colab_type": "code",
"id": "OCdVEEWDtY9q",
- "outputId": "cd121009-3557-4b13-a252-97b868a32ee3"
+ "outputId": "6fc10e64-7703-46f2-847b-2a379e240bb0"
},
"outputs": [
{
@@ -743,21 +642,18 @@
"y_val = trainvalid_labels[-num_validation_samples:]\n",
"\n",
"#This is the data we will use for CNN and RNN training\n",
- "print('Splitting the train data into train and valid is done')\n",
- "\n"
+ "print('Splitting the train data into train and valid is done')"
]
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 16,
"metadata": {
"colab": {
- "base_uri": "https://localhost:8080/",
- "height": 275
+ "base_uri": "https://localhost:8080/"
},
- "colab_type": "code",
"id": "3kbwNXYQtZLO",
- "outputId": "bb19bcca-836d-422f-e903-5e3981b5df53"
+ "outputId": "baaf3374-fdf1-4c36-ff6d-d4f6a5a351bb"
},
"outputs": [
{
@@ -765,19 +661,23 @@
"output_type": "stream",
"text": [
"Defining and training an LSTM model, training embedding layer on the fly\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/nn_impl.py:180: add_dispatch_support..wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/initializers.py:119: calling RandomUniform.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n",
+ "Instructions for updating:\n",
+ "Call initializer instance with the dtype argument instead of passing it to the constructor\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/init_ops.py:1251: calling VarianceScaling.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n",
+ "Instructions for updating:\n",
+ "Call initializer instance with the dtype argument instead of passing it to the constructor\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/nn_impl.py:180: add_dispatch_support..wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
"Instructions for updating:\n",
"Use tf.where in 2.0, which has the same broadcast rule as np.where\n",
"Training the RNN\n",
- "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:422: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.\n",
- "\n",
"Train on 20000 samples, validate on 5000 samples\n",
"Epoch 1/2\n",
- "20000/20000 [==============================] - 580s 29ms/step - loss: 0.5170 - accuracy: 0.7466 - val_loss: 0.6257 - val_accuracy: 0.6769\n",
+ "20000/20000 [==============================] - 1497s 75ms/sample - loss: 0.4971 - acc: 0.7658 - val_loss: 0.5015 - val_acc: 0.8095\n",
"Epoch 2/2\n",
- "20000/20000 [==============================] - 571s 29ms/step - loss: 0.3721 - accuracy: 0.8408 - val_loss: 0.4292 - val_accuracy: 0.8138\n",
- "25000/25000 [==============================] - 134s 5ms/step\n",
- "Test accuracy with RNN: 0.8116400241851807\n"
+ "20000/20000 [==============================] - 1482s 74ms/sample - loss: 0.3532 - acc: 0.8561 - val_loss: 0.4566 - val_acc: 0.7831\n",
+ "25000/25000 [==============================] - 193s 8ms/sample - loss: 0.4721 - acc: 0.7787\n",
+ "Test accuracy with RNN: 0.77874\n"
]
}
],
@@ -803,20 +703,19 @@
" validation_data=(x_val, y_val))\n",
"score, acc = rnnmodel.evaluate(test_data, test_labels,\n",
" batch_size=32)\n",
- "print('Test accuracy with RNN:', acc)\n"
+ "print('Test accuracy with RNN:', acc)"
]
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 18,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
- "height": 77
+ "height": 131
},
- "colab_type": "code",
"id": "aJWmc_qguQbj",
- "outputId": "fd809bae-d9c0-4950-8c9f-0f1f1fb0f0f8"
+ "outputId": "84ba7325-6ec6-4d15-c26e-206a49a0d798"
},
"outputs": [
{
@@ -867,15 +766,18 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Downloading data from https://s3.amazonaws.com/text-datasets/imdb_word_index.json\n",
+ "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/shap/explainers/tf_utils.py:28: The name tf.keras.backend.get_session is deprecated. Please use tf.compat.v1.keras.backend.get_session instead.\n",
+ "\n",
+ "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb_word_index.json\n",
"1646592/1641221 [==============================] - 0s 0us/step\n"
]
}
],
"source": [
- "from keras.datasets import imdb\n",
+ "from tensorflow.keras.datasets import imdb\n",
"import shap\n",
"shap.initjs()\n",
+ "\n",
"# we use the first 100 training examples as our background dataset to integrate over\n",
"explainer = shap.DeepExplainer(rnnmodel, x_train[:20])\n",
"\n",
@@ -888,20 +790,19 @@
"num2word = {}\n",
"for w in words.keys():\n",
" num2word[words[w]] = w\n",
- "x_val_words = np.stack([np.array(list(map(lambda x: num2word.get(x, \"NONE\"), x_val[i]))) for i in range(10)])\n"
+ "x_val_words = np.stack([np.array(list(map(lambda x: num2word.get(x, \"NONE\"), x_val[i]))) for i in range(10)])"
]
},
{
"cell_type": "code",
- "execution_count": 0,
+ "execution_count": 19,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 193
},
- "colab_type": "code",
"id": "VLup1ak_unKe",
- "outputId": "80995a62-04b5-4730-c4ed-9dfda5e64f3b"
+ "outputId": "068f4ef5-9655-4e72-b8d2-7aa876036954"
},
"outputs": [
{
@@ -952,7 +853,7 @@
"data": {
"text/html": [
"\n",
- "
\n",
+ "
\n",
"
\n",
" Visualization omitted, Javascript library not loaded! \n",
" Have you run `initjs()` in this notebook? If this notebook was from another\n",
@@ -962,16 +863,16 @@
"