{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Title :\n", "Vanishing Gradients\n", "\n", "## Description :\n", "The goal of this exercise is to understand the vanishing gradient problem in training RNNs and using various methods to improve training.\n", "\n", "In order to do this exercise, we will use the IMDB movie review dataset to perform sentiment analysis.\n", "\n", "Your final comparison for the trace plot may look something like this:\n", "\n", "\n", "\n", "## Instructions:\n", "- Read the IMDB dataset from the helper code given.\n", "- Take a quick look at your training inputs and labels.\n", "- Pad the values to a fix number `max_words` in-order to have sequences of the same size.\n", "- First post pad the inputs with `padding='post'` i.e sequences smaller than `max_words` will be followed by zero padding.\n", "- Build, compile and fit a Vanilla RNN and evaluate it on the test set.\n", "- Now refit the model, but this time post pad the inputs with `padding='pre'`\n", "- Again evaluate the model performance on the test set.\n", "- Finally, rebuild a model with the Gated Recurrent Unit and fit and evaluate on the training and test set respectively.\n", "- Compare the performance of all three models similar to the table above.\n", "\n", "## Hints:\n", "\n", "tensorflow.keras.preprocessing.sequence.pad_sequences() Pad the sequences to same length - pre/post." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Vanilla RNNs\n", "\n", "We will use Vanilla Recurrent Neural Networks to perform sentiment analysis in `tensorflow.keras` using imdb movie reviews dataset.\n", "The dataset is a subset consisting of 10,000 reviews in the training and test set each. [see here for more info](https://www.tensorflow.org/datasets/catalog/imdb_reviews)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Import required libraries\n", "from tensorflow.keras.datasets import imdb\n", "from tensorflow.keras.preprocessing import sequence\n", "from tensorflow.keras import Sequential\n", "from tensorflow.keras.layers import Embedding, SimpleRNN, Dense,GRU\n", "import pickle\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from prettytable import PrettyTable\n", "from pprint import pprint" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# We fix a vocabulary size of 5000\n", "# Use the code below to call a small subset of the imdb dataset\n", "# We keep the vocabulary size fixed because it was used to curate the sub-dataset\n", "vocabulary_size = 5000\n", "with open('imdb_mini.pkl','rb') as f:\n", " X_train, y_train, X_test, y_test = pickle.load(f)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Inspect a sample review and its label" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "---review---\n", "[1, 48, 2498, 2, 16, 4, 4, 1554, 149, 14, 22, 95, 198, 51, 29, 62, 2039, 46, 11, 189, 10, 10, 146, 806, 1588, 21, 2, 195, 75, 69, 79, 3514, 4, 1122, 292, 2, 5, 150, 14, 803, 4, 4351, 57, 45, 24, 618, 6, 2, 15, 289, 7, 4, 2, 323, 2, 2, 5, 4, 85, 381, 160, 87, 698, 284, 4, 293, 1141, 2, 11, 148, 2, 9, 4, 2, 7, 4, 108, 36, 1173, 93, 8, 4171, 363, 36, 71, 2812, 631, 108, 19, 6, 955, 1382, 841, 15, 43, 566, 30, 2, 11, 4, 2997, 4, 681, 9, 1215, 5, 51, 128, 96, 8, 2330, 6, 1215, 22, 74, 8, 2, 12, 19, 6, 1034, 42, 60, 6, 755, 10, 10, 2, 2, 69, 6, 1211, 2790, 159, 12, 60, 569, 4, 1320, 2, 2, 9, 60, 53, 2, 15, 85, 301, 1215, 108, 12, 2, 512, 1089, 3167, 6, 1242, 156, 4, 228, 603, 270, 1328, 15, 2, 2786, 5, 32, 4, 537, 3392, 4, 22, 10, 10, 38, 133, 266, 6, 1034, 92, 3250, 57, 2, 71, 2, 11, 4, 231, 7, 14, 1034, 49, 678, 1409, 7, 4, 65, 887, 8, 30, 2, 18, 4, 682, 2997, 2, 2, 2, 21, 198, 43, 44, 4, 226, 863, 38, 75, 202, 4, 1002, 6, 2, 405, 2, 501, 601, 19, 1465, 228, 2183, 18, 4, 706, 2629, 95, 19, 57, 2, 1699, 2, 23, 4, 1111, 15, 2580, 4, 2, 46, 21, 11, 4, 147, 182, 14, 586, 593, 1788, 43, 92, 140, 1012, 202, 90, 6, 541, 4304, 18, 3666, 247, 74, 4, 2, 7, 4580, 5, 25, 28, 4, 1034, 2, 1523, 151, 218, 12, 10, 10, 45, 43, 15, 12, 16, 32, 2984, 23, 19, 6, 2, 4, 403, 2, 71, 331, 2, 220, 1671, 23, 50, 16, 57, 281, 7, 1830, 23, 4, 1111, 57, 2, 7, 513, 8, 1277, 129, 2, 43, 6, 171, 4165, 2, 44, 6, 2585, 5, 15, 16, 12, 2, 16, 43, 616, 34, 24, 743, 46, 101, 2, 33, 32, 5, 1935, 16, 3506, 8, 387, 41, 79, 245, 19, 12, 54, 29, 435, 83, 4, 73, 25, 43, 697, 29, 62, 79, 2897, 12, 4, 881, 16, 2, 32, 4, 96, 8, 4, 130, 5, 25, 43, 473, 12, 8, 2, 56, 5, 130, 4, 2, 16, 427, 642, 5, 161, 124, 54, 8, 570, 10, 10, 15, 277, 9, 242, 4, 118, 96, 8, 2, 4, 1474, 200, 4, 107, 31, 630, 11, 4, 91, 307, 2, 103, 4, 91, 2993, 251, 4, 85, 630, 19, 6, 1208, 365, 1260, 12, 32, 8, 4, 2, 552, 1174, 10, 10, 13, 447, 4, 204, 21, 435, 8, 4, 438, 19, 35, 911, 330, 5, 16, 2229, 8, 67, 4, 22, 13, 317, 2, 11, 4, 1857, 15, 14, 22, 80, 242, 130, 56, 4158, 6, 2, 1198, 64, 14, 58, 2, 1551, 1437]\n", "---label---\n", "0\n" ] } ], "source": [ "# Run the code below to see the first tokenized review and the label\n", "print('---review---')\n", "print(X_train[0])\n", "print('---label---')\n", "print(y_train[0])" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "'---review with words---'\n", "(\" if edward was the the flicks watching this film then that's \"\n", " \"what he would scream out in horror br br i'm sorry folks but enough we \"\n", " \"had get carter the italian job and now this what's the similarities no \"\n", " \"it's not exactly a that three of the star and the \"\n", " 'other stars another great british actor the main common in those '\n", " \"is the of the films they weren't made to impress hollywood they were \"\n", " 'quirky english films with a unique charm atmosphere that just cannot be '\n", " ' in the usa the word is cult and what better way to destroy a cult film '\n", " 'than to it with a remake or even a sequel br br had a '\n", " 'tough task before it even hit the road is even more that '\n", " 'other said cult films it genre intelligent scripts a grade actors the '\n", " 'music score set pieces that description and all the stories '\n", " \"surrounding the film br br so here comes a remake don't worry no were \"\n", " ' in the making of this remake some major aspects of the story needed to '\n", " \"be for the modern usa but that's just about the \"\n", " 'whole premise so we give the cop a style past complete with '\n", " 'shock music flashbacks for the cheap scares then with no phone '\n", " \"on the island that sorts the out but in the real world this wouldn't \"\n", " \"happen cops just don't go missing give him a blood link for motivation \"\n", " 'rather than the of beliefs and you have the remake thin though '\n", " \"isn't it br br it's just that it was all laid on with a the name \"\n", " 'were simply almost carry on there was no sense of community on the '\n", " 'island no of town to catch your just a few houses about a '\n", " 'forest and that was it was just annoying by not giving out any '\n", " 'at all and cage was useless to let her get away with it when he went into '\n", " 'the well you just knew he would get locked it the screenplay was all '\n", " 'the way to the end and you just wanted it to up and end the was '\n", " \"absolutely hilarious and didn't know when to stop br br that ending is \"\n", " 'probably the best way to the difference between the two one ends in '\n", " 'the most beautiful after the most horrific day the other ends with a '\n", " 'post production explain it all to the type conclusion br br i loved '\n", " 'the original but went to the cinema with an open mind and was excited to see '\n", " 'the film i left in the knowledge that this film will probably end up '\n", " 'beneath a somewhere only this time forgotten forever')\n", "'---label---'\n", "0\n" ] } ], "source": [ "# You can get the word2id mapping by\n", "# using the imdb.get_word_index() function\n", "\n", "word2id = imdb.get_word_index()\n", "# We need to adjust the mapping by 3 because of tensorflow.keras preprocessing\n", "# more here: https://stackoverflow.com/questions/42821330/restore-original-text-from-keras-s-imdb-dataset\n", "word2id = {k:(v+3) for k,v in word2id.items()}\n", "word2id[\"\"] = 0\n", "word2id[\"\"] = 1\n", "word2id[\"\"] = 2\n", "word2id[\"\"] = 3\n", "\n", "# Reversing the key,value pair will give the id2word\n", "id2word = {i: word for word, i in word2id.items()}\n", "pprint('---review with words---')\n", "pprint(\" \".join([id2word[i] for i in X_train[0]]))\n", "pprint('---label---')\n", "pprint(y_train[0]);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Maximum review length and minimum review length" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ⏸ The `` tag is reserved for?\n", "\n", "\n", "#### A. Special characters\n", "#### B. Out of vocabulary words\n", "#### C. Start of sentence\n", "#### D. End of sentence" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "### edTest(test_chow1) ###\n", "# Submit an answer choice as a string below (eg. if you choose option C, put 'C')\n", "answer1 = '___'" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Maximum review length: 2494\n", "Minimum review length: 7\n" ] } ], "source": [ "# For training we need our sequences to be of fixed length, but the reviews\n", "# are of different sizes\n", "print(f'Maximum review length: {len(max([i for i in X_train]+[i for i in X_test], key=len))}')\n", "print(f'Minimum review length: {len(min([i for i in X_train]+[i for i in X_test], key=len))}')" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# We also create two indices for short and long reviews\n", "# we will use this later\n", "idx_short = [i for i,val in enumerate(X_train) if len(val)<100]\n", "idx_long = [i for i,val in enumerate(X_train) if len(val)>500]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pad sequences\n", "\n", "In order to feed this data into our RNN, all input documents must have the same length. We will limit the maximum review length to max_words by truncating longer reviews and padding shorter reviews. We can accomplish this using the pad_sequences() function in `tensorflow.keras`. For now, set max_words to 500." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ⏸ If we use *post-padding* on a sequence, the new sequence is\"\n", "\n", "\n", "#### A. \"Padded with zeros before the start of original sequence\"\n", "#### B. \"Padded with zeros after the end of the original sequence\"\n", "#### C. \"Padded with ones before the start of original sequence\"\n", "#### D. \"Padded with ones after the end of the original sequence\"" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "### edTest(test_chow2) ###\n", "# Submit an answer choice as a string below (eg. if you choose option C, put 'C')\n", "answer2 = '___'" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# We will clip large reviews and pad smaller reviews to 500 words\n", "max_words = 500\n", "# We can pad the smaller sequences with 0s before, or after.\n", "# This choice can severely affect network performance\n", "# In the first case we, will pad after the sequence \n", "# Please utilize sequence.pad_sequences()\n", "postpad_X_train = ___\n", "postpad_X_test = ___" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### RNN model for sentiment analysis\n", "\n", "We build the model architecture in the code cell below. We have imported some layers from `tensorflow.keras` that you might need but feel free to use any other layers / transformations you like.\n", "\n", "Remember that our input is a sequence of words (technically, integer word IDs) of maximum length = max_words, and our output is a binary sentiment label (0 or 1)." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def model_maker(summary=True,gru=False):\n", "# One layer RNN model with 32 rnn cells\n", " embedding_size=32\n", " model=Sequential()\n", " model.add(Embedding(vocabulary_size, embedding_size, input_length=max_words))\n", " \n", " # We can specify if we want the GRU cell or the vanilla RNN cell\n", " if gru:\n", " model.add(GRU(32))\n", " else:\n", " model.add(SimpleRNN(32))\n", " model.add(Dense(1, activation='sigmoid'))\n", " if summary:\n", " print(model.summary())\n", " \n", " # model compile step\n", " model.compile(loss='binary_crossentropy', \n", " optimizer='adam', \n", " metrics=['accuracy']) \n", " return model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Trace Plot analysis\n", "We expect the postpadded model to perform train slowly because of vanishing gradients.\n", "Let us investigate the cause by training two models,\n", "- One with shorter reviews (that were post padded) using `idx_short`\n", "- The other with longer reviews (that were truncated) using `idx_long`" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# We build two new models with vanilla RNNs\n", "model_short = model_maker(summary=False)\n", "model_long = model_maker(summary=False)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# First we train `model_short` with short reviews\n", "# set epochs to 10\n", "\n", "X_short = ___\n", "y_short = ___\n", "epochs = ___\n", "history_short = model_short.fit(___, ___, epochs=epochs,batch_size=640,verbose=0);" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "# Then we train `model_long` with short reviews\n", "\n", "X_long = ___\n", "y_long = ___\n", "history_long = model_long.fit(___,___, epochs=epochs,batch_size=640,verbose=0);" ] }, { "cell_type": "code", "execution_count": 0, "metadata": {}, "outputs": [], "source": [ "### edTest(test_chow2_1) ###\n", "X_short_shape, y_short_shape = X_short.shape, y_short.shape\n", "X_long_shape, y_long_shape = X_long.shape, y_long.shape\n", "print(X_short_shape, y_short_shape,X_long_shape, y_long_shape)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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Edt37tzJTTfdREZGBhkZGdx8883s3r07tP3HP/4xw4cP5/nnn2fAgAEkJSVx22238fHHH/O73/0OM8PM2L59OwDr1q3juuuuIyMjg65du3LnnXeyf//+0PHuueceZs6cyc9//nOysrLIysqK+jU+//zzpKen8+677zJ8+HASExNZv3495eXlfO973yMrK4u0tDTGjh3L/PnzgUDAyMrK4re//W3EsTZt2oSZsXr1auDMYYuioiIefPBBunbtSkZGBpMnTyZ8XpDu3bvz2muvhd5PmjSJjIwMKisDk85s3rwZM2PPnsBtX2+++SYXXXQRKSkpdOzYkcmTJ3PgwIE6vqMi4pX0pFS+Mf5GsjJPTxo1e92nfFSwysOqGpd6HhrDM7/37twPfKNeu6Wnp5Oens7s2bO59NJLSU5OrnXfX//61/zkJz/hn//5n3nvvff41re+xaWXXsrEiRNxznHjjTeSnJzMhx9+iJnx6KOPcuONN7JixYrQrYTbtm3j5Zdf5vXXXycxMZHevXuzd+9ehgwZwn/+538Cgd/m9+3bx+WXX87999/PL3/5SyoqKvjXf/1XZs2aRW5ubuiW2I8//pjMzEzmzZtHXROdlZWV8dOf/pTf//73dOnShR49enDvvfdSUFDAyy+/TFZWFu+++y7XX389K1asYMSIEdx555289NJLPPbYY6HjvPTSSwwbNoyRI0eecQ7nHNdddx2ZmZnMnTuXjh078sILLzB16lQ2btxIjx49mDx5Mh999BG33347paWl5Ofnk5GRQX5+PhMmTGDRokXk5OTQq1cv9u/fzx133MHPfvYzbrnlFoqLi8nNza3X91VEvJGamMwD42bxXP5cdhwN/LLz3sZlVFRVctXAsa3utmqFhzYqPj6e559/ngceeICnn36akSNHMmnSJG677TbGjx8fse/06dND1yY89thjPP744yxcuJCJEyeyYMEC1qxZQ0FBAdnZ2QC8/PLL5OTksHDhQqZNmwYEhhZefPFFunXrFjpuYmIiqampdO/ePdT25JNPMmLECH7+85+H2v70pz/RsWNH8vPzGTduHBCYlvm5554jKSmpzq+zqqqK3/72t4wePRqAgoICXnnlFbZv306fPn0AePTRR1mwYAG///3veeKJJ/ja177GL3/5S7Zs2UJOTk7oa7rvvvuinuOjjz7is88+49ChQ6SkBO7//vd//3fmzJnDiy++yHe/+12mTJnCb37zGwCWLFlC//79GTduHB999FEoPEyZMgWAvXv3UlFRwa233krfvn0BGD58eJ1fp4h4LyUhia+PvZ7nV74bmjxqwZYVVPormTF4YqsKEBq2aMNuueUW9u7dy5w5c5gxYwZLly5lwoQJoZ6AahdddFHE+549e3Lw4EEA1q9fT8+ePUPBAaB///707NmTdevWhdqysrIigkNtVq5cySeffBLqGUlPT6d3795A4Ad/teHDh581OEAgJF188cWh96tWrcI5x7BhwyLO8c4774SOf9FFF3HhhRfy8ssvA5CXl0dBQQFf/epXa625tLSULl26RBzziy++CB1zypQpbNq0ib1797Jo0SKuuOIKpkyZwqJFi4BAT0p1eBgxYgTTpk1j+PDh3HLLLTz55JMcOnTorF+riHgvKT6R+8bMZHCX6FZkbgAAFJxJREFUPqG2RVtXM3vdYvytaDkI9Tw0hnoOHTQHycnJXHXVVVx11VX88Ic/5Otf/zo//vGP+c53vhO6CLHmoktmht/vBwJd9rWl6fD2tLS0etXj9/u57rrrot4GGR4+6nu8pKSkiAsk/X4/ZsaKFSvO+Lqqew0A7rrrLp577jl++MMf8tJLL3HZZZeFegGi1dytWzcWL158xrZ27QK3cQ0dOpRu3bqxaNEiFi1axLe//W3Gjh3LY489xrp169izZ08oPPh8Pt5//31yc3N5//33efbZZ/nBD37Axx9/zIgRrfcCLJHWIsEXz92jruWlz+bz5YFtACzZsZYKfxU3D59MnLX839sVHiTCsGHDqKyspKysrF53MAwbNow9e/awffv2UO/D1q1b2bt3L8OGDavzs4mJiWesQjpq1Cj+8pe/0Ldv30ZZKXLkyJE459i/fz9XXHFFrfvddddd/Mu//Au5ubm89tpr/PSnP61131GjRnHgwAHi4uLo379/rftNnjyZd955h/z8fCZPnkzXrl3p3Lkzv/jFL0LXO1QzMyZOnMjEiRP54Q9/yAUXXMBrr72m8CDSQsT7fPzdyKt5dc0C1uzbAsDyXeuorKrktouuxPf/t3fvYVVV+R/H3wtBAUG0AA21VEQENUz5iZdSQB0sKXNMHYVG6ydmWmMl09hlysaap3zM8tfkLTNm1PGpNMvKy0zlJc17WToRkxfMUFEzr4giZ/3+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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Helper function to plot the data\n", "# Plot the MSE of the model\n", "plt.rcParams[\"figure.figsize\"] = (8,6)\n", "plt.title(\"Padding='post'\",fontsize=20)\n", "plt.semilogy(history_short.history['loss'], label='Shorter reviews', color='#FF9A98', linewidth=3)\n", "plt.semilogy(history_long.history['loss'], label='Longer reviews', color='#75B594', linewidth=3)\n", "plt.legend()\n", "\n", "# Set the axes labels\n", "plt.xlabel('Epochs',fontsize=14)\n", "plt.xticks(range(1,epochs,4))\n", "plt.ylabel('MSE Loss',fontsize=14)\n", "plt.legend(fontsize=14)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pre-padding sequences\n", "\n", "As we can see, the vanishing gradient problem is real and can severely affect the training of our network. The short review network negligibly trains, whereas the longer review model trains very well.\n", "To counter this, we will now *pre-pad* the shorter sequences." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "# We can pre-pad by using `sequence.pad_sequences` with `padding='pre'`\n", "max_words = 500\n", "prepad_X_train = ___\n", "prepad_X_test = ___" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Trace Plot - Take 2\n", "\n", "Again, we investigate the trace plots for the two categories, but this time, with pre-padding" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "# Reinitializing the models for the two categories\n", "model_short = model_maker(summary=False)\n", "model_long = model_maker(summary=False)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# Again we train `model_short` with short reviews\n", "\n", "X_short = ___\n", "y_short = ___\n", "epochs = 10\n", "history_short = model_short.fit(___, ___, epochs=epochs,batch_size=640,verbose=0);" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# Then we train `model_long` with short reviews\n", "\n", "X_long = ___\n", "y_long = ___\n", "history_long = model_long.fit(___, ___, epochs=epochs,batch_size=640,verbose=0);" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "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SX8yKaW8gdFAXd+h3sB9Wutsy/k/AB5yUM/HQBoQoJTKB36rtX5Pa12llJoNfAu4AO9rrfc6/Y3crLNnoV07fDy8uScxjUFdevD1/vUcPG0M17hcVcmyrE1sOraXcbEpJHWKlgVkhBAtgqurK3PnzmXWrFn84x//IDk5mcGDB3PfffcxYMAAu3PvuOMO69iEJ598ktdff50VK1aQkpLC999/z86dO8nOziYiIgKAjz76iOjoaFasWMGoUaMAo2vhP//5D8HBwdZ63d3d8fb2pmPHjtayt99+m6SkJF566SVr2b///W/at29PRkYG/fv3B8DT05P3338fDw+Pa77P6upq3njjDfr06QNAdnY2H3/8Mbm5udYVGWfPns3333/PO++8w1tvvcWDDz7IK6+8wuHDh4mOjra+p4cfftjhPVatWsWOHTs4deoUXl5eALzwwgssXryY//znPzz77LOkpaXx2muvAbB+/XoiIyPp378/q1atsoaHtLQ0AAoKCqisrOTee++lS5cuACQmJl7zfd6oJu220FqXaq07aK0djj7UWq/XWu+2eV2ptf6ng/Oma607aa3dtNZhWuv3bI4t1VrHaK2jtNb/2zjv5CZcvAiLFsKiL+C48Xiuo28HftTvTh7uO5Egn3bWU8+VXeCjHct5a9NCjhU7/7GTEELciClTplBQUMDixYsZN24cGzZsYODAgdYnAVf07NnT7nVISAhFRcZEt/379xMSEmINDgCRkZGEhISwb98+a1lYWJhdcKhLZmYma9assT4Z8fHxITzc6MXOzs62npeYmHjd4ABGSOrVq5f19bZt29Bak5CQYHePJUuWWOvv2bMnPXr04KOPPgJg8+bNZGdnM2OG4wfgmZmZlJaWEhgYaFfnnj17rHWmpaVx8OBBCgoKSE9PZ/jw4aSlpZGeng4YT1KuhIekpCRGjRpFYmIiU6ZM4e233+bUqVPXfa83Qp6JN7XtmVBdDadPwdIlEBIK/fujAoOIC+pCt4AwNuftY/nBLda1II6eO8nfNiygV0g3xsWm0M7L9zo3EUK0WvXoOmgJPD09GT16NKNHj+b555/nkUceYc6cOTzzzDPWQYhubm521yilMJvNgPHIvq4nqrblbdq0qVd7zGYzEyZMcDgN0jZ81Lc+Dw8PuwGSZrMZpRRbt2696n1deWoAMHPmTN5//32ef/55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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Helper function to plot the data\n", "# Plot the MSE of the model\n", "plt.rcParams[\"figure.figsize\"] = (8,6)\n", "plt.title(\"Padding='pre'\",fontsize=20)\n", "plt.semilogy(history_short.history['loss'], label='Shorter reviews', color='#FF9A98', linewidth=3)\n", "plt.semilogy(history_long.history['loss'], label='Longer reviews', color='#75B594', linewidth=3)\n", "plt.legend()\n", "\n", "# Set the axes labels\n", "plt.xlabel('Epochs',fontsize=14)\n", "plt.xticks(range(1,epochs,4))\n", "plt.ylabel('MSE Loss',fontsize=14)\n", "plt.legend(fontsize=14)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 🍲 Further improvements\n", "\n", "We solved the vanishing gradient problem by *pre-padding* the sequences, but what other design choices can help you improve performance?" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "### edTest(test_chow3) ###\n", "# Submit your answer as a string below\n", "answer3 = '___'" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }