diff --git a/Certificate/Sequence Models.PNG b/Certificate/Sequence Models.PNG new file mode 100644 index 0000000..95b3e43 Binary files /dev/null and b/Certificate/Sequence Models.PNG differ diff --git a/Certificate/Sequence Models.pdf b/Certificate/Sequence Models.pdf new file mode 100644 index 0000000..96defee Binary files /dev/null and b/Certificate/Sequence Models.pdf differ diff --git a/Deep Learning.pdf b/Deep Learning.pdf new file mode 100644 index 0000000..d1db499 Binary files /dev/null and b/Deep Learning.pdf differ diff --git a/README.md b/README.md index 5a438e7..4af62f2 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ * [***Neural Networks and Deep Learning***](https://www.coursera.org/learn/neural-networks-deep-learning/home/welcome)   * [***Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization***](https://www.coursera.org/learn/deep-neural-network/home/welcome) * [***Structuring Machine Learning Projects***](https://www.coursera.org/learn/machine-learning-projects/home/welcome) - * [***Convolutional Neural Networks***]() - * [***Sequence Models***]() + * [***Convolutional Neural Networks***](https://www.coursera.org/learn/convolutional-neural-networks) + * [***Sequence Models***](https://www.coursera.org/learn/nlp-sequence-models) ![Neural Networks for Machine Learning](https://user-images.githubusercontent.com/21110541/29741101-6c274534-8a66-11e7-9e69-d3f2a362af8d.png) @@ -13,12 +13,14 @@ ![convolutional neural networks](https://user-images.githubusercontent.com/21110541/32508421-8cbe3448-c3ea-11e7-8743-e55c878ba0a7.PNG) +![sequence models](https://user-images.githubusercontent.com/21110541/36073520-35d04bc6-0f58-11e8-8f2e-a5c0c0752ae7.PNG) + # Deep Learning + [x] Neural Networks and Deep Learning + [x] Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization + [x] Structuring Machine Learning Projects + [x] Convolutional Neural Networks -+ [ ] Sequence Models ++ [x] Sequence Models # Deep Learning - deeplearning.ai Coursera Deep Learning Course by deeplearning.ai projects @@ -55,9 +57,9 @@ Unified, Real-Time Object Detection](https://arxiv.org/pdf/1506.02640.pdf), [YOL 4. Week4 - Special applications: Face recognition & Neural style transfer - Papers for read: [DeepFace](https://www.cs.toronto.edu/~ranzato/publications/taigman_cvpr14.pdf), [FaceNet](https://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Schroff_FaceNet_A_Unified_2015_CVPR_paper.pdf) ## Course 5. Sequence Models - - - + 1. Week1 - Recurrent Neural Networks + 2. Week2 - Natural Language Processing & Word Embeddings + 3. Week3 - Sequence models & Attention mechanism --- *source from **Andrew Ng**'s [Deep learning](https://www.coursera.org/specializations/deep-learning) course on Coursera* diff --git a/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/Building a Recurrent Neural Network - Step by Step - v1.ipynb b/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/Building a Recurrent Neural Network - Step by Step - v1.ipynb new file mode 100644 index 0000000..54d163d --- /dev/null +++ b/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/Building a Recurrent Neural Network - Step by Step - v1.ipynb @@ -0,0 +1,2054 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Building your Recurrent Neural Network - Step by Step\n", + "\n", + "Welcome to Course 5's first assignment! In this assignment, you will implement your first Recurrent Neural Network in numpy.\n", + "\n", + "Recurrent Neural Networks (RNN) are very effective for Natural Language Processing and other sequence tasks because they have \"memory\". They can read inputs $x^{\\langle t \\rangle}$ (such as words) one at a time, and remember some information/context through the hidden layer activations that get passed from one time-step to the next. This allows a uni-directional RNN to take information from the past to process later inputs. A bidirection RNN can take context from both the past and the future. \n", + "\n", + "**Notation**:\n", + "- Superscript $[l]$ denotes an object associated with the $l^{th}$ layer. \n", + " - Example: $a^{[4]}$ is the $4^{th}$ layer activation. $W^{[5]}$ and $b^{[5]}$ are the $5^{th}$ layer parameters.\n", + "\n", + "- Superscript $(i)$ denotes an object associated with the $i^{th}$ example. \n", + " - Example: $x^{(i)}$ is the $i^{th}$ training example input.\n", + "\n", + "- Superscript $\\langle t \\rangle$ denotes an object at the $t^{th}$ time-step. \n", + " - Example: $x^{\\langle t \\rangle}$ is the input x at the $t^{th}$ time-step. $x^{(i)\\langle t \\rangle}$ is the input at the $t^{th}$ timestep of example $i$.\n", + " \n", + "- Lowerscript $i$ denotes the $i^{th}$ entry of a vector.\n", + " - Example: $a^{[l]}_i$ denotes the $i^{th}$ entry of the activations in layer $l$.\n", + "\n", + "We assume that you are already familiar with `numpy` and/or have completed the previous courses of the specialization. Let's get started!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's first import all the packages that you will need during this assignment." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "from rnn_utils import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1 - Forward propagation for the basic Recurrent Neural Network\n", + "\n", + "Later this week, you will generate music using an RNN. The basic RNN that you will implement has the structure below. In this example, $T_x = T_y$. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "
**Figure 1**: Basic RNN model
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how you can implement an RNN: \n", + "\n", + "**Steps**:\n", + "1. Implement the calculations needed for one time-step of the RNN.\n", + "2. Implement a loop over $T_x$ time-steps in order to process all the inputs, one at a time. \n", + "\n", + "Let's go!\n", + "\n", + "## 1.1 - RNN cell\n", + "\n", + "A Recurrent neural network can be seen as the repetition of a single cell. You are first going to implement the computations for a single time-step. The following figure describes the operations for a single time-step of an RNN cell. \n", + "\n", + "\n", + "
**Figure 2**: Basic RNN cell. Takes as input $x^{\\langle t \\rangle}$ (current input) and $a^{\\langle t - 1\\rangle}$ (previous hidden state containing information from the past), and outputs $a^{\\langle t \\rangle}$ which is given to the next RNN cell and also used to predict $y^{\\langle t \\rangle}$
\n", + "\n", + "**Exercise**: Implement the RNN-cell described in Figure (2).\n", + "\n", + "**Instructions**:\n", + "1. Compute the hidden state with tanh activation: $a^{\\langle t \\rangle} = \\tanh(W_{aa} a^{\\langle t-1 \\rangle} + W_{ax} x^{\\langle t \\rangle} + b_a)$.\n", + "2. Using your new hidden state $a^{\\langle t \\rangle}$, compute the prediction $\\hat{y}^{\\langle t \\rangle} = softmax(W_{ya} a^{\\langle t \\rangle} + b_y)$. We provided you a function: `softmax`.\n", + "3. Store $(a^{\\langle t \\rangle}, a^{\\langle t-1 \\rangle}, x^{\\langle t \\rangle}, parameters)$ in cache\n", + "4. Return $a^{\\langle t \\rangle}$ , $y^{\\langle t \\rangle}$ and cache\n", + "\n", + "We will vectorize over $m$ examples. Thus, $x^{\\langle t \\rangle}$ will have dimension $(n_x,m)$, and $a^{\\langle t \\rangle}$ will have dimension $(n_a,m)$. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: rnn_cell_forward\n", + "\n", + "def rnn_cell_forward(xt, a_prev, parameters):\n", + " \"\"\"\n", + " Implements a single forward step of the RNN-cell as described in Figure (2)\n", + "\n", + " Arguments:\n", + " xt -- your input data at timestep \"t\", numpy array of shape (n_x, m).\n", + " a_prev -- Hidden state at timestep \"t-1\", numpy array of shape (n_a, m)\n", + " parameters -- python dictionary containing:\n", + " Wax -- Weight matrix multiplying the input, numpy array of shape (n_a, n_x)\n", + " Waa -- Weight matrix multiplying the hidden state, numpy array of shape (n_a, n_a)\n", + " Wya -- Weight matrix relating the hidden-state to the output, numpy array of shape (n_y, n_a)\n", + " ba -- Bias, numpy array of shape (n_a, 1)\n", + " by -- Bias relating the hidden-state to the output, numpy array of shape (n_y, 1)\n", + " Returns:\n", + " a_next -- next hidden state, of shape (n_a, m)\n", + " yt_pred -- prediction at timestep \"t\", numpy array of shape (n_y, m)\n", + " cache -- tuple of values needed for the backward pass, contains (a_next, a_prev, xt, parameters)\n", + " \"\"\"\n", + " \n", + " # Retrieve parameters from \"parameters\"\n", + " Wax = parameters[\"Wax\"]\n", + " Waa = parameters[\"Waa\"]\n", + " Wya = parameters[\"Wya\"]\n", + " ba = parameters[\"ba\"]\n", + " by = parameters[\"by\"]\n", + " \n", + " ### START CODE HERE ### (≈2 lines)\n", + " # compute next activation state using the formula given above\n", + " a_next = np.tanh(np.dot(Waa, a_prev) + np.dot(Wax, xt) + ba)\n", + " # compute output of the current cell using the formula given above\n", + " yt_pred = softmax(np.dot(Wya, a_next) + by)\n", + " ### END CODE HERE ###\n", + " \n", + " # store values you need for backward propagation in cache\n", + " cache = (a_next, a_prev, xt, parameters)\n", + " \n", + " return a_next, yt_pred, cache" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a_next[4] = [ 0.59584544 0.18141802 0.61311866 0.99808218 0.85016201 0.99980978\n", + " -0.18887155 0.99815551 0.6531151 0.82872037]\n", + "a_next.shape = (5, 10)\n", + "yt_pred[1] = [ 0.9888161 0.01682021 0.21140899 0.36817467 0.98988387 0.88945212\n", + " 0.36920224 0.9966312 0.9982559 0.17746526]\n", + "yt_pred.shape = (2, 10)\n" + ] + } + ], + "source": [ + "np.random.seed(1)\n", + "xt = np.random.randn(3,10)\n", + "a_prev = np.random.randn(5,10)\n", + "Waa = np.random.randn(5,5)\n", + "Wax = np.random.randn(5,3)\n", + "Wya = np.random.randn(2,5)\n", + "ba = np.random.randn(5,1)\n", + "by = np.random.randn(2,1)\n", + "parameters = {\"Waa\": Waa, \"Wax\": Wax, \"Wya\": Wya, \"ba\": ba, \"by\": by}\n", + "\n", + "a_next, yt_pred, cache = rnn_cell_forward(xt, a_prev, parameters)\n", + "print(\"a_next[4] = \", a_next[4])\n", + "print(\"a_next.shape = \", a_next.shape)\n", + "print(\"yt_pred[1] =\", yt_pred[1])\n", + "print(\"yt_pred.shape = \", yt_pred.shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**: \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "
\n", + " **a_next[4]**:\n", + " \n", + " [ 0.59584544 0.18141802 0.61311866 0.99808218 0.85016201 0.99980978\n", + " -0.18887155 0.99815551 0.6531151 0.82872037]\n", + "
\n", + " **a_next.shape**:\n", + " \n", + " (5, 10)\n", + "
\n", + " **yt[1]**:\n", + " \n", + " [ 0.9888161 0.01682021 0.21140899 0.36817467 0.98988387 0.88945212\n", + " 0.36920224 0.9966312 0.9982559 0.17746526]\n", + "
\n", + " **yt.shape**:\n", + " \n", + " (2, 10)\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1.2 - RNN forward pass \n", + "\n", + "You can see an RNN as the repetition of the cell you've just built. If your input sequence of data is carried over 10 time steps, then you will copy the RNN cell 10 times. Each cell takes as input the hidden state from the previous cell ($a^{\\langle t-1 \\rangle}$) and the current time-step's input data ($x^{\\langle t \\rangle}$). It outputs a hidden state ($a^{\\langle t \\rangle}$) and a prediction ($y^{\\langle t \\rangle}$) for this time-step.\n", + "\n", + "\n", + "\n", + "
**Figure 3**: Basic RNN. The input sequence $x = (x^{\\langle 1 \\rangle}, x^{\\langle 2 \\rangle}, ..., x^{\\langle T_x \\rangle})$ is carried over $T_x$ time steps. The network outputs $y = (y^{\\langle 1 \\rangle}, y^{\\langle 2 \\rangle}, ..., y^{\\langle T_x \\rangle})$.
\n", + "\n", + "\n", + "\n", + "**Exercise**: Code the forward propagation of the RNN described in Figure (3).\n", + "\n", + "**Instructions**:\n", + "1. Create a vector of zeros ($a$) that will store all the hidden states computed by the RNN.\n", + "2. Initialize the \"next\" hidden state as $a_0$ (initial hidden state).\n", + "3. Start looping over each time step, your incremental index is $t$ :\n", + " - Update the \"next\" hidden state and the cache by running `rnn_cell_forward`\n", + " - Store the \"next\" hidden state in $a$ ($t^{th}$ position) \n", + " - Store the prediction in y\n", + " - Add the cache to the list of caches\n", + "4. Return $a$, $y$ and caches" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: rnn_forward\n", + "\n", + "def rnn_forward(x, a0, parameters):\n", + " \"\"\"\n", + " Implement the forward propagation of the recurrent neural network described in Figure (3).\n", + "\n", + " Arguments:\n", + " x -- Input data for every time-step, of shape (n_x, m, T_x).\n", + " a0 -- Initial hidden state, of shape (n_a, m)\n", + " parameters -- python dictionary containing:\n", + " Waa -- Weight matrix multiplying the hidden state, numpy array of shape (n_a, n_a)\n", + " Wax -- Weight matrix multiplying the input, numpy array of shape (n_a, n_x)\n", + " Wya -- Weight matrix relating the hidden-state to the output, numpy array of shape (n_y, n_a)\n", + " ba -- Bias numpy array of shape (n_a, 1)\n", + " by -- Bias relating the hidden-state to the output, numpy array of shape (n_y, 1)\n", + "\n", + " Returns:\n", + " a -- Hidden states for every time-step, numpy array of shape (n_a, m, T_x)\n", + " y_pred -- Predictions for every time-step, numpy array of shape (n_y, m, T_x)\n", + " caches -- tuple of values needed for the backward pass, contains (list of caches, x)\n", + " \"\"\"\n", + " \n", + " # Initialize \"caches\" which will contain the list of all caches\n", + " caches = []\n", + " \n", + " # Retrieve dimensions from shapes of x and Wy\n", + " n_x, m, T_x = x.shape\n", + " n_y, n_a = parameters[\"Wya\"].shape\n", + " \n", + " ### START CODE HERE ###\n", + " \n", + " # initialize \"a\" and \"y\" with zeros (≈2 lines)\n", + " a = np.zeros((n_a, m, T_x))\n", + " y_pred = np.zeros((n_y, m, T_x))\n", + " \n", + " # Initialize a_next (≈1 line)\n", + " a_next = a0\n", + " \n", + " # loop over all time-steps\n", + " for t in range(T_x):\n", + " # Update next hidden state, compute the prediction, get the cache (≈1 line)\n", + " a_next, yt_pred, cache = rnn_cell_forward(x[:,:,t], a_next, parameters)\n", + " # Save the value of the new \"next\" hidden state in a (≈1 line)\n", + " a[:,:,t] = a_next\n", + " # Save the value of the prediction in y (≈1 line)\n", + " y_pred[:,:,t] = yt_pred\n", + " # Append \"cache\" to \"caches\" (≈1 line)\n", + " caches.append(cache)\n", + " \n", + " ### END CODE HERE ###\n", + " \n", + " # store values needed for backward propagation in cache\n", + " caches = (caches, x)\n", + " \n", + " return a, y_pred, caches" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a[4][1] = [-0.99999375 0.77911235 -0.99861469 -0.99833267]\n", + "a.shape = (5, 10, 4)\n", + "y_pred[1][3] = [ 0.79560373 0.86224861 0.11118257 0.81515947]\n", + "y_pred.shape = (2, 10, 4)\n", + "caches[1][1][3] = [-1.1425182 -0.34934272 -0.20889423 0.58662319]\n", + "len(caches) = 2\n" + ] + } + ], + "source": [ + "np.random.seed(1)\n", + "x = np.random.randn(3,10,4)\n", + "a0 = np.random.randn(5,10)\n", + "Waa = np.random.randn(5,5)\n", + "Wax = np.random.randn(5,3)\n", + "Wya = np.random.randn(2,5)\n", + "ba = np.random.randn(5,1)\n", + "by = np.random.randn(2,1)\n", + "parameters = {\"Waa\": Waa, \"Wax\": Wax, \"Wya\": Wya, \"ba\": ba, \"by\": by}\n", + "\n", + "a, y_pred, caches = rnn_forward(x, a0, parameters)\n", + "print(\"a[4][1] = \", a[4][1])\n", + "print(\"a.shape = \", a.shape)\n", + "print(\"y_pred[1][3] =\", y_pred[1][3])\n", + "print(\"y_pred.shape = \", y_pred.shape)\n", + "print(\"caches[1][1][3] =\", caches[1][1][3])\n", + "print(\"len(caches) = \", len(caches))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "
\n", + " **a[4][1]**:\n", + " \n", + " [-0.99999375 0.77911235 -0.99861469 -0.99833267]\n", + "
\n", + " **a.shape**:\n", + " \n", + " (5, 10, 4)\n", + "
\n", + " **y[1][3]**:\n", + " \n", + " [ 0.79560373 0.86224861 0.11118257 0.81515947]\n", + "
\n", + " **y.shape**:\n", + " \n", + " (2, 10, 4)\n", + "
\n", + " **cache[1][1][3]**:\n", + " \n", + " [-1.1425182 -0.34934272 -0.20889423 0.58662319]\n", + "
\n", + " **len(cache)**:\n", + " \n", + " 2\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Congratulations! You've successfully built the forward propagation of a recurrent neural network from scratch. This will work well enough for some applications, but it suffers from vanishing gradient problems. So it works best when each output $y^{\\langle t \\rangle}$ can be estimated using mainly \"local\" context (meaning information from inputs $x^{\\langle t' \\rangle}$ where $t'$ is not too far from $t$). \n", + "\n", + "In the next part, you will build a more complex LSTM model, which is better at addressing vanishing gradients. The LSTM will be better able to remember a piece of information and keep it saved for many timesteps. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2 - Long Short-Term Memory (LSTM) network\n", + "\n", + "This following figure shows the operations of an LSTM-cell.\n", + "\n", + "\n", + "
**Figure 4**: LSTM-cell. This tracks and updates a \"cell state\" or memory variable $c^{\\langle t \\rangle}$ at every time-step, which can be different from $a^{\\langle t \\rangle}$.
\n", + "\n", + "Similar to the RNN example above, you will start by implementing the LSTM cell for a single time-step. Then you can iteratively call it from inside a for-loop to have it process an input with $T_x$ time-steps. \n", + "\n", + "### About the gates\n", + "\n", + "#### - Forget gate\n", + "\n", + "For the sake of this illustration, lets assume we are reading words in a piece of text, and want use an LSTM to keep track of grammatical structures, such as whether the subject is singular or plural. If the subject changes from a singular word to a plural word, we need to find a way to get rid of our previously stored memory value of the singular/plural state. In an LSTM, the forget gate lets us do this: \n", + "\n", + "$$\\Gamma_f^{\\langle t \\rangle} = \\sigma(W_f[a^{\\langle t-1 \\rangle}, x^{\\langle t \\rangle}] + b_f)\\tag{1} $$\n", + "\n", + "Here, $W_f$ are weights that govern the forget gate's behavior. We concatenate $[a^{\\langle t-1 \\rangle}, x^{\\langle t \\rangle}]$ and multiply by $W_f$. The equation above results in a vector $\\Gamma_f^{\\langle t \\rangle}$ with values between 0 and 1. This forget gate vector will be multiplied element-wise by the previous cell state $c^{\\langle t-1 \\rangle}$. So if one of the values of $\\Gamma_f^{\\langle t \\rangle}$ is 0 (or close to 0) then it means that the LSTM should remove that piece of information (e.g. the singular subject) in the corresponding component of $c^{\\langle t-1 \\rangle}$. If one of the values is 1, then it will keep the information. \n", + "\n", + "#### - Update gate\n", + "\n", + "Once we forget that the subject being discussed is singular, we need to find a way to update it to reflect that the new subject is now plural. Here is the formulat for the update gate: \n", + "\n", + "$$\\Gamma_u^{\\langle t \\rangle} = \\sigma(W_u[a^{\\langle t-1 \\rangle}, x^{\\{t\\}}] + b_u)\\tag{2} $$ \n", + "\n", + "Similar to the forget gate, here $\\Gamma_u^{\\langle t \\rangle}$ is again a vector of values between 0 and 1. This will be multiplied element-wise with $\\tilde{c}^{\\langle t \\rangle}$, in order to compute $c^{\\langle t \\rangle}$.\n", + "\n", + "#### - Updating the cell \n", + "\n", + "To update the new subject we need to create a new vector of numbers that we can add to our previous cell state. The equation we use is: \n", + "\n", + "$$ \\tilde{c}^{\\langle t \\rangle} = \\tanh(W_c[a^{\\langle t-1 \\rangle}, x^{\\langle t \\rangle}] + b_c)\\tag{3} $$\n", + "\n", + "Finally, the new cell state is: \n", + "\n", + "$$ c^{\\langle t \\rangle} = \\Gamma_f^{\\langle t \\rangle}* c^{\\langle t-1 \\rangle} + \\Gamma_u^{\\langle t \\rangle} *\\tilde{c}^{\\langle t \\rangle} \\tag{4} $$\n", + "\n", + "\n", + "#### - Output gate\n", + "\n", + "To decide which outputs we will use, we will use the following two formulas: \n", + "\n", + "$$ \\Gamma_o^{\\langle t \\rangle}= \\sigma(W_o[a^{\\langle t-1 \\rangle}, x^{\\langle t \\rangle}] + b_o)\\tag{5}$$ \n", + "$$ a^{\\langle t \\rangle} = \\Gamma_o^{\\langle t \\rangle}* \\tanh(c^{\\langle t \\rangle})\\tag{6} $$\n", + "\n", + "Where in equation 5 you decide what to output using a sigmoid function and in equation 6 you multiply that by the $\\tanh$ of the previous state. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.1 - LSTM cell\n", + "\n", + "**Exercise**: Implement the LSTM cell described in the Figure (3).\n", + "\n", + "**Instructions**:\n", + "1. Concatenate $a^{\\langle t-1 \\rangle}$ and $x^{\\langle t \\rangle}$ in a single matrix: $concat = \\begin{bmatrix} a^{\\langle t-1 \\rangle} \\\\ x^{\\langle t \\rangle} \\end{bmatrix}$\n", + "2. Compute all the formulas 1-6. You can use `sigmoid()` (provided) and `np.tanh()`.\n", + "3. Compute the prediction $y^{\\langle t \\rangle}$. You can use `softmax()` (provided)." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: lstm_cell_forward\n", + "\n", + "def lstm_cell_forward(xt, a_prev, c_prev, parameters):\n", + " \"\"\"\n", + " Implement a single forward step of the LSTM-cell as described in Figure (4)\n", + "\n", + " Arguments:\n", + " xt -- your input data at timestep \"t\", numpy array of shape (n_x, m).\n", + " a_prev -- Hidden state at timestep \"t-1\", numpy array of shape (n_a, m)\n", + " c_prev -- Memory state at timestep \"t-1\", numpy array of shape (n_a, m)\n", + " parameters -- python dictionary containing:\n", + " Wf -- Weight matrix of the forget gate, numpy array of shape (n_a, n_a + n_x)\n", + " bf -- Bias of the forget gate, numpy array of shape (n_a, 1)\n", + " Wi -- Weight matrix of the update gate, numpy array of shape (n_a, n_a + n_x)\n", + " bi -- Bias of the update gate, numpy array of shape (n_a, 1)\n", + " Wc -- Weight matrix of the first \"tanh\", numpy array of shape (n_a, n_a + n_x)\n", + " bc -- Bias of the first \"tanh\", numpy array of shape (n_a, 1)\n", + " Wo -- Weight matrix of the output gate, numpy array of shape (n_a, n_a + n_x)\n", + " bo -- Bias of the output gate, numpy array of shape (n_a, 1)\n", + " Wy -- Weight matrix relating the hidden-state to the output, numpy array of shape (n_y, n_a)\n", + " by -- Bias relating the hidden-state to the output, numpy array of shape (n_y, 1)\n", + " \n", + " Returns:\n", + " a_next -- next hidden state, of shape (n_a, m)\n", + " c_next -- next memory state, of shape (n_a, m)\n", + " yt_pred -- prediction at timestep \"t\", numpy array of shape (n_y, m)\n", + " cache -- tuple of values needed for the backward pass, contains (a_next, c_next, a_prev, c_prev, xt, parameters)\n", + " \n", + " Note: ft/it/ot stand for the forget/update/output gates, cct stands for the candidate value (c tilde),\n", + " c stands for the memory value\n", + " \"\"\"\n", + "\n", + " # Retrieve parameters from \"parameters\"\n", + " Wf = parameters[\"Wf\"]\n", + " bf = parameters[\"bf\"]\n", + " Wi = parameters[\"Wi\"]\n", + " bi = parameters[\"bi\"]\n", + " Wc = parameters[\"Wc\"]\n", + " bc = parameters[\"bc\"]\n", + " Wo = parameters[\"Wo\"]\n", + " bo = parameters[\"bo\"]\n", + " Wy = parameters[\"Wy\"]\n", + " by = parameters[\"by\"]\n", + " \n", + " # Retrieve dimensions from shapes of xt and Wy\n", + " n_x, m = xt.shape\n", + " n_y, n_a = Wy.shape\n", + "\n", + " ### START CODE HERE ###\n", + " # Concatenate a_prev and xt (≈3 lines)\n", + " concat = np.zeros((n_a + n_x, m))\n", + " concat[: n_a, :] = a_prev\n", + " concat[n_a :, :] = xt\n", + "\n", + " # Compute values for ft, it, cct, c_next, ot, a_next using the formulas given figure (4) (≈6 lines)\n", + " ft = sigmoid(np.dot(Wf, concat) + bf)\n", + " it = sigmoid(np.dot(Wi, concat) + bi)\n", + " cct = np.tanh(np.dot(Wc, concat) + bc)\n", + " c_next = ft * c_prev + it * cct \n", + " ot = sigmoid(np.dot(Wo, concat) + bo)\n", + " a_next = ot * np.tanh(c_next)\n", + " \n", + " # Compute prediction of the LSTM cell (≈1 line)\n", + " yt_pred = softmax(np.dot(Wy, a_next) + by)\n", + " ### END CODE HERE ###\n", + "\n", + " # store values needed for backward propagation in cache\n", + " cache = (a_next, c_next, a_prev, c_prev, ft, it, cct, ot, xt, parameters)\n", + "\n", + " return a_next, c_next, yt_pred, cache" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a_next[4] = [-0.66408471 0.0036921 0.02088357 0.22834167 -0.85575339 0.00138482\n", + " 0.76566531 0.34631421 -0.00215674 0.43827275]\n", + "a_next.shape = (5, 10)\n", + "c_next[2] = [ 0.63267805 1.00570849 0.35504474 0.20690913 -1.64566718 0.11832942\n", + " 0.76449811 -0.0981561 -0.74348425 -0.26810932]\n", + "c_next.shape = (5, 10)\n", + "yt[1] = [ 0.79913913 0.15986619 0.22412122 0.15606108 0.97057211 0.31146381\n", + " 0.00943007 0.12666353 0.39380172 0.07828381]\n", + "yt.shape = (2, 10)\n", + "cache[1][3] = [-0.16263996 1.03729328 0.72938082 -0.54101719 0.02752074 -0.30821874\n", + " 0.07651101 -1.03752894 1.41219977 -0.37647422]\n", + "len(cache) = 10\n" + ] + } + ], + "source": [ + "np.random.seed(1)\n", + "xt = np.random.randn(3,10)\n", + "a_prev = np.random.randn(5,10)\n", + "c_prev = np.random.randn(5,10)\n", + "Wf = np.random.randn(5, 5+3)\n", + "bf = np.random.randn(5,1)\n", + "Wi = np.random.randn(5, 5+3)\n", + "bi = np.random.randn(5,1)\n", + "Wo = np.random.randn(5, 5+3)\n", + "bo = np.random.randn(5,1)\n", + "Wc = np.random.randn(5, 5+3)\n", + "bc = np.random.randn(5,1)\n", + "Wy = np.random.randn(2,5)\n", + "by = np.random.randn(2,1)\n", + "\n", + "parameters = {\"Wf\": Wf, \"Wi\": Wi, \"Wo\": Wo, \"Wc\": Wc, \"Wy\": Wy, \"bf\": bf, \"bi\": bi, \"bo\": bo, \"bc\": bc, \"by\": by}\n", + "\n", + "a_next, c_next, yt, cache = lstm_cell_forward(xt, a_prev, c_prev, parameters)\n", + "print(\"a_next[4] = \", a_next[4])\n", + "print(\"a_next.shape = \", c_next.shape)\n", + "print(\"c_next[2] = \", c_next[2])\n", + "print(\"c_next.shape = \", c_next.shape)\n", + "print(\"yt[1] =\", yt[1])\n", + "print(\"yt.shape = \", yt.shape)\n", + "print(\"cache[1][3] =\", cache[1][3])\n", + "print(\"len(cache) = \", len(cache))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "**Expected Output**:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "
\n", + " **a_next[4]**:\n", + " \n", + " [-0.66408471 0.0036921 0.02088357 0.22834167 -0.85575339 0.00138482\n", + " 0.76566531 0.34631421 -0.00215674 0.43827275]\n", + "
\n", + " **a_next.shape**:\n", + " \n", + " (5, 10)\n", + "
\n", + " **c_next[2]**:\n", + " \n", + " [ 0.63267805 1.00570849 0.35504474 0.20690913 -1.64566718 0.11832942\n", + " 0.76449811 -0.0981561 -0.74348425 -0.26810932]\n", + "
\n", + " **c_next.shape**:\n", + " \n", + " (5, 10)\n", + "
\n", + " **yt[1]**:\n", + " \n", + " [ 0.79913913 0.15986619 0.22412122 0.15606108 0.97057211 0.31146381\n", + " 0.00943007 0.12666353 0.39380172 0.07828381]\n", + "
\n", + " **yt.shape**:\n", + " \n", + " (2, 10)\n", + "
\n", + " **cache[1][3]**:\n", + " \n", + " [-0.16263996 1.03729328 0.72938082 -0.54101719 0.02752074 -0.30821874\n", + " 0.07651101 -1.03752894 1.41219977 -0.37647422]\n", + "
\n", + " **len(cache)**:\n", + " \n", + " 10\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.2 - Forward pass for LSTM\n", + "\n", + "Now that you have implemented one step of an LSTM, you can now iterate this over this using a for-loop to process a sequence of $T_x$ inputs. \n", + "\n", + "\n", + "
**Figure 4**: LSTM over multiple time-steps.
\n", + "\n", + "**Exercise:** Implement `lstm_forward()` to run an LSTM over $T_x$ time-steps. \n", + "\n", + "**Note**: $c^{\\langle 0 \\rangle}$ is initialized with zeros." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: lstm_forward\n", + "\n", + "def lstm_forward(x, a0, parameters):\n", + " \"\"\"\n", + " Implement the forward propagation of the recurrent neural network using an LSTM-cell described in Figure (3).\n", + "\n", + " Arguments:\n", + " x -- Input data for every time-step, of shape (n_x, m, T_x).\n", + " a0 -- Initial hidden state, of shape (n_a, m)\n", + " parameters -- python dictionary containing:\n", + " Wf -- Weight matrix of the forget gate, numpy array of shape (n_a, n_a + n_x)\n", + " bf -- Bias of the forget gate, numpy array of shape (n_a, 1)\n", + " Wi -- Weight matrix of the update gate, numpy array of shape (n_a, n_a + n_x)\n", + " bi -- Bias of the update gate, numpy array of shape (n_a, 1)\n", + " Wc -- Weight matrix of the first \"tanh\", numpy array of shape (n_a, n_a + n_x)\n", + " bc -- Bias of the first \"tanh\", numpy array of shape (n_a, 1)\n", + " Wo -- Weight matrix of the output gate, numpy array of shape (n_a, n_a + n_x)\n", + " bo -- Bias of the output gate, numpy array of shape (n_a, 1)\n", + " Wy -- Weight matrix relating the hidden-state to the output, numpy array of shape (n_y, n_a)\n", + " by -- Bias relating the hidden-state to the output, numpy array of shape (n_y, 1)\n", + " \n", + " Returns:\n", + " a -- Hidden states for every time-step, numpy array of shape (n_a, m, T_x)\n", + " y -- Predictions for every time-step, numpy array of shape (n_y, m, T_x)\n", + " caches -- tuple of values needed for the backward pass, contains (list of all the caches, x)\n", + " \"\"\"\n", + "\n", + " # Initialize \"caches\", which will track the list of all the caches\n", + " caches = []\n", + " \n", + " ### START CODE HERE ###\n", + " # Retrieve dimensions from shapes of x and Wy (≈2 lines)\n", + " n_x, m, T_x = x.shape\n", + " n_y, n_a = parameters[\"Wy\"].shape\n", + " \n", + " # initialize \"a\", \"c\" and \"y\" with zeros (≈3 lines)\n", + " a = np.zeros((n_a, m, T_x))\n", + " c = a\n", + " y = np.zeros((n_y, m, T_x))\n", + " \n", + " # Initialize a_next and c_next (≈2 lines)\n", + " a_next = a0\n", + " c_next = np.zeros(a_next.shape)\n", + " \n", + " # loop over all time-steps\n", + " for t in range(T_x):\n", + " # Update next hidden state, next memory state, compute the prediction, get the cache (≈1 line)\n", + " a_next, c_next, yt, cache = lstm_cell_forward(x[:,:,t], a_next, c_next, parameters)\n", + " # Save the value of the new \"next\" hidden state in a (≈1 line)\n", + " a[:,:,t] = a_next\n", + " # Save the value of the prediction in y (≈1 line)\n", + " y[:,:,t] = yt\n", + " # Save the value of the next cell state (≈1 line)\n", + " c[:,:,t] = c_next\n", + " # Append the cache into caches (≈1 line)\n", + " caches.append(cache)\n", + " \n", + " ### END CODE HERE ###\n", + " \n", + " # store values needed for backward propagation in cache\n", + " caches = (caches, x)\n", + "\n", + " return a, y, c, caches" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a[4][3][6] = 0.73162451027\n", + "a.shape = (5, 10, 7)\n", + "y[1][4][3] = 0.95087346185\n", + "y.shape = (2, 10, 7)\n", + "caches[1][1[1]] = [ 0.82797464 0.23009474 0.76201118 -0.22232814 -0.20075807 0.18656139\n", + " 0.41005165]\n", + "c[1][2][1] -0.855544916718\n", + "len(caches) = 2\n" + ] + } + ], + "source": [ + "np.random.seed(1)\n", + "x = np.random.randn(3,10,7)\n", + "a0 = np.random.randn(5,10)\n", + "Wf = np.random.randn(5, 5+3)\n", + "bf = np.random.randn(5,1)\n", + "Wi = np.random.randn(5, 5+3)\n", + "bi = np.random.randn(5,1)\n", + "Wo = np.random.randn(5, 5+3)\n", + "bo = np.random.randn(5,1)\n", + "Wc = np.random.randn(5, 5+3)\n", + "bc = np.random.randn(5,1)\n", + "Wy = np.random.randn(2,5)\n", + "by = np.random.randn(2,1)\n", + "\n", + "parameters = {\"Wf\": Wf, \"Wi\": Wi, \"Wo\": Wo, \"Wc\": Wc, \"Wy\": Wy, \"bf\": bf, \"bi\": bi, \"bo\": bo, \"bc\": bc, \"by\": by}\n", + "\n", + "a, y, c, caches = lstm_forward(x, a0, parameters)\n", + "print(\"a[4][3][6] = \", a[4][3][6])\n", + "print(\"a.shape = \", a.shape)\n", + "print(\"y[1][4][3] =\", y[1][4][3])\n", + "print(\"y.shape = \", y.shape)\n", + "print(\"caches[1][1[1]] =\", caches[1][1][1])\n", + "print(\"c[1][2][1]\", c[1][2][1])\n", + "print(\"len(caches) = \", len(caches))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "
\n", + " **a[4][3][6]** =\n", + " \n", + " 0.172117767533\n", + "
\n", + " **a.shape** =\n", + " \n", + " (5, 10, 7)\n", + "
\n", + " **y[1][4][3]** =\n", + " \n", + " 0.95087346185\n", + "
\n", + " **y.shape** =\n", + " \n", + " (2, 10, 7)\n", + "
\n", + " **caches[1][1][1]** =\n", + " \n", + " [ 0.82797464 0.23009474 0.76201118 -0.22232814 -0.20075807 0.18656139\n", + " 0.41005165]\n", + "
\n", + " **c[1][2][1]** =\n", + " \n", + " -0.855544916718\n", + "
\n", + " **len(caches)** =\n", + " \n", + " 2\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Congratulations! You have now implemented the forward passes for the basic RNN and the LSTM. When using a deep learning framework, implementing the forward pass is sufficient to build systems that achieve great performance. \n", + "\n", + "The rest of this notebook is optional, and will not be graded." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3 - Backpropagation in recurrent neural networks (OPTIONAL / UNGRADED)\n", + "\n", + "In modern deep learning frameworks, you only have to implement the forward pass, and the framework takes care of the backward pass, so most deep learning engineers do not need to bother with the details of the backward pass. If however you are an expert in calculus and want to see the details of backprop in RNNs, you can work through this optional portion of the notebook. \n", + "\n", + "When in an earlier course you implemented a simple (fully connected) neural network, you used backpropagation to compute the derivatives with respect to the cost to update the parameters. Similarly, in recurrent neural networks you can to calculate the derivatives with respect to the cost in order to update the parameters. The backprop equations are quite complicated and we did not derive them in lecture. However, we will briefly present them below. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.1 - Basic RNN backward pass\n", + "\n", + "We will start by computing the backward pass for the basic RNN-cell.\n", + "\n", + "
\n", + "
**Figure 5**: RNN-cell's backward pass. Just like in a fully-connected neural network, the derivative of the cost function $J$ backpropagates through the RNN by following the chain-rule from calculas. The chain-rule is also used to calculate $(\\frac{\\partial J}{\\partial W_{ax}},\\frac{\\partial J}{\\partial W_{aa}},\\frac{\\partial J}{\\partial b})$ to update the parameters $(W_{ax}, W_{aa}, b_a)$.
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Deriving the one step backward functions: \n", + "\n", + "To compute the `rnn_cell_backward` you need to compute the following equations. It is a good exercise to derive them by hand. \n", + "\n", + "The derivative of $\\tanh$ is $1-\\tanh(x)^2$. You can find the complete proof [here](https://www.wyzant.com/resources/lessons/math/calculus/derivative_proofs/tanx). Note that: $ \\sec(x)^2 = 1 - \\tanh(x)^2$\n", + "\n", + "Similarly for $\\frac{ \\partial a^{\\langle t \\rangle} } {\\partial W_{ax}}, \\frac{ \\partial a^{\\langle t \\rangle} } {\\partial W_{aa}}, \\frac{ \\partial a^{\\langle t \\rangle} } {\\partial b}$, the derivative of $\\tanh(u)$ is $(1-\\tanh(u)^2)du$. \n", + "\n", + "The final two equations also follow same rule and are derived using the $\\tanh$ derivative. Note that the arrangement is done in a way to get the same dimensions to match." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def rnn_cell_backward(da_next, cache):\n", + " \"\"\"\n", + " Implements the backward pass for the RNN-cell (single time-step).\n", + "\n", + " Arguments:\n", + " da_next -- Gradient of loss with respect to next hidden state\n", + " cache -- python dictionary containing useful values (output of rnn_cell_forward())\n", + "\n", + " Returns:\n", + " gradients -- python dictionary containing:\n", + " dx -- Gradients of input data, of shape (n_x, m)\n", + " da_prev -- Gradients of previous hidden state, of shape (n_a, m)\n", + " dWax -- Gradients of input-to-hidden weights, of shape (n_a, n_x)\n", + " dWaa -- Gradients of hidden-to-hidden weights, of shape (n_a, n_a)\n", + " dba -- Gradients of bias vector, of shape (n_a, 1)\n", + " \"\"\"\n", + " \n", + " # Retrieve values from cache\n", + " (a_next, a_prev, xt, parameters) = cache\n", + " \n", + " # Retrieve values from parameters\n", + " Wax = parameters[\"Wax\"]\n", + " Waa = parameters[\"Waa\"]\n", + " Wya = parameters[\"Wya\"]\n", + " ba = parameters[\"ba\"]\n", + " by = parameters[\"by\"]\n", + "\n", + " ### START CODE HERE ###\n", + " # compute the gradient of tanh with respect to a_next (≈1 line)\n", + " dtanh = None\n", + "\n", + " # compute the gradient of the loss with respect to Wax (≈2 lines)\n", + " dxt = None\n", + " dWax = None\n", + "\n", + " # compute the gradient with respect to Waa (≈2 lines)\n", + " da_prev = None\n", + " dWaa = None\n", + "\n", + " # compute the gradient with respect to b (≈1 line)\n", + " dba = None\n", + "\n", + " ### END CODE HERE ###\n", + " \n", + " # Store the gradients in a python dictionary\n", + " gradients = {\"dxt\": dxt, \"da_prev\": da_prev, \"dWax\": dWax, \"dWaa\": dWaa, \"dba\": dba}\n", + " \n", + " return gradients" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true, + "scrolled": true + }, + "outputs": [], + "source": [ + "np.random.seed(1)\n", + "xt = np.random.randn(3,10)\n", + "a_prev = np.random.randn(5,10)\n", + "Wax = np.random.randn(5,3)\n", + "Waa = np.random.randn(5,5)\n", + "Wya = np.random.randn(2,5)\n", + "b = np.random.randn(5,1)\n", + "by = np.random.randn(2,1)\n", + "parameters = {\"Wax\": Wax, \"Waa\": Waa, \"Wya\": Wya, \"ba\": ba, \"by\": by}\n", + "\n", + "a_next, yt, cache = rnn_cell_forward(xt, a_prev, parameters)\n", + "\n", + "da_next = np.random.randn(5,10)\n", + "gradients = rnn_cell_backward(da_next, cache)\n", + "print(\"gradients[\\\"dxt\\\"][1][2] =\", gradients[\"dxt\"][1][2])\n", + "print(\"gradients[\\\"dxt\\\"].shape =\", gradients[\"dxt\"].shape)\n", + "print(\"gradients[\\\"da_prev\\\"][2][3] =\", gradients[\"da_prev\"][2][3])\n", + "print(\"gradients[\\\"da_prev\\\"].shape =\", gradients[\"da_prev\"].shape)\n", + "print(\"gradients[\\\"dWax\\\"][3][1] =\", gradients[\"dWax\"][3][1])\n", + "print(\"gradients[\\\"dWax\\\"].shape =\", gradients[\"dWax\"].shape)\n", + "print(\"gradients[\\\"dWaa\\\"][1][2] =\", gradients[\"dWaa\"][1][2])\n", + "print(\"gradients[\\\"dWaa\\\"].shape =\", gradients[\"dWaa\"].shape)\n", + "print(\"gradients[\\\"dba\\\"][4] =\", gradients[\"dba\"][4])\n", + "print(\"gradients[\\\"dba\\\"].shape =\", gradients[\"dba\"].shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **gradients[\"dxt\"][1][2]** =\n", + " \n", + " -0.460564103059\n", + "
\n", + " **gradients[\"dxt\"].shape** =\n", + " \n", + " (3, 10)\n", + "
\n", + " **gradients[\"da_prev\"][2][3]** =\n", + " \n", + " 0.0842968653807\n", + "
\n", + " **gradients[\"da_prev\"].shape** =\n", + " \n", + " (5, 10)\n", + "
\n", + " **gradients[\"dWax\"][3][1]** =\n", + " \n", + " 0.393081873922\n", + "
\n", + " **gradients[\"dWax\"].shape** =\n", + " \n", + " (5, 3)\n", + "
\n", + " **gradients[\"dWaa\"][1][2]** = \n", + " \n", + " -0.28483955787\n", + "
\n", + " **gradients[\"dWaa\"].shape** =\n", + " \n", + " (5, 5)\n", + "
\n", + " **gradients[\"dba\"][4]** = \n", + " \n", + " [ 0.80517166]\n", + "
\n", + " **gradients[\"dba\"].shape** = \n", + " \n", + " (5, 1)\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Backward pass through the RNN\n", + "\n", + "Computing the gradients of the cost with respect to $a^{\\langle t \\rangle}$ at every time-step $t$ is useful because it is what helps the gradient backpropagate to the previous RNN-cell. To do so, you need to iterate through all the time steps starting at the end, and at each step, you increment the overall $db_a$, $dW_{aa}$, $dW_{ax}$ and you store $dx$.\n", + "\n", + "**Instructions**:\n", + "\n", + "Implement the `rnn_backward` function. Initialize the return variables with zeros first and then loop through all the time steps while calling the `rnn_cell_backward` at each time timestep, update the other variables accordingly." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def rnn_backward(da, caches):\n", + " \"\"\"\n", + " Implement the backward pass for a RNN over an entire sequence of input data.\n", + "\n", + " Arguments:\n", + " da -- Upstream gradients of all hidden states, of shape (n_a, m, T_x)\n", + " caches -- tuple containing information from the forward pass (rnn_forward)\n", + " \n", + " Returns:\n", + " gradients -- python dictionary containing:\n", + " dx -- Gradient w.r.t. the input data, numpy-array of shape (n_x, m, T_x)\n", + " da0 -- Gradient w.r.t the initial hidden state, numpy-array of shape (n_a, m)\n", + " dWax -- Gradient w.r.t the input's weight matrix, numpy-array of shape (n_a, n_x)\n", + " dWaa -- Gradient w.r.t the hidden state's weight matrix, numpy-arrayof shape (n_a, n_a)\n", + " dba -- Gradient w.r.t the bias, of shape (n_a, 1)\n", + " \"\"\"\n", + " \n", + " ### START CODE HERE ###\n", + " \n", + " # Retrieve values from the first cache (t=1) of caches (≈2 lines)\n", + " (caches, x) = None\n", + " (a1, a0, x1, parameters) = None\n", + " \n", + " # Retrieve dimensions from da's and x1's shapes (≈2 lines)\n", + " n_a, m, T_x = None\n", + " n_x, m = None\n", + " \n", + " # initialize the gradients with the right sizes (≈6 lines)\n", + " dx = None\n", + " dWax = None\n", + " dWaa = None\n", + " dba = None\n", + " da0 = None\n", + " da_prevt = None\n", + " \n", + " # Loop through all the time steps\n", + " for t in reversed(range(None)):\n", + " # Compute gradients at time step t. Choose wisely the \"da_next\" and the \"cache\" to use in the backward propagation step. (≈1 line)\n", + " gradients = None\n", + " # Retrieve derivatives from gradients (≈ 1 line)\n", + " dxt, da_prevt, dWaxt, dWaat, dbat = gradients[\"dxt\"], gradients[\"da_prev\"], gradients[\"dWax\"], gradients[\"dWaa\"], gradients[\"dba\"]\n", + " # Increment global derivatives w.r.t parameters by adding their derivative at time-step t (≈4 lines)\n", + " dx[:, :, t] = None\n", + " dWax += None\n", + " dWaa += None\n", + " dba += None\n", + " \n", + " # Set da0 to the gradient of a which has been backpropagated through all time-steps (≈1 line) \n", + " da0 = None\n", + " ### END CODE HERE ###\n", + "\n", + " # Store the gradients in a python dictionary\n", + " gradients = {\"dx\": dx, \"da0\": da0, \"dWax\": dWax, \"dWaa\": dWaa,\"dba\": dba}\n", + " \n", + " return gradients" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "np.random.seed(1)\n", + "x = np.random.randn(3,10,4)\n", + "a0 = np.random.randn(5,10)\n", + "Wax = np.random.randn(5,3)\n", + "Waa = np.random.randn(5,5)\n", + "Wya = np.random.randn(2,5)\n", + "ba = np.random.randn(5,1)\n", + "by = np.random.randn(2,1)\n", + "parameters = {\"Wax\": Wax, \"Waa\": Waa, \"Wya\": Wya, \"ba\": ba, \"by\": by}\n", + "a, y, caches = rnn_forward(x, a0, parameters)\n", + "da = np.random.randn(5, 10, 4)\n", + "gradients = rnn_backward(da, caches)\n", + "\n", + "print(\"gradients[\\\"dx\\\"][1][2] =\", gradients[\"dx\"][1][2])\n", + "print(\"gradients[\\\"dx\\\"].shape =\", gradients[\"dx\"].shape)\n", + "print(\"gradients[\\\"da0\\\"][2][3] =\", gradients[\"da0\"][2][3])\n", + "print(\"gradients[\\\"da0\\\"].shape =\", gradients[\"da0\"].shape)\n", + "print(\"gradients[\\\"dWax\\\"][3][1] =\", gradients[\"dWax\"][3][1])\n", + "print(\"gradients[\\\"dWax\\\"].shape =\", gradients[\"dWax\"].shape)\n", + "print(\"gradients[\\\"dWaa\\\"][1][2] =\", gradients[\"dWaa\"][1][2])\n", + "print(\"gradients[\\\"dWaa\\\"].shape =\", gradients[\"dWaa\"].shape)\n", + "print(\"gradients[\\\"dba\\\"][4] =\", gradients[\"dba\"][4])\n", + "print(\"gradients[\\\"dba\\\"].shape =\", gradients[\"dba\"].shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **gradients[\"dx\"][1][2]** =\n", + " \n", + " [-2.07101689 -0.59255627 0.02466855 0.01483317]\n", + "
\n", + " **gradients[\"dx\"].shape** =\n", + " \n", + " (3, 10, 4)\n", + "
\n", + " **gradients[\"da0\"][2][3]** =\n", + " \n", + " -0.314942375127\n", + "
\n", + " **gradients[\"da0\"].shape** =\n", + " \n", + " (5, 10)\n", + "
\n", + " **gradients[\"dWax\"][3][1]** =\n", + " \n", + " 11.2641044965\n", + "
\n", + " **gradients[\"dWax\"].shape** =\n", + " \n", + " (5, 3)\n", + "
\n", + " **gradients[\"dWaa\"][1][2]** = \n", + " \n", + " 2.30333312658\n", + "
\n", + " **gradients[\"dWaa\"].shape** =\n", + " \n", + " (5, 5)\n", + "
\n", + " **gradients[\"dba\"][4]** = \n", + " \n", + " [-0.74747722]\n", + "
\n", + " **gradients[\"dba\"].shape** = \n", + " \n", + " (5, 1)\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3.2 - LSTM backward pass" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.2.1 One Step backward\n", + "\n", + "The LSTM backward pass is slighltly more complicated than the forward one. We have provided you with all the equations for the LSTM backward pass below. (If you enjoy calculus exercises feel free to try deriving these from scratch yourself.) \n", + "\n", + "### 3.2.2 gate derivatives\n", + "\n", + "$$d \\Gamma_o^{\\langle t \\rangle} = da_{next}*\\tanh(c_{next}) * \\Gamma_o^{\\langle t \\rangle}*(1-\\Gamma_o^{\\langle t \\rangle})\\tag{7}$$\n", + "\n", + "$$d\\tilde c^{\\langle t \\rangle} = dc_{next}*\\Gamma_i^{\\langle t \\rangle}+ \\Gamma_o^{\\langle t \\rangle} (1-\\tanh(c_{next})^2) * i_t * da_{next} * \\tilde c^{\\langle t \\rangle} * (1-\\tanh(\\tilde c)^2) \\tag{8}$$\n", + "\n", + "$$d\\Gamma_u^{\\langle t \\rangle} = dc_{next}*\\tilde c^{\\langle t \\rangle} + \\Gamma_o^{\\langle t \\rangle} (1-\\tanh(c_{next})^2) * \\tilde c^{\\langle t \\rangle} * da_{next}*\\Gamma_u^{\\langle t \\rangle}*(1-\\Gamma_u^{\\langle t \\rangle})\\tag{9}$$\n", + "\n", + "$$d\\Gamma_f^{\\langle t \\rangle} = dc_{next}*\\tilde c_{prev} + \\Gamma_o^{\\langle t \\rangle} (1-\\tanh(c_{next})^2) * c_{prev} * da_{next}*\\Gamma_f^{\\langle t \\rangle}*(1-\\Gamma_f^{\\langle t \\rangle})\\tag{10}$$\n", + "\n", + "### 3.2.3 parameter derivatives \n", + "\n", + "$$ dW_f = d\\Gamma_f^{\\langle t \\rangle} * \\begin{pmatrix} a_{prev} \\\\ x_t\\end{pmatrix}^T \\tag{11} $$\n", + "$$ dW_u = d\\Gamma_u^{\\langle t \\rangle} * \\begin{pmatrix} a_{prev} \\\\ x_t\\end{pmatrix}^T \\tag{12} $$\n", + "$$ dW_c = d\\tilde c^{\\langle t \\rangle} * \\begin{pmatrix} a_{prev} \\\\ x_t\\end{pmatrix}^T \\tag{13} $$\n", + "$$ dW_o = d\\Gamma_o^{\\langle t \\rangle} * \\begin{pmatrix} a_{prev} \\\\ x_t\\end{pmatrix}^T \\tag{14}$$\n", + "\n", + "To calculate $db_f, db_u, db_c, db_o$ you just need to sum across the horizontal (axis= 1) axis on $d\\Gamma_f^{\\langle t \\rangle}, d\\Gamma_u^{\\langle t \\rangle}, d\\tilde c^{\\langle t \\rangle}, d\\Gamma_o^{\\langle t \\rangle}$ respectively. Note that you should have the `keep_dims = True` option.\n", + "\n", + "Finally, you will compute the derivative with respect to the previous hidden state, previous memory state, and input.\n", + "\n", + "$$ da_{prev} = W_f^T*d\\Gamma_f^{\\langle t \\rangle} + W_u^T * d\\Gamma_u^{\\langle t \\rangle}+ W_c^T * d\\tilde c^{\\langle t \\rangle} + W_o^T * d\\Gamma_o^{\\langle t \\rangle} \\tag{15}$$\n", + "Here, the weights for equations 13 are the first n_a, (i.e. $W_f = W_f[:n_a,:]$ etc...)\n", + "\n", + "$$ dc_{prev} = dc_{next}\\Gamma_f^{\\langle t \\rangle} + \\Gamma_o^{\\langle t \\rangle} * (1- \\tanh(c_{next})^2)*\\Gamma_f^{\\langle t \\rangle}*da_{next} \\tag{16}$$\n", + "$$ dx^{\\langle t \\rangle} = W_f^T*d\\Gamma_f^{\\langle t \\rangle} + W_u^T * d\\Gamma_u^{\\langle t \\rangle}+ W_c^T * d\\tilde c_t + W_o^T * d\\Gamma_o^{\\langle t \\rangle}\\tag{17} $$\n", + "where the weights for equation 15 are from n_a to the end, (i.e. $W_f = W_f[n_a:,:]$ etc...)\n", + "\n", + "**Exercise:** Implement `lstm_cell_backward` by implementing equations $7-17$ below. Good luck! :)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def lstm_cell_backward(da_next, dc_next, cache):\n", + " \"\"\"\n", + " Implement the backward pass for the LSTM-cell (single time-step).\n", + "\n", + " Arguments:\n", + " da_next -- Gradients of next hidden state, of shape (n_a, m)\n", + " dc_next -- Gradients of next cell state, of shape (n_a, m)\n", + " cache -- cache storing information from the forward pass\n", + "\n", + " Returns:\n", + " gradients -- python dictionary containing:\n", + " dxt -- Gradient of input data at time-step t, of shape (n_x, m)\n", + " da_prev -- Gradient w.r.t. the previous hidden state, numpy array of shape (n_a, m)\n", + " dc_prev -- Gradient w.r.t. the previous memory state, of shape (n_a, m, T_x)\n", + " dWf -- Gradient w.r.t. the weight matrix of the forget gate, numpy array of shape (n_a, n_a + n_x)\n", + " dWi -- Gradient w.r.t. the weight matrix of the update gate, numpy array of shape (n_a, n_a + n_x)\n", + " dWc -- Gradient w.r.t. the weight matrix of the memory gate, numpy array of shape (n_a, n_a + n_x)\n", + " dWo -- Gradient w.r.t. the weight matrix of the output gate, numpy array of shape (n_a, n_a + n_x)\n", + " dbf -- Gradient w.r.t. biases of the forget gate, of shape (n_a, 1)\n", + " dbi -- Gradient w.r.t. biases of the update gate, of shape (n_a, 1)\n", + " dbc -- Gradient w.r.t. biases of the memory gate, of shape (n_a, 1)\n", + " dbo -- Gradient w.r.t. biases of the output gate, of shape (n_a, 1)\n", + " \"\"\"\n", + "\n", + " # Retrieve information from \"cache\"\n", + " (a_next, c_next, a_prev, c_prev, ft, it, cct, ot, xt, parameters) = cache\n", + " \n", + " ### START CODE HERE ###\n", + " # Retrieve dimensions from xt's and a_next's shape (≈2 lines)\n", + " n_x, m = None\n", + " n_a, m = None\n", + " \n", + " # Compute gates related derivatives, you can find their values can be found by looking carefully at equations (7) to (10) (≈4 lines)\n", + " dot = None\n", + " dcct = None\n", + " dit = None\n", + " dft = None\n", + " \n", + " # Code equations (7) to (10) (≈4 lines)\n", + " dit = None\n", + " dft = None\n", + " dot = None\n", + " dcct = None\n", + "\n", + " # Compute parameters related derivatives. Use equations (11)-(14) (≈8 lines)\n", + " dWf = None\n", + " dWi = None\n", + " dWc = None\n", + " dWo = None\n", + " dbf = None\n", + " dbi = None\n", + " dbc = None\n", + " dbo = None\n", + "\n", + " # Compute derivatives w.r.t previous hidden state, previous memory state and input. Use equations (15)-(17). (≈3 lines)\n", + " da_prev = None\n", + " dc_prev = None\n", + " dxt = None\n", + " ### END CODE HERE ###\n", + " \n", + " # Save gradients in dictionary\n", + " gradients = {\"dxt\": dxt, \"da_prev\": da_prev, \"dc_prev\": dc_prev, \"dWf\": dWf,\"dbf\": dbf, \"dWi\": dWi,\"dbi\": dbi,\n", + " \"dWc\": dWc,\"dbc\": dbc, \"dWo\": dWo,\"dbo\": dbo}\n", + "\n", + " return gradients" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true, + "scrolled": false + }, + "outputs": [], + "source": [ + "np.random.seed(1)\n", + "xt = np.random.randn(3,10)\n", + "a_prev = np.random.randn(5,10)\n", + "c_prev = np.random.randn(5,10)\n", + "Wf = np.random.randn(5, 5+3)\n", + "bf = np.random.randn(5,1)\n", + "Wi = np.random.randn(5, 5+3)\n", + "bi = np.random.randn(5,1)\n", + "Wo = np.random.randn(5, 5+3)\n", + "bo = np.random.randn(5,1)\n", + "Wc = np.random.randn(5, 5+3)\n", + "bc = np.random.randn(5,1)\n", + "Wy = np.random.randn(2,5)\n", + "by = np.random.randn(2,1)\n", + "\n", + "parameters = {\"Wf\": Wf, \"Wi\": Wi, \"Wo\": Wo, \"Wc\": Wc, \"Wy\": Wy, \"bf\": bf, \"bi\": bi, \"bo\": bo, \"bc\": bc, \"by\": by}\n", + "\n", + "a_next, c_next, yt, cache = lstm_cell_forward(xt, a_prev, c_prev, parameters)\n", + "\n", + "da_next = np.random.randn(5,10)\n", + "dc_next = np.random.randn(5,10)\n", + "gradients = lstm_cell_backward(da_next, dc_next, cache)\n", + "print(\"gradients[\\\"dxt\\\"][1][2] =\", gradients[\"dxt\"][1][2])\n", + "print(\"gradients[\\\"dxt\\\"].shape =\", gradients[\"dxt\"].shape)\n", + "print(\"gradients[\\\"da_prev\\\"][2][3] =\", gradients[\"da_prev\"][2][3])\n", + "print(\"gradients[\\\"da_prev\\\"].shape =\", gradients[\"da_prev\"].shape)\n", + "print(\"gradients[\\\"dc_prev\\\"][2][3] =\", gradients[\"dc_prev\"][2][3])\n", + "print(\"gradients[\\\"dc_prev\\\"].shape =\", gradients[\"dc_prev\"].shape)\n", + "print(\"gradients[\\\"dWf\\\"][3][1] =\", gradients[\"dWf\"][3][1])\n", + "print(\"gradients[\\\"dWf\\\"].shape =\", gradients[\"dWf\"].shape)\n", + "print(\"gradients[\\\"dWi\\\"][1][2] =\", gradients[\"dWi\"][1][2])\n", + "print(\"gradients[\\\"dWi\\\"].shape =\", gradients[\"dWi\"].shape)\n", + "print(\"gradients[\\\"dWc\\\"][3][1] =\", gradients[\"dWc\"][3][1])\n", + "print(\"gradients[\\\"dWc\\\"].shape =\", gradients[\"dWc\"].shape)\n", + "print(\"gradients[\\\"dWo\\\"][1][2] =\", gradients[\"dWo\"][1][2])\n", + "print(\"gradients[\\\"dWo\\\"].shape =\", gradients[\"dWo\"].shape)\n", + "print(\"gradients[\\\"dbf\\\"][4] =\", gradients[\"dbf\"][4])\n", + "print(\"gradients[\\\"dbf\\\"].shape =\", gradients[\"dbf\"].shape)\n", + "print(\"gradients[\\\"dbi\\\"][4] =\", gradients[\"dbi\"][4])\n", + "print(\"gradients[\\\"dbi\\\"].shape =\", gradients[\"dbi\"].shape)\n", + "print(\"gradients[\\\"dbc\\\"][4] =\", gradients[\"dbc\"][4])\n", + "print(\"gradients[\\\"dbc\\\"].shape =\", gradients[\"dbc\"].shape)\n", + "print(\"gradients[\\\"dbo\\\"][4] =\", gradients[\"dbo\"][4])\n", + "print(\"gradients[\\\"dbo\\\"].shape =\", gradients[\"dbo\"].shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **gradients[\"dxt\"][1][2]** =\n", + " \n", + " 3.23055911511\n", + "
\n", + " **gradients[\"dxt\"].shape** =\n", + " \n", + " (3, 10)\n", + "
\n", + " **gradients[\"da_prev\"][2][3]** =\n", + " \n", + " -0.0639621419711\n", + "
\n", + " **gradients[\"da_prev\"].shape** =\n", + " \n", + " (5, 10)\n", + "
\n", + " **gradients[\"dc_prev\"][2][3]** =\n", + " \n", + " 0.797522038797\n", + "
\n", + " **gradients[\"dc_prev\"].shape** =\n", + " \n", + " (5, 10)\n", + "
\n", + " **gradients[\"dWf\"][3][1]** = \n", + " \n", + " -0.147954838164\n", + "
\n", + " **gradients[\"dWf\"].shape** =\n", + " \n", + " (5, 8)\n", + "
\n", + " **gradients[\"dWi\"][1][2]** = \n", + " \n", + " 1.05749805523\n", + "
\n", + " **gradients[\"dWi\"].shape** = \n", + " \n", + " (5, 8)\n", + "
\n", + " **gradients[\"dWc\"][3][1]** = \n", + " \n", + " 2.30456216369\n", + "
\n", + " **gradients[\"dWc\"].shape** = \n", + " \n", + " (5, 8)\n", + "
\n", + " **gradients[\"dWo\"][1][2]** = \n", + " \n", + " 0.331311595289\n", + "
\n", + " **gradients[\"dWo\"].shape** = \n", + " \n", + " (5, 8)\n", + "
\n", + " **gradients[\"dbf\"][4]** = \n", + " \n", + " [ 0.18864637]\n", + "
\n", + " **gradients[\"dbf\"].shape** = \n", + " \n", + " (5, 1)\n", + "
\n", + " **gradients[\"dbi\"][4]** = \n", + " \n", + " [-0.40142491]\n", + "
\n", + " **gradients[\"dbi\"].shape** = \n", + " \n", + " (5, 1)\n", + "
\n", + " **gradients[\"dbc\"][4]** = \n", + " \n", + " [ 0.25587763]\n", + "
\n", + " **gradients[\"dbc\"].shape** = \n", + " \n", + " (5, 1)\n", + "
\n", + " **gradients[\"dbo\"][4]** = \n", + " \n", + " [ 0.13893342]\n", + "
\n", + " **gradients[\"dbo\"].shape** = \n", + " \n", + " (5, 1)\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.3 Backward pass through the LSTM RNN\n", + "\n", + "This part is very similar to the `rnn_backward` function you implemented above. You will first create variables of the same dimension as your return variables. You will then iterate over all the time steps starting from the end and call the one step function you implemented for LSTM at each iteration. You will then update the parameters by summing them individually. Finally return a dictionary with the new gradients. \n", + "\n", + "**Instructions**: Implement the `lstm_backward` function. Create a for loop starting from $T_x$ and going backward. For each step call `lstm_cell_backward` and update the your old gradients by adding the new gradients to them. Note that `dxt` is not updated but is stored." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def lstm_backward(da, caches):\n", + " \n", + " \"\"\"\n", + " Implement the backward pass for the RNN with LSTM-cell (over a whole sequence).\n", + "\n", + " Arguments:\n", + " da -- Gradients w.r.t the hidden states, numpy-array of shape (n_a, m, T_x)\n", + " dc -- Gradients w.r.t the memory states, numpy-array of shape (n_a, m, T_x)\n", + " caches -- cache storing information from the forward pass (lstm_forward)\n", + "\n", + " Returns:\n", + " gradients -- python dictionary containing:\n", + " dx -- Gradient of inputs, of shape (n_x, m, T_x)\n", + " da0 -- Gradient w.r.t. the previous hidden state, numpy array of shape (n_a, m)\n", + " dWf -- Gradient w.r.t. the weight matrix of the forget gate, numpy array of shape (n_a, n_a + n_x)\n", + " dWi -- Gradient w.r.t. the weight matrix of the update gate, numpy array of shape (n_a, n_a + n_x)\n", + " dWc -- Gradient w.r.t. the weight matrix of the memory gate, numpy array of shape (n_a, n_a + n_x)\n", + " dWo -- Gradient w.r.t. the weight matrix of the save gate, numpy array of shape (n_a, n_a + n_x)\n", + " dbf -- Gradient w.r.t. biases of the forget gate, of shape (n_a, 1)\n", + " dbi -- Gradient w.r.t. biases of the update gate, of shape (n_a, 1)\n", + " dbc -- Gradient w.r.t. biases of the memory gate, of shape (n_a, 1)\n", + " dbo -- Gradient w.r.t. biases of the save gate, of shape (n_a, 1)\n", + " \"\"\"\n", + "\n", + " # Retrieve values from the first cache (t=1) of caches.\n", + " (caches, x) = caches\n", + " (a1, c1, a0, c0, f1, i1, cc1, o1, x1, parameters) = caches[0]\n", + " \n", + " ### START CODE HERE ###\n", + " # Retrieve dimensions from da's and x1's shapes (≈2 lines)\n", + " n_a, m, T_x = None\n", + " n_x, m = None\n", + " \n", + " # initialize the gradients with the right sizes (≈12 lines)\n", + " dx = None\n", + " da0 = None\n", + " da_prevt = None\n", + " dc_prevt = None\n", + " dWf = None\n", + " dWi = None\n", + " dWc = None\n", + " dWo = None\n", + " dbf = None\n", + " dbi = None\n", + " dbc = None\n", + " dbo = None\n", + " \n", + " # loop back over the whole sequence\n", + " for t in reversed(range(None)):\n", + " # Compute all gradients using lstm_cell_backward\n", + " gradients = None\n", + " # Store or add the gradient to the parameters' previous step's gradient\n", + " dx[:,:,t] = None\n", + " dWf = None\n", + " dWi = None\n", + " dWc = None\n", + " dWo = None\n", + " dbf = None\n", + " dbi = None\n", + " dbc = None\n", + " dbo = None\n", + " # Set the first activation's gradient to the backpropagated gradient da_prev.\n", + " da0 = None\n", + " \n", + " ### END CODE HERE ###\n", + "\n", + " # Store the gradients in a python dictionary\n", + " gradients = {\"dx\": dx, \"da0\": da0, \"dWf\": dWf,\"dbf\": dbf, \"dWi\": dWi,\"dbi\": dbi,\n", + " \"dWc\": dWc,\"dbc\": dbc, \"dWo\": dWo,\"dbo\": dbo}\n", + " \n", + " return gradients" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "np.random.seed(1)\n", + "x = np.random.randn(3,10,7)\n", + "a0 = np.random.randn(5,10)\n", + "Wf = np.random.randn(5, 5+3)\n", + "bf = np.random.randn(5,1)\n", + "Wi = np.random.randn(5, 5+3)\n", + "bi = np.random.randn(5,1)\n", + "Wo = np.random.randn(5, 5+3)\n", + "bo = np.random.randn(5,1)\n", + "Wc = np.random.randn(5, 5+3)\n", + "bc = np.random.randn(5,1)\n", + "\n", + "parameters = {\"Wf\": Wf, \"Wi\": Wi, \"Wo\": Wo, \"Wc\": Wc, \"Wy\": Wy, \"bf\": bf, \"bi\": bi, \"bo\": bo, \"bc\": bc, \"by\": by}\n", + "\n", + "a, y, c, caches = lstm_forward(x, a0, parameters)\n", + "\n", + "da = np.random.randn(5, 10, 4)\n", + "gradients = lstm_backward(da, caches)\n", + "\n", + "print(\"gradients[\\\"dx\\\"][1][2] =\", gradients[\"dx\"][1][2])\n", + "print(\"gradients[\\\"dx\\\"].shape =\", gradients[\"dx\"].shape)\n", + "print(\"gradients[\\\"da0\\\"][2][3] =\", gradients[\"da0\"][2][3])\n", + "print(\"gradients[\\\"da0\\\"].shape =\", gradients[\"da0\"].shape)\n", + "print(\"gradients[\\\"dWf\\\"][3][1] =\", gradients[\"dWf\"][3][1])\n", + "print(\"gradients[\\\"dWf\\\"].shape =\", gradients[\"dWf\"].shape)\n", + "print(\"gradients[\\\"dWi\\\"][1][2] =\", gradients[\"dWi\"][1][2])\n", + "print(\"gradients[\\\"dWi\\\"].shape =\", gradients[\"dWi\"].shape)\n", + "print(\"gradients[\\\"dWc\\\"][3][1] =\", gradients[\"dWc\"][3][1])\n", + "print(\"gradients[\\\"dWc\\\"].shape =\", gradients[\"dWc\"].shape)\n", + "print(\"gradients[\\\"dWo\\\"][1][2] =\", gradients[\"dWo\"][1][2])\n", + "print(\"gradients[\\\"dWo\\\"].shape =\", gradients[\"dWo\"].shape)\n", + "print(\"gradients[\\\"dbf\\\"][4] =\", gradients[\"dbf\"][4])\n", + "print(\"gradients[\\\"dbf\\\"].shape =\", gradients[\"dbf\"].shape)\n", + "print(\"gradients[\\\"dbi\\\"][4] =\", gradients[\"dbi\"][4])\n", + "print(\"gradients[\\\"dbi\\\"].shape =\", gradients[\"dbi\"].shape)\n", + "print(\"gradients[\\\"dbc\\\"][4] =\", gradients[\"dbc\"][4])\n", + "print(\"gradients[\\\"dbc\\\"].shape =\", gradients[\"dbc\"].shape)\n", + "print(\"gradients[\\\"dbo\\\"][4] =\", gradients[\"dbo\"][4])\n", + "print(\"gradients[\\\"dbo\\\"].shape =\", gradients[\"dbo\"].shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **gradients[\"dx\"][1][2]** =\n", + " \n", + " [-0.00173313 0.08287442 -0.30545663 -0.43281115]\n", + "
\n", + " **gradients[\"dx\"].shape** =\n", + " \n", + " (3, 10, 4)\n", + "
\n", + " **gradients[\"da0\"][2][3]** =\n", + " \n", + " -0.095911501954\n", + "
\n", + " **gradients[\"da0\"].shape** =\n", + " \n", + " (5, 10)\n", + "
\n", + " **gradients[\"dWf\"][3][1]** = \n", + " \n", + " -0.0698198561274\n", + "
\n", + " **gradients[\"dWf\"].shape** =\n", + " \n", + " (5, 8)\n", + "
\n", + " **gradients[\"dWi\"][1][2]** = \n", + " \n", + " 0.102371820249\n", + "
\n", + " **gradients[\"dWi\"].shape** = \n", + " \n", + " (5, 8)\n", + "
\n", + " **gradients[\"dWc\"][3][1]** = \n", + " \n", + " -0.0624983794927\n", + "
\n", + " **gradients[\"dWc\"].shape** = \n", + " \n", + " (5, 8)\n", + "
\n", + " **gradients[\"dWo\"][1][2]** = \n", + " \n", + " 0.0484389131444\n", + "
\n", + " **gradients[\"dWo\"].shape** = \n", + " \n", + " (5, 8)\n", + "
\n", + " **gradients[\"dbf\"][4]** = \n", + " \n", + " [-0.0565788]\n", + "
\n", + " **gradients[\"dbf\"].shape** = \n", + " \n", + " (5, 1)\n", + "
\n", + " **gradients[\"dbi\"][4]** = \n", + " \n", + " [-0.06997391]\n", + "
\n", + " **gradients[\"dbi\"].shape** = \n", + " \n", + " (5, 1)\n", + "
\n", + " **gradients[\"dbc\"][4]** = \n", + " \n", + " [-0.27441821]\n", + "
\n", + " **gradients[\"dbc\"].shape** = \n", + " \n", + " (5, 1)\n", + "
\n", + " **gradients[\"dbo\"][4]** = \n", + " \n", + " [ 0.16532821]\n", + "
\n", + " **gradients[\"dbo\"].shape** = \n", + " \n", + " (5, 1)\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Congratulations !\n", + "\n", + "Congratulations on completing this assignment. You now understand how recurrent neural networks work! \n", + "\n", + "Lets go on to the next exercise, where you'll use an RNN to build a character-level language model.\n" + ] + } + ], + "metadata": { + "coursera": { + "course_slug": "nlp-sequence-models", + "graded_item_id": "xxuVc", + "launcher_item_id": "X20PE" + }, + "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.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/images/LSTM.png b/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/images/LSTM.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/images/LSTM_rnn.png b/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/images/LSTM_rnn.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/images/clip.png b/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/images/clip.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/images/initial_state.png b/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/images/initial_state.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/images/rnn.png b/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/images/rnn.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/images/rnn_cell_backprop.png b/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/images/rnn_cell_backprop.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/images/rnn_step_forward.png b/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/images/rnn_step_forward.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/images/sampling.png b/Sequence Models/Week 1/Building a Recurrent Neural Network - Step by Step/images/sampling.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/Dinosaurus Island -- Character level language model final - v3.ipynb b/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/Dinosaurus Island -- Character level language model final - v3.ipynb new file mode 100644 index 0000000..4e8fbb8 --- /dev/null +++ b/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/Dinosaurus Island -- Character level language model final - v3.ipynb @@ -0,0 +1,1202 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Character level language model - Dinosaurus land\n", + "\n", + "Welcome to Dinosaurus Island! 65 million years ago, dinosaurs existed, and in this assignment they are back. You are in charge of a special task. Leading biology researchers are creating new breeds of dinosaurs and bringing them to life on earth, and your job is to give names to these dinosaurs. If a dinosaur does not like its name, it might go beserk, so choose wisely! \n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "\n", + "\n", + "
\n", + "\n", + "Luckily you have learned some deep learning and you will use it to save the day. Your assistant has collected a list of all the dinosaur names they could find, and compiled them into this [dataset](dinos.txt). (Feel free to take a look by clicking the previous link.) To create new dinosaur names, you will build a character level language model to generate new names. Your algorithm will learn the different name patterns, and randomly generate new names. Hopefully this algorithm will keep you and your team safe from the dinosaurs' wrath! \n", + "\n", + "By completing this assignment you will learn:\n", + "\n", + "- How to store text data for processing using an RNN \n", + "- How to synthesize data, by sampling predictions at each time step and passing it to the next RNN-cell unit\n", + "- How to build a character-level text generation recurrent neural network\n", + "- Why clipping the gradients is important\n", + "\n", + "We will begin by loading in some functions that we have provided for you in `rnn_utils`. Specifically, you have access to functions such as `rnn_forward` and `rnn_backward` which are equivalent to those you've implemented in the previous assignment. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "from utils import *\n", + "import random" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## 1 - Problem Statement\n", + "\n", + "### 1.1 - Dataset and Preprocessing\n", + "\n", + "Run the following cell to read the dataset of dinosaur names, create a list of unique characters (such as a-z), and compute the dataset and vocabulary size. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['\\n', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']\n", + "There are 19909 total characters and 27 unique characters in your data.\n" + ] + } + ], + "source": [ + "data = open('dinos.txt', 'r').read()\n", + "data= data.lower()\n", + "chars = list(set(data))\n", + "print(sorted(chars))\n", + "data_size, vocab_size = len(data), len(chars)\n", + "print('There are %d total characters and %d unique characters in your data.' % (data_size, vocab_size))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The characters are a-z (26 characters) plus the \"\\n\" (or newline character), which in this assignment plays a role similar to the `` (or \"End of sentence\") token we had discussed in lecture, only here it indicates the end of the dinosaur name rather than the end of a sentence. In the cell below, we create a python dictionary (i.e., a hash table) to map each character to an index from 0-26. We also create a second python dictionary that maps each index back to the corresponding character character. This will help you figure out what index corresponds to what character in the probability distribution output of the softmax layer. Below, `char_to_ix` and `ix_to_char` are the python dictionaries. " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{0: '\\n', 1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g', 8: 'h', 9: 'i', 10: 'j', 11: 'k', 12: 'l', 13: 'm', 14: 'n', 15: 'o', 16: 'p', 17: 'q', 18: 'r', 19: 's', 20: 't', 21: 'u', 22: 'v', 23: 'w', 24: 'x', 25: 'y', 26: 'z'}\n" + ] + } + ], + "source": [ + "char_to_ix = { ch:i for i,ch in enumerate(sorted(chars)) }\n", + "ix_to_char = { i:ch for i,ch in enumerate(sorted(chars)) }\n", + "print(ix_to_char)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.2 - Overview of the model\n", + "\n", + "Your model will have the following structure: \n", + "\n", + "- Initialize parameters \n", + "- Run the optimization loop\n", + " - Forward propagation to compute the loss function\n", + " - Backward propagation to compute the gradients with respect to the loss function\n", + " - Clip the gradients to avoid exploding gradients\n", + " - Using the gradients, update your parameter with the gradient descent update rule.\n", + "- Return the learned parameters \n", + " \n", + "\n", + "
**Figure 1**: Recurrent Neural Network, similar to what you had built in the previous notebook \"Building a RNN - Step by Step\".
\n", + "\n", + "At each time-step, the RNN tries to predict what is the next character given the previous characters. The dataset $X = (x^{\\langle 1 \\rangle}, x^{\\langle 2 \\rangle}, ..., x^{\\langle T_x \\rangle})$ is a list of characters in the training set, while $Y = (y^{\\langle 1 \\rangle}, y^{\\langle 2 \\rangle}, ..., y^{\\langle T_x \\rangle})$ is such that at every time-step $t$, we have $y^{\\langle t \\rangle} = x^{\\langle t+1 \\rangle}$. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2 - Building blocks of the model\n", + "\n", + "In this part, you will build two important blocks of the overall model:\n", + "- Gradient clipping: to avoid exploding gradients\n", + "- Sampling: a technique used to generate characters\n", + "\n", + "You will then apply these two functions to build the model." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.1 - Clipping the gradients in the optimization loop\n", + "\n", + "In this section you will implement the `clip` function that you will call inside of your optimization loop. Recall that your overall loop structure usually consists of a forward pass, a cost computation, a backward pass, and a parameter update. Before updating the parameters, you will perform gradient clipping when needed to make sure that your gradients are not \"exploding,\" meaning taking on overly large values. \n", + "\n", + "In the exercise below, you will implement a function `clip` that takes in a dictionary of gradients and returns a clipped version of gradients if needed. There are different ways to clip gradients; we will use a simple element-wise clipping procedure, in which every element of the gradient vector is clipped to lie between some range [-N, N]. More generally, you will provide a `maxValue` (say 10). In this example, if any component of the gradient vector is greater than 10, it would be set to 10; and if any component of the gradient vector is less than -10, it would be set to -10. If it is between -10 and 10, it is left alone. \n", + "\n", + "\n", + "
**Figure 2**: Visualization of gradient descent with and without gradient clipping, in a case where the network is running into slight \"exploding gradient\" problems.
\n", + "\n", + "**Exercise**: Implement the function below to return the clipped gradients of your dictionary `gradients`. Your function takes in a maximum threshold and returns the clipped versions of your gradients. You can check out this [hint](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.clip.html) for examples of how to clip in numpy. You will need to use the argument `out = ...`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "### GRADED FUNCTION: clip\n", + "\n", + "def clip(gradients, maxValue):\n", + " '''\n", + " Clips the gradients' values between minimum and maximum.\n", + " \n", + " Arguments:\n", + " gradients -- a dictionary containing the gradients \"dWaa\", \"dWax\", \"dWya\", \"db\", \"dby\"\n", + " maxValue -- everything above this number is set to this number, and everything less than -maxValue is set to -maxValue\n", + " \n", + " Returns: \n", + " gradients -- a dictionary with the clipped gradients.\n", + " '''\n", + " \n", + " dWaa, dWax, dWya, db, dby = gradients['dWaa'], gradients['dWax'], gradients['dWya'], gradients['db'], gradients['dby']\n", + " \n", + " ### START CODE HERE ###\n", + " # clip to mitigate exploding gradients, loop over [dWax, dWaa, dWya, db, dby]. (≈2 lines)\n", + " for gradient in [dWax, dWaa, dWya, db, dby]:\n", + " np.clip(gradient, -maxValue, maxValue, out=gradient)\n", + " ### END CODE HERE ###\n", + " \n", + " gradients = {\"dWaa\": dWaa, \"dWax\": dWax, \"dWya\": dWya, \"db\": db, \"dby\": dby}\n", + " \n", + " return gradients" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "gradients[\"dWaa\"][1][2] = 10.0\n", + "gradients[\"dWax\"][3][1] = -10.0\n", + "gradients[\"dWya\"][1][2] = 0.29713815361\n", + "gradients[\"db\"][4] = [ 10.]\n", + "gradients[\"dby\"][1] = [ 8.45833407]\n" + ] + } + ], + "source": [ + "np.random.seed(3)\n", + "dWax = np.random.randn(5,3)*10\n", + "dWaa = np.random.randn(5,5)*10\n", + "dWya = np.random.randn(2,5)*10\n", + "db = np.random.randn(5,1)*10\n", + "dby = np.random.randn(2,1)*10\n", + "gradients = {\"dWax\": dWax, \"dWaa\": dWaa, \"dWya\": dWya, \"db\": db, \"dby\": dby}\n", + "gradients = clip(gradients, 10)\n", + "print(\"gradients[\\\"dWaa\\\"][1][2] =\", gradients[\"dWaa\"][1][2])\n", + "print(\"gradients[\\\"dWax\\\"][3][1] =\", gradients[\"dWax\"][3][1])\n", + "print(\"gradients[\\\"dWya\\\"][1][2] =\", gradients[\"dWya\"][1][2])\n", + "print(\"gradients[\\\"db\\\"][4] =\", gradients[\"db\"][4])\n", + "print(\"gradients[\\\"dby\\\"][1] =\", gradients[\"dby\"][1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "** Expected output:**\n", + "\n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + "
\n", + " **gradients[\"dWaa\"][1][2] **\n", + " \n", + " 10.0\n", + "
\n", + " **gradients[\"dWax\"][3][1]**\n", + " \n", + " -10.0\n", + "
\n", + " **gradients[\"dWya\"][1][2]**\n", + " \n", + "0.29713815361\n", + "
\n", + " **gradients[\"db\"][4]**\n", + " \n", + "[ 10.]\n", + "
\n", + " **gradients[\"dby\"][1]**\n", + " \n", + "[ 8.45833407]\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.2 - Sampling\n", + "\n", + "Now assume that your model is trained. You would like to generate new text (characters). The process of generation is explained in the picture below:\n", + "\n", + "\n", + "
**Figure 3**: In this picture, we assume the model is already trained. We pass in $x^{\\langle 1\\rangle} = \\vec{0}$ at the first time step, and have the network then sample one character at a time.
\n", + "\n", + "**Exercise**: Implement the `sample` function below to sample characters. You need to carry out 4 steps:\n", + "\n", + "- **Step 1**: Pass the network the first \"dummy\" input $x^{\\langle 1 \\rangle} = \\vec{0}$ (the vector of zeros). This is the default input before we've generated any characters. We also set $a^{\\langle 0 \\rangle} = \\vec{0}$\n", + "\n", + "- **Step 2**: Run one step of forward propagation to get $a^{\\langle 1 \\rangle}$ and $\\hat{y}^{\\langle 1 \\rangle}$. Here are the equations:\n", + "\n", + "$$ a^{\\langle t+1 \\rangle} = \\tanh(W_{ax} x^{\\langle t \\rangle } + W_{aa} a^{\\langle t \\rangle } + b)\\tag{1}$$\n", + "\n", + "$$ z^{\\langle t + 1 \\rangle } = W_{ya} a^{\\langle t + 1 \\rangle } + b_y \\tag{2}$$\n", + "\n", + "$$ \\hat{y}^{\\langle t+1 \\rangle } = softmax(z^{\\langle t + 1 \\rangle })\\tag{3}$$\n", + "\n", + "Note that $\\hat{y}^{\\langle t+1 \\rangle }$ is a (softmax) probability vector (its entries are between 0 and 1 and sum to 1). $\\hat{y}^{\\langle t+1 \\rangle}_i$ represents the probability that the character indexed by \"i\" is the next character. We have provided a `softmax()` function that you can use.\n", + "\n", + "- **Step 3**: Carry out sampling: Pick the next character's index according to the probability distribution specified by $\\hat{y}^{\\langle t+1 \\rangle }$. This means that if $\\hat{y}^{\\langle t+1 \\rangle }_i = 0.16$, you will pick the index \"i\" with 16% probability. To implement it, you can use [`np.random.choice`](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.random.choice.html).\n", + "\n", + "Here is an example of how to use `np.random.choice()`:\n", + "```python\n", + "np.random.seed(0)\n", + "p = np.array([0.1, 0.0, 0.7, 0.2])\n", + "index = np.random.choice([0, 1, 2, 3], p = p.ravel())\n", + "```\n", + "This means that you will pick the `index` according to the distribution: \n", + "$P(index = 0) = 0.1, P(index = 1) = 0.0, P(index = 2) = 0.7, P(index = 3) = 0.2$.\n", + "\n", + "- **Step 4**: The last step to implement in `sample()` is to overwrite the variable `x`, which currently stores $x^{\\langle t \\rangle }$, with the value of $x^{\\langle t + 1 \\rangle }$. You will represent $x^{\\langle t + 1 \\rangle }$ by creating a one-hot vector corresponding to the character you've chosen as your prediction. You will then forward propagate $x^{\\langle t + 1 \\rangle }$ in Step 1 and keep repeating the process until you get a \"\\n\" character, indicating you've reached the end of the dinosaur name. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: sample\n", + "\n", + "def sample(parameters, char_to_ix, seed):\n", + " \"\"\"\n", + " Sample a sequence of characters according to a sequence of probability distributions output of the RNN\n", + "\n", + " Arguments:\n", + " parameters -- python dictionary containing the parameters Waa, Wax, Wya, by, and b. \n", + " char_to_ix -- python dictionary mapping each character to an index.\n", + " seed -- used for grading purposes. Do not worry about it.\n", + "\n", + " Returns:\n", + " indices -- a list of length n containing the indices of the sampled characters.\n", + " \"\"\"\n", + " \n", + " # Retrieve parameters and relevant shapes from \"parameters\" dictionary\n", + " Waa, Wax, Wya, by, b = parameters['Waa'], parameters['Wax'], parameters['Wya'], parameters['by'], parameters['b']\n", + " vocab_size = by.shape[0]\n", + " n_a = Waa.shape[1]\n", + " \n", + " ### START CODE HERE ###\n", + " # Step 1: Create the one-hot vector x for the first character (initializing the sequence generation). (≈1 line)\n", + " x = np.zeros((vocab_size, 1))\n", + " # Step 1': Initialize a_prev as zeros (≈1 line)\n", + " a_prev = np.zeros((n_a, 1))\n", + " \n", + " # Create an empty list of indices, this is the list which will contain the list of indices of the characters to generate (≈1 line)\n", + " indices = []\n", + " \n", + " # Idx is a flag to detect a newline character, we initialize it to -1\n", + " idx = -1 \n", + " \n", + " # Loop over time-steps t. At each time-step, sample a character from a probability distribution and append \n", + " # its index to \"indices\". We'll stop if we reach 50 characters (which should be very unlikely with a well \n", + " # trained model), which helps debugging and prevents entering an infinite loop. \n", + " counter = 0\n", + " newline_character = char_to_ix['\\n']\n", + " \n", + " while (idx != newline_character and counter != 50):\n", + " \n", + " # Step 2: Forward propagate x using the equations (1), (2) and (3)\n", + " a = np.tanh(np.dot(Wax, x) + np.dot(Waa, a_prev) + b)\n", + " z = np.dot(Wya, a) + by\n", + " y = softmax(z)\n", + " \n", + " # for grading purposes\n", + " np.random.seed(counter+seed) \n", + " \n", + " # Step 3: Sample the index of a character within the vocabulary from the probability distribution y\n", + " idx = np.random.choice(list(range(vocab_size)), p = y.ravel())\n", + "\n", + " # Append the index to \"indices\"\n", + " indices.append(idx)\n", + " \n", + " # Step 4: Overwrite the input character as the one corresponding to the sampled index.\n", + " x = np.zeros((vocab_size, 1))\n", + " x[idx] = 1\n", + " \n", + " # Update \"a_prev\" to be \"a\"\n", + " a_prev = a\n", + " \n", + " # for grading purposes\n", + " seed += 1\n", + " counter +=1\n", + " \n", + " ### END CODE HERE ###\n", + "\n", + " if (counter == 50):\n", + " indices.append(char_to_ix['\\n'])\n", + " \n", + " return indices" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sampling:\n", + "list of sampled indices: [12, 17, 24, 14, 13, 9, 10, 22, 24, 6, 13, 11, 12, 6, 21, 15, 21, 14, 3, 2, 1, 21, 18, 24, 7, 25, 6, 25, 18, 10, 16, 2, 3, 8, 15, 12, 11, 7, 1, 12, 10, 2, 7, 7, 11, 5, 6, 12, 25, 0, 0] \n", + "\n", + "list of sampled characters: ['l', 'q', 'x', 'n', 'm', 'i', 'j', 'v', 'x', 'f', 'm', 'k', 'l', 'f', 'u', 'o', 'u', 'n', 'c', 'b', 'a', 'u', 'r', 'x', 'g', 'y', 'f', 'y', 'r', 'j', 'p', 'b', 'c', 'h', 'o', 'l', 'k', 'g', 'a', 'l', 'j', 'b', 'g', 'g', 'k', 'e', 'f', 'l', 'y', '\\n', '\\n']\n" + ] + } + ], + "source": [ + "np.random.seed(2)\n", + "_, n_a = 20, 100\n", + "Wax, Waa, Wya = np.random.randn(n_a, vocab_size), np.random.randn(n_a, n_a), np.random.randn(vocab_size, n_a)\n", + "b, by = np.random.randn(n_a, 1), np.random.randn(vocab_size, 1)\n", + "parameters = {\"Wax\": Wax, \"Waa\": Waa, \"Wya\": Wya, \"b\": b, \"by\": by}\n", + "\n", + "\n", + "indices = sample(parameters, char_to_ix, 0)\n", + "print(\"Sampling:\")\n", + "print(\"list of sampled indices:\", indices, '\\n')\n", + "print(\"list of sampled characters:\", [ix_to_char[i] for i in indices])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "** Expected output:**\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "
\n", + " **list of sampled indices:**\n", + " \n", + " [12, 17, 24, 14, 13, 9, 10, 22, 24, 6, 13, 11, 12, 6, 21, 15, 21, 14, 3, 2, 1, 21, 18, 24,
\n", + " 7, 25, 6, 25, 18, 10, 16, 2, 3, 8, 15, 12, 11, 7, 1, 12, 10, 2, 7, 7, 11, 5, 6, 12, 25, 0, 0]\n", + "
\n", + " **list of sampled characters:**\n", + " \n", + " ['l', 'q', 'x', 'n', 'm', 'i', 'j', 'v', 'x', 'f', 'm', 'k', 'l', 'f', 'u', 'o',
\n", + " 'u', 'n', 'c', 'b', 'a', 'u', 'r', 'x', 'g', 'y', 'f', 'y', 'r', 'j', 'p', 'b', 'c', 'h', 'o',
\n", + " 'l', 'k', 'g', 'a', 'l', 'j', 'b', 'g', 'g', 'k', 'e', 'f', 'l', 'y', '\\n', '\\n']\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3 - Building the language model \n", + "\n", + "It is time to build the character-level language model for text generation. \n", + "\n", + "\n", + "### 3.1 - Gradient descent \n", + "\n", + "In this section you will implement a function performing one step of stochastic gradient descent (with clipped gradients). You will go through the training examples one at a time, so the optimization algorithm will be stochastic gradient descent. As a reminder, here are the steps of a common optimization loop for an RNN:\n", + "\n", + "- Forward propagate through the RNN to compute the loss\n", + "- Backward propagate through time to compute the gradients of the loss with respect to the parameters\n", + "- Clip the gradients if necessary \n", + "- Update your parameters using gradient descent \n", + "\n", + "**Exercise**: Implement this optimization process (one step of stochastic gradient descent). \n", + "\n", + "We provide you with the following functions: \n", + "\n", + "```python\n", + "def rnn_forward(X, Y, a_prev, parameters):\n", + " \"\"\" Performs the forward propagation through the RNN and computes the cross-entropy loss.\n", + " It returns the loss' value as well as a \"cache\" storing values to be used in the backpropagation.\"\"\"\n", + " ....\n", + " return loss, cache\n", + " \n", + "def rnn_backward(X, Y, parameters, cache):\n", + " \"\"\" Performs the backward propagation through time to compute the gradients of the loss with respect\n", + " to the parameters. It returns also all the hidden states.\"\"\"\n", + " ...\n", + " return gradients, a\n", + "\n", + "def update_parameters(parameters, gradients, learning_rate):\n", + " \"\"\" Updates parameters using the Gradient Descent Update Rule.\"\"\"\n", + " ...\n", + " return parameters\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: optimize\n", + "\n", + "def optimize(X, Y, a_prev, parameters, learning_rate = 0.01):\n", + " \"\"\"\n", + " Execute one step of the optimization to train the model.\n", + " \n", + " Arguments:\n", + " X -- list of integers, where each integer is a number that maps to a character in the vocabulary.\n", + " Y -- list of integers, exactly the same as X but shifted one index to the left.\n", + " a_prev -- previous hidden state.\n", + " parameters -- python dictionary containing:\n", + " Wax -- Weight matrix multiplying the input, numpy array of shape (n_a, n_x)\n", + " Waa -- Weight matrix multiplying the hidden state, numpy array of shape (n_a, n_a)\n", + " Wya -- Weight matrix relating the hidden-state to the output, numpy array of shape (n_y, n_a)\n", + " b -- Bias, numpy array of shape (n_a, 1)\n", + " by -- Bias relating the hidden-state to the output, numpy array of shape (n_y, 1)\n", + " learning_rate -- learning rate for the model.\n", + " \n", + " Returns:\n", + " loss -- value of the loss function (cross-entropy)\n", + " gradients -- python dictionary containing:\n", + " dWax -- Gradients of input-to-hidden weights, of shape (n_a, n_x)\n", + " dWaa -- Gradients of hidden-to-hidden weights, of shape (n_a, n_a)\n", + " dWya -- Gradients of hidden-to-output weights, of shape (n_y, n_a)\n", + " db -- Gradients of bias vector, of shape (n_a, 1)\n", + " dby -- Gradients of output bias vector, of shape (n_y, 1)\n", + " a[len(X)-1] -- the last hidden state, of shape (n_a, 1)\n", + " \"\"\"\n", + " \n", + " ### START CODE HERE ###\n", + " \n", + " # Forward propagate through time (≈1 line)\n", + " loss, cache = rnn_forward(X, Y, a_prev, parameters)\n", + " \n", + " # Backpropagate through time (≈1 line)\n", + " gradients, a = rnn_backward(X, Y, parameters, cache)\n", + " \n", + " # Clip your gradients between -5 (min) and 5 (max) (≈1 line)\n", + " gradients = clip(gradients, maxValue=5)\n", + " \n", + " # Update parameters (≈1 line)\n", + " parameters = update_parameters(parameters, gradients, learning_rate)\n", + " \n", + " ### END CODE HERE ###\n", + " \n", + " return loss, gradients, a[len(X)-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loss = 126.503975722\n", + "gradients[\"dWaa\"][1][2] = 0.194709315347\n", + "np.argmax(gradients[\"dWax\"]) = 93\n", + "gradients[\"dWya\"][1][2] = -0.007773876032\n", + "gradients[\"db\"][4] = [-0.06809825]\n", + "gradients[\"dby\"][1] = [ 0.01538192]\n", + "a_last[4] = [-1.]\n" + ] + } + ], + "source": [ + "np.random.seed(1)\n", + "vocab_size, n_a = 27, 100\n", + "a_prev = np.random.randn(n_a, 1)\n", + "Wax, Waa, Wya = np.random.randn(n_a, vocab_size), np.random.randn(n_a, n_a), np.random.randn(vocab_size, n_a)\n", + "b, by = np.random.randn(n_a, 1), np.random.randn(vocab_size, 1)\n", + "parameters = {\"Wax\": Wax, \"Waa\": Waa, \"Wya\": Wya, \"b\": b, \"by\": by}\n", + "X = [12,3,5,11,22,3]\n", + "Y = [4,14,11,22,25, 26]\n", + "\n", + "loss, gradients, a_last = optimize(X, Y, a_prev, parameters, learning_rate = 0.01)\n", + "print(\"Loss =\", loss)\n", + "print(\"gradients[\\\"dWaa\\\"][1][2] =\", gradients[\"dWaa\"][1][2])\n", + "print(\"np.argmax(gradients[\\\"dWax\\\"]) =\", np.argmax(gradients[\"dWax\"]))\n", + "print(\"gradients[\\\"dWya\\\"][1][2] =\", gradients[\"dWya\"][1][2])\n", + "print(\"gradients[\\\"db\\\"][4] =\", gradients[\"db\"][4])\n", + "print(\"gradients[\\\"dby\\\"][1] =\", gradients[\"dby\"][1])\n", + "print(\"a_last[4] =\", a_last[4])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "** Expected output:**\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + "
\n", + " **Loss **\n", + " \n", + " 126.503975722\n", + "
\n", + " **gradients[\"dWaa\"][1][2]**\n", + " \n", + " 0.194709315347\n", + "
\n", + " **np.argmax(gradients[\"dWax\"])**\n", + " 93\n", + "
\n", + " **gradients[\"dWya\"][1][2]**\n", + " -0.007773876032\n", + "
\n", + " **gradients[\"db\"][4]**\n", + " [-0.06809825]\n", + "
\n", + " **gradients[\"dby\"][1]**\n", + " [ 0.01538192]\n", + "
\n", + " **a_last[4]**\n", + " [-1.]\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "### 3.2 - Training the model " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Given the dataset of dinosaur names, we use each line of the dataset (one name) as one training example. Every 100 steps of stochastic gradient descent, you will sample 10 randomly chosen names to see how the algorithm is doing. Remember to shuffle the dataset, so that stochastic gradient descent visits the examples in random order. \n", + "\n", + "**Exercise**: Follow the instructions and implement `model()`. When `examples[index]` contains one dinosaur name (string), to create an example (X, Y), you can use this:\n", + "```python\n", + " index = j % len(examples)\n", + " X = [None] + [char_to_ix[ch] for ch in examples[index]] \n", + " Y = X[1:] + [char_to_ix[\"\\n\"]]\n", + "```\n", + "Note that we use: `index= j % len(examples)`, where `j = 1....num_iterations`, to make sure that `examples[index]` is always a valid statement (`index` is smaller than `len(examples)`).\n", + "The first entry of `X` being `None` will be interpreted by `rnn_forward()` as setting $x^{\\langle 0 \\rangle} = \\vec{0}$. Further, this ensures that `Y` is equal to `X` but shifted one step to the left, and with an additional \"\\n\" appended to signify the end of the dinosaur name. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: model\n", + "\n", + "def model(data, ix_to_char, char_to_ix, num_iterations = 35000, n_a = 50, dino_names = 7, vocab_size = 27):\n", + " \"\"\"\n", + " Trains the model and generates dinosaur names. \n", + " \n", + " Arguments:\n", + " data -- text corpus\n", + " ix_to_char -- dictionary that maps the index to a character\n", + " char_to_ix -- dictionary that maps a character to an index\n", + " num_iterations -- number of iterations to train the model for\n", + " n_a -- number of units of the RNN cell\n", + " dino_names -- number of dinosaur names you want to sample at each iteration. \n", + " vocab_size -- number of unique characters found in the text, size of the vocabulary\n", + " \n", + " Returns:\n", + " parameters -- learned parameters\n", + " \"\"\"\n", + " \n", + " # Retrieve n_x and n_y from vocab_size\n", + " n_x, n_y = vocab_size, vocab_size\n", + " \n", + " # Initialize parameters\n", + " parameters = initialize_parameters(n_a, n_x, n_y)\n", + " \n", + " # Initialize loss (this is required because we want to smooth our loss, don't worry about it)\n", + " loss = get_initial_loss(vocab_size, dino_names)\n", + " \n", + " # Build list of all dinosaur names (training examples).\n", + " with open(\"dinos.txt\") as f:\n", + " examples = f.readlines()\n", + " examples = [x.lower().strip() for x in examples]\n", + " \n", + " # Shuffle list of all dinosaur names\n", + " np.random.seed(0)\n", + " np.random.shuffle(examples)\n", + " \n", + " # Initialize the hidden state of your LSTM\n", + " a_prev = np.zeros((n_a, 1))\n", + " \n", + " # Optimization loop\n", + " for j in range(num_iterations):\n", + " \n", + " ### START CODE HERE ###\n", + " \n", + " # Use the hint above to define one training example (X,Y) (≈ 2 lines)\n", + " index = j % len(examples)\n", + " X = [None] + [char_to_ix[ch] for ch in examples[index]] \n", + " Y = X[1:] + [char_to_ix[\"\\n\"]]\n", + " \n", + " # Perform one optimization step: Forward-prop -> Backward-prop -> Clip -> Update parameters\n", + " # Choose a learning rate of 0.01\n", + " curr_loss, gradients, a_prev = optimize(X, Y, a_prev, parameters, learning_rate = 0.01)\n", + " \n", + " ### END CODE HERE ###\n", + " \n", + " # Use a latency trick to keep the loss smooth. It happens here to accelerate the training.\n", + " loss = smooth(loss, curr_loss)\n", + "\n", + " # Every 2000 Iteration, generate \"n\" characters thanks to sample() to check if the model is learning properly\n", + " if j % 2000 == 0:\n", + " \n", + " print('Iteration: %d, Loss: %f' % (j, loss) + '\\n')\n", + " \n", + " # The number of dinosaur names to print\n", + " seed = 0\n", + " for name in range(dino_names):\n", + " \n", + " # Sample indices and print them\n", + " sampled_indices = sample(parameters, char_to_ix, seed)\n", + " print_sample(sampled_indices, ix_to_char)\n", + " \n", + " seed += 1 # To get the same result for grading purposed, increment the seed by one. \n", + " \n", + " print('\\n')\n", + " \n", + " return parameters" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the following cell, you should observe your model outputting random-looking characters at the first iteration. After a few thousand iterations, your model should learn to generate reasonable-looking names. " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iteration: 0, Loss: 23.087336\n", + "\n", + "Nkzxwtdmfqoeyhsqwasjkjvu\n", + "Kneb\n", + "Kzxwtdmfqoeyhsqwasjkjvu\n", + "Neb\n", + "Zxwtdmfqoeyhsqwasjkjvu\n", + "Eb\n", + "Xwtdmfqoeyhsqwasjkjvu\n", + "\n", + "\n", + "Iteration: 2000, Loss: 27.884160\n", + "\n", + "Liusskeomnolxeros\n", + "Hmdaairus\n", + "Hytroligoraurus\n", + "Lecalosapaus\n", + "Xusicikoraurus\n", + "Abalpsamantisaurus\n", + "Tpraneronxeros\n", + "\n", + "\n", + "Iteration: 4000, Loss: 25.901815\n", + "\n", + "Mivrosaurus\n", + "Inee\n", + "Ivtroplisaurus\n", + "Mbaaisaurus\n", + "Wusichisaurus\n", + "Cabaselachus\n", + "Toraperlethosdarenitochusthiamamumamaon\n", + "\n", + "\n", + "Iteration: 6000, Loss: 24.608779\n", + "\n", + "Onwusceomosaurus\n", + "Lieeaerosaurus\n", + "Lxussaurus\n", + "Oma\n", + "Xusteonosaurus\n", + "Eeahosaurus\n", + "Toreonosaurus\n", + "\n", + "\n", + "Iteration: 8000, Loss: 24.070350\n", + "\n", + "Onxusichepriuon\n", + "Kilabersaurus\n", + "Lutrodon\n", + "Omaaerosaurus\n", + "Xutrcheps\n", + "Edaksoje\n", + "Trodiktonus\n", + "\n", + "\n", + "Iteration: 10000, Loss: 23.844446\n", + "\n", + "Onyusaurus\n", + "Klecalosaurus\n", + "Lustodon\n", + "Ola\n", + "Xusodonia\n", + "Eeaeosaurus\n", + "Troceosaurus\n", + "\n", + "\n", + "Iteration: 12000, Loss: 23.291971\n", + "\n", + "Onyxosaurus\n", + "Kica\n", + "Lustrepiosaurus\n", + "Olaagrraiansaurus\n", + "Yuspangosaurus\n", + "Eealosaurus\n", + "Trognesaurus\n", + "\n", + "\n", + "Iteration: 14000, Loss: 23.382339\n", + "\n", + "Meutromodromurus\n", + "Inda\n", + "Iutroinatorsaurus\n", + "Maca\n", + "Yusteratoptititan\n", + "Ca\n", + "Troclosaurus\n", + "\n", + "\n", + "Iteration: 16000, Loss: 23.288447\n", + "\n", + "Meuspsangosaurus\n", + "Ingaa\n", + "Iusosaurus\n", + "Macalosaurus\n", + "Yushanis\n", + "Daalosaurus\n", + "Trpandon\n", + "\n", + "\n", + "Iteration: 18000, Loss: 22.823526\n", + "\n", + "Phytrolonhonyg\n", + "Mela\n", + "Mustrerasaurus\n", + "Peg\n", + "Ytronorosaurus\n", + "Ehalosaurus\n", + "Trolomeehus\n", + "\n", + "\n", + "Iteration: 20000, Loss: 23.041871\n", + "\n", + "Nousmofonosaurus\n", + "Loma\n", + "Lytrognatiasaurus\n", + "Ngaa\n", + "Ytroenetiaudostarmilus\n", + "Eiafosaurus\n", + "Troenchulunosaurus\n", + "\n", + "\n", + "Iteration: 22000, Loss: 22.728849\n", + "\n", + "Piutyrangosaurus\n", + "Midaa\n", + "Myroranisaurus\n", + "Pedadosaurus\n", + "Ytrodon\n", + "Eiadosaurus\n", + "Trodoniomusitocorces\n", + "\n", + "\n", + "Iteration: 24000, Loss: 22.683403\n", + "\n", + "Meutromeisaurus\n", + "Indeceratlapsaurus\n", + "Jurosaurus\n", + "Ndaa\n", + "Yusicheropterus\n", + "Eiaeropectus\n", + "Trodonasaurus\n", + "\n", + "\n", + "Iteration: 26000, Loss: 22.554523\n", + "\n", + "Phyusaurus\n", + "Liceceron\n", + "Lyusichenodylus\n", + "Pegahus\n", + "Yustenhtonthosaurus\n", + "Elagosaurus\n", + "Trodontonsaurus\n", + "\n", + "\n", + "Iteration: 28000, Loss: 22.484472\n", + "\n", + "Onyutimaerihus\n", + "Koia\n", + "Lytusaurus\n", + "Ola\n", + "Ytroheltorus\n", + "Eiadosaurus\n", + "Trofiashates\n", + "\n", + "\n", + "Iteration: 30000, Loss: 22.774404\n", + "\n", + "Phytys\n", + "Lica\n", + "Lysus\n", + "Pacalosaurus\n", + "Ytrochisaurus\n", + "Eiacosaurus\n", + "Trochesaurus\n", + "\n", + "\n", + "Iteration: 32000, Loss: 22.209473\n", + "\n", + "Mawusaurus\n", + "Jica\n", + "Lustoia\n", + "Macaisaurus\n", + "Yusolenqtesaurus\n", + "Eeaeosaurus\n", + "Trnanatrax\n", + "\n", + "\n", + "Iteration: 34000, Loss: 22.396744\n", + "\n", + "Mavptokekus\n", + "Ilabaisaurus\n", + "Itosaurus\n", + "Macaesaurus\n", + "Yrosaurus\n", + "Eiaeosaurus\n", + "Trodon\n", + "\n", + "\n" + ] + } + ], + "source": [ + "parameters = model(data, ix_to_char, char_to_ix)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## Conclusion\n", + "\n", + "You can see that your algorithm has started to generate plausible dinosaur names towards the end of the training. At first, it was generating random characters, but towards the end you could see dinosaur names with cool endings. Feel free to run the algorithm even longer and play with hyperparameters to see if you can get even better results. Our implemetation generated some really cool names like `maconucon`, `marloralus` and `macingsersaurus`. Your model hopefully also learned that dinosaur names tend to end in `saurus`, `don`, `aura`, `tor`, etc.\n", + "\n", + "If your model generates some non-cool names, don't blame the model entirely--not all actual dinosaur names sound cool. (For example, `dromaeosauroides` is an actual dinosaur name and is in the training set.) But this model should give you a set of candidates from which you can pick the coolest! \n", + "\n", + "This assignment had used a relatively small dataset, so that you could train an RNN quickly on a CPU. Training a model of the english language requires a much bigger dataset, and usually needs much more computation, and could run for many hours on GPUs. We ran our dinosaur name for quite some time, and so far our favoriate name is the great, undefeatable, and fierce: Mangosaurus!\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4 - Writing like Shakespeare\n", + "\n", + "The rest of this notebook is optional and is not graded, but we hope you'll do it anyway since it's quite fun and informative. \n", + "\n", + "A similar (but more complicated) task is to generate Shakespeare poems. Instead of learning from a dataset of Dinosaur names you can use a collection of Shakespearian poems. Using LSTM cells, you can learn longer term dependencies that span many characters in the text--e.g., where a character appearing somewhere a sequence can influence what should be a different character much much later in ths sequence. These long term dependencies were less important with dinosaur names, since the names were quite short. \n", + "\n", + "\n", + "\n", + "
Let's become poets!
\n", + "\n", + "We have implemented a Shakespeare poem generator with Keras. Run the following cell to load the required packages and models. This may take a few minutes. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading text data...\n", + "Creating training set...\n", + "number of training examples: 31412\n", + "Vectorizing training set...\n", + "Loading model...\n" + ] + } + ], + "source": [ + "from __future__ import print_function\n", + "from keras.callbacks import LambdaCallback\n", + "from keras.models import Model, load_model, Sequential\n", + "from keras.layers import Dense, Activation, Dropout, Input, Masking\n", + "from keras.layers import LSTM\n", + "from keras.utils.data_utils import get_file\n", + "from keras.preprocessing.sequence import pad_sequences\n", + "from shakespeare_utils import *\n", + "import sys\n", + "import io" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To save you some time, we have already trained a model for ~1000 epochs on a collection of Shakespearian poems called [*\"The Sonnets\"*](shakespeare.txt). " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's train the model for one more epoch. When it finishes training for an epoch---this will also take a few minutes---you can run `generate_output`, which will prompt asking you for an input (`<`40 characters). The poem will start with your sentence, and our RNN-Shakespeare will complete the rest of the poem for you! For example, try \"Forsooth this maketh no sense \" (don't enter the quotation marks). Depending on whether you include the space at the end, your results might also differ--try it both ways, and try other inputs as well. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/1\n", + "31412/31412 [==============================] - 290s - loss: 2.5641 \n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print_callback = LambdaCallback(on_epoch_end=on_epoch_end)\n", + "\n", + "model.fit(x, y, batch_size=128, epochs=1, callbacks=[print_callback])" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Write the beginning of your poem, the Shakespeare machine will complete it. Your input is: One Love\n", + "\n", + "\n", + "Here is your poem: \n", + "\n", + "One Love the carve, oud bearing maly,\n", + "with ink falels me all trife' sey pely,\n", + "why of offore self-race spuse doth by kees,\n", + "not your have i mon chech should she wod,\n", + "in whensiigh nand it dellens a weld, ditnor shilun,\n", + "in himter felten stornt to sifpe thought,\n", + "thee is, mahe betier thite the shall ever looh.\n", + "\n", + "sow god thumser to youl of choudcless spere.\n", + " noe thou in whereoed to mer as one'er,\n", + "but mode my vier" + ] + } + ], + "source": [ + "# Run this cell to try with different inputs without having to re-train the model \n", + "generate_output()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The RNN-Shakespeare model is very similar to the one you have built for dinosaur names. The only major differences are:\n", + "- LSTMs instead of the basic RNN to capture longer-range dependencies\n", + "- The model is a deeper, stacked LSTM model (2 layer)\n", + "- Using Keras instead of python to simplify the code \n", + "\n", + "If you want to learn more, you can also check out the Keras Team's text generation implementation on GitHub: https://github.com/keras-team/keras/blob/master/examples/lstm_text_generation.py.\n", + "\n", + "Congratulations on finishing this notebook! " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**References**:\n", + "- This exercise took inspiration from Andrej Karpathy's implementation: https://gist.github.com/karpathy/d4dee566867f8291f086. To learn more about text generation, also check out Karpathy's [blog post](http://karpathy.github.io/2015/05/21/rnn-effectiveness/).\n", + "- For the Shakespearian poem generator, our implementation was based on the implementation of an LSTM text generator by the Keras team: https://github.com/keras-team/keras/blob/master/examples/lstm_text_generation.py " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "coursera": { + "course_slug": "nlp-sequence-models", + "graded_item_id": "1dYg0", + "launcher_item_id": "MLhxP" + }, + "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.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/images/clip.png b/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/images/clip.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/images/dino.jpg b/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/images/dino.jpg new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/images/dinos3.png b/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/images/dinos3.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/images/fountain.jpg b/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/images/fountain.jpg new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/images/mangosaurus.jpeg b/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/images/mangosaurus.jpeg new file mode 100644 index 0000000..1c6dde9 Binary files /dev/null and b/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/images/mangosaurus.jpeg differ diff --git a/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/images/rnn.png b/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/images/rnn.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/images/shakespeare.jpg b/Sequence Models/Week 1/Dinosaur Island -- Character-level language model/images/shakespeare.jpg new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Jazz improvisation with LSTM/Jazz improvisation with LSTM - v1.ipynb b/Sequence Models/Week 1/Jazz improvisation with LSTM/Jazz improvisation with LSTM - v1.ipynb new file mode 100644 index 0000000..dff3ad3 --- /dev/null +++ b/Sequence Models/Week 1/Jazz improvisation with LSTM/Jazz improvisation with LSTM - v1.ipynb @@ -0,0 +1,1033 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Improvise a Jazz Solo with an LSTM Network\n", + "\n", + "Welcome to your final programming assignment of this week! In this notebook, you will implement a model that uses an LSTM to generate music. You will even be able to listen to your own music at the end of the assignment. \n", + "\n", + "**You will learn to:**\n", + "- Apply an LSTM to music generation.\n", + "- Generate your own jazz music with deep learning.\n", + "\n", + "Please run the following cell to load all the packages required in this assignment. This may take a few minutes. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + } + ], + "source": [ + "from __future__ import print_function\n", + "import IPython\n", + "import sys\n", + "from music21 import *\n", + "import numpy as np\n", + "from grammar import *\n", + "from qa import *\n", + "from preprocess import * \n", + "from music_utils import *\n", + "from data_utils import *\n", + "from keras.models import load_model, Model\n", + "from keras.layers import Dense, Activation, Dropout, Input, LSTM, Reshape, Lambda, RepeatVector\n", + "from keras.initializers import glorot_uniform\n", + "from keras.utils import to_categorical\n", + "from keras.optimizers import Adam\n", + "from keras import backend as K" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1 - Problem statement\n", + "\n", + "You would like to create a jazz music piece specially for a friend's birthday. However, you don't know any instruments or music composition. Fortunately, you know deep learning and will solve this problem using an LSTM netwok. \n", + "\n", + "You will train a network to generate novel jazz solos in a style representative of a body of performed work.\n", + "\n", + "\n", + "\n", + "\n", + "### 1.1 - Dataset\n", + "\n", + "You will train your algorithm on a corpus of Jazz music. Run the cell below to listen to a snippet of the audio from the training set:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "IPython.display.Audio('./data/30s_seq.mp3')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We have taken care of the preprocessing of the musical data to render it in terms of musical \"values.\" You can informally think of each \"value\" as a note, which comprises a pitch and a duration. For example, if you press down a specific piano key for 0.5 seconds, then you have just played a note. In music theory, a \"value\" is actually more complicated than this--specifically, it also captures the information needed to play multiple notes at the same time. For example, when playing a music piece, you might press down two piano keys at the same time (playng multiple notes at the same time generates what's called a \"chord\"). But we don't need to worry about the details of music theory for this assignment. For the purpose of this assignment, all you need to know is that we will obtain a dataset of values, and will learn an RNN model to generate sequences of values. \n", + "\n", + "Our music generation system will use 78 unique values. Run the following code to load the raw music data and preprocess it into values. This might take a few minutes." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "shape of X: (60, 30, 78)\n", + "number of training examples: 60\n", + "Tx (length of sequence): 30\n", + "total # of unique values: 78\n", + "Shape of Y: (30, 60, 78)\n" + ] + } + ], + "source": [ + "X, Y, n_values, indices_values = load_music_utils()\n", + "print('shape of X:', X.shape)\n", + "print('number of training examples:', X.shape[0])\n", + "print('Tx (length of sequence):', X.shape[1])\n", + "print('total # of unique values:', n_values)\n", + "print('Shape of Y:', Y.shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You have just loaded the following:\n", + "\n", + "- `X`: This is an (m, $T_x$, 78) dimensional array. We have m training examples, each of which is a snippet of $T_x =30$ musical values. At each time step, the input is one of 78 different possible values, represented as a one-hot vector. Thus for example, X[i,t,:] is a one-hot vector representating the value of the i-th example at time t. \n", + "\n", + "- `Y`: This is essentially the same as `X`, but shifted one step to the left (to the past). Similar to the dinosaurus assignment, we're interested in the network using the previous values to predict the next value, so our sequence model will try to predict $y^{\\langle t \\rangle}$ given $x^{\\langle 1\\rangle}, \\ldots, x^{\\langle t \\rangle}$. However, the data in `Y` is reordered to be dimension $(T_y, m, 78)$, where $T_y = T_x$. This format makes it more convenient to feed to the LSTM later. \n", + "\n", + "- `n_values`: The number of unique values in this dataset. This should be 78. \n", + "\n", + "- `indices_values`: python dictionary mapping from 0-77 to musical values." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.2 - Overview of our model\n", + "\n", + "Here is the architecture of the model we will use. This is similar to the Dinosaurus model you had used in the previous notebook, except that in you will be implementing it in Keras. The architecture is as follows: \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "We will be training the model on random snippets of 30 values taken from a much longer piece of music. Thus, we won't bother to set the first input $x^{\\langle 1 \\rangle} = \\vec{0}$, which we had done previously to denote the start of a dinosaur name, since now most of these snippets of audio start somewhere in the middle of a piece of music. We are setting each of the snippts to have the same length $T_x = 30$ to make vectorization easier. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2 - Building the model\n", + "\n", + "In this part you will build and train a model that will learn musical patterns. To do so, you will need to build a model that takes in X of shape $(m, T_x, 78)$ and Y of shape $(T_y, m, 78)$. We will use an LSTM with 64 dimensional hidden states. Lets set `n_a = 64`. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "n_a = 64 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Here's how you can create a Keras model with multiple inputs and outputs. If you're building an RNN where even at test time entire input sequence $x^{\\langle 1 \\rangle}, x^{\\langle 2 \\rangle}, \\ldots, x^{\\langle T_x \\rangle}$ were *given in advance*, for example if the inputs were words and the output was a label, then Keras has simple built-in functions to build the model. However, for sequence generation, at test time we don't know all the values of $x^{\\langle t\\rangle}$ in advance; instead we generate them one at a time using $x^{\\langle t\\rangle} = y^{\\langle t-1 \\rangle}$. So the code will be a bit more complicated, and you'll need to implement your own for-loop to iterate over the different time steps. \n", + "\n", + "The function `djmodel()` will call the LSTM layer $T_x$ times using a for-loop, and it is important that all $T_x$ copies have the same weights. I.e., it should not re-initiaiize the weights every time---the $T_x$ steps should have shared weights. The key steps for implementing layers with shareable weights in Keras are: \n", + "1. Define the layer objects (we will use global variables for this).\n", + "2. Call these objects when propagating the input.\n", + "\n", + "We have defined the layers objects you need as global variables. Please run the next cell to create them. Please check the Keras documentation to make sure you understand what these layers are: [Reshape()](https://keras.io/layers/core/#reshape), [LSTM()](https://keras.io/layers/recurrent/#lstm), [Dense()](https://keras.io/layers/core/#dense).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "reshapor = Reshape((1, 78)) # Used in Step 2.B of djmodel(), below\n", + "LSTM_cell = LSTM(n_a, return_state = True) # Used in Step 2.C\n", + "densor = Dense(n_values, activation='softmax') # Used in Step 2.D" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each of `reshapor`, `LSTM_cell` and `densor` are now layer objects, and you can use them to implement `djmodel()`. In order to propagate a Keras tensor object X through one of these layers, use `layer_object(X)` (or `layer_object([X,Y])` if it requires multiple inputs.). For example, `reshapor(X)` will propagate X through the `Reshape((1,78))` layer defined above." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " \n", + "**Exercise**: Implement `djmodel()`. You will need to carry out 2 steps:\n", + "\n", + "1. Create an empty list \"outputs\" to save the outputs of the LSTM Cell at every time step.\n", + "2. Loop for $t \\in 1, \\ldots, T_x$:\n", + "\n", + " A. Select the \"t\"th time-step vector from X. The shape of this selection should be (78,). To do so, create a custom [Lambda](https://keras.io/layers/core/#lambda) layer in Keras by using this line of code:\n", + "``` \n", + " x = Lambda(lambda x: X[:,t,:])(X)\n", + "``` \n", + "Look over the Keras documentation to figure out what this does. It is creating a \"temporary\" or \"unnamed\" function (that's what Lambda functions are) that extracts out the appropriate one-hot vector, and making this function a Keras `Layer` object to apply to `X`. \n", + "\n", + " B. Reshape x to be (1,78). You may find the `reshapor()` layer (defined below) helpful.\n", + "\n", + " C. Run x through one step of LSTM_cell. Remember to initialize the LSTM_cell with the previous step's hidden state $a$ and cell state $c$. Use the following formatting:\n", + "```python\n", + "a, _, c = LSTM_cell(input_x, initial_state=[previous hidden state, previous cell state])\n", + "```\n", + "\n", + " D. Propagate the LSTM's output activation value through a dense+softmax layer using `densor`. \n", + " \n", + " E. Append the predicted value to the list of \"outputs\"\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: djmodel\n", + "\n", + "def djmodel(Tx, n_a, n_values):\n", + " \"\"\"\n", + " Implement the model\n", + " \n", + " Arguments:\n", + " Tx -- length of the sequence in a corpus\n", + " n_a -- the number of activations used in our model\n", + " n_values -- number of unique values in the music data \n", + " \n", + " Returns:\n", + " model -- a keras model with the \n", + " \"\"\"\n", + " \n", + " # Define the input of your model with a shape \n", + " X = Input(shape=(Tx, n_values))\n", + " \n", + " # Define s0, initial hidden state for the decoder LSTM\n", + " a0 = Input(shape=(n_a,), name='a0')\n", + " c0 = Input(shape=(n_a,), name='c0')\n", + " a = a0\n", + " c = c0\n", + " \n", + " ### START CODE HERE ### \n", + " # Step 1: Create empty list to append the outputs while you iterate (≈1 line)\n", + " outputs = []\n", + " \n", + " # Step 2: Loop\n", + " for t in range(Tx):\n", + " \n", + " # Step 2.A: select the \"t\"th time step vector from X. \n", + " x = Lambda(lambda x: X[:,t,:])(X)\n", + " # Step 2.B: Use reshapor to reshape x to be (1, n_values) (≈1 line)\n", + " x = reshapor(x)\n", + " # Step 2.C: Perform one step of the LSTM_cell\n", + " a, _, c = LSTM_cell(x, initial_state=[a, c])\n", + " # Step 2.D: Apply densor to the hidden state output of LSTM_Cell\n", + " out = densor(a)\n", + " # Step 2.E: add the output to \"outputs\"\n", + " outputs.append(out)\n", + " \n", + " # Step 3: Create model instance\n", + " model = Model([X, a0, c0], outputs)\n", + " \n", + " ### END CODE HERE ###\n", + " \n", + " return model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the following cell to define your model. We will use `Tx=30`, `n_a=64` (the dimension of the LSTM activations), and `n_values=78`. This cell may take a few seconds to run. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model = djmodel(Tx = 30 , n_a = 64, n_values = 78)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You now need to compile your model to be trained. We will Adam and a categorical cross-entropy loss." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "opt = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, decay=0.01)\n", + "\n", + "model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, lets initialize `a0` and `c0` for the LSTM's initial state to be zero. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true, + "scrolled": true + }, + "outputs": [], + "source": [ + "m = 60\n", + "a0 = np.zeros((m, n_a))\n", + "c0 = np.zeros((m, n_a))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lets now fit the model! We will turn `Y` to a list before doing so, since the cost function expects `Y` to be provided in this format (one list item per time-step). So `list(Y)` is a list with 30 items, where each of the list items is of shape (60,78). Lets train for 100 epochs. This will take a few minutes. \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/100\n", + "60/60 [==============================] - 5s - loss: 125.9040 - dense_1_loss_1: 4.3549 - dense_1_loss_2: 4.3491 - dense_1_loss_3: 4.3446 - dense_1_loss_4: 4.3425 - dense_1_loss_5: 4.3457 - dense_1_loss_6: 4.3444 - dense_1_loss_7: 4.3403 - dense_1_loss_8: 4.3426 - dense_1_loss_9: 4.3420 - dense_1_loss_10: 4.3363 - dense_1_loss_11: 4.3399 - dense_1_loss_12: 4.3542 - dense_1_loss_13: 4.3405 - dense_1_loss_14: 4.3315 - dense_1_loss_15: 4.3349 - dense_1_loss_16: 4.3365 - dense_1_loss_17: 4.3502 - dense_1_loss_18: 4.3426 - dense_1_loss_19: 4.3398 - dense_1_loss_20: 4.3456 - dense_1_loss_21: 4.3334 - dense_1_loss_22: 4.3307 - dense_1_loss_23: 4.3370 - dense_1_loss_24: 4.3398 - dense_1_loss_25: 4.3419 - dense_1_loss_26: 4.3336 - dense_1_loss_27: 4.3417 - dense_1_loss_28: 4.3389 - dense_1_loss_29: 4.3489 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0000e+00 - dense_1_acc_2: 0.0000e+00 - dense_1_acc_3: 0.0333 - dense_1_acc_4: 0.0167 - dense_1_acc_5: 0.0500 - dense_1_acc_6: 0.0833 - dense_1_acc_7: 0.0833 - dense_1_acc_8: 0.0667 - dense_1_acc_9: 0.0833 - dense_1_acc_10: 0.0833 - dense_1_acc_11: 0.1000 - dense_1_acc_12: 0.0167 - dense_1_acc_13: 0.0333 - dense_1_acc_14: 0.0833 - dense_1_acc_15: 0.1000 - dense_1_acc_16: 0.0833 - dense_1_acc_17: 0.0333 - dense_1_acc_18: 0.1000 - dense_1_acc_19: 0.1000 - dense_1_acc_20: 0.0333 - dense_1_acc_21: 0.0500 - dense_1_acc_22: 0.0833 - dense_1_acc_23: 0.0833 - dense_1_acc_24: 0.0833 - dense_1_acc_25: 0.0167 - dense_1_acc_26: 0.0833 - dense_1_acc_27: 0.0167 - dense_1_acc_28: 0.1000 - dense_1_acc_29: 0.0500 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 2/100\n", + "60/60 [==============================] - 0s - loss: 122.6568 - dense_1_loss_1: 4.3326 - dense_1_loss_2: 4.3046 - dense_1_loss_3: 4.2773 - dense_1_loss_4: 4.2703 - dense_1_loss_5: 4.2588 - dense_1_loss_6: 4.2670 - dense_1_loss_7: 4.2432 - dense_1_loss_8: 4.2369 - dense_1_loss_9: 4.2453 - dense_1_loss_10: 4.2128 - dense_1_loss_11: 4.2108 - dense_1_loss_12: 4.2624 - dense_1_loss_13: 4.2184 - dense_1_loss_14: 4.2120 - dense_1_loss_15: 4.2054 - dense_1_loss_16: 4.2141 - dense_1_loss_17: 4.2386 - dense_1_loss_18: 4.2264 - dense_1_loss_19: 4.1898 - dense_1_loss_20: 4.2158 - dense_1_loss_21: 4.1903 - dense_1_loss_22: 4.1631 - dense_1_loss_23: 4.2017 - dense_1_loss_24: 4.2174 - dense_1_loss_25: 4.2308 - dense_1_loss_26: 4.1616 - dense_1_loss_27: 4.2144 - dense_1_loss_28: 4.2066 - dense_1_loss_29: 4.2285 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.1000 - dense_1_acc_2: 0.0500 - dense_1_acc_3: 0.1333 - dense_1_acc_4: 0.1833 - dense_1_acc_5: 0.1833 - dense_1_acc_6: 0.1333 - dense_1_acc_7: 0.1667 - dense_1_acc_8: 0.1833 - dense_1_acc_9: 0.1667 - dense_1_acc_10: 0.2167 - dense_1_acc_11: 0.1833 - dense_1_acc_12: 0.0833 - dense_1_acc_13: 0.1000 - dense_1_acc_14: 0.1500 - dense_1_acc_15: 0.2000 - dense_1_acc_16: 0.1167 - dense_1_acc_17: 0.1000 - dense_1_acc_18: 0.1167 - dense_1_acc_19: 0.2000 - dense_1_acc_20: 0.1167 - dense_1_acc_21: 0.1167 - dense_1_acc_22: 0.1833 - dense_1_acc_23: 0.1667 - dense_1_acc_24: 0.0833 - dense_1_acc_25: 0.1000 - dense_1_acc_26: 0.2333 - dense_1_acc_27: 0.0667 - dense_1_acc_28: 0.1333 - dense_1_acc_29: 0.0667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 3/100\n", + "60/60 [==============================] - 0s - loss: 117.0733 - dense_1_loss_1: 4.3111 - dense_1_loss_2: 4.2544 - dense_1_loss_3: 4.1883 - dense_1_loss_4: 4.1658 - dense_1_loss_5: 4.1323 - dense_1_loss_6: 4.1614 - dense_1_loss_7: 4.0850 - dense_1_loss_8: 4.0316 - dense_1_loss_9: 4.0027 - dense_1_loss_10: 3.8873 - dense_1_loss_11: 3.8779 - dense_1_loss_12: 4.1530 - dense_1_loss_13: 3.9607 - dense_1_loss_14: 3.9360 - dense_1_loss_15: 3.9995 - dense_1_loss_16: 4.0009 - dense_1_loss_17: 4.1242 - dense_1_loss_18: 4.1254 - dense_1_loss_19: 3.8774 - dense_1_loss_20: 4.0043 - dense_1_loss_21: 3.9801 - dense_1_loss_22: 3.8202 - dense_1_loss_23: 3.8966 - dense_1_loss_24: 3.9966 - dense_1_loss_25: 4.1391 - dense_1_loss_26: 3.7823 - dense_1_loss_27: 4.0445 - dense_1_loss_28: 3.9607 - dense_1_loss_29: 4.1739 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.1000 - dense_1_acc_2: 0.0833 - dense_1_acc_3: 0.1667 - dense_1_acc_4: 0.2167 - dense_1_acc_5: 0.2167 - dense_1_acc_6: 0.1000 - dense_1_acc_7: 0.1333 - dense_1_acc_8: 0.1667 - dense_1_acc_9: 0.1333 - dense_1_acc_10: 0.1500 - dense_1_acc_11: 0.1333 - dense_1_acc_12: 0.0667 - dense_1_acc_13: 0.0833 - dense_1_acc_14: 0.1000 - dense_1_acc_15: 0.0667 - dense_1_acc_16: 0.0667 - dense_1_acc_17: 0.0333 - dense_1_acc_18: 0.1167 - dense_1_acc_19: 0.1500 - dense_1_acc_20: 0.0333 - dense_1_acc_21: 0.0500 - dense_1_acc_22: 0.1333 - dense_1_acc_23: 0.0667 - dense_1_acc_24: 0.0667 - dense_1_acc_25: 0.0500 - dense_1_acc_26: 0.0500 - dense_1_acc_27: 0.0500 - dense_1_acc_28: 0.0333 - dense_1_acc_29: 0.0167 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 4/100\n", + "60/60 [==============================] - 0s - loss: 112.9154 - dense_1_loss_1: 4.2889 - dense_1_loss_2: 4.2037 - dense_1_loss_3: 4.0946 - dense_1_loss_4: 4.0680 - dense_1_loss_5: 3.9878 - dense_1_loss_6: 4.0213 - dense_1_loss_7: 3.9193 - dense_1_loss_8: 3.7682 - dense_1_loss_9: 3.8235 - dense_1_loss_10: 3.6754 - dense_1_loss_11: 3.7804 - dense_1_loss_12: 4.0816 - dense_1_loss_13: 3.8364 - dense_1_loss_14: 3.7726 - dense_1_loss_15: 3.8076 - dense_1_loss_16: 3.8271 - dense_1_loss_17: 3.9546 - dense_1_loss_18: 3.8845 - dense_1_loss_19: 3.7412 - dense_1_loss_20: 3.9397 - dense_1_loss_21: 3.8654 - dense_1_loss_22: 3.7902 - dense_1_loss_23: 3.7795 - dense_1_loss_24: 3.7457 - dense_1_loss_25: 3.9795 - dense_1_loss_26: 3.6115 - dense_1_loss_27: 3.7478 - dense_1_loss_28: 3.8803 - dense_1_loss_29: 4.0392 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.1000 - dense_1_acc_2: 0.0833 - dense_1_acc_3: 0.1833 - dense_1_acc_4: 0.1500 - dense_1_acc_5: 0.1833 - dense_1_acc_6: 0.0500 - dense_1_acc_7: 0.1000 - dense_1_acc_8: 0.1500 - dense_1_acc_9: 0.1833 - dense_1_acc_10: 0.1167 - dense_1_acc_11: 0.1167 - dense_1_acc_12: 0.0667 - dense_1_acc_13: 0.1333 - dense_1_acc_14: 0.1167 - dense_1_acc_15: 0.1333 - dense_1_acc_16: 0.1667 - dense_1_acc_17: 0.2000 - dense_1_acc_18: 0.1333 - dense_1_acc_19: 0.1500 - dense_1_acc_20: 0.0667 - dense_1_acc_21: 0.1000 - dense_1_acc_22: 0.0833 - dense_1_acc_23: 0.1167 - dense_1_acc_24: 0.1167 - dense_1_acc_25: 0.0833 - dense_1_acc_26: 0.2167 - dense_1_acc_27: 0.0500 - dense_1_acc_28: 0.1333 - dense_1_acc_29: 0.0667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 5/100\n", + "60/60 [==============================] - 0s - loss: 110.2597 - dense_1_loss_1: 4.2705 - dense_1_loss_2: 4.1568 - dense_1_loss_3: 4.0205 - dense_1_loss_4: 4.0005 - dense_1_loss_5: 3.8821 - dense_1_loss_6: 3.9264 - dense_1_loss_7: 3.8413 - dense_1_loss_8: 3.6637 - dense_1_loss_9: 3.7376 - dense_1_loss_10: 3.5831 - dense_1_loss_11: 3.7226 - dense_1_loss_12: 4.0011 - dense_1_loss_13: 3.7122 - dense_1_loss_14: 3.6388 - dense_1_loss_15: 3.7068 - dense_1_loss_16: 3.7367 - dense_1_loss_17: 3.7956 - dense_1_loss_18: 3.7533 - dense_1_loss_19: 3.6622 - dense_1_loss_20: 3.9071 - dense_1_loss_21: 3.7816 - dense_1_loss_22: 3.6928 - dense_1_loss_23: 3.6583 - dense_1_loss_24: 3.6317 - dense_1_loss_25: 3.9247 - dense_1_loss_26: 3.5430 - dense_1_loss_27: 3.6524 - dense_1_loss_28: 3.7684 - dense_1_loss_29: 3.8877 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.1000 - dense_1_acc_2: 0.0833 - dense_1_acc_3: 0.1667 - dense_1_acc_4: 0.1333 - dense_1_acc_5: 0.1667 - dense_1_acc_6: 0.0833 - dense_1_acc_7: 0.1000 - dense_1_acc_8: 0.1000 - dense_1_acc_9: 0.1333 - dense_1_acc_10: 0.1333 - dense_1_acc_11: 0.1000 - dense_1_acc_12: 0.0500 - dense_1_acc_13: 0.1667 - dense_1_acc_14: 0.1667 - dense_1_acc_15: 0.1500 - dense_1_acc_16: 0.1500 - dense_1_acc_17: 0.1667 - dense_1_acc_18: 0.0500 - dense_1_acc_19: 0.1667 - dense_1_acc_20: 0.1167 - dense_1_acc_21: 0.1000 - dense_1_acc_22: 0.1333 - dense_1_acc_23: 0.1333 - dense_1_acc_24: 0.1500 - dense_1_acc_25: 0.0167 - dense_1_acc_26: 0.1667 - dense_1_acc_27: 0.1000 - dense_1_acc_28: 0.1000 - dense_1_acc_29: 0.0833 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 6/100\n", + "60/60 [==============================] - 0s - loss: 107.9783 - dense_1_loss_1: 4.2532 - dense_1_loss_2: 4.1154 - dense_1_loss_3: 3.9407 - dense_1_loss_4: 3.9188 - dense_1_loss_5: 3.7855 - dense_1_loss_6: 3.8511 - dense_1_loss_7: 3.7890 - dense_1_loss_8: 3.5661 - dense_1_loss_9: 3.6302 - dense_1_loss_10: 3.4763 - dense_1_loss_11: 3.6447 - dense_1_loss_12: 3.8714 - dense_1_loss_13: 3.5687 - dense_1_loss_14: 3.4623 - dense_1_loss_15: 3.6039 - dense_1_loss_16: 3.6463 - dense_1_loss_17: 3.6529 - dense_1_loss_18: 3.7222 - dense_1_loss_19: 3.5496 - dense_1_loss_20: 3.8246 - dense_1_loss_21: 3.7585 - dense_1_loss_22: 3.6430 - dense_1_loss_23: 3.5896 - dense_1_loss_24: 3.6176 - dense_1_loss_25: 3.9002 - dense_1_loss_26: 3.4826 - dense_1_loss_27: 3.6797 - dense_1_loss_28: 3.6516 - dense_1_loss_29: 3.7825 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.1000 - dense_1_acc_2: 0.0833 - dense_1_acc_3: 0.1833 - dense_1_acc_4: 0.1333 - dense_1_acc_5: 0.1833 - dense_1_acc_6: 0.0833 - dense_1_acc_7: 0.1000 - dense_1_acc_8: 0.1333 - dense_1_acc_9: 0.1667 - dense_1_acc_10: 0.1833 - dense_1_acc_11: 0.1333 - dense_1_acc_12: 0.0833 - dense_1_acc_13: 0.1667 - dense_1_acc_14: 0.1667 - dense_1_acc_15: 0.1833 - dense_1_acc_16: 0.1500 - dense_1_acc_17: 0.1667 - dense_1_acc_18: 0.0833 - dense_1_acc_19: 0.1833 - dense_1_acc_20: 0.1000 - dense_1_acc_21: 0.0833 - dense_1_acc_22: 0.1167 - dense_1_acc_23: 0.1167 - dense_1_acc_24: 0.1167 - dense_1_acc_25: 0.0000e+00 - dense_1_acc_26: 0.1667 - dense_1_acc_27: 0.0667 - dense_1_acc_28: 0.1500 - dense_1_acc_29: 0.0667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 7/100\n", + "60/60 [==============================] - 0s - loss: 104.8643 - dense_1_loss_1: 4.2384 - dense_1_loss_2: 4.0770 - dense_1_loss_3: 3.8699 - dense_1_loss_4: 3.8504 - dense_1_loss_5: 3.6831 - dense_1_loss_6: 3.7806 - dense_1_loss_7: 3.7355 - dense_1_loss_8: 3.4662 - dense_1_loss_9: 3.5230 - dense_1_loss_10: 3.3787 - dense_1_loss_11: 3.5172 - dense_1_loss_12: 3.7278 - dense_1_loss_13: 3.4227 - dense_1_loss_14: 3.2936 - dense_1_loss_15: 3.4729 - dense_1_loss_16: 3.5240 - dense_1_loss_17: 3.5398 - dense_1_loss_18: 3.5894 - dense_1_loss_19: 3.4475 - dense_1_loss_20: 3.7086 - dense_1_loss_21: 3.7033 - dense_1_loss_22: 3.5503 - dense_1_loss_23: 3.4632 - dense_1_loss_24: 3.5312 - dense_1_loss_25: 3.7995 - dense_1_loss_26: 3.3369 - dense_1_loss_27: 3.4836 - dense_1_loss_28: 3.5284 - dense_1_loss_29: 3.6214 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.1000 - dense_1_acc_2: 0.0833 - dense_1_acc_3: 0.1833 - dense_1_acc_4: 0.1333 - dense_1_acc_5: 0.1833 - dense_1_acc_6: 0.1167 - dense_1_acc_7: 0.1167 - dense_1_acc_8: 0.2000 - dense_1_acc_9: 0.1833 - dense_1_acc_10: 0.1833 - dense_1_acc_11: 0.1667 - dense_1_acc_12: 0.1167 - dense_1_acc_13: 0.1833 - dense_1_acc_14: 0.2167 - dense_1_acc_15: 0.2000 - dense_1_acc_16: 0.1667 - dense_1_acc_17: 0.1667 - dense_1_acc_18: 0.2167 - dense_1_acc_19: 0.1667 - dense_1_acc_20: 0.1000 - dense_1_acc_21: 0.1167 - dense_1_acc_22: 0.1833 - dense_1_acc_23: 0.2000 - dense_1_acc_24: 0.1333 - dense_1_acc_25: 0.1000 - dense_1_acc_26: 0.3667 - dense_1_acc_27: 0.1000 - dense_1_acc_28: 0.2000 - dense_1_acc_29: 0.1500 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 8/100\n", + "60/60 [==============================] - 0s - loss: 101.2794 - dense_1_loss_1: 4.2249 - dense_1_loss_2: 4.0353 - dense_1_loss_3: 3.8011 - dense_1_loss_4: 3.7676 - dense_1_loss_5: 3.5933 - dense_1_loss_6: 3.6910 - dense_1_loss_7: 3.6350 - dense_1_loss_8: 3.3723 - dense_1_loss_9: 3.4118 - dense_1_loss_10: 3.2261 - dense_1_loss_11: 3.3967 - dense_1_loss_12: 3.5866 - dense_1_loss_13: 3.2628 - dense_1_loss_14: 3.1666 - dense_1_loss_15: 3.3527 - dense_1_loss_16: 3.3848 - dense_1_loss_17: 3.3601 - dense_1_loss_18: 3.4350 - dense_1_loss_19: 3.2700 - dense_1_loss_20: 3.5765 - dense_1_loss_21: 3.5145 - dense_1_loss_22: 3.3161 - dense_1_loss_23: 3.3409 - dense_1_loss_24: 3.3609 - dense_1_loss_25: 3.6265 - dense_1_loss_26: 3.2130 - dense_1_loss_27: 3.4337 - dense_1_loss_28: 3.3773 - dense_1_loss_29: 3.5461 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.1000 - dense_1_acc_2: 0.1000 - dense_1_acc_3: 0.1833 - dense_1_acc_4: 0.1333 - dense_1_acc_5: 0.1833 - dense_1_acc_6: 0.1167 - dense_1_acc_7: 0.1167 - dense_1_acc_8: 0.1500 - dense_1_acc_9: 0.2000 - dense_1_acc_10: 0.2333 - dense_1_acc_11: 0.1833 - dense_1_acc_12: 0.1000 - dense_1_acc_13: 0.2000 - dense_1_acc_14: 0.2333 - dense_1_acc_15: 0.2333 - dense_1_acc_16: 0.1833 - dense_1_acc_17: 0.2000 - dense_1_acc_18: 0.1833 - dense_1_acc_19: 0.2333 - dense_1_acc_20: 0.2000 - dense_1_acc_21: 0.1333 - dense_1_acc_22: 0.2000 - dense_1_acc_23: 0.1667 - dense_1_acc_24: 0.1667 - dense_1_acc_25: 0.1500 - dense_1_acc_26: 0.2667 - dense_1_acc_27: 0.1167 - dense_1_acc_28: 0.2333 - dense_1_acc_29: 0.1000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 9/100\n", + "60/60 [==============================] - 0s - loss: 97.5204 - dense_1_loss_1: 4.2132 - dense_1_loss_2: 3.9938 - dense_1_loss_3: 3.7228 - dense_1_loss_4: 3.6869 - dense_1_loss_5: 3.4899 - dense_1_loss_6: 3.5940 - dense_1_loss_7: 3.5328 - dense_1_loss_8: 3.2687 - dense_1_loss_9: 3.2599 - dense_1_loss_10: 3.0860 - dense_1_loss_11: 3.2446 - dense_1_loss_12: 3.4448 - dense_1_loss_13: 3.0723 - dense_1_loss_14: 2.9683 - dense_1_loss_15: 3.1960 - dense_1_loss_16: 3.2598 - dense_1_loss_17: 3.2428 - dense_1_loss_18: 3.2547 - dense_1_loss_19: 3.1466 - dense_1_loss_20: 3.4448 - dense_1_loss_21: 3.3736 - dense_1_loss_22: 3.1863 - dense_1_loss_23: 3.2743 - dense_1_loss_24: 3.2657 - dense_1_loss_25: 3.4542 - dense_1_loss_26: 3.0484 - dense_1_loss_27: 3.2197 - dense_1_loss_28: 3.1705 - dense_1_loss_29: 3.4052 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.1000 - dense_1_acc_3: 0.1833 - dense_1_acc_4: 0.1333 - dense_1_acc_5: 0.2000 - dense_1_acc_6: 0.1167 - dense_1_acc_7: 0.1667 - dense_1_acc_8: 0.1500 - dense_1_acc_9: 0.2333 - dense_1_acc_10: 0.2833 - dense_1_acc_11: 0.2000 - dense_1_acc_12: 0.1000 - dense_1_acc_13: 0.2500 - dense_1_acc_14: 0.2833 - dense_1_acc_15: 0.2333 - dense_1_acc_16: 0.1667 - dense_1_acc_17: 0.2167 - dense_1_acc_18: 0.2000 - dense_1_acc_19: 0.2167 - dense_1_acc_20: 0.2000 - dense_1_acc_21: 0.1167 - dense_1_acc_22: 0.2167 - dense_1_acc_23: 0.1333 - dense_1_acc_24: 0.1500 - dense_1_acc_25: 0.1167 - dense_1_acc_26: 0.2167 - dense_1_acc_27: 0.1167 - dense_1_acc_28: 0.2333 - dense_1_acc_29: 0.0833 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 10/100\n", + "60/60 [==============================] - 0s - loss: 93.2951 - dense_1_loss_1: 4.2026 - dense_1_loss_2: 3.9532 - dense_1_loss_3: 3.6438 - dense_1_loss_4: 3.5973 - dense_1_loss_5: 3.3823 - dense_1_loss_6: 3.4690 - dense_1_loss_7: 3.4083 - dense_1_loss_8: 3.1418 - dense_1_loss_9: 3.1179 - dense_1_loss_10: 2.8840 - dense_1_loss_11: 3.0981 - dense_1_loss_12: 3.2677 - dense_1_loss_13: 2.9144 - dense_1_loss_14: 2.8569 - dense_1_loss_15: 3.0905 - dense_1_loss_16: 3.1065 - dense_1_loss_17: 3.0565 - dense_1_loss_18: 3.0391 - dense_1_loss_19: 3.0159 - dense_1_loss_20: 3.2457 - dense_1_loss_21: 3.1609 - dense_1_loss_22: 2.9807 - dense_1_loss_23: 3.0404 - dense_1_loss_24: 3.0801 - dense_1_loss_25: 3.3126 - dense_1_loss_26: 2.8343 - dense_1_loss_27: 3.1310 - dense_1_loss_28: 2.9972 - dense_1_loss_29: 3.2668 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.1000 - dense_1_acc_3: 0.1833 - dense_1_acc_4: 0.1333 - dense_1_acc_5: 0.2167 - dense_1_acc_6: 0.1333 - dense_1_acc_7: 0.1833 - dense_1_acc_8: 0.1500 - dense_1_acc_9: 0.2333 - dense_1_acc_10: 0.2500 - dense_1_acc_11: 0.1833 - dense_1_acc_12: 0.1000 - dense_1_acc_13: 0.2333 - dense_1_acc_14: 0.2667 - dense_1_acc_15: 0.2500 - dense_1_acc_16: 0.1833 - dense_1_acc_17: 0.2167 - dense_1_acc_18: 0.1833 - dense_1_acc_19: 0.2333 - dense_1_acc_20: 0.2000 - dense_1_acc_21: 0.1167 - dense_1_acc_22: 0.1833 - dense_1_acc_23: 0.1667 - dense_1_acc_24: 0.1500 - dense_1_acc_25: 0.1167 - dense_1_acc_26: 0.2167 - dense_1_acc_27: 0.1000 - dense_1_acc_28: 0.2833 - dense_1_acc_29: 0.0833 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 11/100\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "60/60 [==============================] - 0s - loss: 89.2546 - dense_1_loss_1: 4.1930 - dense_1_loss_2: 3.9154 - dense_1_loss_3: 3.5726 - dense_1_loss_4: 3.5090 - dense_1_loss_5: 3.2842 - dense_1_loss_6: 3.3255 - dense_1_loss_7: 3.2574 - dense_1_loss_8: 3.0075 - dense_1_loss_9: 2.9958 - dense_1_loss_10: 2.7867 - dense_1_loss_11: 2.9262 - dense_1_loss_12: 3.1098 - dense_1_loss_13: 2.7767 - dense_1_loss_14: 2.7497 - dense_1_loss_15: 2.8977 - dense_1_loss_16: 2.9300 - dense_1_loss_17: 2.9385 - dense_1_loss_18: 2.8804 - dense_1_loss_19: 2.9554 - dense_1_loss_20: 3.1472 - dense_1_loss_21: 3.0215 - dense_1_loss_22: 2.8213 - dense_1_loss_23: 2.8513 - dense_1_loss_24: 2.9052 - dense_1_loss_25: 3.1611 - dense_1_loss_26: 2.6129 - dense_1_loss_27: 2.8965 - dense_1_loss_28: 2.7634 - dense_1_loss_29: 3.0626 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.0833 - dense_1_acc_3: 0.1833 - dense_1_acc_4: 0.1667 - dense_1_acc_5: 0.2167 - dense_1_acc_6: 0.1500 - dense_1_acc_7: 0.1833 - dense_1_acc_8: 0.1667 - dense_1_acc_9: 0.2667 - dense_1_acc_10: 0.2667 - dense_1_acc_11: 0.2167 - dense_1_acc_12: 0.1167 - dense_1_acc_13: 0.2167 - dense_1_acc_14: 0.2667 - dense_1_acc_15: 0.2500 - dense_1_acc_16: 0.1833 - dense_1_acc_17: 0.2667 - dense_1_acc_18: 0.2000 - dense_1_acc_19: 0.2000 - dense_1_acc_20: 0.2000 - dense_1_acc_21: 0.1667 - dense_1_acc_22: 0.2333 - dense_1_acc_23: 0.2000 - dense_1_acc_24: 0.2000 - dense_1_acc_25: 0.1167 - dense_1_acc_26: 0.2833 - dense_1_acc_27: 0.2000 - dense_1_acc_28: 0.2667 - dense_1_acc_29: 0.1000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 12/100\n", + "60/60 [==============================] - 0s - loss: 85.1477 - dense_1_loss_1: 4.1850 - dense_1_loss_2: 3.8815 - dense_1_loss_3: 3.4970 - dense_1_loss_4: 3.4241 - dense_1_loss_5: 3.1747 - dense_1_loss_6: 3.1674 - dense_1_loss_7: 3.1523 - dense_1_loss_8: 2.9025 - dense_1_loss_9: 2.8640 - dense_1_loss_10: 2.6380 - dense_1_loss_11: 2.7936 - dense_1_loss_12: 2.9178 - dense_1_loss_13: 2.6395 - dense_1_loss_14: 2.5885 - dense_1_loss_15: 2.8020 - dense_1_loss_16: 2.8228 - dense_1_loss_17: 2.7294 - dense_1_loss_18: 2.7477 - dense_1_loss_19: 2.7194 - dense_1_loss_20: 2.9086 - dense_1_loss_21: 2.7878 - dense_1_loss_22: 2.6447 - dense_1_loss_23: 2.6568 - dense_1_loss_24: 2.7479 - dense_1_loss_25: 2.9697 - dense_1_loss_26: 2.4406 - dense_1_loss_27: 2.8676 - dense_1_loss_28: 2.6169 - dense_1_loss_29: 2.8599 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.0833 - dense_1_acc_3: 0.1833 - dense_1_acc_4: 0.1667 - dense_1_acc_5: 0.2167 - dense_1_acc_6: 0.1333 - dense_1_acc_7: 0.2000 - dense_1_acc_8: 0.1833 - dense_1_acc_9: 0.2500 - dense_1_acc_10: 0.2500 - dense_1_acc_11: 0.1833 - dense_1_acc_12: 0.1667 - dense_1_acc_13: 0.2500 - dense_1_acc_14: 0.2500 - dense_1_acc_15: 0.2833 - dense_1_acc_16: 0.1667 - dense_1_acc_17: 0.2500 - dense_1_acc_18: 0.2333 - dense_1_acc_19: 0.1833 - dense_1_acc_20: 0.1667 - dense_1_acc_21: 0.2500 - dense_1_acc_22: 0.2167 - dense_1_acc_23: 0.2167 - dense_1_acc_24: 0.1500 - dense_1_acc_25: 0.1000 - dense_1_acc_26: 0.3167 - dense_1_acc_27: 0.1500 - dense_1_acc_28: 0.2500 - dense_1_acc_29: 0.1667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 13/100\n", + "60/60 [==============================] - 0s - loss: 81.0322 - dense_1_loss_1: 4.1763 - dense_1_loss_2: 3.8493 - dense_1_loss_3: 3.4276 - dense_1_loss_4: 3.3310 - dense_1_loss_5: 3.0635 - dense_1_loss_6: 3.0125 - dense_1_loss_7: 3.0074 - dense_1_loss_8: 2.7820 - dense_1_loss_9: 2.6978 - dense_1_loss_10: 2.5079 - dense_1_loss_11: 2.6490 - dense_1_loss_12: 2.7379 - dense_1_loss_13: 2.4823 - dense_1_loss_14: 2.4618 - dense_1_loss_15: 2.5889 - dense_1_loss_16: 2.6738 - dense_1_loss_17: 2.6001 - dense_1_loss_18: 2.5553 - dense_1_loss_19: 2.6133 - dense_1_loss_20: 2.7357 - dense_1_loss_21: 2.5915 - dense_1_loss_22: 2.5230 - dense_1_loss_23: 2.4973 - dense_1_loss_24: 2.5586 - dense_1_loss_25: 2.7808 - dense_1_loss_26: 2.3086 - dense_1_loss_27: 2.6981 - dense_1_loss_28: 2.4811 - dense_1_loss_29: 2.6398 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.0833 - dense_1_acc_3: 0.1833 - dense_1_acc_4: 0.1667 - dense_1_acc_5: 0.2167 - dense_1_acc_6: 0.1833 - dense_1_acc_7: 0.2667 - dense_1_acc_8: 0.2167 - dense_1_acc_9: 0.3167 - dense_1_acc_10: 0.3333 - dense_1_acc_11: 0.2333 - dense_1_acc_12: 0.1833 - dense_1_acc_13: 0.2667 - dense_1_acc_14: 0.2667 - dense_1_acc_15: 0.3333 - dense_1_acc_16: 0.2167 - dense_1_acc_17: 0.2667 - dense_1_acc_18: 0.3000 - dense_1_acc_19: 0.2500 - dense_1_acc_20: 0.2000 - dense_1_acc_21: 0.3000 - dense_1_acc_22: 0.2667 - dense_1_acc_23: 0.2667 - dense_1_acc_24: 0.2000 - dense_1_acc_25: 0.1500 - dense_1_acc_26: 0.3500 - dense_1_acc_27: 0.2167 - dense_1_acc_28: 0.3167 - dense_1_acc_29: 0.1833 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 14/100\n", + "60/60 [==============================] - 0s - loss: 77.9601 - dense_1_loss_1: 4.1701 - dense_1_loss_2: 3.8156 - dense_1_loss_3: 3.3568 - dense_1_loss_4: 3.2374 - dense_1_loss_5: 2.9629 - dense_1_loss_6: 2.8653 - dense_1_loss_7: 2.8869 - dense_1_loss_8: 2.6852 - dense_1_loss_9: 2.5626 - dense_1_loss_10: 2.4354 - dense_1_loss_11: 2.5116 - dense_1_loss_12: 2.5677 - dense_1_loss_13: 2.3224 - dense_1_loss_14: 2.3686 - dense_1_loss_15: 2.4150 - dense_1_loss_16: 2.5839 - dense_1_loss_17: 2.4449 - dense_1_loss_18: 2.4903 - dense_1_loss_19: 2.4915 - dense_1_loss_20: 2.6270 - dense_1_loss_21: 2.5091 - dense_1_loss_22: 2.4627 - dense_1_loss_23: 2.3852 - dense_1_loss_24: 2.4574 - dense_1_loss_25: 2.5815 - dense_1_loss_26: 2.3192 - dense_1_loss_27: 2.5726 - dense_1_loss_28: 2.3630 - dense_1_loss_29: 2.5083 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.1167 - dense_1_acc_3: 0.2667 - dense_1_acc_4: 0.2000 - dense_1_acc_5: 0.2667 - dense_1_acc_6: 0.2167 - dense_1_acc_7: 0.2833 - dense_1_acc_8: 0.2333 - dense_1_acc_9: 0.3500 - dense_1_acc_10: 0.3167 - dense_1_acc_11: 0.2167 - dense_1_acc_12: 0.2333 - dense_1_acc_13: 0.3333 - dense_1_acc_14: 0.2833 - dense_1_acc_15: 0.4000 - dense_1_acc_16: 0.2500 - dense_1_acc_17: 0.3000 - dense_1_acc_18: 0.3333 - dense_1_acc_19: 0.3333 - dense_1_acc_20: 0.3167 - dense_1_acc_21: 0.3167 - dense_1_acc_22: 0.2833 - dense_1_acc_23: 0.3333 - dense_1_acc_24: 0.2333 - dense_1_acc_25: 0.2000 - dense_1_acc_26: 0.3667 - dense_1_acc_27: 0.3167 - dense_1_acc_28: 0.4000 - dense_1_acc_29: 0.2333 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 15/100\n", + "60/60 [==============================] - 0s - loss: 73.6257 - dense_1_loss_1: 4.1631 - dense_1_loss_2: 3.7769 - dense_1_loss_3: 3.2732 - dense_1_loss_4: 3.1412 - dense_1_loss_5: 2.8381 - dense_1_loss_6: 2.7260 - dense_1_loss_7: 2.7418 - dense_1_loss_8: 2.5269 - dense_1_loss_9: 2.5045 - dense_1_loss_10: 2.2739 - dense_1_loss_11: 2.3766 - dense_1_loss_12: 2.4051 - dense_1_loss_13: 2.2745 - dense_1_loss_14: 2.2042 - dense_1_loss_15: 2.2568 - dense_1_loss_16: 2.3940 - dense_1_loss_17: 2.3293 - dense_1_loss_18: 2.2735 - dense_1_loss_19: 2.3449 - dense_1_loss_20: 2.4590 - dense_1_loss_21: 2.2738 - dense_1_loss_22: 2.2730 - dense_1_loss_23: 2.1869 - dense_1_loss_24: 2.2947 - dense_1_loss_25: 2.3850 - dense_1_loss_26: 2.0492 - dense_1_loss_27: 2.3851 - dense_1_loss_28: 2.2298 - dense_1_loss_29: 2.2649 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.1333 - dense_1_acc_3: 0.2833 - dense_1_acc_4: 0.2333 - dense_1_acc_5: 0.3000 - dense_1_acc_6: 0.2167 - dense_1_acc_7: 0.2667 - dense_1_acc_8: 0.2667 - dense_1_acc_9: 0.3167 - dense_1_acc_10: 0.3333 - dense_1_acc_11: 0.2333 - dense_1_acc_12: 0.2500 - dense_1_acc_13: 0.3167 - dense_1_acc_14: 0.3000 - dense_1_acc_15: 0.4167 - dense_1_acc_16: 0.3000 - dense_1_acc_17: 0.2667 - dense_1_acc_18: 0.3833 - dense_1_acc_19: 0.3333 - dense_1_acc_20: 0.3000 - dense_1_acc_21: 0.3667 - dense_1_acc_22: 0.2500 - dense_1_acc_23: 0.3500 - dense_1_acc_24: 0.2667 - dense_1_acc_25: 0.2000 - dense_1_acc_26: 0.3833 - dense_1_acc_27: 0.3333 - dense_1_acc_28: 0.4000 - dense_1_acc_29: 0.3333 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 16/100\n", + "60/60 [==============================] - 0s - loss: 70.3618 - dense_1_loss_1: 4.1553 - dense_1_loss_2: 3.7367 - dense_1_loss_3: 3.1916 - dense_1_loss_4: 3.0392 - dense_1_loss_5: 2.7275 - dense_1_loss_6: 2.5766 - dense_1_loss_7: 2.6109 - dense_1_loss_8: 2.4347 - dense_1_loss_9: 2.3557 - dense_1_loss_10: 2.1732 - dense_1_loss_11: 2.2006 - dense_1_loss_12: 2.2638 - dense_1_loss_13: 2.1105 - dense_1_loss_14: 2.0830 - dense_1_loss_15: 2.1623 - dense_1_loss_16: 2.2633 - dense_1_loss_17: 2.1704 - dense_1_loss_18: 2.0982 - dense_1_loss_19: 2.2236 - dense_1_loss_20: 2.2410 - dense_1_loss_21: 2.1717 - dense_1_loss_22: 2.1792 - dense_1_loss_23: 2.0740 - dense_1_loss_24: 2.2246 - dense_1_loss_25: 2.3523 - dense_1_loss_26: 1.9297 - dense_1_loss_27: 2.3692 - dense_1_loss_28: 2.1127 - dense_1_loss_29: 2.1301 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.1500 - dense_1_acc_3: 0.3000 - dense_1_acc_4: 0.2333 - dense_1_acc_5: 0.3000 - dense_1_acc_6: 0.2833 - dense_1_acc_7: 0.2833 - dense_1_acc_8: 0.3000 - dense_1_acc_9: 0.3667 - dense_1_acc_10: 0.3000 - dense_1_acc_11: 0.3667 - dense_1_acc_12: 0.3167 - dense_1_acc_13: 0.4333 - dense_1_acc_14: 0.3667 - dense_1_acc_15: 0.4000 - dense_1_acc_16: 0.3500 - dense_1_acc_17: 0.3333 - dense_1_acc_18: 0.3833 - dense_1_acc_19: 0.3500 - dense_1_acc_20: 0.3333 - dense_1_acc_21: 0.3500 - dense_1_acc_22: 0.2667 - dense_1_acc_23: 0.3333 - dense_1_acc_24: 0.3000 - dense_1_acc_25: 0.1667 - dense_1_acc_26: 0.5000 - dense_1_acc_27: 0.3000 - dense_1_acc_28: 0.4167 - dense_1_acc_29: 0.4500 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 17/100\n", + "60/60 [==============================] - 0s - loss: 66.2304 - dense_1_loss_1: 4.1488 - dense_1_loss_2: 3.6911 - dense_1_loss_3: 3.1042 - dense_1_loss_4: 2.9300 - dense_1_loss_5: 2.5999 - dense_1_loss_6: 2.4128 - dense_1_loss_7: 2.4306 - dense_1_loss_8: 2.2906 - dense_1_loss_9: 2.2434 - dense_1_loss_10: 2.1170 - dense_1_loss_11: 2.0371 - dense_1_loss_12: 2.1215 - dense_1_loss_13: 1.9140 - dense_1_loss_14: 1.9231 - dense_1_loss_15: 2.0423 - dense_1_loss_16: 2.0871 - dense_1_loss_17: 2.0013 - dense_1_loss_18: 2.0237 - dense_1_loss_19: 2.0139 - dense_1_loss_20: 2.1063 - dense_1_loss_21: 1.9310 - dense_1_loss_22: 1.9749 - dense_1_loss_23: 1.9782 - dense_1_loss_24: 2.0688 - dense_1_loss_25: 2.1276 - dense_1_loss_26: 1.8247 - dense_1_loss_27: 2.1159 - dense_1_loss_28: 1.9633 - dense_1_loss_29: 2.0072 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.1500 - dense_1_acc_3: 0.3167 - dense_1_acc_4: 0.2500 - dense_1_acc_5: 0.3000 - dense_1_acc_6: 0.3000 - dense_1_acc_7: 0.3667 - dense_1_acc_8: 0.3667 - dense_1_acc_9: 0.4167 - dense_1_acc_10: 0.3667 - dense_1_acc_11: 0.4667 - dense_1_acc_12: 0.3333 - dense_1_acc_13: 0.4333 - dense_1_acc_14: 0.3667 - dense_1_acc_15: 0.4000 - dense_1_acc_16: 0.3500 - dense_1_acc_17: 0.3333 - dense_1_acc_18: 0.3833 - dense_1_acc_19: 0.4167 - dense_1_acc_20: 0.3333 - dense_1_acc_21: 0.4333 - dense_1_acc_22: 0.4333 - dense_1_acc_23: 0.4167 - dense_1_acc_24: 0.4167 - dense_1_acc_25: 0.2500 - dense_1_acc_26: 0.5167 - dense_1_acc_27: 0.3833 - dense_1_acc_28: 0.4833 - dense_1_acc_29: 0.4167 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 18/100\n", + "60/60 [==============================] - 0s - loss: 62.3319 - dense_1_loss_1: 4.1397 - dense_1_loss_2: 3.6421 - dense_1_loss_3: 3.0151 - dense_1_loss_4: 2.8130 - dense_1_loss_5: 2.4758 - dense_1_loss_6: 2.2840 - dense_1_loss_7: 2.2531 - dense_1_loss_8: 2.1385 - dense_1_loss_9: 2.0560 - dense_1_loss_10: 1.9909 - dense_1_loss_11: 1.8967 - dense_1_loss_12: 1.9279 - dense_1_loss_13: 1.7948 - dense_1_loss_14: 1.8012 - dense_1_loss_15: 1.8786 - dense_1_loss_16: 1.9568 - dense_1_loss_17: 1.8149 - dense_1_loss_18: 1.8518 - dense_1_loss_19: 1.8860 - dense_1_loss_20: 1.8862 - dense_1_loss_21: 1.8118 - dense_1_loss_22: 1.8525 - dense_1_loss_23: 1.8370 - dense_1_loss_24: 1.9205 - dense_1_loss_25: 2.0064 - dense_1_loss_26: 1.7062 - dense_1_loss_27: 1.9795 - dense_1_loss_28: 1.8381 - dense_1_loss_29: 1.8766 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.2000 - dense_1_acc_3: 0.3500 - dense_1_acc_4: 0.2667 - dense_1_acc_5: 0.3167 - dense_1_acc_6: 0.3167 - dense_1_acc_7: 0.3833 - dense_1_acc_8: 0.4167 - dense_1_acc_9: 0.3833 - dense_1_acc_10: 0.3667 - dense_1_acc_11: 0.4500 - dense_1_acc_12: 0.4167 - dense_1_acc_13: 0.4500 - dense_1_acc_14: 0.4833 - dense_1_acc_15: 0.4500 - dense_1_acc_16: 0.4333 - dense_1_acc_17: 0.4333 - dense_1_acc_18: 0.4333 - dense_1_acc_19: 0.4000 - dense_1_acc_20: 0.4667 - dense_1_acc_21: 0.4000 - dense_1_acc_22: 0.5000 - dense_1_acc_23: 0.4667 - dense_1_acc_24: 0.4500 - dense_1_acc_25: 0.3833 - dense_1_acc_26: 0.6000 - dense_1_acc_27: 0.4167 - dense_1_acc_28: 0.4833 - dense_1_acc_29: 0.4833 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 19/100\n", + "60/60 [==============================] - 0s - loss: 58.7765 - dense_1_loss_1: 4.1293 - dense_1_loss_2: 3.5938 - dense_1_loss_3: 2.9217 - dense_1_loss_4: 2.6930 - dense_1_loss_5: 2.3465 - dense_1_loss_6: 2.1640 - dense_1_loss_7: 2.1080 - dense_1_loss_8: 1.9949 - dense_1_loss_9: 1.9220 - dense_1_loss_10: 1.8766 - dense_1_loss_11: 1.7984 - dense_1_loss_12: 1.7816 - dense_1_loss_13: 1.6254 - dense_1_loss_14: 1.6782 - dense_1_loss_15: 1.7419 - dense_1_loss_16: 1.8087 - dense_1_loss_17: 1.6636 - dense_1_loss_18: 1.7438 - dense_1_loss_19: 1.7404 - dense_1_loss_20: 1.7639 - dense_1_loss_21: 1.6986 - dense_1_loss_22: 1.7596 - dense_1_loss_23: 1.6799 - dense_1_loss_24: 1.8050 - dense_1_loss_25: 1.8290 - dense_1_loss_26: 1.5970 - dense_1_loss_27: 1.8552 - dense_1_loss_28: 1.6903 - dense_1_loss_29: 1.7664 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.2167 - dense_1_acc_3: 0.3500 - dense_1_acc_4: 0.2833 - dense_1_acc_5: 0.3500 - dense_1_acc_6: 0.3333 - dense_1_acc_7: 0.4333 - dense_1_acc_8: 0.4000 - dense_1_acc_9: 0.4167 - dense_1_acc_10: 0.3833 - dense_1_acc_11: 0.5667 - dense_1_acc_12: 0.3833 - dense_1_acc_13: 0.5000 - dense_1_acc_14: 0.5167 - dense_1_acc_15: 0.4500 - dense_1_acc_16: 0.5500 - dense_1_acc_17: 0.5667 - dense_1_acc_18: 0.5167 - dense_1_acc_19: 0.5333 - dense_1_acc_20: 0.5167 - dense_1_acc_21: 0.4500 - dense_1_acc_22: 0.4500 - dense_1_acc_23: 0.5833 - dense_1_acc_24: 0.4833 - dense_1_acc_25: 0.4167 - dense_1_acc_26: 0.6000 - dense_1_acc_27: 0.4667 - dense_1_acc_28: 0.5500 - dense_1_acc_29: 0.4833 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 20/100\n", + "60/60 [==============================] - 0s - loss: 55.4639 - dense_1_loss_1: 4.1196 - dense_1_loss_2: 3.5414 - dense_1_loss_3: 2.8298 - dense_1_loss_4: 2.5794 - dense_1_loss_5: 2.2221 - dense_1_loss_6: 2.0297 - dense_1_loss_7: 1.9543 - dense_1_loss_8: 1.8577 - dense_1_loss_9: 1.8207 - dense_1_loss_10: 1.8011 - dense_1_loss_11: 1.6898 - dense_1_loss_12: 1.6834 - dense_1_loss_13: 1.5188 - dense_1_loss_14: 1.5221 - dense_1_loss_15: 1.6620 - dense_1_loss_16: 1.6231 - dense_1_loss_17: 1.5220 - dense_1_loss_18: 1.6622 - dense_1_loss_19: 1.6191 - dense_1_loss_20: 1.5955 - dense_1_loss_21: 1.5492 - dense_1_loss_22: 1.6455 - dense_1_loss_23: 1.6137 - dense_1_loss_24: 1.6356 - dense_1_loss_25: 1.6506 - dense_1_loss_26: 1.5272 - dense_1_loss_27: 1.7468 - dense_1_loss_28: 1.6460 - dense_1_loss_29: 1.5955 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.2167 - dense_1_acc_3: 0.3667 - dense_1_acc_4: 0.2833 - dense_1_acc_5: 0.4167 - dense_1_acc_6: 0.4167 - dense_1_acc_7: 0.4833 - dense_1_acc_8: 0.4167 - dense_1_acc_9: 0.4667 - dense_1_acc_10: 0.4000 - dense_1_acc_11: 0.6000 - dense_1_acc_12: 0.5167 - dense_1_acc_13: 0.6833 - dense_1_acc_14: 0.6500 - dense_1_acc_15: 0.5000 - dense_1_acc_16: 0.5500 - dense_1_acc_17: 0.7333 - dense_1_acc_18: 0.4667 - dense_1_acc_19: 0.6500 - dense_1_acc_20: 0.6167 - dense_1_acc_21: 0.5833 - dense_1_acc_22: 0.5000 - dense_1_acc_23: 0.6333 - dense_1_acc_24: 0.4833 - dense_1_acc_25: 0.4500 - dense_1_acc_26: 0.6333 - dense_1_acc_27: 0.5167 - dense_1_acc_28: 0.5167 - dense_1_acc_29: 0.6000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 21/100\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "60/60 [==============================] - 0s - loss: 52.1706 - dense_1_loss_1: 4.1087 - dense_1_loss_2: 3.4868 - dense_1_loss_3: 2.7327 - dense_1_loss_4: 2.4694 - dense_1_loss_5: 2.1064 - dense_1_loss_6: 1.9156 - dense_1_loss_7: 1.8112 - dense_1_loss_8: 1.7305 - dense_1_loss_9: 1.6741 - dense_1_loss_10: 1.7167 - dense_1_loss_11: 1.6203 - dense_1_loss_12: 1.5757 - dense_1_loss_13: 1.3877 - dense_1_loss_14: 1.4051 - dense_1_loss_15: 1.5279 - dense_1_loss_16: 1.5443 - dense_1_loss_17: 1.3941 - dense_1_loss_18: 1.5216 - dense_1_loss_19: 1.4757 - dense_1_loss_20: 1.4830 - dense_1_loss_21: 1.4610 - dense_1_loss_22: 1.5454 - dense_1_loss_23: 1.4908 - dense_1_loss_24: 1.5218 - dense_1_loss_25: 1.5451 - dense_1_loss_26: 1.4260 - dense_1_loss_27: 1.6116 - dense_1_loss_28: 1.4497 - dense_1_loss_29: 1.4315 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.2667 - dense_1_acc_3: 0.4000 - dense_1_acc_4: 0.3000 - dense_1_acc_5: 0.4500 - dense_1_acc_6: 0.4833 - dense_1_acc_7: 0.4833 - dense_1_acc_8: 0.4833 - dense_1_acc_9: 0.5667 - dense_1_acc_10: 0.4167 - dense_1_acc_11: 0.6000 - dense_1_acc_12: 0.5000 - dense_1_acc_13: 0.7000 - dense_1_acc_14: 0.6833 - dense_1_acc_15: 0.5333 - dense_1_acc_16: 0.6167 - dense_1_acc_17: 0.7333 - dense_1_acc_18: 0.5500 - dense_1_acc_19: 0.6500 - dense_1_acc_20: 0.7333 - dense_1_acc_21: 0.6833 - dense_1_acc_22: 0.5333 - dense_1_acc_23: 0.6167 - dense_1_acc_24: 0.6167 - dense_1_acc_25: 0.5500 - dense_1_acc_26: 0.7167 - dense_1_acc_27: 0.5500 - dense_1_acc_28: 0.7000 - dense_1_acc_29: 0.7000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 22/100\n", + "60/60 [==============================] - 0s - loss: 48.9710 - dense_1_loss_1: 4.1000 - dense_1_loss_2: 3.4322 - dense_1_loss_3: 2.6381 - dense_1_loss_4: 2.3589 - dense_1_loss_5: 1.9885 - dense_1_loss_6: 1.7809 - dense_1_loss_7: 1.6797 - dense_1_loss_8: 1.5749 - dense_1_loss_9: 1.6043 - dense_1_loss_10: 1.5899 - dense_1_loss_11: 1.5283 - dense_1_loss_12: 1.4156 - dense_1_loss_13: 1.2840 - dense_1_loss_14: 1.2885 - dense_1_loss_15: 1.3844 - dense_1_loss_16: 1.4373 - dense_1_loss_17: 1.2913 - dense_1_loss_18: 1.4478 - dense_1_loss_19: 1.3420 - dense_1_loss_20: 1.3338 - dense_1_loss_21: 1.3325 - dense_1_loss_22: 1.4579 - dense_1_loss_23: 1.3715 - dense_1_loss_24: 1.4081 - dense_1_loss_25: 1.4006 - dense_1_loss_26: 1.3544 - dense_1_loss_27: 1.5022 - dense_1_loss_28: 1.3299 - dense_1_loss_29: 1.3135 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.2833 - dense_1_acc_3: 0.4000 - dense_1_acc_4: 0.3000 - dense_1_acc_5: 0.4333 - dense_1_acc_6: 0.4833 - dense_1_acc_7: 0.5833 - dense_1_acc_8: 0.5667 - dense_1_acc_9: 0.5667 - dense_1_acc_10: 0.4833 - dense_1_acc_11: 0.6500 - dense_1_acc_12: 0.5833 - dense_1_acc_13: 0.6833 - dense_1_acc_14: 0.7000 - dense_1_acc_15: 0.6333 - dense_1_acc_16: 0.6167 - dense_1_acc_17: 0.7667 - dense_1_acc_18: 0.6167 - dense_1_acc_19: 0.7833 - dense_1_acc_20: 0.7500 - dense_1_acc_21: 0.7500 - dense_1_acc_22: 0.5500 - dense_1_acc_23: 0.7167 - dense_1_acc_24: 0.6333 - dense_1_acc_25: 0.6500 - dense_1_acc_26: 0.6500 - dense_1_acc_27: 0.6500 - dense_1_acc_28: 0.7500 - dense_1_acc_29: 0.7000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 23/100\n", + "60/60 [==============================] - 0s - loss: 46.0550 - dense_1_loss_1: 4.0902 - dense_1_loss_2: 3.3763 - dense_1_loss_3: 2.5458 - dense_1_loss_4: 2.2399 - dense_1_loss_5: 1.8774 - dense_1_loss_6: 1.6535 - dense_1_loss_7: 1.5304 - dense_1_loss_8: 1.4578 - dense_1_loss_9: 1.4931 - dense_1_loss_10: 1.4437 - dense_1_loss_11: 1.4144 - dense_1_loss_12: 1.2828 - dense_1_loss_13: 1.2014 - dense_1_loss_14: 1.1796 - dense_1_loss_15: 1.2369 - dense_1_loss_16: 1.3292 - dense_1_loss_17: 1.2031 - dense_1_loss_18: 1.3290 - dense_1_loss_19: 1.2642 - dense_1_loss_20: 1.2488 - dense_1_loss_21: 1.2321 - dense_1_loss_22: 1.3522 - dense_1_loss_23: 1.2999 - dense_1_loss_24: 1.2890 - dense_1_loss_25: 1.3212 - dense_1_loss_26: 1.2776 - dense_1_loss_27: 1.3955 - dense_1_loss_28: 1.2376 - dense_1_loss_29: 1.2526 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.3000 - dense_1_acc_3: 0.4000 - dense_1_acc_4: 0.3000 - dense_1_acc_5: 0.4333 - dense_1_acc_6: 0.5333 - dense_1_acc_7: 0.6500 - dense_1_acc_8: 0.6167 - dense_1_acc_9: 0.6000 - dense_1_acc_10: 0.5667 - dense_1_acc_11: 0.6500 - dense_1_acc_12: 0.6667 - dense_1_acc_13: 0.8000 - dense_1_acc_14: 0.7333 - dense_1_acc_15: 0.7500 - dense_1_acc_16: 0.6833 - dense_1_acc_17: 0.8500 - dense_1_acc_18: 0.6667 - dense_1_acc_19: 0.7333 - dense_1_acc_20: 0.8333 - dense_1_acc_21: 0.8000 - dense_1_acc_22: 0.6667 - dense_1_acc_23: 0.7500 - dense_1_acc_24: 0.6667 - dense_1_acc_25: 0.7000 - dense_1_acc_26: 0.7167 - dense_1_acc_27: 0.6500 - dense_1_acc_28: 0.8667 - dense_1_acc_29: 0.7500 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 24/100\n", + "60/60 [==============================] - 0s - loss: 43.4850 - dense_1_loss_1: 4.0810 - dense_1_loss_2: 3.3197 - dense_1_loss_3: 2.4572 - dense_1_loss_4: 2.1246 - dense_1_loss_5: 1.7856 - dense_1_loss_6: 1.5532 - dense_1_loss_7: 1.3991 - dense_1_loss_8: 1.3672 - dense_1_loss_9: 1.3770 - dense_1_loss_10: 1.3611 - dense_1_loss_11: 1.3224 - dense_1_loss_12: 1.2066 - dense_1_loss_13: 1.1076 - dense_1_loss_14: 1.1156 - dense_1_loss_15: 1.1495 - dense_1_loss_16: 1.2411 - dense_1_loss_17: 1.1202 - dense_1_loss_18: 1.2157 - dense_1_loss_19: 1.1881 - dense_1_loss_20: 1.2092 - dense_1_loss_21: 1.1384 - dense_1_loss_22: 1.2132 - dense_1_loss_23: 1.2221 - dense_1_loss_24: 1.2087 - dense_1_loss_25: 1.2098 - dense_1_loss_26: 1.1633 - dense_1_loss_27: 1.2749 - dense_1_loss_28: 1.1503 - dense_1_loss_29: 1.2028 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.3000 - dense_1_acc_3: 0.4000 - dense_1_acc_4: 0.3333 - dense_1_acc_5: 0.4167 - dense_1_acc_6: 0.5667 - dense_1_acc_7: 0.6833 - dense_1_acc_8: 0.6833 - dense_1_acc_9: 0.6167 - dense_1_acc_10: 0.6333 - dense_1_acc_11: 0.6667 - dense_1_acc_12: 0.7500 - dense_1_acc_13: 0.8000 - dense_1_acc_14: 0.7167 - dense_1_acc_15: 0.8000 - dense_1_acc_16: 0.7500 - dense_1_acc_17: 0.8333 - dense_1_acc_18: 0.7167 - dense_1_acc_19: 0.7833 - dense_1_acc_20: 0.8000 - dense_1_acc_21: 0.7833 - dense_1_acc_22: 0.7833 - dense_1_acc_23: 0.7333 - dense_1_acc_24: 0.7167 - dense_1_acc_25: 0.7000 - dense_1_acc_26: 0.7333 - dense_1_acc_27: 0.7000 - dense_1_acc_28: 0.8167 - dense_1_acc_29: 0.7833 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 25/100\n", + "60/60 [==============================] - 0s - loss: 40.8146 - dense_1_loss_1: 4.0714 - dense_1_loss_2: 3.2611 - dense_1_loss_3: 2.3723 - dense_1_loss_4: 2.0120 - dense_1_loss_5: 1.6697 - dense_1_loss_6: 1.4262 - dense_1_loss_7: 1.2887 - dense_1_loss_8: 1.2742 - dense_1_loss_9: 1.2645 - dense_1_loss_10: 1.2541 - dense_1_loss_11: 1.2271 - dense_1_loss_12: 1.1437 - dense_1_loss_13: 0.9847 - dense_1_loss_14: 1.0188 - dense_1_loss_15: 1.0460 - dense_1_loss_16: 1.1304 - dense_1_loss_17: 1.0321 - dense_1_loss_18: 1.1291 - dense_1_loss_19: 1.1186 - dense_1_loss_20: 1.0755 - dense_1_loss_21: 1.0576 - dense_1_loss_22: 1.1128 - dense_1_loss_23: 1.1334 - dense_1_loss_24: 1.1490 - dense_1_loss_25: 1.1071 - dense_1_loss_26: 1.1069 - dense_1_loss_27: 1.1911 - dense_1_loss_28: 1.0716 - dense_1_loss_29: 1.0849 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.3000 - dense_1_acc_3: 0.4000 - dense_1_acc_4: 0.3333 - dense_1_acc_5: 0.4667 - dense_1_acc_6: 0.6500 - dense_1_acc_7: 0.7833 - dense_1_acc_8: 0.6833 - dense_1_acc_9: 0.6667 - dense_1_acc_10: 0.6833 - dense_1_acc_11: 0.7000 - dense_1_acc_12: 0.8000 - dense_1_acc_13: 0.8833 - dense_1_acc_14: 0.8667 - dense_1_acc_15: 0.8333 - dense_1_acc_16: 0.7333 - dense_1_acc_17: 0.9167 - dense_1_acc_18: 0.8167 - dense_1_acc_19: 0.8167 - dense_1_acc_20: 0.8833 - dense_1_acc_21: 0.8167 - dense_1_acc_22: 0.8333 - dense_1_acc_23: 0.7667 - dense_1_acc_24: 0.7000 - dense_1_acc_25: 0.7500 - dense_1_acc_26: 0.7667 - dense_1_acc_27: 0.7167 - dense_1_acc_28: 0.8500 - dense_1_acc_29: 0.8667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 26/100\n", + "60/60 [==============================] - 0s - loss: 38.3175 - dense_1_loss_1: 4.0618 - dense_1_loss_2: 3.2017 - dense_1_loss_3: 2.2836 - dense_1_loss_4: 1.9052 - dense_1_loss_5: 1.5765 - dense_1_loss_6: 1.3229 - dense_1_loss_7: 1.1677 - dense_1_loss_8: 1.1717 - dense_1_loss_9: 1.1745 - dense_1_loss_10: 1.1258 - dense_1_loss_11: 1.1417 - dense_1_loss_12: 1.0453 - dense_1_loss_13: 0.8932 - dense_1_loss_14: 0.9421 - dense_1_loss_15: 0.9562 - dense_1_loss_16: 1.0254 - dense_1_loss_17: 0.9611 - dense_1_loss_18: 1.0310 - dense_1_loss_19: 1.0220 - dense_1_loss_20: 0.9930 - dense_1_loss_21: 1.0052 - dense_1_loss_22: 1.0159 - dense_1_loss_23: 1.0510 - dense_1_loss_24: 1.0509 - dense_1_loss_25: 1.0435 - dense_1_loss_26: 1.0095 - dense_1_loss_27: 1.0892 - dense_1_loss_28: 1.0074 - dense_1_loss_29: 1.0422 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.3000 - dense_1_acc_3: 0.4167 - dense_1_acc_4: 0.3333 - dense_1_acc_5: 0.4833 - dense_1_acc_6: 0.6833 - dense_1_acc_7: 0.8000 - dense_1_acc_8: 0.7500 - dense_1_acc_9: 0.8000 - dense_1_acc_10: 0.8000 - dense_1_acc_11: 0.7333 - dense_1_acc_12: 0.8000 - dense_1_acc_13: 0.9500 - dense_1_acc_14: 0.8333 - dense_1_acc_15: 0.8667 - dense_1_acc_16: 0.8000 - dense_1_acc_17: 0.9167 - dense_1_acc_18: 0.9000 - dense_1_acc_19: 0.8500 - dense_1_acc_20: 0.9000 - dense_1_acc_21: 0.8500 - dense_1_acc_22: 0.8833 - dense_1_acc_23: 0.8000 - dense_1_acc_24: 0.7833 - dense_1_acc_25: 0.8333 - dense_1_acc_26: 0.8333 - dense_1_acc_27: 0.8000 - dense_1_acc_28: 0.8667 - dense_1_acc_29: 0.8667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 27/100\n", + "60/60 [==============================] - 0s - loss: 36.0205 - dense_1_loss_1: 4.0515 - dense_1_loss_2: 3.1443 - dense_1_loss_3: 2.2020 - dense_1_loss_4: 1.7932 - dense_1_loss_5: 1.4843 - dense_1_loss_6: 1.2328 - dense_1_loss_7: 1.0851 - dense_1_loss_8: 1.0801 - dense_1_loss_9: 1.0869 - dense_1_loss_10: 1.0429 - dense_1_loss_11: 1.0767 - dense_1_loss_12: 0.9757 - dense_1_loss_13: 0.8379 - dense_1_loss_14: 0.8643 - dense_1_loss_15: 0.8900 - dense_1_loss_16: 0.9171 - dense_1_loss_17: 0.9034 - dense_1_loss_18: 0.9265 - dense_1_loss_19: 0.9491 - dense_1_loss_20: 0.9510 - dense_1_loss_21: 0.9288 - dense_1_loss_22: 0.9309 - dense_1_loss_23: 0.9326 - dense_1_loss_24: 0.9740 - dense_1_loss_25: 1.0095 - dense_1_loss_26: 0.9176 - dense_1_loss_27: 0.9656 - dense_1_loss_28: 0.8980 - dense_1_loss_29: 0.9687 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.3000 - dense_1_acc_3: 0.4167 - dense_1_acc_4: 0.3333 - dense_1_acc_5: 0.5667 - dense_1_acc_6: 0.6833 - dense_1_acc_7: 0.8000 - dense_1_acc_8: 0.8000 - dense_1_acc_9: 0.7833 - dense_1_acc_10: 0.8167 - dense_1_acc_11: 0.7500 - dense_1_acc_12: 0.8167 - dense_1_acc_13: 0.9500 - dense_1_acc_14: 0.8833 - dense_1_acc_15: 0.9000 - dense_1_acc_16: 0.8500 - dense_1_acc_17: 0.9500 - dense_1_acc_18: 0.9167 - dense_1_acc_19: 0.8500 - dense_1_acc_20: 0.9000 - dense_1_acc_21: 0.8500 - dense_1_acc_22: 0.8833 - dense_1_acc_23: 0.9000 - dense_1_acc_24: 0.8500 - dense_1_acc_25: 0.7833 - dense_1_acc_26: 0.8500 - dense_1_acc_27: 0.9000 - dense_1_acc_28: 0.9167 - dense_1_acc_29: 0.8667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 28/100\n", + "60/60 [==============================] - 0s - loss: 33.7848 - dense_1_loss_1: 4.0425 - dense_1_loss_2: 3.0868 - dense_1_loss_3: 2.1200 - dense_1_loss_4: 1.6852 - dense_1_loss_5: 1.3932 - dense_1_loss_6: 1.1289 - dense_1_loss_7: 0.9900 - dense_1_loss_8: 1.0024 - dense_1_loss_9: 1.0050 - dense_1_loss_10: 0.9488 - dense_1_loss_11: 0.9817 - dense_1_loss_12: 0.8831 - dense_1_loss_13: 0.7756 - dense_1_loss_14: 0.7834 - dense_1_loss_15: 0.8331 - dense_1_loss_16: 0.8348 - dense_1_loss_17: 0.8140 - dense_1_loss_18: 0.8562 - dense_1_loss_19: 0.8758 - dense_1_loss_20: 0.8798 - dense_1_loss_21: 0.8379 - dense_1_loss_22: 0.8613 - dense_1_loss_23: 0.8792 - dense_1_loss_24: 0.8986 - dense_1_loss_25: 0.9192 - dense_1_loss_26: 0.8616 - dense_1_loss_27: 0.8881 - dense_1_loss_28: 0.8326 - dense_1_loss_29: 0.8860 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.3000 - dense_1_acc_3: 0.4167 - dense_1_acc_4: 0.3833 - dense_1_acc_5: 0.6167 - dense_1_acc_6: 0.7167 - dense_1_acc_7: 0.8500 - dense_1_acc_8: 0.9000 - dense_1_acc_9: 0.8667 - dense_1_acc_10: 0.9000 - dense_1_acc_11: 0.8000 - dense_1_acc_12: 0.8333 - dense_1_acc_13: 0.9500 - dense_1_acc_14: 0.9333 - dense_1_acc_15: 0.9500 - dense_1_acc_16: 0.9667 - dense_1_acc_17: 0.9500 - dense_1_acc_18: 0.9500 - dense_1_acc_19: 0.9000 - dense_1_acc_20: 0.9500 - dense_1_acc_21: 0.9333 - dense_1_acc_22: 0.9333 - dense_1_acc_23: 0.8833 - dense_1_acc_24: 0.8833 - dense_1_acc_25: 0.8667 - dense_1_acc_26: 0.9500 - dense_1_acc_27: 0.9333 - dense_1_acc_28: 0.9500 - dense_1_acc_29: 0.8833 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 29/100\n", + "60/60 [==============================] - 0s - loss: 31.6634 - dense_1_loss_1: 4.0341 - dense_1_loss_2: 3.0323 - dense_1_loss_3: 2.0400 - dense_1_loss_4: 1.5919 - dense_1_loss_5: 1.2979 - dense_1_loss_6: 1.0361 - dense_1_loss_7: 0.9105 - dense_1_loss_8: 0.9188 - dense_1_loss_9: 0.9485 - dense_1_loss_10: 0.8638 - dense_1_loss_11: 0.8978 - dense_1_loss_12: 0.8210 - dense_1_loss_13: 0.7204 - dense_1_loss_14: 0.7183 - dense_1_loss_15: 0.7616 - dense_1_loss_16: 0.7708 - dense_1_loss_17: 0.7434 - dense_1_loss_18: 0.8088 - dense_1_loss_19: 0.7975 - dense_1_loss_20: 0.8116 - dense_1_loss_21: 0.7497 - dense_1_loss_22: 0.7999 - dense_1_loss_23: 0.7813 - dense_1_loss_24: 0.8122 - dense_1_loss_25: 0.8206 - dense_1_loss_26: 0.7877 - dense_1_loss_27: 0.8113 - dense_1_loss_28: 0.7804 - dense_1_loss_29: 0.7951 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.3000 - dense_1_acc_3: 0.4167 - dense_1_acc_4: 0.4000 - dense_1_acc_5: 0.6833 - dense_1_acc_6: 0.7500 - dense_1_acc_7: 0.9000 - dense_1_acc_8: 0.9000 - dense_1_acc_9: 0.8833 - dense_1_acc_10: 0.9333 - dense_1_acc_11: 0.8500 - dense_1_acc_12: 0.9000 - dense_1_acc_13: 0.9500 - dense_1_acc_14: 0.9000 - dense_1_acc_15: 0.9833 - dense_1_acc_16: 0.9833 - dense_1_acc_17: 0.9833 - dense_1_acc_18: 0.9667 - dense_1_acc_19: 0.9333 - dense_1_acc_20: 0.9833 - dense_1_acc_21: 0.9833 - dense_1_acc_22: 0.9167 - dense_1_acc_23: 0.9167 - dense_1_acc_24: 0.9167 - dense_1_acc_25: 0.9167 - dense_1_acc_26: 0.9667 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 0.9667 - dense_1_acc_29: 0.9500 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 30/100\n", + "60/60 [==============================] - 0s - loss: 29.7061 - dense_1_loss_1: 4.0260 - dense_1_loss_2: 2.9749 - dense_1_loss_3: 1.9639 - dense_1_loss_4: 1.4964 - dense_1_loss_5: 1.2097 - dense_1_loss_6: 0.9430 - dense_1_loss_7: 0.8519 - dense_1_loss_8: 0.8415 - dense_1_loss_9: 0.8529 - dense_1_loss_10: 0.7872 - dense_1_loss_11: 0.8304 - dense_1_loss_12: 0.7575 - dense_1_loss_13: 0.6494 - dense_1_loss_14: 0.6410 - dense_1_loss_15: 0.6851 - dense_1_loss_16: 0.6922 - dense_1_loss_17: 0.6846 - dense_1_loss_18: 0.7506 - dense_1_loss_19: 0.7225 - dense_1_loss_20: 0.7484 - dense_1_loss_21: 0.6899 - dense_1_loss_22: 0.7451 - dense_1_loss_23: 0.7032 - dense_1_loss_24: 0.7487 - dense_1_loss_25: 0.7781 - dense_1_loss_26: 0.7211 - dense_1_loss_27: 0.7470 - dense_1_loss_28: 0.7125 - dense_1_loss_29: 0.7516 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.3000 - dense_1_acc_3: 0.4833 - dense_1_acc_4: 0.4667 - dense_1_acc_5: 0.7000 - dense_1_acc_6: 0.8333 - dense_1_acc_7: 0.9500 - dense_1_acc_8: 0.9333 - dense_1_acc_9: 0.9000 - dense_1_acc_10: 0.9500 - dense_1_acc_11: 0.8667 - dense_1_acc_12: 0.9333 - dense_1_acc_13: 0.9500 - dense_1_acc_14: 0.9667 - dense_1_acc_15: 0.9833 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 0.9500 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 0.9333 - dense_1_acc_23: 0.9500 - dense_1_acc_24: 0.9667 - dense_1_acc_25: 0.9667 - dense_1_acc_26: 0.9667 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 0.9667 - dense_1_acc_29: 0.9500 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 31/100\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "60/60 [==============================] - 0s - loss: 27.8177 - dense_1_loss_1: 4.0181 - dense_1_loss_2: 2.9233 - dense_1_loss_3: 1.8878 - dense_1_loss_4: 1.4001 - dense_1_loss_5: 1.1331 - dense_1_loss_6: 0.8527 - dense_1_loss_7: 0.7803 - dense_1_loss_8: 0.7760 - dense_1_loss_9: 0.7796 - dense_1_loss_10: 0.7254 - dense_1_loss_11: 0.7567 - dense_1_loss_12: 0.6858 - dense_1_loss_13: 0.5967 - dense_1_loss_14: 0.5906 - dense_1_loss_15: 0.6053 - dense_1_loss_16: 0.6292 - dense_1_loss_17: 0.6285 - dense_1_loss_18: 0.6745 - dense_1_loss_19: 0.6555 - dense_1_loss_20: 0.6847 - dense_1_loss_21: 0.6409 - dense_1_loss_22: 0.6845 - dense_1_loss_23: 0.6301 - dense_1_loss_24: 0.6706 - dense_1_loss_25: 0.7265 - dense_1_loss_26: 0.6745 - dense_1_loss_27: 0.6844 - dense_1_loss_28: 0.6329 - dense_1_loss_29: 0.6896 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.3333 - dense_1_acc_3: 0.4833 - dense_1_acc_4: 0.5333 - dense_1_acc_5: 0.7167 - dense_1_acc_6: 0.8833 - dense_1_acc_7: 0.9667 - dense_1_acc_8: 0.9667 - dense_1_acc_9: 0.9167 - dense_1_acc_10: 0.9833 - dense_1_acc_11: 0.9167 - dense_1_acc_12: 0.9833 - dense_1_acc_13: 0.9500 - dense_1_acc_14: 0.9667 - dense_1_acc_15: 0.9833 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 0.9833 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 0.9833 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 0.9833 - dense_1_acc_29: 0.9667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 32/100\n", + "60/60 [==============================] - 0s - loss: 26.0561 - dense_1_loss_1: 4.0111 - dense_1_loss_2: 2.8688 - dense_1_loss_3: 1.8167 - dense_1_loss_4: 1.3135 - dense_1_loss_5: 1.0543 - dense_1_loss_6: 0.7921 - dense_1_loss_7: 0.7131 - dense_1_loss_8: 0.7027 - dense_1_loss_9: 0.7253 - dense_1_loss_10: 0.6496 - dense_1_loss_11: 0.6921 - dense_1_loss_12: 0.6136 - dense_1_loss_13: 0.5311 - dense_1_loss_14: 0.5145 - dense_1_loss_15: 0.5617 - dense_1_loss_16: 0.5770 - dense_1_loss_17: 0.5688 - dense_1_loss_18: 0.6178 - dense_1_loss_19: 0.6038 - dense_1_loss_20: 0.6121 - dense_1_loss_21: 0.5781 - dense_1_loss_22: 0.6214 - dense_1_loss_23: 0.5971 - dense_1_loss_24: 0.6164 - dense_1_loss_25: 0.6363 - dense_1_loss_26: 0.6279 - dense_1_loss_27: 0.6188 - dense_1_loss_28: 0.5768 - dense_1_loss_29: 0.6438 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.3333 - dense_1_acc_3: 0.5167 - dense_1_acc_4: 0.6667 - dense_1_acc_5: 0.7500 - dense_1_acc_6: 0.8667 - dense_1_acc_7: 0.9667 - dense_1_acc_8: 0.9833 - dense_1_acc_9: 0.9333 - dense_1_acc_10: 0.9833 - dense_1_acc_11: 0.9167 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 0.9833 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 0.9833 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 0.9833 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 0.9833 - dense_1_acc_29: 0.9667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 33/100\n", + "60/60 [==============================] - 0s - loss: 24.4278 - dense_1_loss_1: 4.0040 - dense_1_loss_2: 2.8121 - dense_1_loss_3: 1.7462 - dense_1_loss_4: 1.2290 - dense_1_loss_5: 0.9743 - dense_1_loss_6: 0.7325 - dense_1_loss_7: 0.6551 - dense_1_loss_8: 0.6464 - dense_1_loss_9: 0.6683 - dense_1_loss_10: 0.5891 - dense_1_loss_11: 0.6487 - dense_1_loss_12: 0.5629 - dense_1_loss_13: 0.4798 - dense_1_loss_14: 0.4778 - dense_1_loss_15: 0.5141 - dense_1_loss_16: 0.5406 - dense_1_loss_17: 0.5093 - dense_1_loss_18: 0.5536 - dense_1_loss_19: 0.5704 - dense_1_loss_20: 0.5526 - dense_1_loss_21: 0.5321 - dense_1_loss_22: 0.5522 - dense_1_loss_23: 0.5227 - dense_1_loss_24: 0.5615 - dense_1_loss_25: 0.5688 - dense_1_loss_26: 0.5624 - dense_1_loss_27: 0.5525 - dense_1_loss_28: 0.5284 - dense_1_loss_29: 0.5805 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.3833 - dense_1_acc_3: 0.5500 - dense_1_acc_4: 0.7000 - dense_1_acc_5: 0.8333 - dense_1_acc_6: 0.9000 - dense_1_acc_7: 0.9667 - dense_1_acc_8: 0.9833 - dense_1_acc_9: 0.9500 - dense_1_acc_10: 0.9833 - dense_1_acc_11: 0.9167 - dense_1_acc_12: 0.9833 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 0.9833 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 0.9667 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 0.9833 - dense_1_acc_29: 0.9667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 34/100\n", + "60/60 [==============================] - 0s - loss: 22.9095 - dense_1_loss_1: 3.9968 - dense_1_loss_2: 2.7601 - dense_1_loss_3: 1.6792 - dense_1_loss_4: 1.1448 - dense_1_loss_5: 0.8968 - dense_1_loss_6: 0.6668 - dense_1_loss_7: 0.6069 - dense_1_loss_8: 0.5920 - dense_1_loss_9: 0.6197 - dense_1_loss_10: 0.5248 - dense_1_loss_11: 0.5940 - dense_1_loss_12: 0.5129 - dense_1_loss_13: 0.4285 - dense_1_loss_14: 0.4392 - dense_1_loss_15: 0.4631 - dense_1_loss_16: 0.5002 - dense_1_loss_17: 0.4625 - dense_1_loss_18: 0.5015 - dense_1_loss_19: 0.5122 - dense_1_loss_20: 0.5092 - dense_1_loss_21: 0.4810 - dense_1_loss_22: 0.4989 - dense_1_loss_23: 0.4674 - dense_1_loss_24: 0.5078 - dense_1_loss_25: 0.5154 - dense_1_loss_26: 0.5083 - dense_1_loss_27: 0.5024 - dense_1_loss_28: 0.4902 - dense_1_loss_29: 0.5269 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.3833 - dense_1_acc_3: 0.5833 - dense_1_acc_4: 0.7000 - dense_1_acc_5: 0.8500 - dense_1_acc_6: 0.9333 - dense_1_acc_7: 0.9667 - dense_1_acc_8: 0.9667 - dense_1_acc_9: 0.9500 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 0.9167 - dense_1_acc_12: 0.9667 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 0.9833 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 0.9833 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 0.9833 - dense_1_acc_29: 0.9667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 35/100\n", + "60/60 [==============================] - 0s - loss: 21.5532 - dense_1_loss_1: 3.9900 - dense_1_loss_2: 2.7059 - dense_1_loss_3: 1.6127 - dense_1_loss_4: 1.0590 - dense_1_loss_5: 0.8290 - dense_1_loss_6: 0.6149 - dense_1_loss_7: 0.5573 - dense_1_loss_8: 0.5397 - dense_1_loss_9: 0.5651 - dense_1_loss_10: 0.4755 - dense_1_loss_11: 0.5361 - dense_1_loss_12: 0.4597 - dense_1_loss_13: 0.3866 - dense_1_loss_14: 0.3862 - dense_1_loss_15: 0.4262 - dense_1_loss_16: 0.4494 - dense_1_loss_17: 0.4241 - dense_1_loss_18: 0.4588 - dense_1_loss_19: 0.4541 - dense_1_loss_20: 0.4694 - dense_1_loss_21: 0.4399 - dense_1_loss_22: 0.4486 - dense_1_loss_23: 0.4392 - dense_1_loss_24: 0.4614 - dense_1_loss_25: 0.4768 - dense_1_loss_26: 0.4770 - dense_1_loss_27: 0.4658 - dense_1_loss_28: 0.4473 - dense_1_loss_29: 0.4975 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.3833 - dense_1_acc_3: 0.5833 - dense_1_acc_4: 0.7333 - dense_1_acc_5: 0.8667 - dense_1_acc_6: 0.9333 - dense_1_acc_7: 0.9833 - dense_1_acc_8: 0.9667 - dense_1_acc_9: 0.9667 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 0.9333 - dense_1_acc_12: 0.9833 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 0.9833 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 0.9667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 36/100\n", + "60/60 [==============================] - 0s - loss: 20.2400 - dense_1_loss_1: 3.9838 - dense_1_loss_2: 2.6528 - dense_1_loss_3: 1.5476 - dense_1_loss_4: 0.9821 - dense_1_loss_5: 0.7625 - dense_1_loss_6: 0.5707 - dense_1_loss_7: 0.5068 - dense_1_loss_8: 0.4933 - dense_1_loss_9: 0.5105 - dense_1_loss_10: 0.4297 - dense_1_loss_11: 0.4830 - dense_1_loss_12: 0.4188 - dense_1_loss_13: 0.3629 - dense_1_loss_14: 0.3593 - dense_1_loss_15: 0.3770 - dense_1_loss_16: 0.4173 - dense_1_loss_17: 0.3862 - dense_1_loss_18: 0.4134 - dense_1_loss_19: 0.4128 - dense_1_loss_20: 0.4220 - dense_1_loss_21: 0.4019 - dense_1_loss_22: 0.4135 - dense_1_loss_23: 0.3921 - dense_1_loss_24: 0.4180 - dense_1_loss_25: 0.4395 - dense_1_loss_26: 0.4253 - dense_1_loss_27: 0.4206 - dense_1_loss_28: 0.3856 - dense_1_loss_29: 0.4510 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.4000 - dense_1_acc_3: 0.6000 - dense_1_acc_4: 0.8333 - dense_1_acc_5: 0.8667 - dense_1_acc_6: 0.9667 - dense_1_acc_7: 0.9833 - dense_1_acc_8: 0.9833 - dense_1_acc_9: 0.9667 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 0.9167 - dense_1_acc_12: 0.9833 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 0.9667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 37/100\n", + "60/60 [==============================] - 0s - loss: 19.0656 - dense_1_loss_1: 3.9772 - dense_1_loss_2: 2.6016 - dense_1_loss_3: 1.4883 - dense_1_loss_4: 0.9144 - dense_1_loss_5: 0.7015 - dense_1_loss_6: 0.5254 - dense_1_loss_7: 0.4673 - dense_1_loss_8: 0.4499 - dense_1_loss_9: 0.4649 - dense_1_loss_10: 0.3884 - dense_1_loss_11: 0.4509 - dense_1_loss_12: 0.3795 - dense_1_loss_13: 0.3233 - dense_1_loss_14: 0.3257 - dense_1_loss_15: 0.3449 - dense_1_loss_16: 0.3730 - dense_1_loss_17: 0.3505 - dense_1_loss_18: 0.3741 - dense_1_loss_19: 0.3721 - dense_1_loss_20: 0.3834 - dense_1_loss_21: 0.3614 - dense_1_loss_22: 0.3741 - dense_1_loss_23: 0.3577 - dense_1_loss_24: 0.3770 - dense_1_loss_25: 0.3978 - dense_1_loss_26: 0.3797 - dense_1_loss_27: 0.3793 - dense_1_loss_28: 0.3593 - dense_1_loss_29: 0.4232 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.4000 - dense_1_acc_3: 0.5833 - dense_1_acc_4: 0.8333 - dense_1_acc_5: 0.8833 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 0.9833 - dense_1_acc_8: 0.9833 - dense_1_acc_9: 0.9833 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 0.9333 - dense_1_acc_12: 0.9667 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 0.9667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 38/100\n", + "60/60 [==============================] - 0s - loss: 17.9676 - dense_1_loss_1: 3.9711 - dense_1_loss_2: 2.5485 - dense_1_loss_3: 1.4286 - dense_1_loss_4: 0.8440 - dense_1_loss_5: 0.6445 - dense_1_loss_6: 0.4791 - dense_1_loss_7: 0.4292 - dense_1_loss_8: 0.4123 - dense_1_loss_9: 0.4177 - dense_1_loss_10: 0.3490 - dense_1_loss_11: 0.4141 - dense_1_loss_12: 0.3406 - dense_1_loss_13: 0.2968 - dense_1_loss_14: 0.3029 - dense_1_loss_15: 0.3080 - dense_1_loss_16: 0.3358 - dense_1_loss_17: 0.3232 - dense_1_loss_18: 0.3373 - dense_1_loss_19: 0.3404 - dense_1_loss_20: 0.3490 - dense_1_loss_21: 0.3327 - dense_1_loss_22: 0.3346 - dense_1_loss_23: 0.3261 - dense_1_loss_24: 0.3371 - dense_1_loss_25: 0.3630 - dense_1_loss_26: 0.3500 - dense_1_loss_27: 0.3456 - dense_1_loss_28: 0.3307 - dense_1_loss_29: 0.3756 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.4167 - dense_1_acc_3: 0.6167 - dense_1_acc_4: 0.8333 - dense_1_acc_5: 0.9000 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 0.9833 - dense_1_acc_8: 0.9833 - dense_1_acc_9: 0.9833 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 0.9833 - dense_1_acc_12: 0.9833 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 0.9667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 39/100\n", + "60/60 [==============================] - 0s - loss: 16.9770 - dense_1_loss_1: 3.9655 - dense_1_loss_2: 2.4968 - dense_1_loss_3: 1.3715 - dense_1_loss_4: 0.7846 - dense_1_loss_5: 0.5948 - dense_1_loss_6: 0.4417 - dense_1_loss_7: 0.3954 - dense_1_loss_8: 0.3779 - dense_1_loss_9: 0.3790 - dense_1_loss_10: 0.3163 - dense_1_loss_11: 0.3756 - dense_1_loss_12: 0.3138 - dense_1_loss_13: 0.2644 - dense_1_loss_14: 0.2830 - dense_1_loss_15: 0.2780 - dense_1_loss_16: 0.3080 - dense_1_loss_17: 0.2951 - dense_1_loss_18: 0.3061 - dense_1_loss_19: 0.3097 - dense_1_loss_20: 0.3185 - dense_1_loss_21: 0.2992 - dense_1_loss_22: 0.3099 - dense_1_loss_23: 0.2835 - dense_1_loss_24: 0.3036 - dense_1_loss_25: 0.3281 - dense_1_loss_26: 0.3320 - dense_1_loss_27: 0.3111 - dense_1_loss_28: 0.2954 - dense_1_loss_29: 0.3384 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.4333 - dense_1_acc_3: 0.6167 - dense_1_acc_4: 0.8500 - dense_1_acc_5: 0.9167 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 0.9833 - dense_1_acc_8: 0.9833 - dense_1_acc_9: 0.9833 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 0.9833 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 0.9667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 40/100\n", + "60/60 [==============================] - 0s - loss: 16.0670 - dense_1_loss_1: 3.9596 - dense_1_loss_2: 2.4460 - dense_1_loss_3: 1.3226 - dense_1_loss_4: 0.7254 - dense_1_loss_5: 0.5457 - dense_1_loss_6: 0.4076 - dense_1_loss_7: 0.3611 - dense_1_loss_8: 0.3347 - dense_1_loss_9: 0.3472 - dense_1_loss_10: 0.2849 - dense_1_loss_11: 0.3420 - dense_1_loss_12: 0.2801 - dense_1_loss_13: 0.2389 - dense_1_loss_14: 0.2436 - dense_1_loss_15: 0.2635 - dense_1_loss_16: 0.2754 - dense_1_loss_17: 0.2704 - dense_1_loss_18: 0.2768 - dense_1_loss_19: 0.2849 - dense_1_loss_20: 0.2884 - dense_1_loss_21: 0.2716 - dense_1_loss_22: 0.2793 - dense_1_loss_23: 0.2646 - dense_1_loss_24: 0.2760 - dense_1_loss_25: 0.2976 - dense_1_loss_26: 0.3049 - dense_1_loss_27: 0.2849 - dense_1_loss_28: 0.2748 - dense_1_loss_29: 0.3146 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.4333 - dense_1_acc_3: 0.6333 - dense_1_acc_4: 0.8500 - dense_1_acc_5: 0.9333 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 0.9833 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 0.9833 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 0.9833 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 0.9667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 41/100\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "60/60 [==============================] - 0s - loss: 15.2529 - dense_1_loss_1: 3.9544 - dense_1_loss_2: 2.3966 - dense_1_loss_3: 1.2687 - dense_1_loss_4: 0.6774 - dense_1_loss_5: 0.5024 - dense_1_loss_6: 0.3812 - dense_1_loss_7: 0.3285 - dense_1_loss_8: 0.3046 - dense_1_loss_9: 0.3156 - dense_1_loss_10: 0.2589 - dense_1_loss_11: 0.3035 - dense_1_loss_12: 0.2607 - dense_1_loss_13: 0.2246 - dense_1_loss_14: 0.2462 - dense_1_loss_15: 0.2265 - dense_1_loss_16: 0.2568 - dense_1_loss_17: 0.2383 - dense_1_loss_18: 0.2535 - dense_1_loss_19: 0.2576 - dense_1_loss_20: 0.2611 - dense_1_loss_21: 0.2514 - dense_1_loss_22: 0.2588 - dense_1_loss_23: 0.2354 - dense_1_loss_24: 0.2524 - dense_1_loss_25: 0.2707 - dense_1_loss_26: 0.2689 - dense_1_loss_27: 0.2652 - dense_1_loss_28: 0.2467 - dense_1_loss_29: 0.2863 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.4333 - dense_1_acc_3: 0.6500 - dense_1_acc_4: 0.8833 - dense_1_acc_5: 0.9500 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 0.9833 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 0.9833 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 0.9833 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 0.9667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 42/100\n", + "60/60 [==============================] - 0s - loss: 14.5065 - dense_1_loss_1: 3.9485 - dense_1_loss_2: 2.3516 - dense_1_loss_3: 1.2202 - dense_1_loss_4: 0.6335 - dense_1_loss_5: 0.4658 - dense_1_loss_6: 0.3517 - dense_1_loss_7: 0.3073 - dense_1_loss_8: 0.2741 - dense_1_loss_9: 0.2929 - dense_1_loss_10: 0.2326 - dense_1_loss_11: 0.2891 - dense_1_loss_12: 0.2363 - dense_1_loss_13: 0.2024 - dense_1_loss_14: 0.2065 - dense_1_loss_15: 0.2181 - dense_1_loss_16: 0.2337 - dense_1_loss_17: 0.2180 - dense_1_loss_18: 0.2269 - dense_1_loss_19: 0.2313 - dense_1_loss_20: 0.2425 - dense_1_loss_21: 0.2306 - dense_1_loss_22: 0.2312 - dense_1_loss_23: 0.2107 - dense_1_loss_24: 0.2246 - dense_1_loss_25: 0.2515 - dense_1_loss_26: 0.2455 - dense_1_loss_27: 0.2361 - dense_1_loss_28: 0.2248 - dense_1_loss_29: 0.2686 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.4333 - dense_1_acc_3: 0.6500 - dense_1_acc_4: 0.9000 - dense_1_acc_5: 0.9667 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 0.9833 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 0.9833 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 0.9833 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 0.9667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 43/100\n", + "60/60 [==============================] - 0s - loss: 13.8373 - dense_1_loss_1: 3.9440 - dense_1_loss_2: 2.3025 - dense_1_loss_3: 1.1717 - dense_1_loss_4: 0.5890 - dense_1_loss_5: 0.4301 - dense_1_loss_6: 0.3248 - dense_1_loss_7: 0.2817 - dense_1_loss_8: 0.2546 - dense_1_loss_9: 0.2660 - dense_1_loss_10: 0.2147 - dense_1_loss_11: 0.2686 - dense_1_loss_12: 0.2150 - dense_1_loss_13: 0.1853 - dense_1_loss_14: 0.1848 - dense_1_loss_15: 0.2041 - dense_1_loss_16: 0.2100 - dense_1_loss_17: 0.2053 - dense_1_loss_18: 0.2071 - dense_1_loss_19: 0.2139 - dense_1_loss_20: 0.2197 - dense_1_loss_21: 0.2124 - dense_1_loss_22: 0.2034 - dense_1_loss_23: 0.2008 - dense_1_loss_24: 0.2072 - dense_1_loss_25: 0.2268 - dense_1_loss_26: 0.2216 - dense_1_loss_27: 0.2167 - dense_1_loss_28: 0.2117 - dense_1_loss_29: 0.2436 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.4333 - dense_1_acc_3: 0.6500 - dense_1_acc_4: 0.9000 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 0.9833 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 0.9833 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 0.9833 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 0.9667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 44/100\n", + "60/60 [==============================] - 0s - loss: 13.2177 - dense_1_loss_1: 3.9386 - dense_1_loss_2: 2.2562 - dense_1_loss_3: 1.1255 - dense_1_loss_4: 0.5486 - dense_1_loss_5: 0.3993 - dense_1_loss_6: 0.3025 - dense_1_loss_7: 0.2564 - dense_1_loss_8: 0.2345 - dense_1_loss_9: 0.2460 - dense_1_loss_10: 0.1942 - dense_1_loss_11: 0.2437 - dense_1_loss_12: 0.1987 - dense_1_loss_13: 0.1686 - dense_1_loss_14: 0.1807 - dense_1_loss_15: 0.1752 - dense_1_loss_16: 0.1953 - dense_1_loss_17: 0.1844 - dense_1_loss_18: 0.1901 - dense_1_loss_19: 0.1980 - dense_1_loss_20: 0.2013 - dense_1_loss_21: 0.1911 - dense_1_loss_22: 0.1918 - dense_1_loss_23: 0.1833 - dense_1_loss_24: 0.1919 - dense_1_loss_25: 0.1997 - dense_1_loss_26: 0.2072 - dense_1_loss_27: 0.2015 - dense_1_loss_28: 0.1940 - dense_1_loss_29: 0.2194 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.4333 - dense_1_acc_3: 0.7333 - dense_1_acc_4: 0.9000 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 0.9833 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 0.9833 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 0.9833 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 0.9667 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 45/100\n", + "60/60 [==============================] - 0s - loss: 12.6360 - dense_1_loss_1: 3.9345 - dense_1_loss_2: 2.2119 - dense_1_loss_3: 1.0799 - dense_1_loss_4: 0.5121 - dense_1_loss_5: 0.3681 - dense_1_loss_6: 0.2783 - dense_1_loss_7: 0.2343 - dense_1_loss_8: 0.2134 - dense_1_loss_9: 0.2234 - dense_1_loss_10: 0.1771 - dense_1_loss_11: 0.2244 - dense_1_loss_12: 0.1790 - dense_1_loss_13: 0.1555 - dense_1_loss_14: 0.1651 - dense_1_loss_15: 0.1633 - dense_1_loss_16: 0.1810 - dense_1_loss_17: 0.1663 - dense_1_loss_18: 0.1743 - dense_1_loss_19: 0.1806 - dense_1_loss_20: 0.1841 - dense_1_loss_21: 0.1741 - dense_1_loss_22: 0.1761 - dense_1_loss_23: 0.1632 - dense_1_loss_24: 0.1746 - dense_1_loss_25: 0.1848 - dense_1_loss_26: 0.1918 - dense_1_loss_27: 0.1815 - dense_1_loss_28: 0.1785 - dense_1_loss_29: 0.2050 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.4500 - dense_1_acc_3: 0.7500 - dense_1_acc_4: 0.9000 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 0.9833 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 0.9833 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 0.9833 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 46/100\n", + "60/60 [==============================] - 0s - loss: 12.1317 - dense_1_loss_1: 3.9293 - dense_1_loss_2: 2.1679 - dense_1_loss_3: 1.0403 - dense_1_loss_4: 0.4788 - dense_1_loss_5: 0.3430 - dense_1_loss_6: 0.2594 - dense_1_loss_7: 0.2174 - dense_1_loss_8: 0.1956 - dense_1_loss_9: 0.2044 - dense_1_loss_10: 0.1634 - dense_1_loss_11: 0.2073 - dense_1_loss_12: 0.1628 - dense_1_loss_13: 0.1453 - dense_1_loss_14: 0.1458 - dense_1_loss_15: 0.1542 - dense_1_loss_16: 0.1636 - dense_1_loss_17: 0.1542 - dense_1_loss_18: 0.1606 - dense_1_loss_19: 0.1675 - dense_1_loss_20: 0.1694 - dense_1_loss_21: 0.1628 - dense_1_loss_22: 0.1615 - dense_1_loss_23: 0.1489 - dense_1_loss_24: 0.1579 - dense_1_loss_25: 0.1721 - dense_1_loss_26: 0.1748 - dense_1_loss_27: 0.1673 - dense_1_loss_28: 0.1650 - dense_1_loss_29: 0.1908 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.4833 - dense_1_acc_3: 0.7667 - dense_1_acc_4: 0.9333 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 0.9833 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 0.9833 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 0.9833 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 47/100\n", + "60/60 [==============================] - 0s - loss: 11.6713 - dense_1_loss_1: 3.9248 - dense_1_loss_2: 2.1258 - dense_1_loss_3: 1.0013 - dense_1_loss_4: 0.4499 - dense_1_loss_5: 0.3187 - dense_1_loss_6: 0.2443 - dense_1_loss_7: 0.2008 - dense_1_loss_8: 0.1794 - dense_1_loss_9: 0.1882 - dense_1_loss_10: 0.1506 - dense_1_loss_11: 0.1903 - dense_1_loss_12: 0.1520 - dense_1_loss_13: 0.1332 - dense_1_loss_14: 0.1355 - dense_1_loss_15: 0.1385 - dense_1_loss_16: 0.1498 - dense_1_loss_17: 0.1434 - dense_1_loss_18: 0.1492 - dense_1_loss_19: 0.1531 - dense_1_loss_20: 0.1568 - dense_1_loss_21: 0.1519 - dense_1_loss_22: 0.1467 - dense_1_loss_23: 0.1383 - dense_1_loss_24: 0.1460 - dense_1_loss_25: 0.1583 - dense_1_loss_26: 0.1615 - dense_1_loss_27: 0.1581 - dense_1_loss_28: 0.1521 - dense_1_loss_29: 0.1727 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.4833 - dense_1_acc_3: 0.7667 - dense_1_acc_4: 0.9333 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 0.9833 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 0.9833 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 0.9833 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 0.9833 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 48/100\n", + "60/60 [==============================] - 0s - loss: 11.2458 - dense_1_loss_1: 3.9202 - dense_1_loss_2: 2.0852 - dense_1_loss_3: 0.9666 - dense_1_loss_4: 0.4240 - dense_1_loss_5: 0.2963 - dense_1_loss_6: 0.2271 - dense_1_loss_7: 0.1857 - dense_1_loss_8: 0.1639 - dense_1_loss_9: 0.1754 - dense_1_loss_10: 0.1371 - dense_1_loss_11: 0.1764 - dense_1_loss_12: 0.1424 - dense_1_loss_13: 0.1209 - dense_1_loss_14: 0.1275 - dense_1_loss_15: 0.1261 - dense_1_loss_16: 0.1425 - dense_1_loss_17: 0.1292 - dense_1_loss_18: 0.1379 - dense_1_loss_19: 0.1374 - dense_1_loss_20: 0.1471 - dense_1_loss_21: 0.1382 - dense_1_loss_22: 0.1372 - dense_1_loss_23: 0.1262 - dense_1_loss_24: 0.1348 - dense_1_loss_25: 0.1449 - dense_1_loss_26: 0.1467 - dense_1_loss_27: 0.1492 - dense_1_loss_28: 0.1402 - dense_1_loss_29: 0.1595 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.4833 - dense_1_acc_3: 0.7667 - dense_1_acc_4: 0.9500 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 0.9833 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 0.9833 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 0.9833 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 49/100\n", + "60/60 [==============================] - 0s - loss: 10.8676 - dense_1_loss_1: 3.9159 - dense_1_loss_2: 2.0455 - dense_1_loss_3: 0.9305 - dense_1_loss_4: 0.3992 - dense_1_loss_5: 0.2781 - dense_1_loss_6: 0.2127 - dense_1_loss_7: 0.1740 - dense_1_loss_8: 0.1519 - dense_1_loss_9: 0.1637 - dense_1_loss_10: 0.1273 - dense_1_loss_11: 0.1649 - dense_1_loss_12: 0.1308 - dense_1_loss_13: 0.1127 - dense_1_loss_14: 0.1173 - dense_1_loss_15: 0.1182 - dense_1_loss_16: 0.1314 - dense_1_loss_17: 0.1199 - dense_1_loss_18: 0.1290 - dense_1_loss_19: 0.1273 - dense_1_loss_20: 0.1350 - dense_1_loss_21: 0.1272 - dense_1_loss_22: 0.1275 - dense_1_loss_23: 0.1163 - dense_1_loss_24: 0.1237 - dense_1_loss_25: 0.1328 - dense_1_loss_26: 0.1371 - dense_1_loss_27: 0.1371 - dense_1_loss_28: 0.1313 - dense_1_loss_29: 0.1493 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.5000 - dense_1_acc_3: 0.7667 - dense_1_acc_4: 0.9667 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 0.9833 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 0.9833 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 50/100\n", + "60/60 [==============================] - 0s - loss: 10.5149 - dense_1_loss_1: 3.9115 - dense_1_loss_2: 2.0077 - dense_1_loss_3: 0.8961 - dense_1_loss_4: 0.3733 - dense_1_loss_5: 0.2618 - dense_1_loss_6: 0.1972 - dense_1_loss_7: 0.1602 - dense_1_loss_8: 0.1434 - dense_1_loss_9: 0.1501 - dense_1_loss_10: 0.1187 - dense_1_loss_11: 0.1495 - dense_1_loss_12: 0.1195 - dense_1_loss_13: 0.1068 - dense_1_loss_14: 0.1078 - dense_1_loss_15: 0.1116 - dense_1_loss_16: 0.1175 - dense_1_loss_17: 0.1143 - dense_1_loss_18: 0.1200 - dense_1_loss_19: 0.1194 - dense_1_loss_20: 0.1235 - dense_1_loss_21: 0.1205 - dense_1_loss_22: 0.1171 - dense_1_loss_23: 0.1097 - dense_1_loss_24: 0.1138 - dense_1_loss_25: 0.1241 - dense_1_loss_26: 0.1276 - dense_1_loss_27: 0.1280 - dense_1_loss_28: 0.1236 - dense_1_loss_29: 0.1402 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.5000 - dense_1_acc_3: 0.7833 - dense_1_acc_4: 0.9667 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 0.9833 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 51/100\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "60/60 [==============================] - 0s - loss: 10.1932 - dense_1_loss_1: 3.9073 - dense_1_loss_2: 1.9695 - dense_1_loss_3: 0.8641 - dense_1_loss_4: 0.3521 - dense_1_loss_5: 0.2467 - dense_1_loss_6: 0.1842 - dense_1_loss_7: 0.1490 - dense_1_loss_8: 0.1352 - dense_1_loss_9: 0.1386 - dense_1_loss_10: 0.1112 - dense_1_loss_11: 0.1381 - dense_1_loss_12: 0.1111 - dense_1_loss_13: 0.1001 - dense_1_loss_14: 0.1017 - dense_1_loss_15: 0.1037 - dense_1_loss_16: 0.1100 - dense_1_loss_17: 0.1060 - dense_1_loss_18: 0.1109 - dense_1_loss_19: 0.1118 - dense_1_loss_20: 0.1147 - dense_1_loss_21: 0.1129 - dense_1_loss_22: 0.1084 - dense_1_loss_23: 0.1017 - dense_1_loss_24: 0.1066 - dense_1_loss_25: 0.1151 - dense_1_loss_26: 0.1180 - dense_1_loss_27: 0.1195 - dense_1_loss_28: 0.1149 - dense_1_loss_29: 0.1299 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.5167 - dense_1_acc_3: 0.7833 - dense_1_acc_4: 0.9667 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 52/100\n", + "60/60 [==============================] - 0s - loss: 9.9014 - dense_1_loss_1: 3.9034 - dense_1_loss_2: 1.9349 - dense_1_loss_3: 0.8357 - dense_1_loss_4: 0.3334 - dense_1_loss_5: 0.2317 - dense_1_loss_6: 0.1726 - dense_1_loss_7: 0.1395 - dense_1_loss_8: 0.1267 - dense_1_loss_9: 0.1293 - dense_1_loss_10: 0.1047 - dense_1_loss_11: 0.1293 - dense_1_loss_12: 0.1045 - dense_1_loss_13: 0.0920 - dense_1_loss_14: 0.0955 - dense_1_loss_15: 0.0965 - dense_1_loss_16: 0.1051 - dense_1_loss_17: 0.0976 - dense_1_loss_18: 0.1035 - dense_1_loss_19: 0.1030 - dense_1_loss_20: 0.1081 - dense_1_loss_21: 0.1040 - dense_1_loss_22: 0.1013 - dense_1_loss_23: 0.0944 - dense_1_loss_24: 0.0998 - dense_1_loss_25: 0.1068 - dense_1_loss_26: 0.1091 - dense_1_loss_27: 0.1114 - dense_1_loss_28: 0.1074 - dense_1_loss_29: 0.1202 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.5167 - dense_1_acc_3: 0.8167 - dense_1_acc_4: 0.9667 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 53/100\n", + "60/60 [==============================] - 0s - loss: 9.6413 - dense_1_loss_1: 3.8988 - dense_1_loss_2: 1.9009 - dense_1_loss_3: 0.8074 - dense_1_loss_4: 0.3157 - dense_1_loss_5: 0.2175 - dense_1_loss_6: 0.1629 - dense_1_loss_7: 0.1315 - dense_1_loss_8: 0.1183 - dense_1_loss_9: 0.1209 - dense_1_loss_10: 0.0982 - dense_1_loss_11: 0.1217 - dense_1_loss_12: 0.0985 - dense_1_loss_13: 0.0858 - dense_1_loss_14: 0.0892 - dense_1_loss_15: 0.0905 - dense_1_loss_16: 0.0996 - dense_1_loss_17: 0.0913 - dense_1_loss_18: 0.0969 - dense_1_loss_19: 0.0962 - dense_1_loss_20: 0.1015 - dense_1_loss_21: 0.0976 - dense_1_loss_22: 0.0956 - dense_1_loss_23: 0.0883 - dense_1_loss_24: 0.0941 - dense_1_loss_25: 0.0998 - dense_1_loss_26: 0.1024 - dense_1_loss_27: 0.1049 - dense_1_loss_28: 0.1020 - dense_1_loss_29: 0.1132 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.5167 - dense_1_acc_3: 0.8333 - dense_1_acc_4: 0.9667 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 54/100\n", + "60/60 [==============================] - 0s - loss: 9.3907 - dense_1_loss_1: 3.8949 - dense_1_loss_2: 1.8682 - dense_1_loss_3: 0.7808 - dense_1_loss_4: 0.2993 - dense_1_loss_5: 0.2038 - dense_1_loss_6: 0.1528 - dense_1_loss_7: 0.1223 - dense_1_loss_8: 0.1109 - dense_1_loss_9: 0.1128 - dense_1_loss_10: 0.0922 - dense_1_loss_11: 0.1117 - dense_1_loss_12: 0.0917 - dense_1_loss_13: 0.0812 - dense_1_loss_14: 0.0828 - dense_1_loss_15: 0.0847 - dense_1_loss_16: 0.0917 - dense_1_loss_17: 0.0864 - dense_1_loss_18: 0.0910 - dense_1_loss_19: 0.0907 - dense_1_loss_20: 0.0946 - dense_1_loss_21: 0.0928 - dense_1_loss_22: 0.0896 - dense_1_loss_23: 0.0828 - dense_1_loss_24: 0.0875 - dense_1_loss_25: 0.0946 - dense_1_loss_26: 0.0962 - dense_1_loss_27: 0.0990 - dense_1_loss_28: 0.0964 - dense_1_loss_29: 0.1073 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.5167 - dense_1_acc_3: 0.8333 - dense_1_acc_4: 0.9667 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 55/100\n", + "60/60 [==============================] - 0s - loss: 9.1700 - dense_1_loss_1: 3.8907 - dense_1_loss_2: 1.8363 - dense_1_loss_3: 0.7546 - dense_1_loss_4: 0.2852 - dense_1_loss_5: 0.1936 - dense_1_loss_6: 0.1452 - dense_1_loss_7: 0.1156 - dense_1_loss_8: 0.1055 - dense_1_loss_9: 0.1059 - dense_1_loss_10: 0.0872 - dense_1_loss_11: 0.1047 - dense_1_loss_12: 0.0859 - dense_1_loss_13: 0.0778 - dense_1_loss_14: 0.0783 - dense_1_loss_15: 0.0803 - dense_1_loss_16: 0.0847 - dense_1_loss_17: 0.0816 - dense_1_loss_18: 0.0855 - dense_1_loss_19: 0.0857 - dense_1_loss_20: 0.0890 - dense_1_loss_21: 0.0878 - dense_1_loss_22: 0.0842 - dense_1_loss_23: 0.0775 - dense_1_loss_24: 0.0826 - dense_1_loss_25: 0.0891 - dense_1_loss_26: 0.0905 - dense_1_loss_27: 0.0923 - dense_1_loss_28: 0.0907 - dense_1_loss_29: 0.1019 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.5167 - dense_1_acc_3: 0.8333 - dense_1_acc_4: 0.9667 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 56/100\n", + "60/60 [==============================] - 0s - loss: 8.9552 - dense_1_loss_1: 3.8870 - dense_1_loss_2: 1.8067 - dense_1_loss_3: 0.7300 - dense_1_loss_4: 0.2717 - dense_1_loss_5: 0.1820 - dense_1_loss_6: 0.1361 - dense_1_loss_7: 0.1085 - dense_1_loss_8: 0.0994 - dense_1_loss_9: 0.1000 - dense_1_loss_10: 0.0824 - dense_1_loss_11: 0.0975 - dense_1_loss_12: 0.0807 - dense_1_loss_13: 0.0737 - dense_1_loss_14: 0.0736 - dense_1_loss_15: 0.0765 - dense_1_loss_16: 0.0803 - dense_1_loss_17: 0.0765 - dense_1_loss_18: 0.0808 - dense_1_loss_19: 0.0802 - dense_1_loss_20: 0.0840 - dense_1_loss_21: 0.0820 - dense_1_loss_22: 0.0786 - dense_1_loss_23: 0.0731 - dense_1_loss_24: 0.0779 - dense_1_loss_25: 0.0836 - dense_1_loss_26: 0.0854 - dense_1_loss_27: 0.0860 - dense_1_loss_28: 0.0851 - dense_1_loss_29: 0.0961 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.5667 - dense_1_acc_3: 0.8500 - dense_1_acc_4: 0.9667 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 0.9833 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 57/100\n", + "60/60 [==============================] - 0s - loss: 8.7656 - dense_1_loss_1: 3.8829 - dense_1_loss_2: 1.7771 - dense_1_loss_3: 0.7076 - dense_1_loss_4: 0.2592 - dense_1_loss_5: 0.1730 - dense_1_loss_6: 0.1292 - dense_1_loss_7: 0.1029 - dense_1_loss_8: 0.0938 - dense_1_loss_9: 0.0948 - dense_1_loss_10: 0.0779 - dense_1_loss_11: 0.0924 - dense_1_loss_12: 0.0768 - dense_1_loss_13: 0.0692 - dense_1_loss_14: 0.0702 - dense_1_loss_15: 0.0724 - dense_1_loss_16: 0.0764 - dense_1_loss_17: 0.0715 - dense_1_loss_18: 0.0761 - dense_1_loss_19: 0.0757 - dense_1_loss_20: 0.0800 - dense_1_loss_21: 0.0770 - dense_1_loss_22: 0.0744 - dense_1_loss_23: 0.0689 - dense_1_loss_24: 0.0736 - dense_1_loss_25: 0.0784 - dense_1_loss_26: 0.0809 - dense_1_loss_27: 0.0813 - dense_1_loss_28: 0.0808 - dense_1_loss_29: 0.0913 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.5667 - dense_1_acc_3: 0.8500 - dense_1_acc_4: 0.9833 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 58/100\n", + "60/60 [==============================] - 0s - loss: 8.5852 - dense_1_loss_1: 3.8788 - dense_1_loss_2: 1.7489 - dense_1_loss_3: 0.6874 - dense_1_loss_4: 0.2468 - dense_1_loss_5: 0.1641 - dense_1_loss_6: 0.1224 - dense_1_loss_7: 0.0973 - dense_1_loss_8: 0.0889 - dense_1_loss_9: 0.0898 - dense_1_loss_10: 0.0735 - dense_1_loss_11: 0.0869 - dense_1_loss_12: 0.0727 - dense_1_loss_13: 0.0652 - dense_1_loss_14: 0.0666 - dense_1_loss_15: 0.0680 - dense_1_loss_16: 0.0722 - dense_1_loss_17: 0.0677 - dense_1_loss_18: 0.0715 - dense_1_loss_19: 0.0714 - dense_1_loss_20: 0.0754 - dense_1_loss_21: 0.0734 - dense_1_loss_22: 0.0703 - dense_1_loss_23: 0.0652 - dense_1_loss_24: 0.0694 - dense_1_loss_25: 0.0746 - dense_1_loss_26: 0.0765 - dense_1_loss_27: 0.0774 - dense_1_loss_28: 0.0768 - dense_1_loss_29: 0.0864 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.5667 - dense_1_acc_3: 0.8667 - dense_1_acc_4: 0.9833 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 59/100\n", + "60/60 [==============================] - 0s - loss: 8.4182 - dense_1_loss_1: 3.8753 - dense_1_loss_2: 1.7218 - dense_1_loss_3: 0.6659 - dense_1_loss_4: 0.2361 - dense_1_loss_5: 0.1560 - dense_1_loss_6: 0.1158 - dense_1_loss_7: 0.0921 - dense_1_loss_8: 0.0846 - dense_1_loss_9: 0.0852 - dense_1_loss_10: 0.0694 - dense_1_loss_11: 0.0823 - dense_1_loss_12: 0.0686 - dense_1_loss_13: 0.0617 - dense_1_loss_14: 0.0633 - dense_1_loss_15: 0.0643 - dense_1_loss_16: 0.0684 - dense_1_loss_17: 0.0642 - dense_1_loss_18: 0.0678 - dense_1_loss_19: 0.0676 - dense_1_loss_20: 0.0711 - dense_1_loss_21: 0.0699 - dense_1_loss_22: 0.0668 - dense_1_loss_23: 0.0620 - dense_1_loss_24: 0.0657 - dense_1_loss_25: 0.0711 - dense_1_loss_26: 0.0724 - dense_1_loss_27: 0.0740 - dense_1_loss_28: 0.0728 - dense_1_loss_29: 0.0822 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.5667 - dense_1_acc_3: 0.9000 - dense_1_acc_4: 0.9833 - dense_1_acc_5: 0.9833 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 60/100\n", + "60/60 [==============================] - 0s - loss: 8.2606 - dense_1_loss_1: 3.8712 - dense_1_loss_2: 1.6948 - dense_1_loss_3: 0.6471 - dense_1_loss_4: 0.2261 - dense_1_loss_5: 0.1480 - dense_1_loss_6: 0.1094 - dense_1_loss_7: 0.0876 - dense_1_loss_8: 0.0806 - dense_1_loss_9: 0.0807 - dense_1_loss_10: 0.0658 - dense_1_loss_11: 0.0780 - dense_1_loss_12: 0.0651 - dense_1_loss_13: 0.0584 - dense_1_loss_14: 0.0601 - dense_1_loss_15: 0.0614 - dense_1_loss_16: 0.0647 - dense_1_loss_17: 0.0612 - dense_1_loss_18: 0.0639 - dense_1_loss_19: 0.0644 - dense_1_loss_20: 0.0675 - dense_1_loss_21: 0.0661 - dense_1_loss_22: 0.0635 - dense_1_loss_23: 0.0591 - dense_1_loss_24: 0.0621 - dense_1_loss_25: 0.0673 - dense_1_loss_26: 0.0688 - dense_1_loss_27: 0.0704 - dense_1_loss_28: 0.0693 - dense_1_loss_29: 0.0782 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.5667 - dense_1_acc_3: 0.9000 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 61/100\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "60/60 [==============================] - 0s - loss: 8.1172 - dense_1_loss_1: 3.8671 - dense_1_loss_2: 1.6703 - dense_1_loss_3: 0.6284 - dense_1_loss_4: 0.2163 - dense_1_loss_5: 0.1416 - dense_1_loss_6: 0.1045 - dense_1_loss_7: 0.0838 - dense_1_loss_8: 0.0768 - dense_1_loss_9: 0.0771 - dense_1_loss_10: 0.0630 - dense_1_loss_11: 0.0745 - dense_1_loss_12: 0.0622 - dense_1_loss_13: 0.0553 - dense_1_loss_14: 0.0572 - dense_1_loss_15: 0.0589 - dense_1_loss_16: 0.0619 - dense_1_loss_17: 0.0581 - dense_1_loss_18: 0.0606 - dense_1_loss_19: 0.0613 - dense_1_loss_20: 0.0642 - dense_1_loss_21: 0.0624 - dense_1_loss_22: 0.0603 - dense_1_loss_23: 0.0566 - dense_1_loss_24: 0.0592 - dense_1_loss_25: 0.0635 - dense_1_loss_26: 0.0654 - dense_1_loss_27: 0.0667 - dense_1_loss_28: 0.0659 - dense_1_loss_29: 0.0740 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.5667 - dense_1_acc_3: 0.9000 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 62/100\n", + "60/60 [==============================] - 0s - loss: 7.9837 - dense_1_loss_1: 3.8632 - dense_1_loss_2: 1.6452 - dense_1_loss_3: 0.6116 - dense_1_loss_4: 0.2086 - dense_1_loss_5: 0.1352 - dense_1_loss_6: 0.0993 - dense_1_loss_7: 0.0800 - dense_1_loss_8: 0.0732 - dense_1_loss_9: 0.0733 - dense_1_loss_10: 0.0605 - dense_1_loss_11: 0.0707 - dense_1_loss_12: 0.0595 - dense_1_loss_13: 0.0527 - dense_1_loss_14: 0.0546 - dense_1_loss_15: 0.0564 - dense_1_loss_16: 0.0589 - dense_1_loss_17: 0.0552 - dense_1_loss_18: 0.0579 - dense_1_loss_19: 0.0584 - dense_1_loss_20: 0.0612 - dense_1_loss_21: 0.0596 - dense_1_loss_22: 0.0575 - dense_1_loss_23: 0.0538 - dense_1_loss_24: 0.0567 - dense_1_loss_25: 0.0602 - dense_1_loss_26: 0.0629 - dense_1_loss_27: 0.0634 - dense_1_loss_28: 0.0630 - dense_1_loss_29: 0.0710 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6000 - dense_1_acc_3: 0.9000 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 63/100\n", + "60/60 [==============================] - 0s - loss: 7.8538 - dense_1_loss_1: 3.8596 - dense_1_loss_2: 1.6218 - dense_1_loss_3: 0.5936 - dense_1_loss_4: 0.1999 - dense_1_loss_5: 0.1288 - dense_1_loss_6: 0.0946 - dense_1_loss_7: 0.0762 - dense_1_loss_8: 0.0702 - dense_1_loss_9: 0.0698 - dense_1_loss_10: 0.0576 - dense_1_loss_11: 0.0669 - dense_1_loss_12: 0.0567 - dense_1_loss_13: 0.0505 - dense_1_loss_14: 0.0523 - dense_1_loss_15: 0.0535 - dense_1_loss_16: 0.0560 - dense_1_loss_17: 0.0527 - dense_1_loss_18: 0.0553 - dense_1_loss_19: 0.0557 - dense_1_loss_20: 0.0581 - dense_1_loss_21: 0.0572 - dense_1_loss_22: 0.0549 - dense_1_loss_23: 0.0509 - dense_1_loss_24: 0.0541 - dense_1_loss_25: 0.0576 - dense_1_loss_26: 0.0599 - dense_1_loss_27: 0.0604 - dense_1_loss_28: 0.0604 - dense_1_loss_29: 0.0686 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9000 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 64/100\n", + "60/60 [==============================] - 0s - loss: 7.7356 - dense_1_loss_1: 3.8556 - dense_1_loss_2: 1.5997 - dense_1_loss_3: 0.5772 - dense_1_loss_4: 0.1923 - dense_1_loss_5: 0.1228 - dense_1_loss_6: 0.0903 - dense_1_loss_7: 0.0727 - dense_1_loss_8: 0.0673 - dense_1_loss_9: 0.0668 - dense_1_loss_10: 0.0551 - dense_1_loss_11: 0.0635 - dense_1_loss_12: 0.0540 - dense_1_loss_13: 0.0484 - dense_1_loss_14: 0.0504 - dense_1_loss_15: 0.0509 - dense_1_loss_16: 0.0534 - dense_1_loss_17: 0.0505 - dense_1_loss_18: 0.0530 - dense_1_loss_19: 0.0532 - dense_1_loss_20: 0.0555 - dense_1_loss_21: 0.0551 - dense_1_loss_22: 0.0528 - dense_1_loss_23: 0.0485 - dense_1_loss_24: 0.0519 - dense_1_loss_25: 0.0551 - dense_1_loss_26: 0.0577 - dense_1_loss_27: 0.0577 - dense_1_loss_28: 0.0581 - dense_1_loss_29: 0.0660 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9000 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 65/100\n", + "60/60 [==============================] - 0s - loss: 7.6240 - dense_1_loss_1: 3.8520 - dense_1_loss_2: 1.5769 - dense_1_loss_3: 0.5630 - dense_1_loss_4: 0.1855 - dense_1_loss_5: 0.1175 - dense_1_loss_6: 0.0865 - dense_1_loss_7: 0.0699 - dense_1_loss_8: 0.0648 - dense_1_loss_9: 0.0640 - dense_1_loss_10: 0.0528 - dense_1_loss_11: 0.0608 - dense_1_loss_12: 0.0518 - dense_1_loss_13: 0.0464 - dense_1_loss_14: 0.0483 - dense_1_loss_15: 0.0487 - dense_1_loss_16: 0.0515 - dense_1_loss_17: 0.0482 - dense_1_loss_18: 0.0509 - dense_1_loss_19: 0.0507 - dense_1_loss_20: 0.0534 - dense_1_loss_21: 0.0525 - dense_1_loss_22: 0.0505 - dense_1_loss_23: 0.0464 - dense_1_loss_24: 0.0496 - dense_1_loss_25: 0.0527 - dense_1_loss_26: 0.0549 - dense_1_loss_27: 0.0552 - dense_1_loss_28: 0.0554 - dense_1_loss_29: 0.0630 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9000 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 66/100\n", + "60/60 [==============================] - 0s - loss: 7.5171 - dense_1_loss_1: 3.8482 - dense_1_loss_2: 1.5556 - dense_1_loss_3: 0.5476 - dense_1_loss_4: 0.1793 - dense_1_loss_5: 0.1124 - dense_1_loss_6: 0.0828 - dense_1_loss_7: 0.0674 - dense_1_loss_8: 0.0622 - dense_1_loss_9: 0.0613 - dense_1_loss_10: 0.0506 - dense_1_loss_11: 0.0584 - dense_1_loss_12: 0.0497 - dense_1_loss_13: 0.0444 - dense_1_loss_14: 0.0460 - dense_1_loss_15: 0.0470 - dense_1_loss_16: 0.0498 - dense_1_loss_17: 0.0460 - dense_1_loss_18: 0.0485 - dense_1_loss_19: 0.0484 - dense_1_loss_20: 0.0513 - dense_1_loss_21: 0.0503 - dense_1_loss_22: 0.0483 - dense_1_loss_23: 0.0450 - dense_1_loss_24: 0.0476 - dense_1_loss_25: 0.0506 - dense_1_loss_26: 0.0523 - dense_1_loss_27: 0.0530 - dense_1_loss_28: 0.0531 - dense_1_loss_29: 0.0602 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9000 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 67/100\n", + "60/60 [==============================] - 0s - loss: 7.4190 - dense_1_loss_1: 3.8443 - dense_1_loss_2: 1.5344 - dense_1_loss_3: 0.5345 - dense_1_loss_4: 0.1730 - dense_1_loss_5: 0.1083 - dense_1_loss_6: 0.0795 - dense_1_loss_7: 0.0652 - dense_1_loss_8: 0.0597 - dense_1_loss_9: 0.0591 - dense_1_loss_10: 0.0488 - dense_1_loss_11: 0.0562 - dense_1_loss_12: 0.0478 - dense_1_loss_13: 0.0426 - dense_1_loss_14: 0.0441 - dense_1_loss_15: 0.0453 - dense_1_loss_16: 0.0479 - dense_1_loss_17: 0.0440 - dense_1_loss_18: 0.0465 - dense_1_loss_19: 0.0464 - dense_1_loss_20: 0.0493 - dense_1_loss_21: 0.0482 - dense_1_loss_22: 0.0464 - dense_1_loss_23: 0.0434 - dense_1_loss_24: 0.0457 - dense_1_loss_25: 0.0485 - dense_1_loss_26: 0.0504 - dense_1_loss_27: 0.0512 - dense_1_loss_28: 0.0511 - dense_1_loss_29: 0.0571 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9000 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 68/100\n", + "60/60 [==============================] - 0s - loss: 7.3250 - dense_1_loss_1: 3.8406 - dense_1_loss_2: 1.5141 - dense_1_loss_3: 0.5213 - dense_1_loss_4: 0.1672 - dense_1_loss_5: 0.1041 - dense_1_loss_6: 0.0763 - dense_1_loss_7: 0.0628 - dense_1_loss_8: 0.0575 - dense_1_loss_9: 0.0569 - dense_1_loss_10: 0.0469 - dense_1_loss_11: 0.0541 - dense_1_loss_12: 0.0460 - dense_1_loss_13: 0.0409 - dense_1_loss_14: 0.0425 - dense_1_loss_15: 0.0436 - dense_1_loss_16: 0.0458 - dense_1_loss_17: 0.0423 - dense_1_loss_18: 0.0446 - dense_1_loss_19: 0.0447 - dense_1_loss_20: 0.0474 - dense_1_loss_21: 0.0465 - dense_1_loss_22: 0.0446 - dense_1_loss_23: 0.0416 - dense_1_loss_24: 0.0438 - dense_1_loss_25: 0.0466 - dense_1_loss_26: 0.0486 - dense_1_loss_27: 0.0493 - dense_1_loss_28: 0.0491 - dense_1_loss_29: 0.0550 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9000 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 69/100\n", + "60/60 [==============================] - 0s - loss: 7.2364 - dense_1_loss_1: 3.8370 - dense_1_loss_2: 1.4951 - dense_1_loss_3: 0.5087 - dense_1_loss_4: 0.1615 - dense_1_loss_5: 0.1001 - dense_1_loss_6: 0.0732 - dense_1_loss_7: 0.0605 - dense_1_loss_8: 0.0554 - dense_1_loss_9: 0.0549 - dense_1_loss_10: 0.0453 - dense_1_loss_11: 0.0519 - dense_1_loss_12: 0.0442 - dense_1_loss_13: 0.0395 - dense_1_loss_14: 0.0410 - dense_1_loss_15: 0.0421 - dense_1_loss_16: 0.0439 - dense_1_loss_17: 0.0407 - dense_1_loss_18: 0.0431 - dense_1_loss_19: 0.0431 - dense_1_loss_20: 0.0455 - dense_1_loss_21: 0.0451 - dense_1_loss_22: 0.0428 - dense_1_loss_23: 0.0399 - dense_1_loss_24: 0.0423 - dense_1_loss_25: 0.0448 - dense_1_loss_26: 0.0469 - dense_1_loss_27: 0.0473 - dense_1_loss_28: 0.0475 - dense_1_loss_29: 0.0532 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9000 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 70/100\n", + "60/60 [==============================] - 0s - loss: 7.1507 - dense_1_loss_1: 3.8333 - dense_1_loss_2: 1.4752 - dense_1_loss_3: 0.4963 - dense_1_loss_4: 0.1564 - dense_1_loss_5: 0.0965 - dense_1_loss_6: 0.0703 - dense_1_loss_7: 0.0584 - dense_1_loss_8: 0.0535 - dense_1_loss_9: 0.0529 - dense_1_loss_10: 0.0436 - dense_1_loss_11: 0.0500 - dense_1_loss_12: 0.0426 - dense_1_loss_13: 0.0380 - dense_1_loss_14: 0.0396 - dense_1_loss_15: 0.0406 - dense_1_loss_16: 0.0423 - dense_1_loss_17: 0.0393 - dense_1_loss_18: 0.0414 - dense_1_loss_19: 0.0416 - dense_1_loss_20: 0.0439 - dense_1_loss_21: 0.0434 - dense_1_loss_22: 0.0413 - dense_1_loss_23: 0.0384 - dense_1_loss_24: 0.0408 - dense_1_loss_25: 0.0430 - dense_1_loss_26: 0.0453 - dense_1_loss_27: 0.0456 - dense_1_loss_28: 0.0457 - dense_1_loss_29: 0.0516 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9000 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 71/100\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "60/60 [==============================] - 0s - loss: 7.0698 - dense_1_loss_1: 3.8295 - dense_1_loss_2: 1.4567 - dense_1_loss_3: 0.4849 - dense_1_loss_4: 0.1514 - dense_1_loss_5: 0.0930 - dense_1_loss_6: 0.0678 - dense_1_loss_7: 0.0565 - dense_1_loss_8: 0.0517 - dense_1_loss_9: 0.0512 - dense_1_loss_10: 0.0422 - dense_1_loss_11: 0.0482 - dense_1_loss_12: 0.0412 - dense_1_loss_13: 0.0365 - dense_1_loss_14: 0.0381 - dense_1_loss_15: 0.0393 - dense_1_loss_16: 0.0409 - dense_1_loss_17: 0.0378 - dense_1_loss_18: 0.0399 - dense_1_loss_19: 0.0400 - dense_1_loss_20: 0.0423 - dense_1_loss_21: 0.0417 - dense_1_loss_22: 0.0398 - dense_1_loss_23: 0.0371 - dense_1_loss_24: 0.0394 - dense_1_loss_25: 0.0415 - dense_1_loss_26: 0.0438 - dense_1_loss_27: 0.0437 - dense_1_loss_28: 0.0439 - dense_1_loss_29: 0.0500 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9167 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 72/100\n", + "60/60 [==============================] - 0s - loss: 6.9929 - dense_1_loss_1: 3.8260 - dense_1_loss_2: 1.4383 - dense_1_loss_3: 0.4737 - dense_1_loss_4: 0.1473 - dense_1_loss_5: 0.0899 - dense_1_loss_6: 0.0654 - dense_1_loss_7: 0.0546 - dense_1_loss_8: 0.0499 - dense_1_loss_9: 0.0495 - dense_1_loss_10: 0.0407 - dense_1_loss_11: 0.0464 - dense_1_loss_12: 0.0398 - dense_1_loss_13: 0.0352 - dense_1_loss_14: 0.0367 - dense_1_loss_15: 0.0380 - dense_1_loss_16: 0.0395 - dense_1_loss_17: 0.0365 - dense_1_loss_18: 0.0384 - dense_1_loss_19: 0.0386 - dense_1_loss_20: 0.0409 - dense_1_loss_21: 0.0402 - dense_1_loss_22: 0.0384 - dense_1_loss_23: 0.0360 - dense_1_loss_24: 0.0381 - dense_1_loss_25: 0.0400 - dense_1_loss_26: 0.0422 - dense_1_loss_27: 0.0420 - dense_1_loss_28: 0.0424 - dense_1_loss_29: 0.0484 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9167 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 73/100\n", + "60/60 [==============================] - 0s - loss: 6.9210 - dense_1_loss_1: 3.8220 - dense_1_loss_2: 1.4211 - dense_1_loss_3: 0.4635 - dense_1_loss_4: 0.1428 - dense_1_loss_5: 0.0870 - dense_1_loss_6: 0.0634 - dense_1_loss_7: 0.0529 - dense_1_loss_8: 0.0483 - dense_1_loss_9: 0.0479 - dense_1_loss_10: 0.0394 - dense_1_loss_11: 0.0449 - dense_1_loss_12: 0.0385 - dense_1_loss_13: 0.0341 - dense_1_loss_14: 0.0356 - dense_1_loss_15: 0.0367 - dense_1_loss_16: 0.0381 - dense_1_loss_17: 0.0353 - dense_1_loss_18: 0.0370 - dense_1_loss_19: 0.0374 - dense_1_loss_20: 0.0395 - dense_1_loss_21: 0.0388 - dense_1_loss_22: 0.0371 - dense_1_loss_23: 0.0349 - dense_1_loss_24: 0.0369 - dense_1_loss_25: 0.0387 - dense_1_loss_26: 0.0407 - dense_1_loss_27: 0.0407 - dense_1_loss_28: 0.0410 - dense_1_loss_29: 0.0468 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9167 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 74/100\n", + "60/60 [==============================] - 0s - loss: 6.8496 - dense_1_loss_1: 3.8183 - dense_1_loss_2: 1.4044 - dense_1_loss_3: 0.4524 - dense_1_loss_4: 0.1384 - dense_1_loss_5: 0.0840 - dense_1_loss_6: 0.0611 - dense_1_loss_7: 0.0511 - dense_1_loss_8: 0.0468 - dense_1_loss_9: 0.0464 - dense_1_loss_10: 0.0380 - dense_1_loss_11: 0.0433 - dense_1_loss_12: 0.0372 - dense_1_loss_13: 0.0330 - dense_1_loss_14: 0.0345 - dense_1_loss_15: 0.0355 - dense_1_loss_16: 0.0368 - dense_1_loss_17: 0.0342 - dense_1_loss_18: 0.0358 - dense_1_loss_19: 0.0361 - dense_1_loss_20: 0.0381 - dense_1_loss_21: 0.0377 - dense_1_loss_22: 0.0358 - dense_1_loss_23: 0.0337 - dense_1_loss_24: 0.0357 - dense_1_loss_25: 0.0375 - dense_1_loss_26: 0.0395 - dense_1_loss_27: 0.0395 - dense_1_loss_28: 0.0396 - dense_1_loss_29: 0.0453 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9167 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 75/100\n", + "60/60 [==============================] - 0s - loss: 6.7845 - dense_1_loss_1: 3.8150 - dense_1_loss_2: 1.3878 - dense_1_loss_3: 0.4426 - dense_1_loss_4: 0.1346 - dense_1_loss_5: 0.0814 - dense_1_loss_6: 0.0592 - dense_1_loss_7: 0.0496 - dense_1_loss_8: 0.0454 - dense_1_loss_9: 0.0449 - dense_1_loss_10: 0.0369 - dense_1_loss_11: 0.0420 - dense_1_loss_12: 0.0360 - dense_1_loss_13: 0.0321 - dense_1_loss_14: 0.0334 - dense_1_loss_15: 0.0343 - dense_1_loss_16: 0.0356 - dense_1_loss_17: 0.0331 - dense_1_loss_18: 0.0347 - dense_1_loss_19: 0.0350 - dense_1_loss_20: 0.0369 - dense_1_loss_21: 0.0366 - dense_1_loss_22: 0.0347 - dense_1_loss_23: 0.0325 - dense_1_loss_24: 0.0345 - dense_1_loss_25: 0.0365 - dense_1_loss_26: 0.0382 - dense_1_loss_27: 0.0383 - dense_1_loss_28: 0.0385 - dense_1_loss_29: 0.0440 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9167 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 76/100\n", + "60/60 [==============================] - 0s - loss: 6.7198 - dense_1_loss_1: 3.8113 - dense_1_loss_2: 1.3713 - dense_1_loss_3: 0.4330 - dense_1_loss_4: 0.1308 - dense_1_loss_5: 0.0790 - dense_1_loss_6: 0.0572 - dense_1_loss_7: 0.0483 - dense_1_loss_8: 0.0442 - dense_1_loss_9: 0.0436 - dense_1_loss_10: 0.0358 - dense_1_loss_11: 0.0408 - dense_1_loss_12: 0.0349 - dense_1_loss_13: 0.0312 - dense_1_loss_14: 0.0324 - dense_1_loss_15: 0.0333 - dense_1_loss_16: 0.0345 - dense_1_loss_17: 0.0320 - dense_1_loss_18: 0.0336 - dense_1_loss_19: 0.0339 - dense_1_loss_20: 0.0358 - dense_1_loss_21: 0.0355 - dense_1_loss_22: 0.0336 - dense_1_loss_23: 0.0315 - dense_1_loss_24: 0.0335 - dense_1_loss_25: 0.0354 - dense_1_loss_26: 0.0368 - dense_1_loss_27: 0.0371 - dense_1_loss_28: 0.0374 - dense_1_loss_29: 0.0423 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9167 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 77/100\n", + "60/60 [==============================] - 0s - loss: 6.6606 - dense_1_loss_1: 3.8078 - dense_1_loss_2: 1.3562 - dense_1_loss_3: 0.4239 - dense_1_loss_4: 0.1276 - dense_1_loss_5: 0.0769 - dense_1_loss_6: 0.0555 - dense_1_loss_7: 0.0470 - dense_1_loss_8: 0.0430 - dense_1_loss_9: 0.0423 - dense_1_loss_10: 0.0348 - dense_1_loss_11: 0.0396 - dense_1_loss_12: 0.0339 - dense_1_loss_13: 0.0303 - dense_1_loss_14: 0.0314 - dense_1_loss_15: 0.0324 - dense_1_loss_16: 0.0335 - dense_1_loss_17: 0.0311 - dense_1_loss_18: 0.0326 - dense_1_loss_19: 0.0329 - dense_1_loss_20: 0.0347 - dense_1_loss_21: 0.0344 - dense_1_loss_22: 0.0326 - dense_1_loss_23: 0.0306 - dense_1_loss_24: 0.0324 - dense_1_loss_25: 0.0342 - dense_1_loss_26: 0.0358 - dense_1_loss_27: 0.0361 - dense_1_loss_28: 0.0362 - dense_1_loss_29: 0.0409 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9167 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 78/100\n", + "60/60 [==============================] - 0s - loss: 6.6013 - dense_1_loss_1: 3.8040 - dense_1_loss_2: 1.3404 - dense_1_loss_3: 0.4153 - dense_1_loss_4: 0.1241 - dense_1_loss_5: 0.0745 - dense_1_loss_6: 0.0538 - dense_1_loss_7: 0.0457 - dense_1_loss_8: 0.0417 - dense_1_loss_9: 0.0411 - dense_1_loss_10: 0.0339 - dense_1_loss_11: 0.0384 - dense_1_loss_12: 0.0328 - dense_1_loss_13: 0.0293 - dense_1_loss_14: 0.0304 - dense_1_loss_15: 0.0314 - dense_1_loss_16: 0.0325 - dense_1_loss_17: 0.0302 - dense_1_loss_18: 0.0316 - dense_1_loss_19: 0.0319 - dense_1_loss_20: 0.0336 - dense_1_loss_21: 0.0334 - dense_1_loss_22: 0.0317 - dense_1_loss_23: 0.0299 - dense_1_loss_24: 0.0315 - dense_1_loss_25: 0.0332 - dense_1_loss_26: 0.0349 - dense_1_loss_27: 0.0351 - dense_1_loss_28: 0.0352 - dense_1_loss_29: 0.0397 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9167 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 79/100\n", + "60/60 [==============================] - 0s - loss: 6.5439 - dense_1_loss_1: 3.8008 - dense_1_loss_2: 1.3256 - dense_1_loss_3: 0.4060 - dense_1_loss_4: 0.1206 - dense_1_loss_5: 0.0721 - dense_1_loss_6: 0.0522 - dense_1_loss_7: 0.0444 - dense_1_loss_8: 0.0405 - dense_1_loss_9: 0.0399 - dense_1_loss_10: 0.0330 - dense_1_loss_11: 0.0372 - dense_1_loss_12: 0.0318 - dense_1_loss_13: 0.0285 - dense_1_loss_14: 0.0296 - dense_1_loss_15: 0.0305 - dense_1_loss_16: 0.0316 - dense_1_loss_17: 0.0293 - dense_1_loss_18: 0.0307 - dense_1_loss_19: 0.0310 - dense_1_loss_20: 0.0327 - dense_1_loss_21: 0.0324 - dense_1_loss_22: 0.0308 - dense_1_loss_23: 0.0291 - dense_1_loss_24: 0.0307 - dense_1_loss_25: 0.0323 - dense_1_loss_26: 0.0339 - dense_1_loss_27: 0.0341 - dense_1_loss_28: 0.0341 - dense_1_loss_29: 0.0386 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9167 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 80/100\n", + "60/60 [==============================] - 0s - loss: 6.4905 - dense_1_loss_1: 3.7971 - dense_1_loss_2: 1.3110 - dense_1_loss_3: 0.3981 - dense_1_loss_4: 0.1179 - dense_1_loss_5: 0.0702 - dense_1_loss_6: 0.0508 - dense_1_loss_7: 0.0432 - dense_1_loss_8: 0.0395 - dense_1_loss_9: 0.0389 - dense_1_loss_10: 0.0322 - dense_1_loss_11: 0.0362 - dense_1_loss_12: 0.0309 - dense_1_loss_13: 0.0277 - dense_1_loss_14: 0.0287 - dense_1_loss_15: 0.0296 - dense_1_loss_16: 0.0307 - dense_1_loss_17: 0.0285 - dense_1_loss_18: 0.0298 - dense_1_loss_19: 0.0301 - dense_1_loss_20: 0.0317 - dense_1_loss_21: 0.0315 - dense_1_loss_22: 0.0300 - dense_1_loss_23: 0.0283 - dense_1_loss_24: 0.0298 - dense_1_loss_25: 0.0314 - dense_1_loss_26: 0.0329 - dense_1_loss_27: 0.0332 - dense_1_loss_28: 0.0331 - dense_1_loss_29: 0.0374 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9167 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 81/100\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "60/60 [==============================] - 0s - loss: 6.4382 - dense_1_loss_1: 3.7937 - dense_1_loss_2: 1.2969 - dense_1_loss_3: 0.3898 - dense_1_loss_4: 0.1149 - dense_1_loss_5: 0.0681 - dense_1_loss_6: 0.0493 - dense_1_loss_7: 0.0420 - dense_1_loss_8: 0.0384 - dense_1_loss_9: 0.0378 - dense_1_loss_10: 0.0314 - dense_1_loss_11: 0.0352 - dense_1_loss_12: 0.0301 - dense_1_loss_13: 0.0269 - dense_1_loss_14: 0.0280 - dense_1_loss_15: 0.0288 - dense_1_loss_16: 0.0297 - dense_1_loss_17: 0.0277 - dense_1_loss_18: 0.0290 - dense_1_loss_19: 0.0293 - dense_1_loss_20: 0.0309 - dense_1_loss_21: 0.0306 - dense_1_loss_22: 0.0293 - dense_1_loss_23: 0.0274 - dense_1_loss_24: 0.0290 - dense_1_loss_25: 0.0305 - dense_1_loss_26: 0.0321 - dense_1_loss_27: 0.0323 - dense_1_loss_28: 0.0323 - dense_1_loss_29: 0.0365 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 82/100\n", + "60/60 [==============================] - 0s - loss: 6.3889 - dense_1_loss_1: 3.7903 - dense_1_loss_2: 1.2832 - dense_1_loss_3: 0.3825 - dense_1_loss_4: 0.1120 - dense_1_loss_5: 0.0665 - dense_1_loss_6: 0.0481 - dense_1_loss_7: 0.0410 - dense_1_loss_8: 0.0375 - dense_1_loss_9: 0.0368 - dense_1_loss_10: 0.0306 - dense_1_loss_11: 0.0343 - dense_1_loss_12: 0.0293 - dense_1_loss_13: 0.0263 - dense_1_loss_14: 0.0273 - dense_1_loss_15: 0.0281 - dense_1_loss_16: 0.0290 - dense_1_loss_17: 0.0270 - dense_1_loss_18: 0.0282 - dense_1_loss_19: 0.0285 - dense_1_loss_20: 0.0301 - dense_1_loss_21: 0.0298 - dense_1_loss_22: 0.0285 - dense_1_loss_23: 0.0266 - dense_1_loss_24: 0.0283 - dense_1_loss_25: 0.0297 - dense_1_loss_26: 0.0312 - dense_1_loss_27: 0.0315 - dense_1_loss_28: 0.0315 - dense_1_loss_29: 0.0355 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6167 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 83/100\n", + "60/60 [==============================] - 0s - loss: 6.3391 - dense_1_loss_1: 3.7868 - dense_1_loss_2: 1.2691 - dense_1_loss_3: 0.3746 - dense_1_loss_4: 0.1093 - dense_1_loss_5: 0.0648 - dense_1_loss_6: 0.0467 - dense_1_loss_7: 0.0400 - dense_1_loss_8: 0.0364 - dense_1_loss_9: 0.0358 - dense_1_loss_10: 0.0298 - dense_1_loss_11: 0.0333 - dense_1_loss_12: 0.0285 - dense_1_loss_13: 0.0256 - dense_1_loss_14: 0.0265 - dense_1_loss_15: 0.0274 - dense_1_loss_16: 0.0282 - dense_1_loss_17: 0.0263 - dense_1_loss_18: 0.0275 - dense_1_loss_19: 0.0278 - dense_1_loss_20: 0.0293 - dense_1_loss_21: 0.0290 - dense_1_loss_22: 0.0277 - dense_1_loss_23: 0.0258 - dense_1_loss_24: 0.0276 - dense_1_loss_25: 0.0289 - dense_1_loss_26: 0.0304 - dense_1_loss_27: 0.0307 - dense_1_loss_28: 0.0307 - dense_1_loss_29: 0.0346 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6500 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 84/100\n", + "60/60 [==============================] - 0s - loss: 6.2930 - dense_1_loss_1: 3.7834 - dense_1_loss_2: 1.2556 - dense_1_loss_3: 0.3679 - dense_1_loss_4: 0.1068 - dense_1_loss_5: 0.0632 - dense_1_loss_6: 0.0454 - dense_1_loss_7: 0.0391 - dense_1_loss_8: 0.0355 - dense_1_loss_9: 0.0349 - dense_1_loss_10: 0.0291 - dense_1_loss_11: 0.0325 - dense_1_loss_12: 0.0278 - dense_1_loss_13: 0.0249 - dense_1_loss_14: 0.0258 - dense_1_loss_15: 0.0267 - dense_1_loss_16: 0.0275 - dense_1_loss_17: 0.0256 - dense_1_loss_18: 0.0268 - dense_1_loss_19: 0.0270 - dense_1_loss_20: 0.0285 - dense_1_loss_21: 0.0282 - dense_1_loss_22: 0.0270 - dense_1_loss_23: 0.0252 - dense_1_loss_24: 0.0269 - dense_1_loss_25: 0.0281 - dense_1_loss_26: 0.0297 - dense_1_loss_27: 0.0299 - dense_1_loss_28: 0.0299 - dense_1_loss_29: 0.0339 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6500 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 85/100\n", + "60/60 [==============================] - 0s - loss: 6.2478 - dense_1_loss_1: 3.7799 - dense_1_loss_2: 1.2433 - dense_1_loss_3: 0.3604 - dense_1_loss_4: 0.1043 - dense_1_loss_5: 0.0615 - dense_1_loss_6: 0.0443 - dense_1_loss_7: 0.0381 - dense_1_loss_8: 0.0346 - dense_1_loss_9: 0.0341 - dense_1_loss_10: 0.0285 - dense_1_loss_11: 0.0317 - dense_1_loss_12: 0.0271 - dense_1_loss_13: 0.0243 - dense_1_loss_14: 0.0252 - dense_1_loss_15: 0.0260 - dense_1_loss_16: 0.0268 - dense_1_loss_17: 0.0249 - dense_1_loss_18: 0.0261 - dense_1_loss_19: 0.0263 - dense_1_loss_20: 0.0278 - dense_1_loss_21: 0.0275 - dense_1_loss_22: 0.0264 - dense_1_loss_23: 0.0246 - dense_1_loss_24: 0.0262 - dense_1_loss_25: 0.0275 - dense_1_loss_26: 0.0290 - dense_1_loss_27: 0.0291 - dense_1_loss_28: 0.0291 - dense_1_loss_29: 0.0331 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6500 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 86/100\n", + "60/60 [==============================] - 0s - loss: 6.2047 - dense_1_loss_1: 3.7768 - dense_1_loss_2: 1.2299 - dense_1_loss_3: 0.3543 - dense_1_loss_4: 0.1021 - dense_1_loss_5: 0.0601 - dense_1_loss_6: 0.0433 - dense_1_loss_7: 0.0372 - dense_1_loss_8: 0.0338 - dense_1_loss_9: 0.0332 - dense_1_loss_10: 0.0279 - dense_1_loss_11: 0.0309 - dense_1_loss_12: 0.0264 - dense_1_loss_13: 0.0237 - dense_1_loss_14: 0.0246 - dense_1_loss_15: 0.0253 - dense_1_loss_16: 0.0262 - dense_1_loss_17: 0.0243 - dense_1_loss_18: 0.0255 - dense_1_loss_19: 0.0256 - dense_1_loss_20: 0.0271 - dense_1_loss_21: 0.0268 - dense_1_loss_22: 0.0257 - dense_1_loss_23: 0.0240 - dense_1_loss_24: 0.0256 - dense_1_loss_25: 0.0268 - dense_1_loss_26: 0.0283 - dense_1_loss_27: 0.0284 - dense_1_loss_28: 0.0284 - dense_1_loss_29: 0.0323 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6667 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 87/100\n", + "60/60 [==============================] - 0s - loss: 6.1634 - dense_1_loss_1: 3.7732 - dense_1_loss_2: 1.2184 - dense_1_loss_3: 0.3480 - dense_1_loss_4: 0.0998 - dense_1_loss_5: 0.0588 - dense_1_loss_6: 0.0422 - dense_1_loss_7: 0.0364 - dense_1_loss_8: 0.0331 - dense_1_loss_9: 0.0325 - dense_1_loss_10: 0.0272 - dense_1_loss_11: 0.0302 - dense_1_loss_12: 0.0258 - dense_1_loss_13: 0.0232 - dense_1_loss_14: 0.0240 - dense_1_loss_15: 0.0247 - dense_1_loss_16: 0.0255 - dense_1_loss_17: 0.0238 - dense_1_loss_18: 0.0248 - dense_1_loss_19: 0.0250 - dense_1_loss_20: 0.0265 - dense_1_loss_21: 0.0262 - dense_1_loss_22: 0.0251 - dense_1_loss_23: 0.0235 - dense_1_loss_24: 0.0250 - dense_1_loss_25: 0.0261 - dense_1_loss_26: 0.0276 - dense_1_loss_27: 0.0278 - dense_1_loss_28: 0.0277 - dense_1_loss_29: 0.0315 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6667 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 88/100\n", + "60/60 [==============================] - 0s - loss: 6.1224 - dense_1_loss_1: 3.7698 - dense_1_loss_2: 1.2063 - dense_1_loss_3: 0.3416 - dense_1_loss_4: 0.0977 - dense_1_loss_5: 0.0574 - dense_1_loss_6: 0.0412 - dense_1_loss_7: 0.0355 - dense_1_loss_8: 0.0323 - dense_1_loss_9: 0.0318 - dense_1_loss_10: 0.0266 - dense_1_loss_11: 0.0295 - dense_1_loss_12: 0.0252 - dense_1_loss_13: 0.0226 - dense_1_loss_14: 0.0234 - dense_1_loss_15: 0.0241 - dense_1_loss_16: 0.0249 - dense_1_loss_17: 0.0232 - dense_1_loss_18: 0.0243 - dense_1_loss_19: 0.0244 - dense_1_loss_20: 0.0259 - dense_1_loss_21: 0.0256 - dense_1_loss_22: 0.0244 - dense_1_loss_23: 0.0229 - dense_1_loss_24: 0.0245 - dense_1_loss_25: 0.0255 - dense_1_loss_26: 0.0269 - dense_1_loss_27: 0.0272 - dense_1_loss_28: 0.0271 - dense_1_loss_29: 0.0307 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6667 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 89/100\n", + "60/60 [==============================] - 0s - loss: 6.0826 - dense_1_loss_1: 3.7664 - dense_1_loss_2: 1.1942 - dense_1_loss_3: 0.3355 - dense_1_loss_4: 0.0955 - dense_1_loss_5: 0.0561 - dense_1_loss_6: 0.0402 - dense_1_loss_7: 0.0348 - dense_1_loss_8: 0.0316 - dense_1_loss_9: 0.0310 - dense_1_loss_10: 0.0261 - dense_1_loss_11: 0.0288 - dense_1_loss_12: 0.0246 - dense_1_loss_13: 0.0222 - dense_1_loss_14: 0.0229 - dense_1_loss_15: 0.0235 - dense_1_loss_16: 0.0243 - dense_1_loss_17: 0.0227 - dense_1_loss_18: 0.0237 - dense_1_loss_19: 0.0238 - dense_1_loss_20: 0.0253 - dense_1_loss_21: 0.0250 - dense_1_loss_22: 0.0239 - dense_1_loss_23: 0.0224 - dense_1_loss_24: 0.0239 - dense_1_loss_25: 0.0250 - dense_1_loss_26: 0.0263 - dense_1_loss_27: 0.0266 - dense_1_loss_28: 0.0265 - dense_1_loss_29: 0.0300 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6667 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 90/100\n", + "60/60 [==============================] - 0s - loss: 6.0451 - dense_1_loss_1: 3.7631 - dense_1_loss_2: 1.1831 - dense_1_loss_3: 0.3297 - dense_1_loss_4: 0.0935 - dense_1_loss_5: 0.0550 - dense_1_loss_6: 0.0392 - dense_1_loss_7: 0.0340 - dense_1_loss_8: 0.0309 - dense_1_loss_9: 0.0304 - dense_1_loss_10: 0.0255 - dense_1_loss_11: 0.0283 - dense_1_loss_12: 0.0241 - dense_1_loss_13: 0.0217 - dense_1_loss_14: 0.0224 - dense_1_loss_15: 0.0230 - dense_1_loss_16: 0.0237 - dense_1_loss_17: 0.0222 - dense_1_loss_18: 0.0231 - dense_1_loss_19: 0.0232 - dense_1_loss_20: 0.0247 - dense_1_loss_21: 0.0245 - dense_1_loss_22: 0.0234 - dense_1_loss_23: 0.0219 - dense_1_loss_24: 0.0233 - dense_1_loss_25: 0.0244 - dense_1_loss_26: 0.0256 - dense_1_loss_27: 0.0260 - dense_1_loss_28: 0.0259 - dense_1_loss_29: 0.0294 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6667 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 91/100\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "60/60 [==============================] - 0s - loss: 6.0091 - dense_1_loss_1: 3.7600 - dense_1_loss_2: 1.1720 - dense_1_loss_3: 0.3247 - dense_1_loss_4: 0.0915 - dense_1_loss_5: 0.0539 - dense_1_loss_6: 0.0383 - dense_1_loss_7: 0.0334 - dense_1_loss_8: 0.0303 - dense_1_loss_9: 0.0297 - dense_1_loss_10: 0.0250 - dense_1_loss_11: 0.0277 - dense_1_loss_12: 0.0235 - dense_1_loss_13: 0.0212 - dense_1_loss_14: 0.0219 - dense_1_loss_15: 0.0225 - dense_1_loss_16: 0.0232 - dense_1_loss_17: 0.0217 - dense_1_loss_18: 0.0226 - dense_1_loss_19: 0.0227 - dense_1_loss_20: 0.0242 - dense_1_loss_21: 0.0239 - dense_1_loss_22: 0.0229 - dense_1_loss_23: 0.0214 - dense_1_loss_24: 0.0228 - dense_1_loss_25: 0.0239 - dense_1_loss_26: 0.0251 - dense_1_loss_27: 0.0254 - dense_1_loss_28: 0.0253 - dense_1_loss_29: 0.0287 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6667 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 92/100\n", + "60/60 [==============================] - 0s - loss: 5.9724 - dense_1_loss_1: 3.7565 - dense_1_loss_2: 1.1609 - dense_1_loss_3: 0.3189 - dense_1_loss_4: 0.0896 - dense_1_loss_5: 0.0528 - dense_1_loss_6: 0.0374 - dense_1_loss_7: 0.0327 - dense_1_loss_8: 0.0296 - dense_1_loss_9: 0.0290 - dense_1_loss_10: 0.0244 - dense_1_loss_11: 0.0271 - dense_1_loss_12: 0.0230 - dense_1_loss_13: 0.0207 - dense_1_loss_14: 0.0214 - dense_1_loss_15: 0.0221 - dense_1_loss_16: 0.0227 - dense_1_loss_17: 0.0212 - dense_1_loss_18: 0.0221 - dense_1_loss_19: 0.0222 - dense_1_loss_20: 0.0236 - dense_1_loss_21: 0.0234 - dense_1_loss_22: 0.0224 - dense_1_loss_23: 0.0209 - dense_1_loss_24: 0.0224 - dense_1_loss_25: 0.0234 - dense_1_loss_26: 0.0245 - dense_1_loss_27: 0.0248 - dense_1_loss_28: 0.0247 - dense_1_loss_29: 0.0280 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6667 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 93/100\n", + "60/60 [==============================] - 0s - loss: 5.9388 - dense_1_loss_1: 3.7531 - dense_1_loss_2: 1.1507 - dense_1_loss_3: 0.3140 - dense_1_loss_4: 0.0879 - dense_1_loss_5: 0.0518 - dense_1_loss_6: 0.0365 - dense_1_loss_7: 0.0320 - dense_1_loss_8: 0.0290 - dense_1_loss_9: 0.0284 - dense_1_loss_10: 0.0240 - dense_1_loss_11: 0.0265 - dense_1_loss_12: 0.0225 - dense_1_loss_13: 0.0203 - dense_1_loss_14: 0.0209 - dense_1_loss_15: 0.0216 - dense_1_loss_16: 0.0222 - dense_1_loss_17: 0.0207 - dense_1_loss_18: 0.0216 - dense_1_loss_19: 0.0218 - dense_1_loss_20: 0.0231 - dense_1_loss_21: 0.0230 - dense_1_loss_22: 0.0219 - dense_1_loss_23: 0.0205 - dense_1_loss_24: 0.0219 - dense_1_loss_25: 0.0228 - dense_1_loss_26: 0.0240 - dense_1_loss_27: 0.0244 - dense_1_loss_28: 0.0243 - dense_1_loss_29: 0.0274 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6667 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 94/100\n", + "60/60 [==============================] - 0s - loss: 5.9052 - dense_1_loss_1: 3.7502 - dense_1_loss_2: 1.1397 - dense_1_loss_3: 0.3089 - dense_1_loss_4: 0.0863 - dense_1_loss_5: 0.0507 - dense_1_loss_6: 0.0358 - dense_1_loss_7: 0.0314 - dense_1_loss_8: 0.0284 - dense_1_loss_9: 0.0278 - dense_1_loss_10: 0.0235 - dense_1_loss_11: 0.0260 - dense_1_loss_12: 0.0221 - dense_1_loss_13: 0.0198 - dense_1_loss_14: 0.0205 - dense_1_loss_15: 0.0211 - dense_1_loss_16: 0.0217 - dense_1_loss_17: 0.0203 - dense_1_loss_18: 0.0212 - dense_1_loss_19: 0.0213 - dense_1_loss_20: 0.0226 - dense_1_loss_21: 0.0225 - dense_1_loss_22: 0.0214 - dense_1_loss_23: 0.0200 - dense_1_loss_24: 0.0215 - dense_1_loss_25: 0.0222 - dense_1_loss_26: 0.0235 - dense_1_loss_27: 0.0240 - dense_1_loss_28: 0.0238 - dense_1_loss_29: 0.0268 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6667 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 95/100\n", + "60/60 [==============================] - 0s - loss: 5.8725 - dense_1_loss_1: 3.7469 - dense_1_loss_2: 1.1300 - dense_1_loss_3: 0.3034 - dense_1_loss_4: 0.0847 - dense_1_loss_5: 0.0497 - dense_1_loss_6: 0.0350 - dense_1_loss_7: 0.0308 - dense_1_loss_8: 0.0278 - dense_1_loss_9: 0.0272 - dense_1_loss_10: 0.0231 - dense_1_loss_11: 0.0254 - dense_1_loss_12: 0.0216 - dense_1_loss_13: 0.0194 - dense_1_loss_14: 0.0201 - dense_1_loss_15: 0.0207 - dense_1_loss_16: 0.0213 - dense_1_loss_17: 0.0199 - dense_1_loss_18: 0.0207 - dense_1_loss_19: 0.0209 - dense_1_loss_20: 0.0222 - dense_1_loss_21: 0.0220 - dense_1_loss_22: 0.0210 - dense_1_loss_23: 0.0196 - dense_1_loss_24: 0.0211 - dense_1_loss_25: 0.0218 - dense_1_loss_26: 0.0230 - dense_1_loss_27: 0.0235 - dense_1_loss_28: 0.0234 - dense_1_loss_29: 0.0263 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6667 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 96/100\n", + "60/60 [==============================] - 0s - loss: 5.8412 - dense_1_loss_1: 3.7437 - dense_1_loss_2: 1.1198 - dense_1_loss_3: 0.2988 - dense_1_loss_4: 0.0832 - dense_1_loss_5: 0.0488 - dense_1_loss_6: 0.0344 - dense_1_loss_7: 0.0302 - dense_1_loss_8: 0.0273 - dense_1_loss_9: 0.0267 - dense_1_loss_10: 0.0227 - dense_1_loss_11: 0.0249 - dense_1_loss_12: 0.0212 - dense_1_loss_13: 0.0190 - dense_1_loss_14: 0.0197 - dense_1_loss_15: 0.0203 - dense_1_loss_16: 0.0208 - dense_1_loss_17: 0.0195 - dense_1_loss_18: 0.0203 - dense_1_loss_19: 0.0204 - dense_1_loss_20: 0.0217 - dense_1_loss_21: 0.0216 - dense_1_loss_22: 0.0206 - dense_1_loss_23: 0.0193 - dense_1_loss_24: 0.0206 - dense_1_loss_25: 0.0213 - dense_1_loss_26: 0.0225 - dense_1_loss_27: 0.0230 - dense_1_loss_28: 0.0229 - dense_1_loss_29: 0.0258 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6667 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 97/100\n", + "60/60 [==============================] - 0s - loss: 5.8096 - dense_1_loss_1: 3.7406 - dense_1_loss_2: 1.1099 - dense_1_loss_3: 0.2939 - dense_1_loss_4: 0.0817 - dense_1_loss_5: 0.0478 - dense_1_loss_6: 0.0337 - dense_1_loss_7: 0.0296 - dense_1_loss_8: 0.0267 - dense_1_loss_9: 0.0262 - dense_1_loss_10: 0.0222 - dense_1_loss_11: 0.0244 - dense_1_loss_12: 0.0208 - dense_1_loss_13: 0.0186 - dense_1_loss_14: 0.0193 - dense_1_loss_15: 0.0199 - dense_1_loss_16: 0.0204 - dense_1_loss_17: 0.0191 - dense_1_loss_18: 0.0199 - dense_1_loss_19: 0.0200 - dense_1_loss_20: 0.0213 - dense_1_loss_21: 0.0212 - dense_1_loss_22: 0.0202 - dense_1_loss_23: 0.0189 - dense_1_loss_24: 0.0202 - dense_1_loss_25: 0.0209 - dense_1_loss_26: 0.0221 - dense_1_loss_27: 0.0226 - dense_1_loss_28: 0.0224 - dense_1_loss_29: 0.0253 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6667 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 98/100\n", + "60/60 [==============================] - 0s - loss: 5.7808 - dense_1_loss_1: 3.7374 - dense_1_loss_2: 1.1009 - dense_1_loss_3: 0.2898 - dense_1_loss_4: 0.0802 - dense_1_loss_5: 0.0469 - dense_1_loss_6: 0.0330 - dense_1_loss_7: 0.0290 - dense_1_loss_8: 0.0262 - dense_1_loss_9: 0.0258 - dense_1_loss_10: 0.0218 - dense_1_loss_11: 0.0239 - dense_1_loss_12: 0.0204 - dense_1_loss_13: 0.0183 - dense_1_loss_14: 0.0189 - dense_1_loss_15: 0.0195 - dense_1_loss_16: 0.0200 - dense_1_loss_17: 0.0187 - dense_1_loss_18: 0.0195 - dense_1_loss_19: 0.0196 - dense_1_loss_20: 0.0209 - dense_1_loss_21: 0.0208 - dense_1_loss_22: 0.0198 - dense_1_loss_23: 0.0185 - dense_1_loss_24: 0.0198 - dense_1_loss_25: 0.0205 - dense_1_loss_26: 0.0217 - dense_1_loss_27: 0.0221 - dense_1_loss_28: 0.0219 - dense_1_loss_29: 0.0249 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6667 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 99/100\n", + "60/60 [==============================] - 0s - loss: 5.7520 - dense_1_loss_1: 3.7342 - dense_1_loss_2: 1.0915 - dense_1_loss_3: 0.2857 - dense_1_loss_4: 0.0789 - dense_1_loss_5: 0.0461 - dense_1_loss_6: 0.0324 - dense_1_loss_7: 0.0285 - dense_1_loss_8: 0.0257 - dense_1_loss_9: 0.0253 - dense_1_loss_10: 0.0214 - dense_1_loss_11: 0.0234 - dense_1_loss_12: 0.0200 - dense_1_loss_13: 0.0179 - dense_1_loss_14: 0.0185 - dense_1_loss_15: 0.0191 - dense_1_loss_16: 0.0196 - dense_1_loss_17: 0.0183 - dense_1_loss_18: 0.0191 - dense_1_loss_19: 0.0193 - dense_1_loss_20: 0.0205 - dense_1_loss_21: 0.0204 - dense_1_loss_22: 0.0194 - dense_1_loss_23: 0.0181 - dense_1_loss_24: 0.0194 - dense_1_loss_25: 0.0201 - dense_1_loss_26: 0.0213 - dense_1_loss_27: 0.0216 - dense_1_loss_28: 0.0215 - dense_1_loss_29: 0.0245 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6667 - dense_1_acc_3: 0.9333 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n", + "Epoch 100/100\n", + "60/60 [==============================] - 0s - loss: 5.7237 - dense_1_loss_1: 3.7312 - dense_1_loss_2: 1.0825 - dense_1_loss_3: 0.2813 - dense_1_loss_4: 0.0776 - dense_1_loss_5: 0.0452 - dense_1_loss_6: 0.0317 - dense_1_loss_7: 0.0280 - dense_1_loss_8: 0.0252 - dense_1_loss_9: 0.0248 - dense_1_loss_10: 0.0211 - dense_1_loss_11: 0.0230 - dense_1_loss_12: 0.0196 - dense_1_loss_13: 0.0176 - dense_1_loss_14: 0.0182 - dense_1_loss_15: 0.0188 - dense_1_loss_16: 0.0192 - dense_1_loss_17: 0.0180 - dense_1_loss_18: 0.0188 - dense_1_loss_19: 0.0189 - dense_1_loss_20: 0.0201 - dense_1_loss_21: 0.0200 - dense_1_loss_22: 0.0190 - dense_1_loss_23: 0.0178 - dense_1_loss_24: 0.0191 - dense_1_loss_25: 0.0197 - dense_1_loss_26: 0.0209 - dense_1_loss_27: 0.0212 - dense_1_loss_28: 0.0211 - dense_1_loss_29: 0.0241 - dense_1_loss_30: 0.0000e+00 - dense_1_acc_1: 0.0667 - dense_1_acc_2: 0.6667 - dense_1_acc_3: 0.9500 - dense_1_acc_4: 1.0000 - dense_1_acc_5: 1.0000 - dense_1_acc_6: 1.0000 - dense_1_acc_7: 1.0000 - dense_1_acc_8: 1.0000 - dense_1_acc_9: 1.0000 - dense_1_acc_10: 1.0000 - dense_1_acc_11: 1.0000 - dense_1_acc_12: 1.0000 - dense_1_acc_13: 1.0000 - dense_1_acc_14: 1.0000 - dense_1_acc_15: 1.0000 - dense_1_acc_16: 1.0000 - dense_1_acc_17: 1.0000 - dense_1_acc_18: 1.0000 - dense_1_acc_19: 1.0000 - dense_1_acc_20: 1.0000 - dense_1_acc_21: 1.0000 - dense_1_acc_22: 1.0000 - dense_1_acc_23: 1.0000 - dense_1_acc_24: 1.0000 - dense_1_acc_25: 1.0000 - dense_1_acc_26: 1.0000 - dense_1_acc_27: 1.0000 - dense_1_acc_28: 1.0000 - dense_1_acc_29: 1.0000 - dense_1_acc_30: 0.0000e+00 \n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.fit([X, a0, c0], list(Y), epochs=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You should see the model loss going down. Now that you have trained a model, lets go on the the final section to implement an inference algorithm, and generate some music! " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3 - Generating music\n", + "\n", + "You now have a trained model which has learned the patterns of the jazz soloist. Lets now use this model to synthesize new music. \n", + "\n", + "#### 3.1 - Predicting & Sampling\n", + "\n", + "\n", + "\n", + "At each step of sampling, you will take as input the activation `a` and cell state `c` from the previous state of the LSTM, forward propagate by one step, and get a new output activation as well as cell state. The new activation `a` can then be used to generate the output, using `densor` as before. \n", + "\n", + "To start off the model, we will initialize `x0` as well as the LSTM activation and and cell value `a0` and `c0` to be zeros. \n", + "\n", + "\n", + " \n", + "\n", + "\n", + "**Exercise:** Implement the function below to sample a sequence of musical values. Here are some of the key steps you'll need to implement inside the for-loop that generates the $T_y$ output characters: \n", + "\n", + "Step 2.A: Use `LSTM_Cell`, which inputs the previous step's `c` and `a` to generate the current step's `c` and `a`. \n", + "\n", + "Step 2.B: Use `densor` (defined previously) to compute a softmax on `a` to get the output for the current step. \n", + "\n", + "Step 2.C: Save the output you have just generated by appending it to `outputs`.\n", + "\n", + "Step 2.D: Sample x to the be \"out\"'s one-hot version (the prediction) so that you can pass it to the next LSTM's step. We have already provided this line of code, which uses a [Lambda](https://keras.io/layers/core/#lambda) function. \n", + "```python\n", + "x = Lambda(one_hot)(out) \n", + "```\n", + "[Minor technical note: Rather than sampling a value at random according to the probabilities in `out`, this line of code actually chooses the single most likely note at each step using an argmax.]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: music_inference_model\n", + "\n", + "def music_inference_model(LSTM_cell, densor, n_values = 78, n_a = 64, Ty = 100):\n", + " \"\"\"\n", + " Uses the trained \"LSTM_cell\" and \"densor\" from model() to generate a sequence of values.\n", + " \n", + " Arguments:\n", + " LSTM_cell -- the trained \"LSTM_cell\" from model(), Keras layer object\n", + " densor -- the trained \"densor\" from model(), Keras layer object\n", + " n_values -- integer, umber of unique values\n", + " n_a -- number of units in the LSTM_cell\n", + " Ty -- integer, number of time steps to generate\n", + " \n", + " Returns:\n", + " inference_model -- Keras model instance\n", + " \"\"\"\n", + " \n", + " # Define the input of your model with a shape \n", + " x0 = Input(shape=(1, n_values))\n", + " \n", + " # Define s0, initial hidden state for the decoder LSTM\n", + " a0 = Input(shape=(n_a,), name='a0')\n", + " c0 = Input(shape=(n_a,), name='c0')\n", + " a = a0\n", + " c = c0\n", + " x = x0\n", + "\n", + " ### START CODE HERE ###\n", + " # Step 1: Create an empty list of \"outputs\" to later store your predicted values (≈1 line)\n", + " outputs = []\n", + " \n", + " # Step 2: Loop over Ty and generate a value at every time step\n", + " for t in range(Ty):\n", + " \n", + " # Step 2.A: Perform one step of LSTM_cell (≈1 line)\n", + " a, _, c = LSTM_cell(x, initial_state=[a, c])\n", + " \n", + " # Step 2.B: Apply Dense layer to the hidden state output of the LSTM_cell (≈1 line)\n", + " out = densor(a)\n", + "\n", + " # Step 2.C: Append the prediction \"out\" to \"outputs\". out.shape = (None, 78) (≈1 line)\n", + " outputs.append(out)\n", + " \n", + " # Step 2.D: Select the next value according to \"out\", and set \"x\" to be the one-hot representation of the\n", + " # selected value, which will be passed as the input to LSTM_cell on the next step. We have provided \n", + " # the line of code you need to do this. \n", + " x = Lambda(one_hot)(out)\n", + " \n", + " # Step 3: Create model instance with the correct \"inputs\" and \"outputs\" (≈1 line)\n", + " inference_model = Model([x0, a0, c0], outputs)\n", + " \n", + " ### END CODE HERE ###\n", + " \n", + " return inference_model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the cell below to define your inference model. This model is hard coded to generate 50 values." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "inference_model = music_inference_model(LSTM_cell, densor, n_values = 78, n_a = 64, Ty = 50)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, this creates the zero-valued vectors you will use to initialize `x` and the LSTM state variables `a` and `c`. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "x_initializer = np.zeros((1, 1, 78))\n", + "a_initializer = np.zeros((1, n_a))\n", + "c_initializer = np.zeros((1, n_a))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise**: Implement `predict_and_sample()`. This function takes many arguments including the inputs [x_initializer, a_initializer, c_initializer]. In order to predict the output corresponding to this input, you will need to carry-out 3 steps:\n", + "1. Use your inference model to predict an output given your set of inputs. The output `pred` should be a list of length 20 where each element is a numpy-array of shape ($T_y$, n_values)\n", + "2. Convert `pred` into a numpy array of $T_y$ indices. Each index corresponds is computed by taking the `argmax` of an element of the `pred` list. [Hint](https://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html).\n", + "3. Convert the indices into their one-hot vector representations. [Hint](https://keras.io/utils/#to_categorical)." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: predict_and_sample\n", + "\n", + "def predict_and_sample(inference_model, x_initializer = x_initializer, a_initializer = a_initializer, \n", + " c_initializer = c_initializer):\n", + " \"\"\"\n", + " Predicts the next value of values using the inference model.\n", + " \n", + " Arguments:\n", + " inference_model -- Keras model instance for inference time\n", + " x_initializer -- numpy array of shape (1, 1, 78), one-hot vector initializing the values generation\n", + " a_initializer -- numpy array of shape (1, n_a), initializing the hidden state of the LSTM_cell\n", + " c_initializer -- numpy array of shape (1, n_a), initializing the cell state of the LSTM_cel\n", + " \n", + " Returns:\n", + " results -- numpy-array of shape (Ty, 78), matrix of one-hot vectors representing the values generated\n", + " indices -- numpy-array of shape (Ty, 1), matrix of indices representing the values generated\n", + " \"\"\"\n", + " \n", + " ### START CODE HERE ###\n", + " # Step 1: Use your inference model to predict an output sequence given x_initializer, a_initializer and c_initializer.\n", + " pred = inference_model.predict([x_initializer, a_initializer, c_initializer])\n", + " # Step 2: Convert \"pred\" into an np.array() of indices with the maximum probabilities\n", + " indices = np.argmax(pred, 2)\n", + " # Step 3: Convert indices to one-hot vectors, the shape of the results should be (1, )\n", + " results = to_categorical(indices, num_classes=None)\n", + " ### END CODE HERE ###\n", + " \n", + " return results, indices" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "np.argmax(results[12]) = 15\n", + "np.argmax(results[17]) = 36\n", + "list(indices[12:18]) = [array([15]), array([22]), array([31]), array([11]), array([51]), array([36])]\n" + ] + } + ], + "source": [ + "results, indices = predict_and_sample(inference_model, x_initializer, a_initializer, c_initializer)\n", + "print(\"np.argmax(results[12]) =\", np.argmax(results[12]))\n", + "print(\"np.argmax(results[17]) =\", np.argmax(results[17]))\n", + "print(\"list(indices[12:18]) =\", list(indices[12:18]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**: Your results may differ because Keras' results are not completely predictable. However, if you have trained your LSTM_cell with model.fit() for exactly 100 epochs as described above, you should very likely observe a sequence of indices that are not all identical. Moreover, you should observe that: np.argmax(results[12]) is the first element of list(indices[12:18]) and np.argmax(results[17]) is the last element of list(indices[12:18]). \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **np.argmax(results[12])** =\n", + " \n", + " 1\n", + "
\n", + " **np.argmax(results[12])** =\n", + " \n", + " 42\n", + "
\n", + " **list(indices[12:18])** =\n", + " \n", + " [array([1]), array([42]), array([54]), array([17]), array([1]), array([42])]\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.3 - Generate music \n", + "\n", + "Finally, you are ready to generate music. Your RNN generates a sequence of values. The following code generates music by first calling your `predict_and_sample()` function. These values are then post-processed into musical chords (meaning that multiple values or notes can be played at the same time). \n", + "\n", + "Most computational music algorithms use some post-processing because it is difficult to generate music that sounds good without such post-processing. The post-processing does things such as clean up the generated audio by making sure the same sound is not repeated too many times, that two successive notes are not too far from each other in pitch, and so on. One could argue that a lot of these post-processing steps are hacks; also, a lot the music generation literature has also focused on hand-crafting post-processors, and a lot of the output quality depends on the quality of the post-processing and not just the quality of the RNN. But this post-processing does make a huge difference, so lets use it in our implementation as well. \n", + "\n", + "Lets make some music! " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the following cell to generate music and record it into your `out_stream`. This can take a couple of minutes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Predicting new values for different set of chords.\n", + "Generated 51 sounds using the predicted values for the set of chords (\"1\") and after pruning\n", + "Generated 50 sounds using the predicted values for the set of chords (\"2\") and after pruning\n", + "Generated 51 sounds using the predicted values for the set of chords (\"3\") and after pruning\n", + "Generated 50 sounds using the predicted values for the set of chords (\"4\") and after pruning\n" + ] + } + ], + "source": [ + "out_stream = generate_music(inference_model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To listen to your music, click File->Open... Then go to \"output/\" and download \"my_music.midi\". Either play it on your computer with an application that can read midi files if you have one, or use one of the free online \"MIDI to mp3\" conversion tools to convert this to mp3. \n", + "\n", + "As reference, here also is a 30sec audio clip we generated using this algorithm. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "IPython.display.Audio('./data/30s_trained_model.mp3')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Congratulations!\n", + "\n", + "You have come to the end of the notebook. \n", + "\n", + "\n", + "Here's what you should remember:\n", + "- A sequence model can be used to generate musical values, which are then post-processed into midi music. \n", + "- Fairly similar models can be used to generate dinosaur names or to generate music, with the major difference being the input fed to the model. \n", + "- In Keras, sequence generation involves defining layers with shared weights, which are then repeated for the different time steps $1, \\ldots, T_x$. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Congratulations on completing this assignment and generating a jazz solo! " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**References**\n", + "\n", + "The ideas presented in this notebook came primarily from three computational music papers cited below. The implementation here also took significant inspiration and used many components from Ji-Sung Kim's github repository.\n", + "\n", + "- Ji-Sung Kim, 2016, [deepjazz](https://github.com/jisungk/deepjazz)\n", + "- Jon Gillick, Kevin Tang and Robert Keller, 2009. [Learning Jazz Grammars](http://ai.stanford.edu/~kdtang/papers/smc09-jazzgrammar.pdf)\n", + "- Robert Keller and David Morrison, 2007, [A Grammatical Approach to Automatic Improvisation](http://smc07.uoa.gr/SMC07%20Proceedings/SMC07%20Paper%2055.pdf)\n", + "- François Pachet, 1999, [Surprising Harmonies](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.5.7473&rep=rep1&type=pdf)\n", + "\n", + "We're also grateful to François Germain for valuable feedback." + ] + } + ], + "metadata": { + "coursera": { + "course_slug": "nlp-sequence-models", + "graded_item_id": "EG0F7", + "launcher_item_id": "cxJXc" + }, + "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.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Sequence Models/Week 1/Jazz improvisation with LSTM/data/30s_seq.mp3 b/Sequence Models/Week 1/Jazz improvisation with LSTM/data/30s_seq.mp3 new file mode 100644 index 0000000..40b0d5b Binary files /dev/null and b/Sequence Models/Week 1/Jazz improvisation with LSTM/data/30s_seq.mp3 differ diff --git a/Sequence Models/Week 1/Jazz improvisation with LSTM/data/30s_trained_model.mp3 b/Sequence Models/Week 1/Jazz improvisation with LSTM/data/30s_trained_model.mp3 new file mode 100644 index 0000000..f6862a3 Binary files /dev/null and b/Sequence Models/Week 1/Jazz improvisation with LSTM/data/30s_trained_model.mp3 differ diff --git a/Sequence Models/Week 1/Jazz improvisation with LSTM/data/training_example.mp3 b/Sequence Models/Week 1/Jazz improvisation with LSTM/data/training_example.mp3 new file mode 100644 index 0000000..08c63c5 Binary files /dev/null and b/Sequence Models/Week 1/Jazz improvisation with LSTM/data/training_example.mp3 differ diff --git a/Sequence Models/Week 1/Jazz improvisation with LSTM/images/chord_symbols.png b/Sequence Models/Week 1/Jazz improvisation with LSTM/images/chord_symbols.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Jazz improvisation with LSTM/images/dataset.png b/Sequence Models/Week 1/Jazz improvisation with LSTM/images/dataset.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Jazz improvisation with LSTM/images/jazz.jpg b/Sequence Models/Week 1/Jazz improvisation with LSTM/images/jazz.jpg new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Jazz improvisation with LSTM/images/model.png b/Sequence Models/Week 1/Jazz improvisation with LSTM/images/model.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Jazz improvisation with LSTM/images/music_gen.png b/Sequence Models/Week 1/Jazz improvisation with LSTM/images/music_gen.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Jazz improvisation with LSTM/images/music_generation.png b/Sequence Models/Week 1/Jazz improvisation with LSTM/images/music_generation.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Jazz improvisation with LSTM/images/tones.png b/Sequence Models/Week 1/Jazz improvisation with LSTM/images/tones.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 1/Jazz improvisation with LSTM/inference_code.py b/Sequence Models/Week 1/Jazz improvisation with LSTM/inference_code.py new file mode 100644 index 0000000..f41b741 --- /dev/null +++ b/Sequence Models/Week 1/Jazz improvisation with LSTM/inference_code.py @@ -0,0 +1,63 @@ +def inference_model(LSTM_cell, densor, n_x = 78, n_a = 64, Ty = 100): + """ + Uses the trained "LSTM_cell" and "densor" from model() to generate a sequence of values. + + Arguments: + LSTM_cell -- the trained "LSTM_cell" from model(), Keras layer object + densor -- the trained "densor" from model(), Keras layer object + n_x -- number of unique values + n_a -- number of units in the LSTM_cell + Ty -- number of time steps to generate + + Returns: + inference_model -- Keras model instance + """ + + # Define the input of your model with a shape + x0 = Input(shape=(1, n_x)) + + # Define s0, initial hidden state for the decoder LSTM + a0 = Input(shape=(n_a,), name='a0') + c0 = Input(shape=(n_a,), name='c0') + a = a0 + c = c0 + x = x0 + + ### START CODE HERE ### + # Step 1: Create an empty list of "outputs" to later store your predicted values (≈1 line) + outputs = [] + + # Step 2: Loop over Ty and generate a value at every time step + for t in range(Ty): + + # Step 2.A: Perform one step of LSTM_cell (≈1 line) + a, _, c = LSTM_cell(x, initial_state=[a, c]) + + # Step 2.B: Apply Dense layer to the hidden state output of the LSTM_cell (≈1 line) + out = densor(a) + + # Step 2.C: Append the prediction "out" to "outputs" (≈1 line) + outputs.append(out) + + # Step 2.D: Set the prediction "out" to be the next input "x". You will need to use RepeatVector(1). (≈1 line) + x = RepeatVector(1)(out) + + # Step 3: Create model instance with the correct "inputs" and "outputs" (≈1 line) + inference_model = Model(inputs=[x0, a0, c0], outputs=outputs) + ### END CODE HERE ### + + return inference_model + + +inference_model = inference_model(LSTM_cell, densor) + + +x1 = np.zeros((1, 1, 78)) +x1[:,:,35] = 1 +a1 = np.zeros((1, n_a)) +c1 = np.zeros((1, n_a)) +predicting = inference_model.predict([x1, a1, c1]) + + +indices = np.argmax(predicting, axis = -1) +results = to_categorical(indices, num_classes=78) \ No newline at end of file diff --git a/Sequence Models/Week 1/Recurrent Neural Networks.pdf b/Sequence Models/Week 1/Recurrent Neural Networks.pdf new file mode 100644 index 0000000..ab177c1 Binary files /dev/null and b/Sequence Models/Week 1/Recurrent Neural Networks.pdf differ diff --git a/Sequence Models/Week 2/Emojify/Emojify - v2.ipynb b/Sequence Models/Week 2/Emojify/Emojify - v2.ipynb new file mode 100644 index 0000000..250c89c --- /dev/null +++ b/Sequence Models/Week 2/Emojify/Emojify - v2.ipynb @@ -0,0 +1,1612 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Emojify! \n", + "\n", + "Welcome to the second assignment of Week 2. You are going to use word vector representations to build an Emojifier. \n", + "\n", + "Have you ever wanted to make your text messages more expressive? Your emojifier app will help you do that. So rather than writing \"Congratulations on the promotion! Lets get coffee and talk. Love you!\" the emojifier can automatically turn this into \"Congratulations on the promotion! 👍 Lets get coffee and talk. ☕️ Love you! ❤️\"\n", + "\n", + "You will implement a model which inputs a sentence (such as \"Let's go see the baseball game tonight!\") and finds the most appropriate emoji to be used with this sentence (⚾️). In many emoji interfaces, you need to remember that ❤️ is the \"heart\" symbol rather than the \"love\" symbol. But using word vectors, you'll see that even if your training set explicitly relates only a few words to a particular emoji, your algorithm will be able to generalize and associate words in the test set to the same emoji even if those words don't even appear in the training set. This allows you to build an accurate classifier mapping from sentences to emojis, even using a small training set. \n", + "\n", + "In this exercise, you'll start with a baseline model (Emojifier-V1) using word embeddings, then build a more sophisticated model (Emojifier-V2) that further incorporates an LSTM. \n", + "\n", + "Lets get started! Run the following cell to load the package you are going to use. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "from emo_utils import *\n", + "import emoji\n", + "import matplotlib.pyplot as plt\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1 - Baseline model: Emojifier-V1\n", + "\n", + "### 1.1 - Dataset EMOJISET\n", + "\n", + "Let's start by building a simple baseline classifier. \n", + "\n", + "You have a tiny dataset (X, Y) where:\n", + "- X contains 127 sentences (strings)\n", + "- Y contains a integer label between 0 and 4 corresponding to an emoji for each sentence\n", + "\n", + "\n", + "
**Figure 1**: EMOJISET - a classification problem with 5 classes. A few examples of sentences are given here.
\n", + "\n", + "Let's load the dataset using the code below. We split the dataset between training (127 examples) and testing (56 examples)." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "X_train, Y_train = read_csv('data/train_emoji.csv')\n", + "X_test, Y_test = read_csv('data/tesss.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "maxLen = len(max(X_train, key=len).split())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the following cell to print sentences from X_train and corresponding labels from Y_train. Change `index` to see different examples. Because of the font the iPython notebook uses, the heart emoji may be colored black rather than red." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I am proud of your achievements 😄\n" + ] + } + ], + "source": [ + "index = 1\n", + "print(X_train[index], label_to_emoji(Y_train[index]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.2 - Overview of the Emojifier-V1\n", + "\n", + "In this part, you are going to implement a baseline model called \"Emojifier-v1\". \n", + "\n", + "
\n", + "\n", + "
**Figure 2**: Baseline model (Emojifier-V1).
\n", + "
\n", + "\n", + "The input of the model is a string corresponding to a sentence (e.g. \"I love you). In the code, the output will be a probability vector of shape (1,5), that you then pass in an argmax layer to extract the index of the most likely emoji output." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To get our labels into a format suitable for training a softmax classifier, lets convert $Y$ from its current shape current shape $(m, 1)$ into a \"one-hot representation\" $(m, 5)$, where each row is a one-hot vector giving the label of one example, You can do so using this next code snipper. Here, `Y_oh` stands for \"Y-one-hot\" in the variable names `Y_oh_train` and `Y_oh_test`: \n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "Y_oh_train = convert_to_one_hot(Y_train, C = 5)\n", + "Y_oh_test = convert_to_one_hot(Y_test, C = 5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's see what `convert_to_one_hot()` did. Feel free to change `index` to print out different values. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 is converted into one hot [ 1. 0. 0. 0. 0.]\n" + ] + } + ], + "source": [ + "index = 50\n", + "print(Y_train[index], \"is converted into one hot\", Y_oh_train[index])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All the data is now ready to be fed into the Emojify-V1 model. Let's implement the model!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.3 - Implementing Emojifier-V1\n", + "\n", + "As shown in Figure (2), the first step is to convert an input sentence into the word vector representation, which then get averaged together. Similar to the previous exercise, we will use pretrained 50-dimensional GloVe embeddings. Run the following cell to load the `word_to_vec_map`, which contains all the vector representations." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "word_to_index, index_to_word, word_to_vec_map = read_glove_vecs('data/glove.6B.50d.txt')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You've loaded:\n", + "- `word_to_index`: dictionary mapping from words to their indices in the vocabulary (400,001 words, with the valid indices ranging from 0 to 400,000)\n", + "- `index_to_word`: dictionary mapping from indices to their corresponding words in the vocabulary\n", + "- `word_to_vec_map`: dictionary mapping words to their GloVe vector representation.\n", + "\n", + "Run the following cell to check if it works." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "the index of cucumber in the vocabulary is 113317\n", + "the 289846th word in the vocabulary is potatos\n" + ] + } + ], + "source": [ + "word = \"cucumber\"\n", + "index = 289846\n", + "print(\"the index of\", word, \"in the vocabulary is\", word_to_index[word])\n", + "print(\"the\", str(index) + \"th word in the vocabulary is\", index_to_word[index])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise**: Implement `sentence_to_avg()`. You will need to carry out two steps:\n", + "1. Convert every sentence to lower-case, then split the sentence into a list of words. `X.lower()` and `X.split()` might be useful. \n", + "2. For each word in the sentence, access its GloVe representation. Then, average all these values." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: sentence_to_avg\n", + "\n", + "def sentence_to_avg(sentence, word_to_vec_map):\n", + " \"\"\"\n", + " Converts a sentence (string) into a list of words (strings). Extracts the GloVe representation of each word\n", + " and averages its value into a single vector encoding the meaning of the sentence.\n", + " \n", + " Arguments:\n", + " sentence -- string, one training example from X\n", + " word_to_vec_map -- dictionary mapping every word in a vocabulary into its 50-dimensional vector representation\n", + " \n", + " Returns:\n", + " avg -- average vector encoding information about the sentence, numpy-array of shape (50,)\n", + " \"\"\"\n", + " \n", + " ### START CODE HERE ###\n", + " # Step 1: Split sentence into list of lower case words (≈ 1 line)\n", + " words = (sentence.lower()).split()\n", + "\n", + " # Initialize the average word vector, should have the same shape as your word vectors.\n", + " avg = np.zeros((50,))\n", + " \n", + " # Step 2: average the word vectors. You can loop over the words in the list \"words\".\n", + " for w in words:\n", + " avg += word_to_vec_map[w]\n", + " avg = avg / len(words)\n", + " \n", + " ### END CODE HERE ###\n", + " \n", + " return avg" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "avg = [-0.008005 0.56370833 -0.50427333 0.258865 0.55131103 0.03104983\n", + " -0.21013718 0.16893933 -0.09590267 0.141784 -0.15708967 0.18525867\n", + " 0.6495785 0.38371117 0.21102167 0.11301667 0.02613967 0.26037767\n", + " 0.05820667 -0.01578167 -0.12078833 -0.02471267 0.4128455 0.5152061\n", + " 0.38756167 -0.898661 -0.535145 0.33501167 0.68806933 -0.2156265\n", + " 1.797155 0.10476933 -0.36775333 0.750785 0.10282583 0.348925\n", + " -0.27262833 0.66768 -0.10706167 -0.283635 0.59580117 0.28747333\n", + " -0.3366635 0.23393817 0.34349183 0.178405 0.1166155 -0.076433\n", + " 0.1445417 0.09808667]\n" + ] + } + ], + "source": [ + "avg = sentence_to_avg(\"Morrocan couscous is my favorite dish\", word_to_vec_map)\n", + "print(\"avg = \", avg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **avg= **\n", + " \n", + " [-0.008005 0.56370833 -0.50427333 0.258865 0.55131103 0.03104983\n", + " -0.21013718 0.16893933 -0.09590267 0.141784 -0.15708967 0.18525867\n", + " 0.6495785 0.38371117 0.21102167 0.11301667 0.02613967 0.26037767\n", + " 0.05820667 -0.01578167 -0.12078833 -0.02471267 0.4128455 0.5152061\n", + " 0.38756167 -0.898661 -0.535145 0.33501167 0.68806933 -0.2156265\n", + " 1.797155 0.10476933 -0.36775333 0.750785 0.10282583 0.348925\n", + " -0.27262833 0.66768 -0.10706167 -0.283635 0.59580117 0.28747333\n", + " -0.3366635 0.23393817 0.34349183 0.178405 0.1166155 -0.076433\n", + " 0.1445417 0.09808667]\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "#### Model\n", + "\n", + "You now have all the pieces to finish implementing the `model()` function. After using `sentence_to_avg()` you need to pass the average through forward propagation, compute the cost, and then backpropagate to update the softmax's parameters. \n", + "\n", + "**Exercise**: Implement the `model()` function described in Figure (2). Assuming here that $Yoh$ (\"Y one hot\") is the one-hot encoding of the output labels, the equations you need to implement in the forward pass and to compute the cross-entropy cost are:\n", + "$$ z^{(i)} = W . avg^{(i)} + b$$\n", + "$$ a^{(i)} = softmax(z^{(i)})$$\n", + "$$ \\mathcal{L}^{(i)} = - \\sum_{k = 0}^{n_y - 1} Yoh^{(i)}_k * log(a^{(i)}_k)$$\n", + "\n", + "It is possible to come up with a more efficient vectorized implementation. But since we are using a for-loop to convert the sentences one at a time into the avg^{(i)} representation anyway, let's not bother this time. \n", + "\n", + "We provided you a function `softmax()`." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: model\n", + "\n", + "def model(X, Y, word_to_vec_map, learning_rate = 0.01, num_iterations = 400):\n", + " \"\"\"\n", + " Model to train word vector representations in numpy.\n", + " \n", + " Arguments:\n", + " X -- input data, numpy array of sentences as strings, of shape (m, 1)\n", + " Y -- labels, numpy array of integers between 0 and 7, numpy-array of shape (m, 1)\n", + " word_to_vec_map -- dictionary mapping every word in a vocabulary into its 50-dimensional vector representation\n", + " learning_rate -- learning_rate for the stochastic gradient descent algorithm\n", + " num_iterations -- number of iterations\n", + " \n", + " Returns:\n", + " pred -- vector of predictions, numpy-array of shape (m, 1)\n", + " W -- weight matrix of the softmax layer, of shape (n_y, n_h)\n", + " b -- bias of the softmax layer, of shape (n_y,)\n", + " \"\"\"\n", + " \n", + " np.random.seed(1)\n", + "\n", + " # Define number of training examples\n", + " m = Y.shape[0] # number of training examples\n", + " n_y = 5 # number of classes \n", + " n_h = 50 # dimensions of the GloVe vectors \n", + " \n", + " # Initialize parameters using Xavier initialization\n", + " W = np.random.randn(n_y, n_h) / np.sqrt(n_h)\n", + " b = np.zeros((n_y,))\n", + " \n", + " # Convert Y to Y_onehot with n_y classes\n", + " Y_oh = convert_to_one_hot(Y, C = n_y) \n", + " \n", + " # Optimization loop\n", + " for t in range(num_iterations): # Loop over the number of iterations\n", + " for i in range(m): # Loop over the training examples\n", + " \n", + " ### START CODE HERE ### (≈ 4 lines of code)\n", + " # Average the word vectors of the words from the i'th training example\n", + " avg = sentence_to_avg(X[i], word_to_vec_map)\n", + "\n", + " # Forward propagate the avg through the softmax layer\n", + " z = np.dot(W, avg) + b\n", + " a = softmax(z)\n", + "\n", + " # Compute cost using the i'th training label's one hot representation and \"A\" (the output of the softmax)\n", + " cost = - np.sum(Y_oh[i] * np.log(a))\n", + " ### END CODE HERE ###\n", + " \n", + " # Compute gradients \n", + " dz = a - Y_oh[i]\n", + " dW = np.dot(dz.reshape(n_y,1), avg.reshape(1, n_h))\n", + " db = dz\n", + "\n", + " # Update parameters with Stochastic Gradient Descent\n", + " W = W - learning_rate * dW\n", + " b = b - learning_rate * db\n", + " \n", + " if t % 100 == 0:\n", + " print(\"Epoch: \" + str(t) + \" --- cost = \" + str(cost))\n", + " pred = predict(X, Y, W, b, word_to_vec_map)\n", + "\n", + " return pred, W, b" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(132,)\n", + "(132,)\n", + "(132, 5)\n", + "never talk to me again\n", + "\n", + "(20,)\n", + "(20,)\n", + "(132, 5)\n", + "\n" + ] + } + ], + "source": [ + "print(X_train.shape)\n", + "print(Y_train.shape)\n", + "print(np.eye(5)[Y_train.reshape(-1)].shape)\n", + "print(X_train[0])\n", + "print(type(X_train))\n", + "Y = np.asarray([5,0,0,5, 4, 4, 4, 6, 6, 4, 1, 1, 5, 6, 6, 3, 6, 3, 4, 4])\n", + "print(Y.shape)\n", + "\n", + "X = np.asarray(['I am going to the bar tonight', 'I love you', 'miss you my dear',\n", + " 'Lets go party and drinks','Congrats on the new job','Congratulations',\n", + " 'I am so happy for you', 'Why are you feeling bad', 'What is wrong with you',\n", + " 'You totally deserve this prize', 'Let us go play football',\n", + " 'Are you down for football this afternoon', 'Work hard play harder',\n", + " 'It is suprising how people can be dumb sometimes',\n", + " 'I am very disappointed','It is the best day in my life',\n", + " 'I think I will end up alone','My life is so boring','Good job',\n", + " 'Great so awesome'])\n", + "\n", + "print(X.shape)\n", + "print(np.eye(5)[Y_train.reshape(-1)].shape)\n", + "print(type(X_train))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the next cell to train your model and learn the softmax parameters (W,b). " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 0 --- cost = 1.95204988128\n", + "Accuracy: 0.348484848485\n", + "Epoch: 100 --- cost = 0.0797181872601\n", + "Accuracy: 0.931818181818\n", + "Epoch: 200 --- cost = 0.0445636924368\n", + "Accuracy: 0.954545454545\n", + "Epoch: 300 --- cost = 0.0343226737879\n", + "Accuracy: 0.969696969697\n", + "[[ 3.]\n", + " [ 2.]\n", + " [ 3.]\n", + " [ 0.]\n", + " [ 4.]\n", + " [ 0.]\n", + " [ 3.]\n", + " [ 2.]\n", + " [ 3.]\n", + " [ 1.]\n", + " [ 3.]\n", + " [ 3.]\n", + " [ 1.]\n", + " [ 3.]\n", + " [ 2.]\n", + " [ 3.]\n", + " [ 2.]\n", + " [ 3.]\n", + " [ 1.]\n", + " [ 2.]\n", + " [ 3.]\n", + " [ 0.]\n", + " [ 2.]\n", + " [ 2.]\n", + " [ 2.]\n", + " [ 1.]\n", + " [ 4.]\n", + " [ 3.]\n", + " [ 3.]\n", + " [ 4.]\n", + " [ 0.]\n", + " [ 3.]\n", + " [ 4.]\n", + " [ 2.]\n", + " [ 0.]\n", + " [ 3.]\n", + " [ 2.]\n", + " [ 2.]\n", + " [ 3.]\n", + " [ 4.]\n", + " [ 2.]\n", + " [ 2.]\n", + " [ 0.]\n", + " [ 2.]\n", + " [ 3.]\n", + " [ 0.]\n", + " [ 3.]\n", + " [ 2.]\n", + " [ 4.]\n", + " [ 3.]\n", + " [ 0.]\n", + " [ 3.]\n", + " [ 3.]\n", + " [ 3.]\n", + " [ 4.]\n", + " [ 2.]\n", + " [ 1.]\n", + " [ 1.]\n", + " [ 1.]\n", + " [ 2.]\n", + " [ 3.]\n", + " [ 1.]\n", + " [ 0.]\n", + " [ 0.]\n", + " [ 0.]\n", + " [ 3.]\n", + " [ 4.]\n", + " [ 4.]\n", + " [ 2.]\n", + " [ 2.]\n", + " [ 1.]\n", + " [ 2.]\n", + " [ 0.]\n", + " [ 3.]\n", + " [ 2.]\n", + " [ 2.]\n", + " [ 0.]\n", + " [ 3.]\n", + " [ 3.]\n", + " [ 1.]\n", + " [ 2.]\n", + " [ 1.]\n", + " [ 2.]\n", + " [ 2.]\n", + " [ 4.]\n", + " [ 3.]\n", + " [ 3.]\n", + " [ 2.]\n", + " [ 4.]\n", + " [ 0.]\n", + " [ 0.]\n", + " [ 3.]\n", + " [ 3.]\n", + " [ 3.]\n", + " [ 3.]\n", + " [ 2.]\n", + " [ 0.]\n", + " [ 1.]\n", + " [ 2.]\n", + " [ 3.]\n", + " [ 0.]\n", + " [ 2.]\n", + " [ 2.]\n", + " [ 2.]\n", + " [ 3.]\n", + " [ 2.]\n", + " [ 2.]\n", + " [ 2.]\n", + " [ 4.]\n", + " [ 1.]\n", + " [ 1.]\n", + " [ 3.]\n", + " [ 3.]\n", + " [ 4.]\n", + " [ 1.]\n", + " [ 2.]\n", + " [ 1.]\n", + " [ 1.]\n", + " [ 3.]\n", + " [ 1.]\n", + " [ 0.]\n", + " [ 4.]\n", + " [ 0.]\n", + " [ 3.]\n", + " [ 3.]\n", + " [ 4.]\n", + " [ 4.]\n", + " [ 1.]\n", + " [ 4.]\n", + " [ 3.]\n", + " [ 0.]\n", + " [ 2.]]\n" + ] + } + ], + "source": [ + "pred, W, b = model(X_train, Y_train, word_to_vec_map)\n", + "print(pred)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output** (on a subset of iterations):\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **Epoch: 0**\n", + " \n", + " cost = 1.95204988128\n", + " \n", + " Accuracy: 0.348484848485\n", + "
\n", + " **Epoch: 100**\n", + " \n", + " cost = 0.0797181872601\n", + " \n", + " Accuracy: 0.931818181818\n", + "
\n", + " **Epoch: 200**\n", + " \n", + " cost = 0.0445636924368\n", + " \n", + " Accuracy: 0.954545454545\n", + "
\n", + " **Epoch: 300**\n", + " \n", + " cost = 0.0343226737879\n", + " \n", + " Accuracy: 0.969696969697\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Great! Your model has pretty high accuracy on the training set. Lets now see how it does on the test set. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "### 1.4 - Examining test set performance \n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training set:\n", + "Accuracy: 0.977272727273\n", + "Test set:\n", + "Accuracy: 0.857142857143\n" + ] + } + ], + "source": [ + "print(\"Training set:\")\n", + "pred_train = predict(X_train, Y_train, W, b, word_to_vec_map)\n", + "print('Test set:')\n", + "pred_test = predict(X_test, Y_test, W, b, word_to_vec_map)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **Train set accuracy**\n", + " \n", + " 97.7\n", + "
\n", + " **Test set accuracy**\n", + " \n", + " 85.7\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Random guessing would have had 20% accuracy given that there are 5 classes. This is pretty good performance after training on only 127 examples. \n", + "\n", + "In the training set, the algorithm saw the sentence \"*I love you*\" with the label ❤️. You can check however that the word \"adore\" does not appear in the training set. Nonetheless, lets see what happens if you write \"*I adore you*.\"\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy: 0.833333333333\n", + "\n", + "i adore you ❤️\n", + "i love you ❤️\n", + "funny lol 😄\n", + "lets play with a ball ⚾\n", + "food is ready 🍴\n", + "not feeling happy 😄\n" + ] + } + ], + "source": [ + "X_my_sentences = np.array([\"i adore you\", \"i love you\", \"funny lol\", \"lets play with a ball\", \"food is ready\", \"not feeling happy\"])\n", + "Y_my_labels = np.array([[0], [0], [2], [1], [4],[3]])\n", + "\n", + "pred = predict(X_my_sentences, Y_my_labels , W, b, word_to_vec_map)\n", + "print_predictions(X_my_sentences, pred)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Amazing! Because *adore* has a similar embedding as *love*, the algorithm has generalized correctly even to a word it has never seen before. Words such as *heart*, *dear*, *beloved* or *adore* have embedding vectors similar to *love*, and so might work too---feel free to modify the inputs above and try out a variety of input sentences. How well does it work?\n", + "\n", + "Note though that it doesn't get \"not feeling happy\" correct. This algorithm ignores word ordering, so is not good at understanding phrases like \"not happy.\" \n", + "\n", + "Printing the confusion matrix can also help understand which classes are more difficult for your model. A confusion matrix shows how often an example whose label is one class (\"actual\" class) is mislabeled by the algorithm with a different class (\"predicted\" class). \n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(56,)\n", + " ❤️ ⚾ 😄 😞 🍴\n", + "Predicted 0.0 1.0 2.0 3.0 4.0 All\n", + "Actual \n", + "0 6 0 0 1 0 7\n", + "1 0 8 0 0 0 8\n", + "2 2 0 16 0 0 18\n", + "3 1 1 2 12 0 16\n", + "4 0 0 1 0 6 7\n", + "All 9 9 19 13 6 56\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "print(Y_test.shape)\n", + "print(' '+ label_to_emoji(0)+ ' ' + label_to_emoji(1) + ' ' + label_to_emoji(2)+ ' ' + label_to_emoji(3)+' ' + label_to_emoji(4))\n", + "print(pd.crosstab(Y_test, pred_test.reshape(56,), rownames=['Actual'], colnames=['Predicted'], margins=True))\n", + "plot_confusion_matrix(Y_test, pred_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "\n", + "**What you should remember from this part**:\n", + "- Even with a 127 training examples, you can get a reasonably good model for Emojifying. This is due to the generalization power word vectors gives you. \n", + "- Emojify-V1 will perform poorly on sentences such as *\"This movie is not good and not enjoyable\"* because it doesn't understand combinations of words--it just averages all the words' embedding vectors together, without paying attention to the ordering of words. You will build a better algorithm in the next part. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2 - Emojifier-V2: Using LSTMs in Keras: \n", + "\n", + "Let's build an LSTM model that takes as input word sequences. This model will be able to take word ordering into account. Emojifier-V2 will continue to use pre-trained word embeddings to represent words, but will feed them into an LSTM, whose job it is to predict the most appropriate emoji. \n", + "\n", + "Run the following cell to load the Keras packages." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "np.random.seed(0)\n", + "from keras.models import Model\n", + "from keras.layers import Dense, Input, Dropout, LSTM, Activation\n", + "from keras.layers.embeddings import Embedding\n", + "from keras.preprocessing import sequence\n", + "from keras.initializers import glorot_uniform\n", + "np.random.seed(1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.1 - Overview of the model\n", + "\n", + "Here is the Emojifier-v2 you will implement:\n", + "\n", + "
\n", + "
**Figure 3**: Emojifier-V2. A 2-layer LSTM sequence classifier.
\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.2 Keras and mini-batching \n", + "\n", + "In this exercise, we want to train Keras using mini-batches. However, most deep learning frameworks require that all sequences in the same mini-batch have the same length. This is what allows vectorization to work: If you had a 3-word sentence and a 4-word sentence, then the computations needed for them are different (one takes 3 steps of an LSTM, one takes 4 steps) so it's just not possible to do them both at the same time.\n", + "\n", + "The common solution to this is to use padding. Specifically, set a maximum sequence length, and pad all sequences to the same length. For example, of the maximum sequence length is 20, we could pad every sentence with \"0\"s so that each input sentence is of length 20. Thus, a sentence \"i love you\" would be represented as $(e_{i}, e_{love}, e_{you}, \\vec{0}, \\vec{0}, \\ldots, \\vec{0})$. In this example, any sentences longer than 20 words would have to be truncated. One simple way to choose the maximum sequence length is to just pick the length of the longest sentence in the training set. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.3 - The Embedding layer\n", + "\n", + "In Keras, the embedding matrix is represented as a \"layer\", and maps positive integers (indices corresponding to words) into dense vectors of fixed size (the embedding vectors). It can be trained or initialized with a pretrained embedding. In this part, you will learn how to create an [Embedding()](https://keras.io/layers/embeddings/) layer in Keras, initialize it with the GloVe 50-dimensional vectors loaded earlier in the notebook. Because our training set is quite small, we will not update the word embeddings but will instead leave their values fixed. But in the code below, we'll show you how Keras allows you to either train or leave fixed this layer. \n", + "\n", + "The `Embedding()` layer takes an integer matrix of size (batch size, max input length) as input. This corresponds to sentences converted into lists of indices (integers), as shown in the figure below.\n", + "\n", + "\n", + "
**Figure 4**: Embedding layer. This example shows the propagation of two examples through the embedding layer. Both have been zero-padded to a length of `max_len=5`. The final dimension of the representation is `(2,max_len,50)` because the word embeddings we are using are 50 dimensional.
\n", + "\n", + "The largest integer (i.e. word index) in the input should be no larger than the vocabulary size. The layer outputs an array of shape (batch size, max input length, dimension of word vectors).\n", + "\n", + "The first step is to convert all your training sentences into lists of indices, and then zero-pad all these lists so that their length is the length of the longest sentence. \n", + "\n", + "**Exercise**: Implement the function below to convert X (array of sentences as strings) into an array of indices corresponding to words in the sentences. The output shape should be such that it can be given to `Embedding()` (described in Figure 4). " + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: sentences_to_indices\n", + "\n", + "def sentences_to_indices(X, word_to_index, max_len):\n", + " \"\"\"\n", + " Converts an array of sentences (strings) into an array of indices corresponding to words in the sentences.\n", + " The output shape should be such that it can be given to `Embedding()` (described in Figure 4). \n", + " \n", + " Arguments:\n", + " X -- array of sentences (strings), of shape (m, 1)\n", + " word_to_index -- a dictionary containing the each word mapped to its index\n", + " max_len -- maximum number of words in a sentence. You can assume every sentence in X is no longer than this. \n", + " \n", + " Returns:\n", + " X_indices -- array of indices corresponding to words in the sentences from X, of shape (m, max_len)\n", + " \"\"\"\n", + " \n", + " m = X.shape[0] # number of training examples\n", + " \n", + " ### START CODE HERE ###\n", + " # Initialize X_indices as a numpy matrix of zeros and the correct shape (≈ 1 line)\n", + " X_indices = np.zeros((m, max_len))\n", + " \n", + " for i in range(m): # loop over training examples\n", + " \n", + " # Convert the ith training sentence in lower case and split is into words. You should get a list of words.\n", + " sentence_words = X[i].lower().split()\n", + " \n", + " # Initialize j to 0\n", + " j = 0\n", + " \n", + " # Loop over the words of sentence_words\n", + " for w in sentence_words:\n", + " # Set the (i,j)th entry of X_indices to the index of the correct word.\n", + " X_indices[i, j] = word_to_index[w]\n", + " # Increment j to j + 1\n", + " j = j + 1\n", + " \n", + " ### END CODE HERE ###\n", + " \n", + " return X_indices" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the following cell to check what `sentences_to_indices()` does, and check your results." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "X1 = ['funny lol' 'lets play baseball' 'food is ready for you']\n", + "X1_indices = [[ 155345. 225122. 0. 0. 0.]\n", + " [ 220930. 286375. 69714. 0. 0.]\n", + " [ 151204. 192973. 302254. 151349. 394475.]]\n" + ] + } + ], + "source": [ + "X1 = np.array([\"funny lol\", \"lets play baseball\", \"food is ready for you\"])\n", + "X1_indices = sentences_to_indices(X1,word_to_index, max_len = 5)\n", + "print(\"X1 =\", X1)\n", + "print(\"X1_indices =\", X1_indices)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **X1 =**\n", + " \n", + " ['funny lol' 'lets play football' 'food is ready for you']\n", + "
\n", + " **X1_indices =**\n", + " \n", + " [[ 155345. 225122. 0. 0. 0.]
\n", + " [ 220930. 286375. 151266. 0. 0.]
\n", + " [ 151204. 192973. 302254. 151349. 394475.]]\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's build the `Embedding()` layer in Keras, using pre-trained word vectors. After this layer is built, you will pass the output of `sentences_to_indices()` to it as an input, and the `Embedding()` layer will return the word embeddings for a sentence. \n", + "\n", + "**Exercise**: Implement `pretrained_embedding_layer()`. You will need to carry out the following steps:\n", + "1. Initialize the embedding matrix as a numpy array of zeroes with the correct shape.\n", + "2. Fill in the embedding matrix with all the word embeddings extracted from `word_to_vec_map`.\n", + "3. Define Keras embedding layer. Use [Embedding()](https://keras.io/layers/embeddings/). Be sure to make this layer non-trainable, by setting `trainable = False` when calling `Embedding()`. If you were to set `trainable = True`, then it will allow the optimization algorithm to modify the values of the word embeddings. \n", + "4. Set the embedding weights to be equal to the embedding matrix " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: pretrained_embedding_layer\n", + "\n", + "def pretrained_embedding_layer(word_to_vec_map, word_to_index):\n", + " \"\"\"\n", + " Creates a Keras Embedding() layer and loads in pre-trained GloVe 50-dimensional vectors.\n", + " \n", + " Arguments:\n", + " word_to_vec_map -- dictionary mapping words to their GloVe vector representation.\n", + " word_to_index -- dictionary mapping from words to their indices in the vocabulary (400,001 words)\n", + "\n", + " Returns:\n", + " embedding_layer -- pretrained layer Keras instance\n", + " \"\"\"\n", + " \n", + " vocab_len = len(word_to_index) + 1 # adding 1 to fit Keras embedding (requirement)\n", + " emb_dim = word_to_vec_map[\"cucumber\"].shape[0] # define dimensionality of your GloVe word vectors (= 50)\n", + " \n", + " ### START CODE HERE ###\n", + " # Initialize the embedding matrix as a numpy array of zeros of shape (vocab_len, dimensions of word vectors = emb_dim)\n", + " emb_matrix = np.zeros((vocab_len, emb_dim))\n", + " \n", + " # Set each row \"index\" of the embedding matrix to be the word vector representation of the \"index\"th word of the vocabulary\n", + " for word, index in word_to_index.items():\n", + " emb_matrix[index, :] = word_to_vec_map[word]\n", + "\n", + " # Define Keras embedding layer with the correct output/input sizes, make it trainable. Use Embedding(...). Make sure to set trainable=False. \n", + " embedding_layer = Embedding(vocab_len, emb_dim)\n", + " ### END CODE HERE ###\n", + "\n", + " # Build the embedding layer, it is required before setting the weights of the embedding layer. Do not modify the \"None\".\n", + " embedding_layer.build((None,))\n", + " \n", + " # Set the weights of the embedding layer to the embedding matrix. Your layer is now pretrained.\n", + " embedding_layer.set_weights([emb_matrix])\n", + " \n", + " return embedding_layer" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "weights[0][1][3] = -0.3403\n" + ] + } + ], + "source": [ + "embedding_layer = pretrained_embedding_layer(word_to_vec_map, word_to_index)\n", + "print(\"weights[0][1][3] =\", embedding_layer.get_weights()[0][1][3])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **weights[0][1][3] =**\n", + " \n", + " -0.3403\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.3 Building the Emojifier-V2\n", + "\n", + "Lets now build the Emojifier-V2 model. You will do so using the embedding layer you have built, and feed its output to an LSTM network. \n", + "\n", + "
\n", + "
**Figure 3**: Emojifier-v2. A 2-layer LSTM sequence classifier.
\n", + "\n", + "\n", + "**Exercise:** Implement `Emojify_V2()`, which builds a Keras graph of the architecture shown in Figure 3. The model takes as input an array of sentences of shape (`m`, `max_len`, ) defined by `input_shape`. It should output a softmax probability vector of shape (`m`, `C = 5`). You may need `Input(shape = ..., dtype = '...')`, [LSTM()](https://keras.io/layers/recurrent/#lstm), [Dropout()](https://keras.io/layers/core/#dropout), [Dense()](https://keras.io/layers/core/#dense), and [Activation()](https://keras.io/activations/)." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: Emojify_V2\n", + "\n", + "def Emojify_V2(input_shape, word_to_vec_map, word_to_index):\n", + " \"\"\"\n", + " Function creating the Emojify-v2 model's graph.\n", + " \n", + " Arguments:\n", + " input_shape -- shape of the input, usually (max_len,)\n", + " word_to_vec_map -- dictionary mapping every word in a vocabulary into its 50-dimensional vector representation\n", + " word_to_index -- dictionary mapping from words to their indices in the vocabulary (400,001 words)\n", + "\n", + " Returns:\n", + " model -- a model instance in Keras\n", + " \"\"\"\n", + " \n", + " ### START CODE HERE ###\n", + " # Define sentence_indices as the input of the graph, it should be of shape input_shape and dtype 'int32' (as it contains indices).\n", + " sentence_indices = Input(shape=input_shape, dtype=np.int32)\n", + " \n", + " # Create the embedding layer pretrained with GloVe Vectors (≈1 line)\n", + " embedding_layer = pretrained_embedding_layer(word_to_vec_map, word_to_index)\n", + " \n", + " # Propagate sentence_indices through your embedding layer, you get back the embeddings\n", + " embeddings = embedding_layer(sentence_indices) \n", + " \n", + " # Propagate the embeddings through an LSTM layer with 128-dimensional hidden state\n", + " # Be careful, the returned output should be a batch of sequences.\n", + " X = LSTM(128, return_sequences=True)(embeddings)\n", + " # Add dropout with a probability of 0.5\n", + " X = Dropout(0.5)(X)\n", + " # Propagate X trough another LSTM layer with 128-dimensional hidden state\n", + " # Be careful, the returned output should be a single hidden state, not a batch of sequences.\n", + " X = LSTM(128)(X)\n", + " # Add dropout with a probability of 0.5\n", + " X = Dropout(0.5)(X)\n", + " # Propagate X through a Dense layer with softmax activation to get back a batch of 5-dimensional vectors.\n", + " X = Dense(5, activation='softmax')(X)\n", + " # Add a softmax activation\n", + " X = Activation('softmax')(X)\n", + " \n", + " # Create Model instance which converts sentence_indices into X.\n", + " model = Model(sentence_indices, X)\n", + " \n", + " ### END CODE HERE ###\n", + " \n", + " return model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the following cell to create your model and check its summary. Because all sentences in the dataset are less than 10 words, we chose `max_len = 10`. You should see your architecture, it uses \"20,223,927\" parameters, of which 20,000,050 (the word embeddings) are non-trainable, and the remaining 223,877 are. Because our vocabulary size has 400,001 words (with valid indices from 0 to 400,000) there are 400,001\\*50 = 20,000,050 non-trainable parameters. " + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "input_2 (InputLayer) (None, 10) 0 \n", + "_________________________________________________________________\n", + "embedding_3 (Embedding) (None, 10, 50) 20000050 \n", + "_________________________________________________________________\n", + "lstm_3 (LSTM) (None, 10, 128) 91648 \n", + "_________________________________________________________________\n", + "dropout_3 (Dropout) (None, 10, 128) 0 \n", + "_________________________________________________________________\n", + "lstm_4 (LSTM) (None, 128) 131584 \n", + "_________________________________________________________________\n", + "dropout_4 (Dropout) (None, 128) 0 \n", + "_________________________________________________________________\n", + "dense_2 (Dense) (None, 5) 645 \n", + "_________________________________________________________________\n", + "activation_2 (Activation) (None, 5) 0 \n", + "=================================================================\n", + "Total params: 20,223,927\n", + "Trainable params: 20,223,927\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model = Emojify_V2((maxLen,), word_to_vec_map, word_to_index)\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As usual, after creating your model in Keras, you need to compile it and define what loss, optimizer and metrics your are want to use. Compile your model using `categorical_crossentropy` loss, `adam` optimizer and `['accuracy']` metrics:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It's time to train your model. Your Emojifier-V2 `model` takes as input an array of shape (`m`, `max_len`) and outputs probability vectors of shape (`m`, `number of classes`). We thus have to convert X_train (array of sentences as strings) to X_train_indices (array of sentences as list of word indices), and Y_train (labels as indices) to Y_train_oh (labels as one-hot vectors)." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "X_train_indices = sentences_to_indices(X_train, word_to_index, maxLen)\n", + "Y_train_oh = convert_to_one_hot(Y_train, C = 5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Fit the Keras model on `X_train_indices` and `Y_train_oh`. We will use `epochs = 50` and `batch_size = 32`." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/50\n", + "132/132 [==============================] - 2s - loss: 1.6063 - acc: 0.2500 \n", + "Epoch 2/50\n", + "132/132 [==============================] - 1s - loss: 1.5827 - acc: 0.3712 \n", + "Epoch 3/50\n", + "132/132 [==============================] - 1s - loss: 1.5617 - acc: 0.3561 \n", + "Epoch 4/50\n", + "132/132 [==============================] - 1s - loss: 1.5480 - acc: 0.3712 \n", + "Epoch 5/50\n", + "132/132 [==============================] - 1s - loss: 1.5066 - acc: 0.4242 \n", + "Epoch 6/50\n", + "132/132 [==============================] - 1s - loss: 1.4802 - acc: 0.4394 \n", + "Epoch 7/50\n", + "132/132 [==============================] - 1s - loss: 1.4200 - acc: 0.5076 \n", + "Epoch 8/50\n", + "132/132 [==============================] - 1s - loss: 1.3913 - acc: 0.5152 \n", + "Epoch 9/50\n", + "132/132 [==============================] - 1s - loss: 1.3794 - acc: 0.5682 \n", + "Epoch 10/50\n", + "132/132 [==============================] - 1s - loss: 1.3192 - acc: 0.6061 \n", + "Epoch 11/50\n", + "132/132 [==============================] - 1s - loss: 1.3099 - acc: 0.5985 \n", + "Epoch 12/50\n", + "132/132 [==============================] - 1s - loss: 1.2381 - acc: 0.6818 \n", + "Epoch 13/50\n", + "132/132 [==============================] - 1s - loss: 1.2051 - acc: 0.7424 \n", + "Epoch 14/50\n", + "132/132 [==============================] - 1s - loss: 1.1538 - acc: 0.7879 \n", + "Epoch 15/50\n", + "132/132 [==============================] - 1s - loss: 1.1818 - acc: 0.7273 \n", + "Epoch 16/50\n", + "132/132 [==============================] - 1s - loss: 1.1137 - acc: 0.7879 \n", + "Epoch 17/50\n", + "132/132 [==============================] - 1s - loss: 1.1251 - acc: 0.7803 \n", + "Epoch 18/50\n", + "132/132 [==============================] - 1s - loss: 1.0874 - acc: 0.8106 \n", + "Epoch 19/50\n", + "132/132 [==============================] - 1s - loss: 1.0984 - acc: 0.8106 \n", + "Epoch 20/50\n", + "132/132 [==============================] - 1s - loss: 1.0785 - acc: 0.8485 \n", + "Epoch 21/50\n", + "132/132 [==============================] - 1s - loss: 1.0431 - acc: 0.8864 \n", + "Epoch 22/50\n", + "132/132 [==============================] - 1s - loss: 1.0329 - acc: 0.8864 \n", + "Epoch 23/50\n", + "132/132 [==============================] - 1s - loss: 1.0048 - acc: 0.9167 \n", + "Epoch 24/50\n", + "132/132 [==============================] - 1s - loss: 0.9825 - acc: 0.9318 \n", + "Epoch 25/50\n", + "132/132 [==============================] - 1s - loss: 0.9913 - acc: 0.9242 \n", + "Epoch 26/50\n", + "132/132 [==============================] - 1s - loss: 0.9696 - acc: 0.9545 \n", + "Epoch 27/50\n", + "132/132 [==============================] - 1s - loss: 0.9977 - acc: 0.9242 \n", + "Epoch 28/50\n", + "132/132 [==============================] - 1s - loss: 1.0870 - acc: 0.8030 \n", + "Epoch 29/50\n", + "132/132 [==============================] - 1s - loss: 0.9474 - acc: 0.9545 \n", + "Epoch 30/50\n", + "132/132 [==============================] - 1s - loss: 0.9819 - acc: 0.9242 \n", + "Epoch 31/50\n", + "132/132 [==============================] - 1s - loss: 0.9829 - acc: 0.9318 \n", + "Epoch 32/50\n", + "132/132 [==============================] - 2s - loss: 0.9443 - acc: 0.9697 \n", + "Epoch 33/50\n", + "132/132 [==============================] - 2s - loss: 0.9318 - acc: 0.9773 \n", + "Epoch 34/50\n", + "132/132 [==============================] - 2s - loss: 0.9290 - acc: 0.9773 \n", + "Epoch 35/50\n", + "132/132 [==============================] - 2s - loss: 0.9442 - acc: 0.9697 \n", + "Epoch 36/50\n", + "132/132 [==============================] - 2s - loss: 0.9217 - acc: 0.9848 \n", + "Epoch 37/50\n", + "132/132 [==============================] - 2s - loss: 0.9213 - acc: 0.9848 \n", + "Epoch 38/50\n", + "132/132 [==============================] - 2s - loss: 0.9189 - acc: 0.9924 \n", + "Epoch 39/50\n", + "132/132 [==============================] - 2s - loss: 0.9291 - acc: 0.9773 \n", + "Epoch 40/50\n", + "132/132 [==============================] - 2s - loss: 0.9145 - acc: 0.9924 \n", + "Epoch 41/50\n", + "132/132 [==============================] - 2s - loss: 0.9153 - acc: 0.9924 \n", + "Epoch 42/50\n", + "132/132 [==============================] - 2s - loss: 0.9158 - acc: 0.9924 \n", + "Epoch 43/50\n", + "132/132 [==============================] - 2s - loss: 0.9213 - acc: 0.9848 \n", + "Epoch 44/50\n", + "132/132 [==============================] - 2s - loss: 0.9136 - acc: 0.9924 \n", + "Epoch 45/50\n", + "132/132 [==============================] - 2s - loss: 0.9147 - acc: 0.9924 \n", + "Epoch 46/50\n", + "132/132 [==============================] - 2s - loss: 0.9142 - acc: 0.9924 \n", + "Epoch 47/50\n", + "132/132 [==============================] - 2s - loss: 0.9126 - acc: 0.9924 \n", + "Epoch 48/50\n", + "132/132 [==============================] - 2s - loss: 0.9134 - acc: 0.9924 \n", + "Epoch 49/50\n", + "132/132 [==============================] - 2s - loss: 0.9136 - acc: 0.9924 \n", + "Epoch 50/50\n", + "132/132 [==============================] - 2s - loss: 0.9129 - acc: 0.9924 \n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.fit(X_train_indices, Y_train_oh, epochs = 50, batch_size = 32, shuffle=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Your model should perform close to **100% accuracy** on the training set. The exact accuracy you get may be a little different. Run the following cell to evaluate your model on the test set. " + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "32/56 [================>.............] - ETA: 0s\n", + "Test accuracy = 0.785714294229\n" + ] + } + ], + "source": [ + "X_test_indices = sentences_to_indices(X_test, word_to_index, max_len = maxLen)\n", + "Y_test_oh = convert_to_one_hot(Y_test, C = 5)\n", + "loss, acc = model.evaluate(X_test_indices, Y_test_oh)\n", + "print()\n", + "print(\"Test accuracy = \", acc)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You should get a test accuracy between 80% and 95%. Run the cell below to see the mislabelled examples. " + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Expected emoji:😞 prediction: I am upset\t⚾\n", + "Expected emoji:😞 prediction: work is hard\t😄\n", + "Expected emoji:😞 prediction: work is horrible\t😄\n", + "Expected emoji:🍴 prediction: any suggestions for dinner\t😄\n", + "Expected emoji:😄 prediction: you brighten my day\t😞\n", + "Expected emoji:😞 prediction: she is a bully\t❤️\n", + "Expected emoji:😞 prediction: I am upset\t⚾\n", + "Expected emoji:😞 prediction: My life is so boring\t❤️\n", + "Expected emoji:😄 prediction: will you be my valentine\t❤️\n", + "Expected emoji:😞 prediction: go away\t⚾\n", + "Expected emoji:😞 prediction: yesterday we lost again\t⚾\n", + "Expected emoji:🍴 prediction: I did not have breakfast 😄\n" + ] + } + ], + "source": [ + "# This code allows you to see the mislabelled examples\n", + "C = 5\n", + "y_test_oh = np.eye(C)[Y_test.reshape(-1)]\n", + "X_test_indices = sentences_to_indices(X_test, word_to_index, maxLen)\n", + "pred = model.predict(X_test_indices)\n", + "for i in range(len(X_test)):\n", + " x = X_test_indices\n", + " num = np.argmax(pred[i])\n", + " if(num != Y_test[i]):\n", + " print('Expected emoji:'+ label_to_emoji(Y_test[i]) + ' prediction: '+ X_test[i] + label_to_emoji(num).strip())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now you can try it on your own example. Write your own sentence below. " + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "not feeling happy ❤️\n" + ] + } + ], + "source": [ + "# Change the sentence below to see your prediction. Make sure all the words are in the Glove embeddings. \n", + "x_test = np.array(['not feeling happy'])\n", + "X_test_indices = sentences_to_indices(x_test, word_to_index, maxLen)\n", + "print(x_test[0] +' '+ label_to_emoji(np.argmax(model.predict(X_test_indices))))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Previously, Emojify-V1 model did not correctly label \"not feeling happy,\" but our implementation of Emojiy-V2 got it right. (Keras' outputs are slightly random each time, so you may not have obtained the same result.) The current model still isn't very robust at understanding negation (like \"not happy\") because the training set is small and so doesn't have a lot of examples of negation. But if the training set were larger, the LSTM model would be much better than the Emojify-V1 model at understanding such complex sentences. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Congratulations!\n", + "\n", + "You have completed this notebook! ❤️❤️❤️\n", + "\n", + "\n", + "**What you should remember**:\n", + "- If you have an NLP task where the training set is small, using word embeddings can help your algorithm significantly. Word embeddings allow your model to work on words in the test set that may not even have appeared in your training set. \n", + "- Training sequence models in Keras (and in most other deep learning frameworks) requires a few important details:\n", + " - To use mini-batches, the sequences need to be padded so that all the examples in a mini-batch have the same length. \n", + " - An `Embedding()` layer can be initialized with pretrained values. These values can be either fixed or trained further on your dataset. If however your labeled dataset is small, it's usually not worth trying to train a large pre-trained set of embeddings. \n", + " - `LSTM()` has a flag called `return_sequences` to decide if you would like to return every hidden states or only the last one. \n", + " - You can use `Dropout()` right after `LSTM()` to regularize your network. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Congratulations on finishing this assignment and building an Emojifier. We hope you're happy with what you've accomplished in this notebook! \n", + "\n", + "# 😀😀😀😀😀😀\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Acknowledgments\n", + "\n", + "Thanks to Alison Darcy and the Woebot team for their advice on the creation of this assignment. Woebot is a chatbot friend that is ready to speak with you 24/7. As part of Woebot's technology, it uses word embeddings to understand the emotions of what you say. You can play with it by going to http://woebot.io\n", + "\n", + "\n", + "\n", + "\n" + ] + } + ], + "metadata": { + "coursera": { + "course_slug": "nlp-sequence-models", + "graded_item_id": "RNnEs", + "launcher_item_id": "acNYU" + }, + "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.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Sequence Models/Week 2/Emojify/images/data_set.png b/Sequence Models/Week 2/Emojify/images/data_set.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Emojify/images/dataset_kiank.png b/Sequence Models/Week 2/Emojify/images/dataset_kiank.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Emojify/images/emb_kiank.png b/Sequence Models/Week 2/Emojify/images/emb_kiank.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Emojify/images/embedding1.png b/Sequence Models/Week 2/Emojify/images/embedding1.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Emojify/images/emo_model.png b/Sequence Models/Week 2/Emojify/images/emo_model.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Emojify/images/emoji_list.png b/Sequence Models/Week 2/Emojify/images/emoji_list.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Emojify/images/emojifier-v2.png b/Sequence Models/Week 2/Emojify/images/emojifier-v2.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Emojify/images/emojifierv1.png b/Sequence Models/Week 2/Emojify/images/emojifierv1.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Emojify/images/emojify_model.png b/Sequence Models/Week 2/Emojify/images/emojify_model.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Emojify/images/emojiss.png b/Sequence Models/Week 2/Emojify/images/emojiss.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Emojify/images/image_1.png b/Sequence Models/Week 2/Emojify/images/image_1.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Emojify/images/woebot.png b/Sequence Models/Week 2/Emojify/images/woebot.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Natural Language Processing & Word Embeddings.pdf b/Sequence Models/Week 2/Natural Language Processing & Word Embeddings.pdf new file mode 100644 index 0000000..b692202 Binary files /dev/null and b/Sequence Models/Week 2/Natural Language Processing & Word Embeddings.pdf differ diff --git a/Sequence Models/Week 2/Word Vector Representation/Operations on word vectors - v2.ipynb b/Sequence Models/Week 2/Word Vector Representation/Operations on word vectors - v2.ipynb new file mode 100644 index 0000000..1001c69 --- /dev/null +++ b/Sequence Models/Week 2/Word Vector Representation/Operations on word vectors - v2.ipynb @@ -0,0 +1,764 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Operations on word vectors\n", + "\n", + "Welcome to your first assignment of this week! \n", + "\n", + "Because word embeddings are very computionally expensive to train, most ML practitioners will load a pre-trained set of embeddings. \n", + "\n", + "**After this assignment you will be able to:**\n", + "\n", + "- Load pre-trained word vectors, and measure similarity using cosine similarity\n", + "- Use word embeddings to solve word analogy problems such as Man is to Woman as King is to ______. \n", + "- Modify word embeddings to reduce their gender bias \n", + "\n", + "Let's get started! Run the following cell to load the packages you will need." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "from w2v_utils import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, lets load the word vectors. For this assignment, we will use 50-dimensional GloVe vectors to represent words. Run the following cell to load the `word_to_vec_map`. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "words, word_to_vec_map = read_glove_vecs('data/glove.6B.50d.txt')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You've loaded:\n", + "- `words`: set of words in the vocabulary.\n", + "- `word_to_vec_map`: dictionary mapping words to their GloVe vector representation.\n", + "\n", + "You've seen that one-hot vectors do not do a good job cpaturing what words are similar. GloVe vectors provide much more useful information about the meaning of individual words. Lets now see how you can use GloVe vectors to decide how similar two words are. \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 1 - Cosine similarity\n", + "\n", + "To measure how similar two words are, we need a way to measure the degree of similarity between two embedding vectors for the two words. Given two vectors $u$ and $v$, cosine similarity is defined as follows: \n", + "\n", + "$$\\text{CosineSimilarity(u, v)} = \\frac {u . v} {||u||_2 ||v||_2} = cos(\\theta) \\tag{1}$$\n", + "\n", + "where $u.v$ is the dot product (or inner product) of two vectors, $||u||_2$ is the norm (or length) of the vector $u$, and $\\theta$ is the angle between $u$ and $v$. This similarity depends on the angle between $u$ and $v$. If $u$ and $v$ are very similar, their cosine similarity will be close to 1; if they are dissimilar, the cosine similarity will take a smaller value. \n", + "\n", + "\n", + "
**Figure 1**: The cosine of the angle between two vectors is a measure of how similar they are
\n", + "\n", + "**Exercise**: Implement the function `cosine_similarity()` to evaluate similarity between word vectors.\n", + "\n", + "**Reminder**: The norm of $u$ is defined as $ ||u||_2 = \\sqrt{\\sum_{i=1}^{n} u_i^2}$" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: cosine_similarity\n", + "\n", + "def cosine_similarity(u, v):\n", + " \"\"\"\n", + " Cosine similarity reflects the degree of similariy between u and v\n", + " \n", + " Arguments:\n", + " u -- a word vector of shape (n,) \n", + " v -- a word vector of shape (n,)\n", + "\n", + " Returns:\n", + " cosine_similarity -- the cosine similarity between u and v defined by the formula above.\n", + " \"\"\"\n", + " \n", + " distance = 0.0\n", + " \n", + " ### START CODE HERE ###\n", + " # Compute the dot product between u and v (≈1 line)\n", + " dot = np.dot(u, v)\n", + " # Compute the L2 norm of u (≈1 line)\n", + " norm_u = np.sqrt(np.sum(u**2))\n", + " \n", + " # Compute the L2 norm of v (≈1 line)\n", + " norm_v = np.sqrt(np.sum(v**2))\n", + " # Compute the cosine similarity defined by formula (1) (≈1 line)\n", + " cosine_similarity = dot / np.dot(norm_u, norm_v)\n", + " ### END CODE HERE ###\n", + " \n", + " return cosine_similarity" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cosine_similarity(father, mother) = 0.890903844289\n", + "cosine_similarity(ball, crocodile) = 0.274392462614\n", + "cosine_similarity(france - paris, rome - italy) = -0.675147930817\n" + ] + } + ], + "source": [ + "father = word_to_vec_map[\"father\"]\n", + "mother = word_to_vec_map[\"mother\"]\n", + "ball = word_to_vec_map[\"ball\"]\n", + "crocodile = word_to_vec_map[\"crocodile\"]\n", + "france = word_to_vec_map[\"france\"]\n", + "italy = word_to_vec_map[\"italy\"]\n", + "paris = word_to_vec_map[\"paris\"]\n", + "rome = word_to_vec_map[\"rome\"]\n", + "\n", + "print(\"cosine_similarity(father, mother) = \", cosine_similarity(father, mother))\n", + "print(\"cosine_similarity(ball, crocodile) = \",cosine_similarity(ball, crocodile))\n", + "print(\"cosine_similarity(france - paris, rome - italy) = \",cosine_similarity(france - paris, rome - italy))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **cosine_similarity(father, mother)** =\n", + " \n", + " 0.890903844289\n", + "
\n", + " **cosine_similarity(ball, crocodile)** =\n", + " \n", + " 0.274392462614\n", + "
\n", + " **cosine_similarity(france - paris, rome - italy)** =\n", + " \n", + " -0.675147930817\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After you get the correct expected output, please feel free to modify the inputs and measure the cosine similarity between other pairs of words! Playing around the cosine similarity of other inputs will give you a better sense of how word vectors behave. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2 - Word analogy task\n", + "\n", + "In the word analogy task, we complete the sentence \"*a* is to *b* as *c* is to **____**\". An example is '*man* is to *woman* as *king* is to *queen*' . In detail, we are trying to find a word *d*, such that the associated word vectors $e_a, e_b, e_c, e_d$ are related in the following manner: $e_b - e_a \\approx e_d - e_c$. We will measure the similarity between $e_b - e_a$ and $e_d - e_c$ using cosine similarity. \n", + "\n", + "**Exercise**: Complete the code below to be able to perform word analogies!" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: complete_analogy\n", + "\n", + "def complete_analogy(word_a, word_b, word_c, word_to_vec_map):\n", + " \"\"\"\n", + " Performs the word analogy task as explained above: a is to b as c is to ____. \n", + " \n", + " Arguments:\n", + " word_a -- a word, string\n", + " word_b -- a word, string\n", + " word_c -- a word, string\n", + " word_to_vec_map -- dictionary that maps words to their corresponding vectors. \n", + " \n", + " Returns:\n", + " best_word -- the word such that v_b - v_a is close to v_best_word - v_c, as measured by cosine similarity\n", + " \"\"\"\n", + " \n", + " # convert words to lower case\n", + " word_a, word_b, word_c = word_a.lower(), word_b.lower(), word_c.lower()\n", + " \n", + " ### START CODE HERE ###\n", + " # Get the word embeddings v_a, v_b and v_c (≈1-3 lines)\n", + " e_a, e_b, e_c = word_to_vec_map[word_a], word_to_vec_map[word_b], word_to_vec_map[word_c]\n", + " ### END CODE HERE ###\n", + " \n", + " words = word_to_vec_map.keys()\n", + " max_cosine_sim = -100 # Initialize max_cosine_sim to a large negative number\n", + " best_word = None # Initialize best_word with None, it will help keep track of the word to output\n", + "\n", + " # loop over the whole word vector set\n", + " for w in words: \n", + " # to avoid best_word being one of the input words, pass on them.\n", + " if w in [word_a, word_b, word_c] :\n", + " continue\n", + " \n", + " ### START CODE HERE ###\n", + " # Compute cosine similarity between the vector (e_b - e_a) and the vector ((w's vector representation) - e_c) (≈1 line)\n", + " cosine_sim = cosine_similarity((e_b - e_a), (word_to_vec_map[w] - e_c))\n", + " \n", + " # If the cosine_sim is more than the max_cosine_sim seen so far,\n", + " # then: set the new max_cosine_sim to the current cosine_sim and the best_word to the current word (≈3 lines)\n", + " if cosine_sim > max_cosine_sim:\n", + " max_cosine_sim = cosine_sim\n", + " best_word = w\n", + " ### END CODE HERE ###\n", + " \n", + " return best_word" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the cell below to test your code, this may take 1-2 minutes." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "italy -> italian :: spain -> spanish\n", + "india -> delhi :: japan -> tokyo\n", + "man -> woman :: boy -> girl\n", + "small -> smaller :: large -> larger\n" + ] + } + ], + "source": [ + "triads_to_try = [('italy', 'italian', 'spain'), ('india', 'delhi', 'japan'), ('man', 'woman', 'boy'), ('small', 'smaller', 'large')]\n", + "for triad in triads_to_try:\n", + " print ('{} -> {} :: {} -> {}'.format( *triad, complete_analogy(*triad,word_to_vec_map)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **italy -> italian** ::\n", + " \n", + " spain -> spanish\n", + "
\n", + " **india -> delhi** ::\n", + " \n", + " japan -> tokyo\n", + "
\n", + " **man -> woman ** ::\n", + " \n", + " boy -> girl\n", + "
\n", + " **small -> smaller ** ::\n", + " \n", + " large -> larger\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once you get the correct expected output, please feel free to modify the input cells above to test your own analogies. Try to find some other analogy pairs that do work, but also find some where the algorithm doesn't give the right answer: For example, you can try small->smaller as big->?. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Congratulations!\n", + "\n", + "You've come to the end of this assignment. Here are the main points you should remember:\n", + "\n", + "- Cosine similarity a good way to compare similarity between pairs of word vectors. (Though L2 distance works too.) \n", + "- For NLP applications, using a pre-trained set of word vectors from the internet is often a good way to get started. \n", + "\n", + "Even though you have finished the graded portions, we recommend you take a look too at the rest of this notebook. \n", + "\n", + "Congratulations on finishing the graded portions of this notebook! \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3 - Debiasing word vectors (OPTIONAL/UNGRADED) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the following exercise, you will examine gender biases that can be reflected in a word embedding, and explore algorithms for reducing the bias. In addition to learning about the topic of debiasing, this exercise will also help hone your intuition about what word vectors are doing. This section involves a bit of linear algebra, though you can probably complete it even without being expert in linear algebra, and we encourage you to give it a shot. This portion of the notebook is optional and is not graded. \n", + "\n", + "Lets first see how the GloVe word embeddings relate to gender. You will first compute a vector $g = e_{woman}-e_{man}$, where $e_{woman}$ represents the word vector corresponding to the word *woman*, and $e_{man}$ corresponds to the word vector corresponding to the word *man*. The resulting vector $g$ roughly encodes the concept of \"gender\". (You might get a more accurate representation if you compute $g_1 = e_{mother}-e_{father}$, $g_2 = e_{girl}-e_{boy}$, etc. and average over them. But just using $e_{woman}-e_{man}$ will give good enough results for now.) \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "g = word_to_vec_map['woman'] - word_to_vec_map['man']\n", + "print(g)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, you will consider the cosine similarity of different words with $g$. Consider what a positive value of similarity means vs a negative cosine similarity. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true, + "scrolled": false + }, + "outputs": [], + "source": [ + "print ('List of names and their similarities with constructed vector:')\n", + "\n", + "# girls and boys name\n", + "name_list = ['john', 'marie', 'sophie', 'ronaldo', 'priya', 'rahul', 'danielle', 'reza', 'katy', 'yasmin']\n", + "\n", + "for w in name_list:\n", + " print (w, cosine_similarity(word_to_vec_map[w], g))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, female first names tend to have a positive cosine similarity with our constructed vector $g$, while male first names tend to have a negative cosine similarity. This is not suprising, and the result seems acceptable. \n", + "\n", + "But let's try with some other words." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "print('Other words and their similarities:')\n", + "word_list = ['lipstick', 'guns', 'science', 'arts', 'literature', 'warrior','doctor', 'tree', 'receptionist', \n", + " 'technology', 'fashion', 'teacher', 'engineer', 'pilot', 'computer', 'singer']\n", + "for w in word_list:\n", + " print (w, cosine_similarity(word_to_vec_map[w], g))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Do you notice anything surprising? It is astonishing how these results reflect certain unhealthy gender stereotypes. For example, \"computer\" is closer to \"man\" while \"literature\" is closer to \"woman\". Ouch! \n", + "\n", + "We'll see below how to reduce the bias of these vectors, using an algorithm due to [Boliukbasi et al., 2016](https://arxiv.org/abs/1607.06520). Note that some word pairs such as \"actor\"/\"actress\" or \"grandmother\"/\"grandfather\" should remain gender specific, while other words such as \"receptionist\" or \"technology\" should be neutralized, i.e. not be gender-related. You will have to treat these two type of words differently when debiasing.\n", + "\n", + "### 3.1 - Neutralize bias for non-gender specific words \n", + "\n", + "The figure below should help you visualize what neutralizing does. If you're using a 50-dimensional word embedding, the 50 dimensional space can be split into two parts: The bias-direction $g$, and the remaining 49 dimensions, which we'll call $g_{\\perp}$. In linear algebra, we say that the 49 dimensional $g_{\\perp}$ is perpendicular (or \"othogonal\") to $g$, meaning it is at 90 degrees to $g$. The neutralization step takes a vector such as $e_{receptionist}$ and zeros out the component in the direction of $g$, giving us $e_{receptionist}^{debiased}$. \n", + "\n", + "Even though $g_{\\perp}$ is 49 dimensional, given the limitations of what we can draw on a screen, we illustrate it using a 1 dimensional axis below. \n", + "\n", + "\n", + "
**Figure 2**: The word vector for \"receptionist\" represented before and after applying the neutralize operation.
\n", + "\n", + "**Exercise**: Implement `neutralize()` to remove the bias of words such as \"receptionist\" or \"scientist\". Given an input embedding $e$, you can use the following formulas to compute $e^{debiased}$: \n", + "\n", + "$$e^{bias\\_component} = \\frac{e \\cdot g}{||g||_2^2} * g\\tag{2}$$\n", + "$$e^{debiased} = e - e^{bias\\_component}\\tag{3}$$\n", + "\n", + "If you are an expert in linear algebra, you may recognize $e^{bias\\_component}$ as the projection of $e$ onto the direction $g$. If you're not an expert in linear algebra, don't worry about this.\n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def neutralize(word, g, word_to_vec_map):\n", + " \"\"\"\n", + " Removes the bias of \"word\" by projecting it on the space orthogonal to the bias axis. \n", + " This function ensures that gender neutral words are zero in the gender subspace.\n", + " \n", + " Arguments:\n", + " word -- string indicating the word to debias\n", + " g -- numpy-array of shape (50,), corresponding to the bias axis (such as gender)\n", + " word_to_vec_map -- dictionary mapping words to their corresponding vectors.\n", + " \n", + " Returns:\n", + " e_debiased -- neutralized word vector representation of the input \"word\"\n", + " \"\"\"\n", + " \n", + " ### START CODE HERE ###\n", + " # Select word vector representation of \"word\". Use word_to_vec_map. (≈ 1 line)\n", + " e = None\n", + " \n", + " # Compute e_biascomponent using the formula give above. (≈ 1 line)\n", + " e_biascomponent = None\n", + " \n", + " # Neutralize e by substracting e_biascomponent from it \n", + " # e_debiased should be equal to its orthogonal projection. (≈ 1 line)\n", + " e_debiased = None\n", + " ### END CODE HERE ###\n", + " \n", + " return e_debiased" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "e = \"receptionist\"\n", + "print(\"cosine similarity between \" + e + \" and g, before neutralizing: \", cosine_similarity(word_to_vec_map[\"receptionist\"], g))\n", + "\n", + "e_debiased = neutralize(\"receptionist\", g, word_to_vec_map)\n", + "print(\"cosine similarity between \" + e + \" and g, after neutralizing: \", cosine_similarity(e_debiased, g))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**: The second result is essentially 0, up to numerical roundof (on the order of $10^{-17}$).\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **cosine similarity between receptionist and g, before neutralizing:** :\n", + " \n", + " 0.330779417506\n", + "
\n", + " **cosine similarity between receptionist and g, after neutralizing:** :\n", + " \n", + " -3.26732746085e-17\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.2 - Equalization algorithm for gender-specific words\n", + "\n", + "Next, lets see how debiasing can also be applied to word pairs such as \"actress\" and \"actor.\" Equalization is applied to pairs of words that you might want to have differ only through the gender property. As a concrete example, suppose that \"actress\" is closer to \"babysit\" than \"actor.\" By applying neutralizing to \"babysit\" we can reduce the gender-stereotype associated with babysitting. But this still does not guarantee that \"actor\" and \"actress\" are equidistant from \"babysit.\" The equalization algorithm takes care of this. \n", + "\n", + "The key idea behind equalization is to make sure that a particular pair of words are equi-distant from the 49-dimensional $g_\\perp$. The equalization step also ensures that the two equalized steps are now the same distance from $e_{receptionist}^{debiased}$, or from any other work that has been neutralized. In pictures, this is how equalization works: \n", + "\n", + "\n", + "\n", + "\n", + "The derivation of the linear algebra to do this is a bit more complex. (See Bolukbasi et al., 2016 for details.) But the key equations are: \n", + "\n", + "$$ \\mu = \\frac{e_{w1} + e_{w2}}{2}\\tag{4}$$ \n", + "\n", + "$$ \\mu_{B} = \\frac {\\mu \\cdot \\text{bias_axis}}{||\\text{bias_axis}||_2^2} *\\text{bias_axis}\n", + "\\tag{5}$$ \n", + "\n", + "$$\\mu_{\\perp} = \\mu - \\mu_{B} \\tag{6}$$\n", + "\n", + "$$ e_{w1B} = \\frac {e_{w1} \\cdot \\text{bias_axis}}{||\\text{bias_axis}||_2^2} *\\text{bias_axis}\n", + "\\tag{7}$$ \n", + "$$ e_{w2B} = \\frac {e_{w2} \\cdot \\text{bias_axis}}{||\\text{bias_axis}||_2^2} *\\text{bias_axis}\n", + "\\tag{8}$$\n", + "\n", + "\n", + "$$e_{w1B}^{corrected} = \\sqrt{ |{1 - ||\\mu_{\\perp} ||^2_2} |} * \\frac{e_{\\text{w1B}} - \\mu_B} {|(e_{w1} - \\mu_{\\perp}) - \\mu_B)|} \\tag{9}$$\n", + "\n", + "\n", + "$$e_{w2B}^{corrected} = \\sqrt{ |{1 - ||\\mu_{\\perp} ||^2_2} |} * \\frac{e_{\\text{w2B}} - \\mu_B} {|(e_{w2} - \\mu_{\\perp}) - \\mu_B)|} \\tag{10}$$\n", + "\n", + "$$e_1 = e_{w1B}^{corrected} + \\mu_{\\perp} \\tag{11}$$\n", + "$$e_2 = e_{w2B}^{corrected} + \\mu_{\\perp} \\tag{12}$$\n", + "\n", + "\n", + "**Exercise**: Implement the function below. Use the equations above to get the final equalized version of the pair of words. Good luck!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def equalize(pair, bias_axis, word_to_vec_map):\n", + " \"\"\"\n", + " Debias gender specific words by following the equalize method described in the figure above.\n", + " \n", + " Arguments:\n", + " pair -- pair of strings of gender specific words to debias, e.g. (\"actress\", \"actor\") \n", + " bias_axis -- numpy-array of shape (50,), vector corresponding to the bias axis, e.g. gender\n", + " word_to_vec_map -- dictionary mapping words to their corresponding vectors\n", + " \n", + " Returns\n", + " e_1 -- word vector corresponding to the first word\n", + " e_2 -- word vector corresponding to the second word\n", + " \"\"\"\n", + " \n", + " ### START CODE HERE ###\n", + " # Step 1: Select word vector representation of \"word\". Use word_to_vec_map. (≈ 2 lines)\n", + " w1, w2 = None\n", + " e_w1, e_w2 = None\n", + " \n", + " # Step 2: Compute the mean of e_w1 and e_w2 (≈ 1 line)\n", + " mu = None\n", + "\n", + " # Step 3: Compute the projections of mu over the bias axis and the orthogonal axis (≈ 2 lines)\n", + " mu_B = None\n", + " mu_orth = None\n", + "\n", + " # Step 4: Use equations (7) and (8) to compute e_w1B and e_w2B (≈2 lines)\n", + " e_w1B = None\n", + " e_w2B = None\n", + " \n", + " # Step 5: Adjust the Bias part of e_w1B and e_w2B using the formulas (9) and (10) given above (≈2 lines)\n", + " corrected_e_w1B = None\n", + " corrected_e_w2B = None\n", + "\n", + " # Step 6: Debias by equalizing e1 and e2 to the sum of their corrected projections (≈2 lines)\n", + " e1 = None\n", + " e2 = None\n", + " \n", + " ### END CODE HERE ###\n", + " \n", + " return e1, e2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true, + "scrolled": true + }, + "outputs": [], + "source": [ + "print(\"cosine similarities before equalizing:\")\n", + "print(\"cosine_similarity(word_to_vec_map[\\\"man\\\"], gender) = \", cosine_similarity(word_to_vec_map[\"man\"], g))\n", + "print(\"cosine_similarity(word_to_vec_map[\\\"woman\\\"], gender) = \", cosine_similarity(word_to_vec_map[\"woman\"], g))\n", + "print()\n", + "e1, e2 = equalize((\"man\", \"woman\"), g, word_to_vec_map)\n", + "print(\"cosine similarities after equalizing:\")\n", + "print(\"cosine_similarity(e1, gender) = \", cosine_similarity(e1, g))\n", + "print(\"cosine_similarity(e2, gender) = \", cosine_similarity(e2, g))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**:\n", + "\n", + "cosine similarities before equalizing:\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **cosine_similarity(word_to_vec_map[\"man\"], gender)** =\n", + " \n", + " -0.117110957653\n", + "
\n", + " **cosine_similarity(word_to_vec_map[\"woman\"], gender)** =\n", + " \n", + " 0.356666188463\n", + "
\n", + "\n", + "cosine similarities after equalizing:\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **cosine_similarity(u1, gender)** =\n", + " \n", + " -0.700436428931\n", + "
\n", + " **cosine_similarity(u2, gender)** =\n", + " \n", + " 0.700436428931\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Please feel free to play with the input words in the cell above, to apply equalization to other pairs of words. \n", + "\n", + "These debiasing algorithms are very helpful for reducing bias, but are not perfect and do not eliminate all traces of bias. For example, one weakness of this implementation was that the bias direction $g$ was defined using only the pair of words _woman_ and _man_. As discussed earlier, if $g$ were defined by computing $g_1 = e_{woman} - e_{man}$; $g_2 = e_{mother} - e_{father}$; $g_3 = e_{girl} - e_{boy}$; and so on and averaging over them, you would obtain a better estimate of the \"gender\" dimension in the 50 dimensional word embedding space. Feel free to play with such variants as well. \n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Congratulations\n", + "\n", + "You have come to the end of this notebook, and have seen a lot of the ways that word vectors can be used as well as modified. \n", + "\n", + "Congratulations on finishing this notebook! \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**References**:\n", + "- The debiasing algorithm is from Bolukbasi et al., 2016, [Man is to Computer Programmer as Woman is to\n", + "Homemaker? Debiasing Word Embeddings](https://papers.nips.cc/paper/6228-man-is-to-computer-programmer-as-woman-is-to-homemaker-debiasing-word-embeddings.pdf)\n", + "- The GloVe word embeddings were due to Jeffrey Pennington, Richard Socher, and Christopher D. Manning. (https://nlp.stanford.edu/projects/glove/)\n" + ] + } + ], + "metadata": { + "coursera": { + "course_slug": "nlp-sequence-models", + "graded_item_id": "8hb5s", + "launcher_item_id": "5NrJ6" + }, + "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.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Sequence Models/Week 2/Word Vector Representation/images/1-hot-vector.png b/Sequence Models/Week 2/Word Vector Representation/images/1-hot-vector.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/cosine_sim.png b/Sequence Models/Week 2/Word Vector Representation/images/cosine_sim.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/equalize.png b/Sequence Models/Week 2/Word Vector Representation/images/equalize.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/equalize1.png b/Sequence Models/Week 2/Word Vector Representation/images/equalize1.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/equalize10.png b/Sequence Models/Week 2/Word Vector Representation/images/equalize10.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/equalize7.png b/Sequence Models/Week 2/Word Vector Representation/images/equalize7.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/equalize8.png b/Sequence Models/Week 2/Word Vector Representation/images/equalize8.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/equalize9.png b/Sequence Models/Week 2/Word Vector Representation/images/equalize9.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/equalize_kiank.png b/Sequence Models/Week 2/Word Vector Representation/images/equalize_kiank.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/equalize_kiank1.png b/Sequence Models/Week 2/Word Vector Representation/images/equalize_kiank1.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/equalize_kiank2.png b/Sequence Models/Week 2/Word Vector Representation/images/equalize_kiank2.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/equalize_kiank3.png b/Sequence Models/Week 2/Word Vector Representation/images/equalize_kiank3.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/lookup.png b/Sequence Models/Week 2/Word Vector Representation/images/lookup.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/neutral.png b/Sequence Models/Week 2/Word Vector Representation/images/neutral.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/neutralize.png b/Sequence Models/Week 2/Word Vector Representation/images/neutralize.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/neutralize_kiank.png b/Sequence Models/Week 2/Word Vector Representation/images/neutralize_kiank.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/skipgram.png b/Sequence Models/Week 2/Word Vector Representation/images/skipgram.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 2/Word Vector Representation/images/slide_window.mp4 b/Sequence Models/Week 2/Word Vector Representation/images/slide_window.mp4 new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 3/Machine Translation/Neural machine translation with attention - v2.ipynb b/Sequence Models/Week 3/Machine Translation/Neural machine translation with attention - v2.ipynb new file mode 100644 index 0000000..7dd9ec7 --- /dev/null +++ b/Sequence Models/Week 3/Machine Translation/Neural machine translation with attention - v2.ipynb @@ -0,0 +1,1147 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Neural Machine Translation\n", + "\n", + "Welcome to your first programming assignment for this week! \n", + "\n", + "You will build a Neural Machine Translation (NMT) model to translate human readable dates (\"25th of June, 2009\") into machine readable dates (\"2009-06-25\"). You will do this using an attention model, one of the most sophisticated sequence to sequence models. \n", + "\n", + "This notebook was produced together with NVIDIA's Deep Learning Institute. \n", + "\n", + "Let's load all the packages you will need for this assignment." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + } + ], + "source": [ + "from keras.layers import Bidirectional, Concatenate, Permute, Dot, Input, LSTM, Multiply\n", + "from keras.layers import RepeatVector, Dense, Activation, Lambda\n", + "from keras.optimizers import Adam\n", + "from keras.utils import to_categorical\n", + "from keras.models import load_model, Model\n", + "import keras.backend as K\n", + "import numpy as np\n", + "\n", + "from faker import Faker\n", + "import random\n", + "from tqdm import tqdm\n", + "from babel.dates import format_date\n", + "from nmt_utils import *\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1 - Translating human readable dates into machine readable dates\n", + "\n", + "The model you will build here could be used to translate from one language to another, such as translating from English to Hindi. However, language translation requires massive datasets and usually takes days of training on GPUs. To give you a place to experiment with these models even without using massive datasets, we will instead use a simpler \"date translation\" task. \n", + "\n", + "The network will input a date written in a variety of possible formats (*e.g. \"the 29th of August 1958\", \"03/30/1968\", \"24 JUNE 1987\"*) and translate them into standardized, machine readable dates (*e.g. \"1958-08-29\", \"1968-03-30\", \"1987-06-24\"*). We will have the network learn to output dates in the common machine-readable format YYYY-MM-DD. \n", + "\n", + "\n", + "\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.1 - Dataset\n", + "\n", + "We will train the model on a dataset of 10000 human readable dates and their equivalent, standardized, machine readable dates. Let's run the following cells to load the dataset and print some examples. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 10000/10000 [00:01<00:00, 8412.91it/s]\n" + ] + } + ], + "source": [ + "m = 10000\n", + "dataset, human_vocab, machine_vocab, inv_machine_vocab = load_dataset(m)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('9 may 1998', '1998-05-09'),\n", + " ('10.09.70', '1970-09-10'),\n", + " ('4/28/90', '1990-04-28'),\n", + " ('thursday january 26 1995', '1995-01-26'),\n", + " ('monday march 7 1983', '1983-03-07'),\n", + " ('sunday may 22 1988', '1988-05-22'),\n", + " ('tuesday july 8 2008', '2008-07-08'),\n", + " ('08 sep 1999', '1999-09-08'),\n", + " ('1 jan 1981', '1981-01-01'),\n", + " ('monday may 22 1995', '1995-05-22')]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset[:10]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You've loaded:\n", + "- `dataset`: a list of tuples of (human readable date, machine readable date)\n", + "- `human_vocab`: a python dictionary mapping all characters used in the human readable dates to an integer-valued index \n", + "- `machine_vocab`: a python dictionary mapping all characters used in machine readable dates to an integer-valued index. These indices are not necessarily consistent with `human_vocab`. \n", + "- `inv_machine_vocab`: the inverse dictionary of `machine_vocab`, mapping from indices back to characters. \n", + "\n", + "Let's preprocess the data and map the raw text data into the index values. We will also use Tx=30 (which we assume is the maximum length of the human readable date; if we get a longer input, we would have to truncate it) and Ty=10 (since \"YYYY-MM-DD\" is 10 characters long). " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "X.shape: (10000, 30)\n", + "Y.shape: (10000, 10)\n", + "Xoh.shape: (10000, 30, 37)\n", + "Yoh.shape: (10000, 10, 11)\n" + ] + } + ], + "source": [ + "Tx = 30\n", + "Ty = 10\n", + "X, Y, Xoh, Yoh = preprocess_data(dataset, human_vocab, machine_vocab, Tx, Ty)\n", + "\n", + "print(\"X.shape:\", X.shape)\n", + "print(\"Y.shape:\", Y.shape)\n", + "print(\"Xoh.shape:\", Xoh.shape)\n", + "print(\"Yoh.shape:\", Yoh.shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You now have:\n", + "- `X`: a processed version of the human readable dates in the training set, where each character is replaced by an index mapped to the character via `human_vocab`. Each date is further padded to $T_x$ values with a special character (< pad >). `X.shape = (m, Tx)`\n", + "- `Y`: a processed version of the machine readable dates in the training set, where each character is replaced by the index it is mapped to in `machine_vocab`. You should have `Y.shape = (m, Ty)`. \n", + "- `Xoh`: one-hot version of `X`, the \"1\" entry's index is mapped to the character thanks to `human_vocab`. `Xoh.shape = (m, Tx, len(human_vocab))`\n", + "- `Yoh`: one-hot version of `Y`, the \"1\" entry's index is mapped to the character thanks to `machine_vocab`. `Yoh.shape = (m, Tx, len(machine_vocab))`. Here, `len(machine_vocab) = 11` since there are 11 characters ('-' as well as 0-9). \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lets also look at some examples of preprocessed training examples. Feel free to play with `index` in the cell below to navigate the dataset and see how source/target dates are preprocessed. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Source date: 9 may 1998\n", + "Target date: 1998-05-09\n", + "\n", + "Source after preprocessing (indices): [12 0 24 13 34 0 4 12 12 11 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36\n", + " 36 36 36 36 36]\n", + "Target after preprocessing (indices): [ 2 10 10 9 0 1 6 0 1 10]\n", + "\n", + "Source after preprocessing (one-hot): [[ 0. 0. 0. ..., 0. 0. 0.]\n", + " [ 1. 0. 0. ..., 0. 0. 0.]\n", + " [ 0. 0. 0. ..., 0. 0. 0.]\n", + " ..., \n", + " [ 0. 0. 0. ..., 0. 0. 1.]\n", + " [ 0. 0. 0. ..., 0. 0. 1.]\n", + " [ 0. 0. 0. ..., 0. 0. 1.]]\n", + "Target after preprocessing (one-hot): [[ 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n", + " [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n", + " [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n", + " [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n", + " [ 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", + " [ 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", + " [ 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n", + " [ 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", + " [ 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", + " [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]\n" + ] + } + ], + "source": [ + "index = 0\n", + "print(\"Source date:\", dataset[index][0])\n", + "print(\"Target date:\", dataset[index][1])\n", + "print()\n", + "print(\"Source after preprocessing (indices):\", X[index])\n", + "print(\"Target after preprocessing (indices):\", Y[index])\n", + "print()\n", + "print(\"Source after preprocessing (one-hot):\", Xoh[index])\n", + "print(\"Target after preprocessing (one-hot):\", Yoh[index])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2 - Neural machine translation with attention\n", + "\n", + "If you had to translate a book's paragraph from French to English, you would not read the whole paragraph, then close the book and translate. Even during the translation process, you would read/re-read and focus on the parts of the French paragraph corresponding to the parts of the English you are writing down. \n", + "\n", + "The attention mechanism tells a Neural Machine Translation model where it should pay attention to at any step. \n", + "\n", + "\n", + "### 2.1 - Attention mechanism\n", + "\n", + "In this part, you will implement the attention mechanism presented in the lecture videos. Here is a figure to remind you how the model works. The diagram on the left shows the attention model. The diagram on the right shows what one \"Attention\" step does to calculate the attention variables $\\alpha^{\\langle t, t' \\rangle}$, which are used to compute the context variable $context^{\\langle t \\rangle}$ for each timestep in the output ($t=1, \\ldots, T_y$). \n", + "\n", + "\n", + " \n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
**Figure 1**: Neural machine translation with attention
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Here are some properties of the model that you may notice: \n", + "\n", + "- There are two separate LSTMs in this model (see diagram on the left). Because the one at the bottom of the picture is a Bi-directional LSTM and comes *before* the attention mechanism, we will call it *pre-attention* Bi-LSTM. The LSTM at the top of the diagram comes *after* the attention mechanism, so we will call it the *post-attention* LSTM. The pre-attention Bi-LSTM goes through $T_x$ time steps; the post-attention LSTM goes through $T_y$ time steps. \n", + "\n", + "- The post-attention LSTM passes $s^{\\langle t \\rangle}, c^{\\langle t \\rangle}$ from one time step to the next. In the lecture videos, we were using only a basic RNN for the post-activation sequence model, so the state captured by the RNN output activations $s^{\\langle t\\rangle}$. But since we are using an LSTM here, the LSTM has both the output activation $s^{\\langle t\\rangle}$ and the hidden cell state $c^{\\langle t\\rangle}$. However, unlike previous text generation examples (such as Dinosaurus in week 1), in this model the post-activation LSTM at time $t$ does will not take the specific generated $y^{\\langle t-1 \\rangle}$ as input; it only takes $s^{\\langle t\\rangle}$ and $c^{\\langle t\\rangle}$ as input. We have designed the model this way, because (unlike language generation where adjacent characters are highly correlated) there isn't as strong a dependency between the previous character and the next character in a YYYY-MM-DD date. \n", + "\n", + "- We use $a^{\\langle t \\rangle} = [\\overrightarrow{a}^{\\langle t \\rangle}; \\overleftarrow{a}^{\\langle t \\rangle}]$ to represent the concatenation of the activations of both the forward-direction and backward-directions of the pre-attention Bi-LSTM. \n", + "\n", + "- The diagram on the right uses a `RepeatVector` node to copy $s^{\\langle t-1 \\rangle}$'s value $T_x$ times, and then `Concatenation` to concatenate $s^{\\langle t-1 \\rangle}$ and $a^{\\langle t \\rangle}$ to compute $e^{\\langle t, t'}$, which is then passed through a softmax to compute $\\alpha^{\\langle t, t' \\rangle}$. We'll explain how to use `RepeatVector` and `Concatenation` in Keras below. \n", + "\n", + "Lets implement this model. You will start by implementing two functions: `one_step_attention()` and `model()`.\n", + "\n", + "**1) `one_step_attention()`**: At step $t$, given all the hidden states of the Bi-LSTM ($[a^{<1>},a^{<2>}, ..., a^{}]$) and the previous hidden state of the second LSTM ($s^{}$), `one_step_attention()` will compute the attention weights ($[\\alpha^{},\\alpha^{}, ..., \\alpha^{}]$) and output the context vector (see Figure 1 (right) for details):\n", + "$$context^{} = \\sum_{t' = 0}^{T_x} \\alpha^{}a^{}\\tag{1}$$ \n", + "\n", + "Note that we are denoting the attention in this notebook $context^{\\langle t \\rangle}$. In the lecture videos, the context was denoted $c^{\\langle t \\rangle}$, but here we are calling it $context^{\\langle t \\rangle}$ to avoid confusion with the (post-attention) LSTM's internal memory cell variable, which is sometimes also denoted $c^{\\langle t \\rangle}$. \n", + " \n", + "**2) `model()`**: Implements the entire model. It first runs the input through a Bi-LSTM to get back $[a^{<1>},a^{<2>}, ..., a^{}]$. Then, it calls `one_step_attention()` $T_y$ times (`for` loop). At each iteration of this loop, it gives the computed context vector $c^{}$ to the second LSTM, and runs the output of the LSTM through a dense layer with softmax activation to generate a prediction $\\hat{y}^{}$. \n", + "\n", + "\n", + "\n", + "**Exercise**: Implement `one_step_attention()`. The function `model()` will call the layers in `one_step_attention()` $T_y$ using a for-loop, and it is important that all $T_y$ copies have the same weights. I.e., it should not re-initiaiize the weights every time. In other words, all $T_y$ steps should have shared weights. Here's how you can implement layers with shareable weights in Keras:\n", + "1. Define the layer objects (as global variables for examples).\n", + "2. Call these objects when propagating the input.\n", + "\n", + "We have defined the layers you need as global variables. Please run the following cells to create them. Please check the Keras documentation to make sure you understand what these layers are: [RepeatVector()](https://keras.io/layers/core/#repeatvector), [Concatenate()](https://keras.io/layers/merge/#concatenate), [Dense()](https://keras.io/layers/core/#dense), [Activation()](https://keras.io/layers/core/#activation), [Dot()](https://keras.io/layers/merge/#dot)." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Defined shared layers as global variables\n", + "repeator = RepeatVector(Tx)\n", + "concatenator = Concatenate(axis=-1)\n", + "densor = Dense(1, activation = \"relu\")\n", + "activator = Activation(softmax, name='attention_weights') # We are using a custom softmax(axis = 1) loaded in this notebook\n", + "dotor = Dot(axes = 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now you can use these layers to implement `one_step_attention()`. In order to propagate a Keras tensor object X through one of these layers, use `layer(X)` (or `layer([X,Y])` if it requires multiple inputs.), e.g. `densor(X)` will propagate X through the `Dense(1)` layer defined above." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: one_step_attention\n", + "\n", + "def one_step_attention(a, s_prev):\n", + " \"\"\"\n", + " Performs one step of attention: Outputs a context vector computed as a dot product of the attention weights\n", + " \"alphas\" and the hidden states \"a\" of the Bi-LSTM.\n", + " \n", + " Arguments:\n", + " a -- hidden state output of the Bi-LSTM, numpy-array of shape (m, Tx, 2*n_a)\n", + " s_prev -- previous hidden state of the (post-attention) LSTM, numpy-array of shape (m, n_s)\n", + " \n", + " Returns:\n", + " context -- context vector, input of the next (post-attetion) LSTM cell\n", + " \"\"\"\n", + " \n", + " ### START CODE HERE ###\n", + " # Use repeator to repeat s_prev to be of shape (m, Tx, n_s) so that you can concatenate it with all hidden states \"a\" (≈ 1 line)\n", + " s_prev = repeator(s_prev)\n", + " # Use concatenator to concatenate a and s_prev on the last axis (≈ 1 line)\n", + " concat = concatenator([a, s_prev])\n", + " # Use densor to propagate concat through a small fully-connected neural network to compute the \"energies\" variable e. (≈1 lines)\n", + " e = densor(concat)\n", + " # Use activator and e to compute the attention weights \"alphas\" (≈ 1 line)\n", + " alphas = activator(e)\n", + " # Use dotor together with \"alphas\" and \"a\" to compute the context vector to be given to the next (post-attention) LSTM-cell (≈ 1 line)\n", + " context = dotor([alphas, a])\n", + " ### END CODE HERE ###\n", + " \n", + " return context" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You will be able to check the expected output of `one_step_attention()` after you've coded the `model()` function." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise**: Implement `model()` as explained in figure 2 and the text above. Again, we have defined global layers that will share weights to be used in `model()`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "n_a = 64\n", + "n_s = 128\n", + "post_activation_LSTM_cell = LSTM(n_s, return_state = True)\n", + "output_layer = Dense(len(machine_vocab), activation=softmax)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now you can use these layers $T_y$ times in a `for` loop to generate the outputs, and their parameters will not be reinitialized. You will have to carry out the following steps: \n", + "\n", + "1. Propagate the input into a [Bidirectional](https://keras.io/layers/wrappers/#bidirectional) [LSTM](https://keras.io/layers/recurrent/#lstm)\n", + "2. Iterate for $t = 0, \\dots, T_y-1$: \n", + " 1. Call `one_step_attention()` on $[\\alpha^{},\\alpha^{}, ..., \\alpha^{}]$ and $s^{}$ to get the context vector $context^{}$.\n", + " 2. Give $context^{}$ to the post-attention LSTM cell. Remember pass in the previous hidden-state $s^{\\langle t-1\\rangle}$ and cell-states $c^{\\langle t-1\\rangle}$ of this LSTM using `initial_state= [previous hidden state, previous cell state]`. Get back the new hidden state $s^{}$ and the new cell state $c^{}$.\n", + " 3. Apply a softmax layer to $s^{}$, get the output. \n", + " 4. Save the output by adding it to the list of outputs.\n", + "\n", + "3. Create your Keras model instance, it should have three inputs (\"inputs\", $s^{<0>}$ and $c^{<0>}$) and output the list of \"outputs\"." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: model\n", + "\n", + "def model(Tx, Ty, n_a, n_s, human_vocab_size, machine_vocab_size):\n", + " \"\"\"\n", + " Arguments:\n", + " Tx -- length of the input sequence\n", + " Ty -- length of the output sequence\n", + " n_a -- hidden state size of the Bi-LSTM\n", + " n_s -- hidden state size of the post-attention LSTM\n", + " human_vocab_size -- size of the python dictionary \"human_vocab\"\n", + " machine_vocab_size -- size of the python dictionary \"machine_vocab\"\n", + "\n", + " Returns:\n", + " model -- Keras model instance\n", + " \"\"\"\n", + " \n", + " # Define the inputs of your model with a shape (Tx,)\n", + " # Define s0 and c0, initial hidden state for the decoder LSTM of shape (n_s,)\n", + " X = Input(shape=(Tx, human_vocab_size))\n", + " s0 = Input(shape=(n_s,), name='s0')\n", + " c0 = Input(shape=(n_s,), name='c0')\n", + " s = s0\n", + " c = c0\n", + " \n", + " # Initialize empty list of outputs\n", + " outputs = []\n", + " \n", + " ### START CODE HERE ###\n", + " \n", + " # Step 1: Define your pre-attention Bi-LSTM. Remember to use return_sequences=True. (≈ 1 line)\n", + " a = Bidirectional(LSTM(n_a, return_sequences=True))(X)\n", + " \n", + " # Step 2: Iterate for Ty steps\n", + " for t in range(Ty):\n", + " \n", + " # Step 2.A: Perform one step of the attention mechanism to get back the context vector at step t (≈ 1 line)\n", + " context = one_step_attention(a, s)\n", + " \n", + " # Step 2.B: Apply the post-attention LSTM cell to the \"context\" vector.\n", + " # Don't forget to pass: initial_state = [hidden state, cell state] (≈ 1 line)\n", + " s, _, c = post_activation_LSTM_cell(context, initial_state=[s, c])\n", + " \n", + " # Step 2.C: Apply Dense layer to the hidden state output of the post-attention LSTM (≈ 1 line)\n", + " out = output_layer(s)\n", + " \n", + " # Step 2.D: Append \"out\" to the \"outputs\" list (≈ 1 line)\n", + " outputs.append(out)\n", + " \n", + " # Step 3: Create model instance taking three inputs and returning the list of outputs. (≈ 1 line)\n", + " model = Model([X, s0, c0], outputs)\n", + " \n", + " ### END CODE HERE ###\n", + " \n", + " return model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the following cell to create your model." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model = model(Tx, Ty, n_a, n_s, len(human_vocab), len(machine_vocab))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's get a summary of the model to check if it matches the expected output." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "____________________________________________________________________________________________________\n", + "Layer (type) Output Shape Param # Connected to \n", + "====================================================================================================\n", + "input_2 (InputLayer) (None, 30, 37) 0 \n", + "____________________________________________________________________________________________________\n", + "s0 (InputLayer) (None, 128) 0 \n", + "____________________________________________________________________________________________________\n", + "bidirectional_1 (Bidirectional) (None, 30, 128) 52224 input_2[0][0] \n", + "____________________________________________________________________________________________________\n", + "repeat_vector_1 (RepeatVector) (None, 30, 128) 0 s0[0][0] \n", + " lstm_1[0][0] \n", + " lstm_1[1][0] \n", + " lstm_1[2][0] \n", + " lstm_1[3][0] \n", + " lstm_1[4][0] \n", + " lstm_1[5][0] \n", + " lstm_1[6][0] \n", + " lstm_1[7][0] \n", + " lstm_1[8][0] \n", + "____________________________________________________________________________________________________\n", + "concatenate_1 (Concatenate) (None, 30, 256) 0 bidirectional_1[0][0] \n", + " repeat_vector_1[0][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[1][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[2][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[3][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[4][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[5][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[6][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[7][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[8][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[9][0] \n", + "____________________________________________________________________________________________________\n", + "dense_1 (Dense) (None, 30, 1) 257 concatenate_1[0][0] \n", + " concatenate_1[1][0] \n", + " concatenate_1[2][0] \n", + " concatenate_1[3][0] \n", + " concatenate_1[4][0] \n", + " concatenate_1[5][0] \n", + " concatenate_1[6][0] \n", + " concatenate_1[7][0] \n", + " concatenate_1[8][0] \n", + " concatenate_1[9][0] \n", + "____________________________________________________________________________________________________\n", + "attention_weights (Activation) (None, 30, 1) 0 dense_1[0][0] \n", + " dense_1[1][0] \n", + " dense_1[2][0] \n", + " dense_1[3][0] \n", + " dense_1[4][0] \n", + " dense_1[5][0] \n", + " dense_1[6][0] \n", + " dense_1[7][0] \n", + " dense_1[8][0] \n", + " dense_1[9][0] \n", + "____________________________________________________________________________________________________\n", + "dot_1 (Dot) (None, 1, 128) 0 attention_weights[0][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[1][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[2][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[3][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[4][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[5][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[6][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[7][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[8][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[9][0] \n", + " bidirectional_1[0][0] \n", + "____________________________________________________________________________________________________\n", + "c0 (InputLayer) (None, 128) 0 \n", + "____________________________________________________________________________________________________\n", + "lstm_1 (LSTM) [(None, 128), (None, 131584 dot_1[0][0] \n", + " s0[0][0] \n", + " c0[0][0] \n", + " dot_1[1][0] \n", + " lstm_1[0][0] \n", + " lstm_1[0][2] \n", + " dot_1[2][0] \n", + " lstm_1[1][0] \n", + " lstm_1[1][2] \n", + " dot_1[3][0] \n", + " lstm_1[2][0] \n", + " lstm_1[2][2] \n", + " dot_1[4][0] \n", + " lstm_1[3][0] \n", + " lstm_1[3][2] \n", + " dot_1[5][0] \n", + " lstm_1[4][0] \n", + " lstm_1[4][2] \n", + " dot_1[6][0] \n", + " lstm_1[5][0] \n", + " lstm_1[5][2] \n", + " dot_1[7][0] \n", + " lstm_1[6][0] \n", + " lstm_1[6][2] \n", + " dot_1[8][0] \n", + " lstm_1[7][0] \n", + " lstm_1[7][2] \n", + " dot_1[9][0] \n", + " lstm_1[8][0] \n", + " lstm_1[8][2] \n", + "____________________________________________________________________________________________________\n", + "dense_2 (Dense) (None, 11) 1419 lstm_1[0][0] \n", + " lstm_1[1][0] \n", + " lstm_1[2][0] \n", + " lstm_1[3][0] \n", + " lstm_1[4][0] \n", + " lstm_1[5][0] \n", + " lstm_1[6][0] \n", + " lstm_1[7][0] \n", + " lstm_1[8][0] \n", + " lstm_1[9][0] \n", + "====================================================================================================\n", + "Total params: 185,484\n", + "Trainable params: 185,484\n", + "Non-trainable params: 0\n", + "____________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**:\n", + "\n", + "Here is the summary you should see\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **Total params:**\n", + " \n", + " 185,484\n", + "
\n", + " **Trainable params:**\n", + " \n", + " 185,484\n", + "
\n", + " **Non-trainable params:**\n", + " \n", + " 0\n", + "
\n", + " **bidirectional_1's output shape **\n", + " \n", + " (None, 30, 128) \n", + "
\n", + " **repeat_vector_1's output shape **\n", + " \n", + " (None, 30, 128) \n", + "
\n", + " **concatenate_1's output shape **\n", + " \n", + " (None, 30, 256) \n", + "
\n", + " **attention_weights's output shape **\n", + " \n", + " (None, 30, 1) \n", + "
\n", + " **dot_1's output shape **\n", + " \n", + " (None, 1, 128) \n", + "
\n", + " **dense_2's output shape **\n", + " \n", + " (None, 11) \n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As usual, after creating your model in Keras, you need to compile it and define what loss, optimizer and metrics your are want to use. Compile your model using `categorical_crossentropy` loss, a custom [Adam](https://keras.io/optimizers/#adam) [optimizer](https://keras.io/optimizers/#usage-of-optimizers) (`learning rate = 0.005`, $\\beta_1 = 0.9$, $\\beta_2 = 0.999$, `decay = 0.01`) and `['accuracy']` metrics:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "### START CODE HERE ### (≈2 lines)\n", + "opt = Adam(lr = 0.005, beta_1=0.9, beta_2=0.999, decay = 0.01)\n", + "model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])\n", + "### END CODE HERE ###" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The last step is to define all your inputs and outputs to fit the model:\n", + "- You already have X of shape $(m = 10000, T_x = 30)$ containing the training examples.\n", + "- You need to create `s0` and `c0` to initialize your `post_activation_LSTM_cell` with 0s.\n", + "- Given the `model()` you coded, you need the \"outputs\" to be a list of 11 elements of shape (m, T_y). So that: `outputs[i][0], ..., outputs[i][Ty]` represent the true labels (characters) corresponding to the $i^{th}$ training example (`X[i]`). More generally, `outputs[i][j]` is the true label of the $j^{th}$ character in the $i^{th}$ training example." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s0 = np.zeros((m, n_s))\n", + "c0 = np.zeros((m, n_s))\n", + "outputs = list(Yoh.swapaxes(0,1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's now fit the model and run it for one epoch." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/1\n", + "10000/10000 [==============================] - 49s - loss: 15.4064 - dense_2_loss_1: 1.0319 - dense_2_loss_2: 0.8296 - dense_2_loss_3: 1.6019 - dense_2_loss_4: 2.6215 - dense_2_loss_5: 0.6991 - dense_2_loss_6: 1.1022 - dense_2_loss_7: 2.5118 - dense_2_loss_8: 0.8281 - dense_2_loss_9: 1.6111 - dense_2_loss_10: 2.5692 - dense_2_acc_1: 0.5660 - dense_2_acc_2: 0.7592 - dense_2_acc_3: 0.3628 - dense_2_acc_4: 0.0974 - dense_2_acc_5: 0.8998 - dense_2_acc_6: 0.4708 - dense_2_acc_7: 0.1080 - dense_2_acc_8: 0.8650 - dense_2_acc_9: 0.2831 - dense_2_acc_10: 0.1226 \n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.fit([Xoh, s0, c0], outputs, epochs=1, batch_size=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "While training you can see the loss as well as the accuracy on each of the 10 positions of the output. The table below gives you an example of what the accuracies could be if the batch had 2 examples: \n", + "\n", + "
\n", + "
Thus, `dense_2_acc_8: 0.89` means that you are predicting the 7th character of the output correctly 89% of the time in the current batch of data.
\n", + "\n", + "\n", + "We have run this model for longer, and saved the weights. Run the next cell to load our weights. (By training a model for several minutes, you should be able to obtain a model of similar accuracy, but loading our model will save you time.) " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model.load_weights('models/model.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can now see the results on new examples." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "source: 3 May 1979\n", + "output: 1979-05-03\n", + "source: 5 April 09\n", + "output: 2009-03-05\n", + "source: 21th of August 2016\n", + "output: 2016-08-01\n", + "source: Tue 10 Jul 2007\n", + "output: 2007-07-10\n", + "source: Saturday May 9 2018\n", + "output: 2018-05-09\n", + "source: March 3 2001\n", + "output: 2001-03-03\n", + "source: March 3rd 2001\n", + "output: 2001-03-03\n", + "source: 1 March 2001\n", + "output: 2001-03-01\n" + ] + } + ], + "source": [ + "EXAMPLES = ['3 May 1979', '5 April 09', '21th of August 2016', 'Tue 10 Jul 2007', 'Saturday May 9 2018', 'March 3 2001', 'March 3rd 2001', '1 March 2001']\n", + "for example in EXAMPLES:\n", + " \n", + " source = string_to_int(example, Tx, human_vocab)\n", + " source = np.array(list(map(lambda x: to_categorical(x, num_classes=len(human_vocab)), source))).swapaxes(0,1)\n", + " prediction = model.predict([source, s0, c0])\n", + " prediction = np.argmax(prediction, axis = -1)\n", + " output = [inv_machine_vocab[int(i)] for i in prediction]\n", + " \n", + " print(\"source:\", example)\n", + " print(\"output:\", ''.join(output))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also change these examples to test with your own examples. The next part will give you a better sense on what the attention mechanism is doing--i.e., what part of the input the network is paying attention to when generating a particular output character. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3 - Visualizing Attention (Optional / Ungraded)\n", + "\n", + "Since the problem has a fixed output length of 10, it is also possible to carry out this task using 10 different softmax units to generate the 10 characters of the output. But one advantage of the attention model is that each part of the output (say the month) knows it needs to depend only on a small part of the input (the characters in the input giving the month). We can visualize what part of the output is looking at what part of the input.\n", + "\n", + "Consider the task of translating \"Saturday 9 May 2018\" to \"2018-05-09\". If we visualize the computed $\\alpha^{\\langle t, t' \\rangle}$ we get this: \n", + "\n", + "
\n", + "
**Figure 8**: Full Attention Map
\n", + "\n", + "Notice how the output ignores the \"Saturday\" portion of the input. None of the output timesteps are paying much attention to that portion of the input. We see also that 9 has been translated as 09 and May has been correctly translated into 05, with the output paying attention to the parts of the input it needs to to make the translation. The year mostly requires it to pay attention to the input's \"18\" in order to generate \"2018.\" \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.1 - Getting the activations from the network\n", + "\n", + "Lets now visualize the attention values in your network. We'll propagate an example through the network, then visualize the values of $\\alpha^{\\langle t, t' \\rangle}$. \n", + "\n", + "To figure out where the attention values are located, let's start by printing a summary of the model ." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "____________________________________________________________________________________________________\n", + "Layer (type) Output Shape Param # Connected to \n", + "====================================================================================================\n", + "input_2 (InputLayer) (None, 30, 37) 0 \n", + "____________________________________________________________________________________________________\n", + "s0 (InputLayer) (None, 128) 0 \n", + "____________________________________________________________________________________________________\n", + "bidirectional_1 (Bidirectional) (None, 30, 128) 52224 input_2[0][0] \n", + "____________________________________________________________________________________________________\n", + "repeat_vector_1 (RepeatVector) (None, 30, 128) 0 s0[0][0] \n", + " lstm_1[0][0] \n", + " lstm_1[1][0] \n", + " lstm_1[2][0] \n", + " lstm_1[3][0] \n", + " lstm_1[4][0] \n", + " lstm_1[5][0] \n", + " lstm_1[6][0] \n", + " lstm_1[7][0] \n", + " lstm_1[8][0] \n", + "____________________________________________________________________________________________________\n", + "concatenate_1 (Concatenate) (None, 30, 256) 0 bidirectional_1[0][0] \n", + " repeat_vector_1[0][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[1][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[2][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[3][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[4][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[5][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[6][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[7][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[8][0] \n", + " bidirectional_1[0][0] \n", + " repeat_vector_1[9][0] \n", + "____________________________________________________________________________________________________\n", + "dense_1 (Dense) (None, 30, 1) 257 concatenate_1[0][0] \n", + " concatenate_1[1][0] \n", + " concatenate_1[2][0] \n", + " concatenate_1[3][0] \n", + " concatenate_1[4][0] \n", + " concatenate_1[5][0] \n", + " concatenate_1[6][0] \n", + " concatenate_1[7][0] \n", + " concatenate_1[8][0] \n", + " concatenate_1[9][0] \n", + "____________________________________________________________________________________________________\n", + "attention_weights (Activation) (None, 30, 1) 0 dense_1[0][0] \n", + " dense_1[1][0] \n", + " dense_1[2][0] \n", + " dense_1[3][0] \n", + " dense_1[4][0] \n", + " dense_1[5][0] \n", + " dense_1[6][0] \n", + " dense_1[7][0] \n", + " dense_1[8][0] \n", + " dense_1[9][0] \n", + "____________________________________________________________________________________________________\n", + "dot_1 (Dot) (None, 1, 128) 0 attention_weights[0][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[1][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[2][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[3][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[4][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[5][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[6][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[7][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[8][0] \n", + " bidirectional_1[0][0] \n", + " attention_weights[9][0] \n", + " bidirectional_1[0][0] \n", + "____________________________________________________________________________________________________\n", + "c0 (InputLayer) (None, 128) 0 \n", + "____________________________________________________________________________________________________\n", + "lstm_1 (LSTM) [(None, 128), (None, 131584 dot_1[0][0] \n", + " s0[0][0] \n", + " c0[0][0] \n", + " dot_1[1][0] \n", + " lstm_1[0][0] \n", + " lstm_1[0][2] \n", + " dot_1[2][0] \n", + " lstm_1[1][0] \n", + " lstm_1[1][2] \n", + " dot_1[3][0] \n", + " lstm_1[2][0] \n", + " lstm_1[2][2] \n", + " dot_1[4][0] \n", + " lstm_1[3][0] \n", + " lstm_1[3][2] \n", + " dot_1[5][0] \n", + " lstm_1[4][0] \n", + " lstm_1[4][2] \n", + " dot_1[6][0] \n", + " lstm_1[5][0] \n", + " lstm_1[5][2] \n", + " dot_1[7][0] \n", + " lstm_1[6][0] \n", + " lstm_1[6][2] \n", + " dot_1[8][0] \n", + " lstm_1[7][0] \n", + " lstm_1[7][2] \n", + " dot_1[9][0] \n", + " lstm_1[8][0] \n", + " lstm_1[8][2] \n", + "____________________________________________________________________________________________________\n", + "dense_2 (Dense) (None, 11) 1419 lstm_1[0][0] \n", + " lstm_1[1][0] \n", + " lstm_1[2][0] \n", + " lstm_1[3][0] \n", + " lstm_1[4][0] \n", + " lstm_1[5][0] \n", + " lstm_1[6][0] \n", + " lstm_1[7][0] \n", + " lstm_1[8][0] \n", + " lstm_1[9][0] \n", + "====================================================================================================\n", + "Total params: 185,484\n", + "Trainable params: 185,484\n", + "Non-trainable params: 0\n", + "____________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Navigate through the output of `model.summary()` above. You can see that the layer named `attention_weights` outputs the `alphas` of shape (m, 30, 1) before `dot_2` computes the context vector for every time step $t = 0, \\ldots, T_y-1$. Lets get the activations from this layer.\n", + "\n", + "The function `attention_map()` pulls out the attention values from your model and plots them." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAesAAAGsCAYAAAD9ro91AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmcLGV5//3Pl00WWQVcwAgigogGAUVjVFxANGwqKii4\n7+Ia3KJRkl9MEKNxfVyIioia4BYVUcF9iQiI7IoSRQVN3EVQQTjX88ddw+kz9Mz0zJmeqZn5vF+v\nOae7uq66r6perr6rqutOVSFJkvprncVOQJIkTc9iLUlSz1msJUnqOYu1JEk9Z7GWJKnnLNaSJPWc\nxVqSpJ6zWEuS1HMWa0mSem69xU5g0EabbVmbbrvd0Mc25jr+wAZzWu5Kil1q+Rrb7zaNXbhYrUy/\n//mV/PGq32Sm+XpVrDfddjseefwpQx/bZ50f881VfzGn5a6k2KWWr7H9btPYhYvVyvShFz9qpPnc\nDS5JUs9ZrCVJ6rmxFesk707y8yQXjasNSZJWgnH2rE8EDhjj8iVJWhHGVqyr6ivAr8e1fEmSVopU\n1fgWnuwAnFpVu08zz9OApwFstc22e/3bO987dL5NuI5r5viTiJUUu9TyNbbfbRq7cLFamY455hh+\nftlF/f/pVlW9E3gnwLZ32L2m+tnDUvwphj/vMXY+Y5davsZK88ezwSVJ6jmLtSRJPTfOn259EPgG\nsEuSK5I8eVxtSZK0nI3tmHVVHTGuZUuStJK4G1ySpJ6zWEuS1HMWa0mSes5iLUlSz1msJUnqOYu1\nJEk9N9ZineR5SS5KcnGS54+zLUmSlqtxXhRld+CpwD2AvwQOTHKHcbUnSdJyNc6e9Z2Ab1bVH6rq\neuDLwMPH2J4kScvS2IbITHIn4OPAvYA/Ap8Hzqmq50yazyEy5zF2qeVrbL/bNHbhYrUyLfoQmVX1\nnSSvAU4HrgHOA24YMp9DZM5j7FLL19h+t2nswsVK0xnrCWZV9a6q2quq7gv8BvjeONuTJGk5GlvP\nGiDJtlX18yR/QTtefc9xtidJ0nI01mINfCTJLYA/A8+uqt+OuT1JkpadsRbrqrrPOJcvSdJK4BXM\nJEnqOYu1JEk9Z7GWJKnnLNaSJPWcxVqSpJ4bqVgnuV2SB3W3N0qy6XjTkiRJE2Ys1kmeCnwYeEc3\naXvgv0ZZuENkSpK09kbpWT8buDdwFUBVfR/YdqYgh8iUJGl+jFKsr62q6ybuJFkPGGWoLofIlCRp\nHsw4RGaS44HfAo8DngM8C7ikql4+Q5xDZDqMorHzGLvU8jVWmtl8DpH5UuDJwIXA04HTgH+fKcgh\nMh1G0dj5jV1q+RorzZ9RivVGwLur6gSAJOt20/4wU2BVvQt4Vxf3z8AVc09VkqSVaZRj1p+nFecJ\nGwGfG2XhSbbt/p8YIvMDs01QkqSVbpSe9YZVdfXEnaq6OsnGIy7fITIlSVpLoxTra5LsWVXnAiTZ\ni3bC2IwcIlOSpLU3SrF+PvChJD8FAtwKePRYs5IkSTeasVhX1dlJdgV26SZdWlV/Hm9akiRpwig9\na4C7Azt08++ZhKo6aWxZSZKkG81YrJO8D9iJNX8nXYDFWpKkBTBKz3pvYLea6VJnkiRpLEb5nfVF\ntJPKJEnSIhilZ701cEmSs4BrJyZW1cHTBSXZEPgKcLOunQ9X1avWIldJklakUYr1sXNc9rXAA7qL\nqKwPfC3Jp6vqzDkuT5KkFWmUn259OcntgJ2r6nPd1cvWHSGugIkrn63f/XncW5KkWRpliMyn0oaw\n3KqqdkqyM/D2qnrgjAtvg358C7gD8NaqesmQeRwicx5jl1q+xva7TWMXLlYr03wOkfls4B7ANwGq\n6vsTA3TMpKpuAPZIsgXwsSS7V9VFk+ZxiMx5jF1q+Rrb7zaNXbhYaTqjnA1+bVVdN3EnyXrMcnd2\nN4DHF4EDZpeeJEkapVh/OcnfARsl2Q/4EPDJmYKSbNP1qEmyEbAf8N21SVaSpJVolGL9UuAXwIXA\n04HTgFeMEHdr4ItJLgDOBs6oqlPnmqgkSSvVKGeDrwJO6P5GVlUXAHebY16SJKkzyrXBf8iQY9RV\ndfuxZCRJktYw6rXBJ2wIPBLYajzpSJKkyWY8Zl1Vvxr4u7Kq3gD8zQLkJkmSGG03+J4Dd9eh9bRH\nHQdbkiStpVGK7usGbl8PXA48aizZSJKkmxjlbPD7L0QikiRpuFF2g79wuser6vXzl44kSZps1LPB\n7w58ort/EHAW8P1xJSVJklYbpVhvD+xZVb8HSHIs8KmqOnKciUmSpGaUITIvBe5aVdd2928GXFBV\nu8xLAg6ROa+xSy1fY/vdprELF6uVaT6HyDwJOCvJx7r7hwLDK+ocOETm/MYutXyN7Xebxi5crDSd\nUS6K8mrgicBvur8nVtU/j9pAkmcnOa/7u83cU5UkaWUa9eImGwNXVdV7uqEvd6yqH44SWFVvBd46\n5wwlSVrhZuxZJ3kV8BLgZd2k9YGTx5mUJElabZTxrB8GHAxcA1BVPwU2HWdSkiRptVGK9XXVThkv\ngCSbjDclSZI0aJRifUqSdwBbJHkq8DnghPGmJUmSJoxybfB/TbIfcBVwR+CVVXXG2DOTJEnAiGeD\nV9UZSc4F7gv8erwpSZKkQVPuBk9yapLdu9u3Bi4CngS8L8nzFyg/SZJWvOmOWe9YVRd1t58InFFV\nBwH70Iq2JElaANMV6z8P3H4gcBpAN6DHqlEWnuSAJJcmuSzJS+eepiRJK9d0x6x/kuQ5wBXAnsBn\nAJJsRLswyrSSrEu7ctl+3TLOTvKJqrpkrbOWJGkFma5n/WTgzsATgEdX1W+76fcE3jPCsu8BXFZV\nP6iq64D/AA5Zi1wlSVqRZhwic84LTg4DDqiqp3T3jwL2qaqjJ83nEJnzGLvU8jW2320au3CxWpnm\nc4jMsXKIzPmNXWr5GtvvNo1duFhpOqNcwWyurgRuO3B/+26aJEmahVFG3br3KNOGOBvYOcmOSTYA\nDgc+MfsUJUla2UbpWb95xGlrqKrrgaOBzwLfAU6pqotnl54kSZrymHWSewF/BWyT5IUDD20GrDvK\nwqvqNLrfZ0uSpLmZ7gSzDYCbd/MMjl99FXDYOJOSJEmrTVmsq+rLwJeTnFhVP1rAnCRJ0oBRfrp1\nYpKb/Bi7qh4whnwkSdIkoxTrYwZubwg8Arh+POlIkqTJZizWVfWtSZO+nuSsMeUjSZImmbFYJ9lq\n4O46wF7A5qM20A3ocQ5wZVUdOOsMJUla4UbZDf4toIDQdn//kDbIx6ieR/ud9Wazzk6SJI20G3zH\nuS48yfbA3wCvBl44w+ySJGmIUXaDbwg8C/hrWg/7q8Dbq+pPIyz/DcCLWfN32pIkaRZmHCIzySnA\n74GTu0mPAbaoqkfOEHcg8NCqelaSfYFjhh2zdojM+Y1davka2+82jV24WK1M8zlE5u5VtdvA/S8m\nuWSEuHsDByd5KO0nX5slObmqjhycySEy5zd2qeVrbL/bNHbhYqXpjDKQx7lJ7jlxJ8k+tLO7p1VV\nL6uq7atqB9qIW1+YXKglSdLMRulZ7wX8d5Ifd/f/Arg0yYVAVdVdx5adJEkaqVgfsLaNVNWXgC+t\n7XIkSVqJRinW/1RVRw1OSPK+ydMkSdJ4jHLM+s6Dd5KsR9s1LkmSFsCUxTrJy5L8HrhrkquS/L67\n/3/AxxcsQ0mSVrgpi3VV/UtVbQq8tqo2q6pNu79bVNXLFjBHSZJWtFGOWX86yX0nT6yqr4whH0mS\nNMkoxfpFA7c3BO5BG9zjAWPJSJIkrWGUgTwOGryf5La0a35LkqQFMMrZ4JNdAdxpvhORJEnDjTLq\n1ptpo21BK+57AOeOMylJkrTaKKNuPX7g7vXA5VX19XlLwFG35jV2qeVrbL/bNHbhYrUyzeeoW/8J\n3KG7fdmI41iPzFG35jd2qeVrbL/bNHbhYqXpTHdRlPWSHE87Rv1e4CTgJ0mOT7L+qA0keXaS87q/\n26x9ypIkrSzTnWD2WmArYMeq2quq9gR2ArYA/nXUBqrqrVW1R/f307VLV5KklWe6Yn0g8NSq+v3E\nhKq6Cngm8NBxJyZJkprpinXVkLPPquoGVp8dLkmSxmy6Yn1JksdNnpjkSOC740tJkiQNmu5s8GcD\nH03yJNrlRQH2BjYCHjbuxCRJUjNlsa6qK4F9kjyA1WNan1ZVn1+QzCRJEjDatcG/AHxhAXKRJElD\nzOXa4JIkaQFZrCVJ6rmxFuskByS5NMllSV46zrYkSVquxlask6wLvBV4CLAbcESS3cbVniRJy9U4\ne9b3oA388YOqug74D+CQMbYnSdKyNOMQmXNecHIYcEBVPaW7fxSwT1UdPWk+h8icx9illq+x/W7T\n2IWL1co0n0NkjpVDZM5v7FLL19h+t2nswsVK0xnnbvArgdsO3N++myZJkmZhnMX6bGDnJDsm2QA4\nHPjEGNuTJGlZGttu8Kq6PsnRwGeBdYF3V9XF42pPkqTlaqzHrKvqNOC0cbYhSdJy5xXMJEnqOYu1\nJEk9Z7GWJKnnLNaSJPWcxVqSpJ6zWEuS1HPjHiLzBUkuTnJRkg8m2XCc7UmStByNc4jM7YDnAntX\n1e60C6McPq72JElarsa9G3w9YKMk6wEbAz8dc3uSJC07YxsiEyDJ84BXA38ETq+qxw6ZxyEy5zF2\nqeVrbL/bNHbhYrUyLfoQmUm2BA4BdgR+C3woyZFVdfLgfA6ROb+xSy1fY/vdprELFytNZ5y7wR8E\n/LCqflFVfwY+CvzVGNuTJGlZGmex/jFwzyQbJwnwQOA7Y2xPkqRlaWzFuqq+CXwYOBe4sGvrneNq\nT5Kk5WrcQ2S+CnjVONuQJGm58wpmkiT1nMVakqSeG+vvrGcryS+AH03x8NbAL+e46JUUu9TyNbbf\nbRq7cLFamW5XVdvMNFOvivV0kpxTVXsb2782jV2Y2KWWr7HS/HE3uCRJPWexliSp55ZSsV6b32iv\npNillq+x/W7T2IWLlaa0ZI5ZS5K0UvW+Z53Eq+JLkla0XhfrJA8FPp9ku8XORZKkxdLbYp3kwcC/\nAkdV1ZVJFjTXbvCRBZXklovRrmaWZM6X5l2bWEmCnhbrJPsDJwGXAL8GqKpVC1zIbtPlMqcP2iSb\nz3L+7YBXAEfMdT2TbDSXuC72dkk2nGv8LNu65aT7C/1F7NlJDpjF/NsAH53L85Jka+CyJFvNNnZt\nJdklyb2SrJ9k3VnG3jPJUd3/G4wrxynanlWuXczOSfZOss4c1nVtYu+c5H5JbjG7jKXZ6d0JZkke\nCLwN+AfglsC2wKlV9bXu8dQskk7y18BuwAmjxiU5GngwcDHwU+AdVXXtLNp8FrAp8LaqumrEmACP\nB+4MnAl8dJbreTSwC3A1cFxV/W4WsdsCrwT+paquHDVuLpLsSvsS9kbgkqo6YeCxdapq1YjLuTew\nM/Bd4KxZxB1C287Pr6ofzyLvjYG/Bs6pql+PGtfFHgS8FrhXVf1mNrFzleThwD8DV3Z/5wAnjvJ6\nTHIw8E/At4FNgJdV1ffHmO5Eu3esqu91t9etqhtGjDuU9nlxGfAT4HvAe6vqmjHHPgR4DfADYH3g\nyVX1v6PkLM1WH3vWVwFPqKr3A58C/gz8TffhTFXVKD2cgd7a7YG7AkeOGHco8CjgKGAf4I6zLNRP\npxWDD1TVVaP0zAe+gKxD+2LxEuCQUXty3ZeDRwLHAU8C3pxk51Fzpl0e8S+A58wiZq6uBv4b+F/g\nkUlOSnJwks1mUXD/Cvh34P7AM4DXjdI77/ZevAW4uqp+nGS9UbdxVf0B2Ai4MMkWo8QMxH4SeAFw\nTpItZxM7F0nWBx5NKx4PBD4O3BZ4SZLNZoi9BfBs4DFV9Xja+3GPJNuOc89LkgOB85J8AKCqbhil\nl9vl+3TgiKp6BHAB8ETghUk2HWPsvrQvnE+pqkOB64DdZ8pXmqveFeuqOruq/rvrZV1K2x3+Z+DA\n7kOaEXucO3X/nwx8Fbgb8LgRPpw3B94AHNq1+0Jo3/pnarDbDf0QWi/1D0meCbylK6ZT6r6APJZW\nLP+OVszuDzxipny7D989gcOBR9B6QwBvmqlgJ9kuyS5dkTwauGXX8x2bqroCOKvL+aHAabQvGJ9K\nco8Rcr4H8GrgiV0xORa4Bnj+CG1fCTwPeHCSR1XV9aN++eviPw48GfjWbItuVX2ato0XpGADm9H2\nPAB8DDiV1vt7zAzrez3tS8mu3WtrX+BxtPfEK5JsMt+Jdss8mvYcXpfkZBi5YF8P3By4VRfzbuBy\n2jW6Dxxj7P8BT6+qs5LcivbF/ugk70hy2FwOmUjT6V2xnjDRy+p2v70P+BNweJJ9ZopN+7nXGUmO\n6pbzEVoReyzwxBneSJfTdlk+uar2r6rrkjwXeErXY5ku5z/Sis9xwHtovdULgDuPcNxvF1pv/Hzg\nxbTdckfTep9T5tvt1nw27XDBw6rqAFrP/u7AUVO1231AHgO8LcnTaLvtrwW26x6f9w+bgWW+FCja\nh+L/0vZ8XEz7ovLCGQrC5sB9gQd096+gfbnZbZQcquqjtIL7iiSP6qaNfLihqj5De16+kVkehx4o\n2LOOnWU7fwZeDzw8yX2698DXgPNou/Kni/0d8CbgZcDpwHuq6iDanoztgTuMId9raF/YPkB7TW44\nWLBHyPf9wJPSjrG/mvY6vgR40Bhjv1NVX+zuPhn4/7oe9jeAw2ivbWn+VNWS+AN2pX2AbDPi/AcB\n59J2cU1M+zTtDPPNp4m7Oe2D7l9Z3av4FrD7iO1uSCuUW3X3Dwe+CGw8Q9yhwH8Bdx6YdibtmNim\nI7S7M20Pwl1ovYL/BP5ihFz37OZ9Oa23cDaw3RifxwAbAP+P9kH5XeDQgXXYcoRlHEL7MnNEd/9+\ntN76tnTnYYywjIfQjlE+bI7rcUj3+lpnIWNn0caGtC8G7wTuOzD9C8AeI8RvSfvSeuDAtI8AB48r\n54F2btG1dXJ3f09g12nm35z2RfzdwOsHpp8KbDZDW3OOnWaZpwF7jns7+bey/hY9gVklC+vPcv6H\n0nq2TwIeTusp3GaEuFvTjmV9irYb/i5zyHUd2jfuC0cp9MAWtN27rwYe2BXcz41aOIGb0Y51n0Hr\npe42i1w37wrd33cfkvfqpo9U+Ob4XO5C61X//RzjD6IdT/0wcMpcigiwH3D7tViHmy9G7Cza2JK2\n1+XTwNNoe1wuBm45YvxDaHuI9gcO7r5g7DDuvLu2t+7a/i7wfWD7EWLWGbj9ONoel01GbG9OsZPf\nI7RDUd8CbrUQ28m/lfPXu7PB51uS+9HO9vwD7azW82cRuz7cuFtxtu1uTDvJ58yq+s6IMbehfal4\nOO142jFVdcEs870VsKrmeFZ3kpfTxld92lziZ9nWE4AdgOOrncA12/iDgX8E3l9Vr53YzV7L/UU9\nC91hkHvTvnz+CXhjVX17+qgbY7egFa5HdLEvns37Z20leQHtC+h+VXXhLOKeRNud/ujZxK1NbJKb\nAUfSznF5dFVdNJt2pZks+2INNxbOqnZMeSHbndXPzAbiNqE9N1ePIa2p2kxVVZLDaWfEHjru7dWd\nzHY8cPhcinW3jP1puzCfW+14tIboTtSqGvGM+0mxm9JejyP9DHE+dCfhnQL87Wy+sHaxt6Pthbts\nDu3OKbb7orwf8D/VToyV5tWKKNYaTdczPRD44UL1DJJsPNdCPbCMiQ/JH8xTWuqBJBtW1Z8WOw+p\nDyzWkiT1XG9/uiVJkhqLtSRJPWexliSp5yzW0gJKMu9n+CfZIcljpnhsnSRvSnJRkguTnJ1kx/nO\nQdJ4Oc6utPTtADyGdrnOyR5NG+71rtWGmd2edi11SUuIPWtpESTZN8mXknw4yXeTvH/ioi5JLk9y\nfNcTPivJHbrpJyY5bGAZE73044D7JDmvu5DIoFsDP6vV19q/orphOpPsn+QbSc5N8qEkN++mH9Dl\ndG7XKz+1m35skmMG2r8oyQ7d7SO7XM/rBrNYdyLHJK9Ocn6SM9ONZZ7klkk+1k0/P90gPVMtR1rp\nLNbS4rkbbaSp3WhDud574LHfVdVdaEN6vmGG5bwU+GpV7VFV/zbpsVOAg7ri97okdwNIsjXwCuBB\nVbUnbbzrF6YNg3kC7XKue9GNSDWdJHei9eDvXVV7ADfQrrcNbTzsM6vqL4GvAE/tpr8J+HI3fU/g\n4hmWI61o7gaXFs9Z1YYMJcl5tN3ZX+se++DA/5ML8Miq6ooku9BGKXsA8Pkkj6QNg7kb8PWuQ78B\nbcSoXWkXxfl+l9fJtOuKT+eBtMJ+dresjYCfd49dRxsUA9o1s/frbj+AdilTqo2s9bskR02zHGlF\ns1hLi+fagds3sOb7sYbcvp5ub1iSdWgFdkZVdS1tMI9PJ/k/2ghvpwNnVNURg/Mm2WOaRd3YfmfD\niTDgvVX1siExfx645O7kdZxsuuVIK5q7waV+evTA/9/obl9O63lCGwVrYnz139PGI7+JJHt2A8RM\nFPi7Aj+iDb9674Hj4ZskuSNtlKsdkuzULWKwmF9O22VNkj2BibPKPw8clmTb7rGtumtsT+fzwDO7\n+ddNsvkclyOtCBZrqZ+2THIB8Dxg4qSxE4D7JTkfuBerz+q+ALihO1Fr8glm2wKfTHJRN9/1wFuq\n6hfAE4APdu18gzZm9J9ou70/leRc1twN/RFgqyQX08bK/h5AVV1CO/59eresM2gntk3necD9k1xI\n2z2+2xyXI60IXhtc6pkklwN7V9Uve5DLvrShWg9c7FyklcyetSRJPWfPWpKknrNnLUlSz1msJUnq\nOYu1JEk9Z7GWJKnnLNaSJPWcxVqSpJ6zWEuS1HMWa0mSes5iLUlSz1msJUnqOYu1JEk9Z7GWJKnn\nLNaSJPWcxVqSpJ6zWEuS1HMWa0mSes5iLUlSz1msJUnqOYu1JEk9Z7GWJKnnLNaSJPWcxVqSpJ6z\nWEuS1HMWa0mSes5iLUlSz1msJUnqOYu1JEk9Z7GWJKnnLNaSJPWcxVqSpJ6zWEuS1HMWa0mSes5i\nLUlSz1msJUnqOYu1JEk9Z7GWJKnnLNaSJPWcxVqSpJ6zWEuS1HMWa0mSes5iLUlSz1msJUnqOYu1\nJEk9Z7GWJKnnLNaSJPWcxVqSpJ6zWEuS1HMWa0mSes5iLUlSz1msJUnqOYu1JEk9Z7GWJKnnLNaS\nJPWcxVqSpJ6zWEuS1HMWa0mSes5iLUlSz1msJUnqOYu1JEk9Z7GWJKnnLNaSJPWcxVqSpJ6zWEuS\n1HMWa0mSes5iLUlSz1msJUnqOYu1JEk9Z7GWJKnnLNaSJPWcxVqSpJ6zWEuS1HMWa0mSes5iLUlS\nz1msJUnqOYu1JEk9Z7GWJKnnLNaSJPWcxVqSpJ6zWEuS1HMWa0mSes5iLUlSz1msJUnqOYu1JEk9\nZ7GWJKnnLNaSJPWcxVqSpJ6zWEuS1HMWa0mSes5iLUlSz1msJUnqOYu1JEk9Z7GWJKnnLNaSJPWc\nxVqSpJ6zWEuS1HMWa0mSes5iLUlSz1msJUnqOYu1JEk9Z7GWJKnnLNaSJPWcxVqSpJ6zWEuS1HMW\na0mSes5iLUlSz1msJUnqOYu1JEk9Z7GWJKnnLNaSJPWcxVqSpJ6zWEuS1HMWa0mSes5iLUlSz1ms\nJUnqOYu1JEk9Z7GWJKnnLNaSJPWcxVqSpJ6zWEuS1HMWa0mSes5iLUlSz1msJUnqOYu1JEk9Z7GW\nJKnnLNaSJPWcxVqSpJ6zWEuS1HMWa0mSes5iLUlSz1msJUnqOYu1JEk9Z7GWJKnnLNaSJPWcxVqS\npJ6zWEuS1HMWa0mSes5iLUlSz1msJUnqOYu1JEk9Z7GWJKnnLNaSJPWcxVqSpJ6zWEuS1HMWa0mS\nes5iLUlSz1msJUnqOYu1JEk9Z7GWJKnnLNaSJPWcxVqSpJ6zWEuS1HMWa0mSes5iLUlSz1msJUnq\nOYu1JEk9Z7GWJKnnLNaSJPWcxVqSpJ6zWEuS1HMWa0mSes5iLUlSz1msJUnqOYu1JEk9Z7GWJKnn\nLNaSJPWcxVqSpJ6zWEuS1HMWa0mSes5iLUlSz1msJUnqOYu1JEk9Z7GWJKnnLNaSJPWcxVqSpJ6z\nWEuS1HMWa0mSes5iLUlSz1msJUnqOYu1JEk9Z7GWJKnn1lvsBJaq/R98QP3yl7+ccb668Z8pHpvq\nQaCmfuimkdO2McVMNW1oj9qqKeNuMr2mzmPYMoY9P1NFTM5r8vKGPz7F0kaIH54FVE27pW/yuhm+\njYZv0Zljh0dOG1czPAdTvp6GbKTBZQxZsRnfb8M2xhSPzXb+Neaa7s1743th+o29xuOz3EaDb7hh\nz+F080/Z4E3ihr2pJ+c8JGa6D5OB9uuPv/hsVR0wJNkVyWI9R7/65S/5+pnnrPFmKdrruSa9UWrg\nzTn4eh+ct2rN1/bEvIPvncH41ctdM36wrcH3xUx5DZ13Fus1n22tGigIE4+vusl2aRNWTd6GBavW\n2Cart9mqSdu0qljF6g/WGpg28fjg/GvmNRE78Fi1/2/Ma1IuqwYen7hfA/OvmrxeA8uefL8te3Lb\nA7lNvj+4nrU6ZnA9B9ex1liPNecdzLsYvqzB9ZyIGXz+hi5rirxq0rJuen/6+Ueb96axq1aNngs3\nWdZNHxt8fD7mn8uyWuKrBt6Qq1ZPG3p/yO2pYldNPD7i/FM93t3+03lv3RrdyN3gkiT1nMVakqSe\ns1hLktRzFmtJknrOYi1JUs9ZrCVJ6jmLtSRJPWexliSp5yzWkiT1nMVakqSes1hLktRzFmtJknrO\nYi1JUs9ZrCVJ6jmLtSRJPWexliSp5yzWkiT1XKpqsXNYkpJ8Bth6sfOYR1sDv1zsJObJcloXcH36\nzvUZj19W1QGLnURfWKwFQJJzqmrvxc5jPiyndQHXp+9cHy0Ed4NLktRzFmtJknrOYq0J71zsBObR\ncloXcH36zvXR2HnMWpKknrNnLUlSz1msJUnqOYv1MpTkgCSXJrksyUuHPJ4kb+oevyDJnt30DZOc\nleT8JBcn+YeBmEd201YlWdCfdYxpfV6b5Lvd/B9LssUSX5//1817XpLTk9xmqa7LQOzfJqkkC3Y9\ngzE9N8e1VnKDAAALkElEQVQmubJ7bs5L8tClvD7d48/p3j8XJzl+odZnRasq/5bRH7Au8D/A7YEN\ngPOB3SbN81Dg00CAewLf7KYHuHl3e33gm8A9u/t3AnYBvgTsvQzWZ39gve72a4DXLPH12Wwg/rnA\n25fqunTTbgt8FvgRsPUSf26OBY5ZqPfMAqzP/YHPATfr7m+70Ou2Ev/sWS8/9wAuq6ofVNV1wH8A\nh0ya5xDgpGrOBLZIcuvu/tXdPOt3fwVQVd+pqksXaB0GjWt9Tq+q67vHzgS2H/uaNONan6sG4jeZ\nmD5mY1mXzr8BL2Zh1mPCONdnMYxrfZ4JHFdV1wJU1c/HviayWC9D2wE/Gbh/RTdtpHmSrJvkPODn\nwBlV9c0x5jqKhVifJ9F6FwthbOuT5NVJfgI8FnjlGHKfbCzrkuQQ4MqqOn9ciU9hnK+153S7md+d\nZMv5T32oca3PHYH7JPlmki8nuftYstcaLNZaQ1XdUFV70Hqa90iy+2LntDZmWp8kLweuB96/GPnN\n1nTrU1Uvr6rb0tbl6MXKcVTD1iXJxsDfsTBfNubVNM/N22i7ovcAfga8bpFSnJVp1mc9YCvabvMX\nAackySKluWJYrJefK2nH+yZs302b1TxV9Vvgi8BiX0h/bOuT5AnAgcBjq2qhdlkuxPPzfuARa53p\nzMaxLjsBOwLnJ7m8m//cJLea18yHG8tzU1X/1xW+VcAJtN3TC2Fcr7UrgI92u8rPAlaxvAY16iWL\n9fJzNrBzkh2TbAAcDnxi0jyfAB7XnQl6T+B3VfWzJNukOys6yUbAfsB3FzL5IcayPkkOoB0TPbiq\n/rBQK8P41mfngfhDWJjnbd7XpaourKptq2qHqtqBVhj2rKr/XYrr092/9UD8w4CLxr0inXF9FvwX\n7SQzktyRdvJaH0bpWtbWW+wENL+q6vokR9POpF0XeHdVXZzkGd3jbwdOo50FehnwB+CJXfitgfcm\nWZf2Re6UqjoVIMnDgDcD2wCfSnJeVT14qa4P8BbgZsAZ3R68M6vqGUt4fY5Lsgutl/MjYCmvy6IY\n4/ocn2QP2glalwNPX+Lr827g3UkuAq4DHr+Ae6ZWLC83KklSz7kbXJKknrNYS5LUcxZrSZJ6zmKt\nGyU5NO1azLsOTNuhO5FkurgZ55lPSZ6Q5C3ztKwk+UKSzbr7N6Rdv/miJB/qfvc7m+VdPfNca8x/\nYpLDhkzfO8mbuts3rm+SZyR53MD0sV4DPMm+Sf5qLZfxd3OIeWSS7yT54qTpOyR5zMD9tXotdNt/\n3yRfSrLDHOJ37V4v306yV5JnzTWXWbR5bLfeJybZt5v2H5N+EaBlxmKtQUcAX+v+XykeCpw/cLnO\nP1bVHlW1O+1M1zXOqu6K+9jfN1V1TlU9d8j0t1fVSd3dJwDjHrBjX2CtijXtIiez9WTgqVV1/0nT\ndwAec9PZF82hwIer6m7Ar4CxF+spvI32U0QtUxZrAZDk5sBf0z4kD59inick+XjXC/l+klcNPLxu\nkhPSRuE5vfttJkmemuTstNF7PjK5p5pknSSXZ2DUq27Zt0xyUNolDb+d5HNJbjkkpzV6poM92yQv\n6tq+IENGdeo8Fvj4FI99FbhD15u7NMlJtN/I3jbJEUku7Hrgr5mU07912+HzSbYZYTs8KMk5Sb6X\n5MBu/n2T3OSnTF2v6phunfcG3t/17P4myX8NzLdfko8NiX9gtz0vTLv05c266ZenG92q69VP9DSf\nAbyga+M+3fZ++5B81+jhJjm1W4fjgI26+JtcJW7YdkzyStpr8V1JXjsp5DjapS7PS/KCbtptknym\ne90cP7Ds/ZN8I8m5aXtJbj65feB3tC9lvwZuSLvE5oldPhdOtJFkjyRnZvUobVumjZ71fOCZaXsA\njgN26nJ7bbf+X+7eMz9IclySx6aNZnVhkp26ZQ99nSd5Y7ctSPLgJF9J+6J4NfDHgdyhvVYflMSf\n4y5X1YPRRPxb/D9a0XpXd/u/gb262zsAF3W3n0C7XOItgI1ohWvvbp7rgT26+U4Bjuxu32KgjX8C\nnjOk7TcCT+xu7wN8rru9Jat/XvgU4HUDebylu30icNjAsq7u/t8feCdt9KB1gFOB+w5p+0fApkPi\n16MV8Wd267eK1aMO3Qb4Me035+sBXwAO7R4r2hXRoF0y8y3TbYcu/890Oe5MuwjIhrQe7alD1vdY\nuhGcGBgBrVvP7wLbdPc/ABw0aV03pF0H+o7d/ZOA53e3L6cb3ap7Tr80ub0Z8r0xx26+U4F9B7fp\nkG0/3Xa8cd0mxdy4XQa2zQ+Azbs8fkS7ItfWwFeATbr5XgK8coT3wV6062BP3N+i+/8C4H7d7X8E\n3jDk+diB7r0ykOtvab9ZvhntymD/0D32vIFlTPU63xi4mHYBkkuBnWbI/Qy6961/y+/PnrUmHEEb\nlYfu/6l2hZ9RVb+qqj8CH6X1gAB+WFXndbe/RfvgAtg9yVeTXEj7QnDnIcv8T+DR3e3Du/vQLn34\n2S72RVPETmX/7u/bwLnArrTiMtlWVfX7gfsbpQ1ecA6tkLyrm/6jaqMSAdydVsx+UW3krvcD9+0e\nWzWQ/8ms3j7TbYdTqmpVVX2fVnh2ZZaqqoD3AUd2eynuxU0HJ9mF9jx9r7v/3oG8Z2Ot8+1Mtx1n\n4/NV9buq+hNwCXA72nWrdwO+3j2fj++mz+QHwO2TvDntKndXJdmcVrS/3M0zm+12dlX9rNoIVf8D\nnN5Nv5DV75Ghr/NqV9Z7Kq0Iv6Wq/meGtn7O+A+LaJG4y0Qk2Qp4AHCXJEW72lEledGQ2SdfRWfi\n/rUD026g9byh9cQOrarz067Fve+QZX6Dtrt5G9oxwH/qpr8ZeH1VfSLtRJpjh8ReT3c4p9tFuMHE\nagH/UlXvGBKzRnySdapdtxm6Y9aDM6Rd4eyaGZYzlYntcyJTb4eptulsvQf4JPAn4EO1egjQUdy4\nHWk91OkMy3cwfpRlzKfJr731aM//GVU1q/Mvquo3Sf4SeDDtEMCjgBdMHzVybqsG7q9i9efvdK/z\nu9COhY9ShDek7R7XMmTPWgCHAe+rqttVuybzbYEfAvcZMu9+SbZKOyZ9KPD1GZa9KfCzJOvTepQ3\n0fUKPwa8HvhOVf2qe2hzVg8q8Pgpln85bdclwMG0cXehXWLxSRPHKZNsl2TbIfGX0kZEmo2zgPsl\n2TrtcoxHABO9rnVo2xPaiVBf625Ptx0emXbsfqcul1HHDf99t1wAquqnwE+BV9AK92SXAjskuUN3\n/6iBvC9n9XYcHARkjTamyfdyYI9u+m1Zc7CKP3frPdl023Eqw/IZ5kzg3hPrmmSTtOtYT6s7br9O\nVX2Eth33rKrfAb9JMvF+GNxuc8ltsqGv8yS3A/4WuBvwkCT7zLCcO7Jw1x3XArNYC9qH5OSTkT7C\n8F3hZ3WPXQB8pKrOmWHZfw98k1bUpxtc4j+BI1m9CxlaD+NDSb7F1AMFnED7wD+ftuv3GoCqOp12\n3PYb3e7FDzP8g/RTDO/tT6mqfga8lDYS0fnAt6pq4iS1a2jDCV5E21vxj9306bbDj2nb9dPAM7rd\nuaM4EXh7d0LTxJ6M9wM/qarvDMn7T7RrP3+o2yargLd3D/8D8MYk59B6pxM+CTxs4gSzafL9Ou0L\n3iXAm2iHHia8E7hg8glmM2zHqVxAOxHs/IETzG6iqn5BO579wSQX0PbejLK7fjvgS92u85OBl3XT\nHw+8tlvWHqx+Xgfb/BVtt/tFQ06Mm86xTHqdp+3OeRftePhPaSd+/nuSoXssupPS/lgLM+CJFoHX\nBtfIut23e1dV78dKHlXaiEgnVdV+i53LfEg7I/vbVfWuGWee2/JPpJ3g9eFxLF9z031xuWpcz7sW\nnz1rrWhd7+6EdBdFWcq6ntldaT1CrSy/pZ34pmXKnrUkST1nz1qSpJ6zWEuS1HMWa0mSes5iLUlS\nz1msJUnquf8faBfAOZOCFXEAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "attention_map = plot_attention_map(model, human_vocab, inv_machine_vocab, \"Tuesday April 08 1993\", num = 6, n_s = 128)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "On the generated plot you can observe the values of the attention weights for each character of the predicted output. Examine this plot and check that where the network is paying attention makes sense to you.\n", + "\n", + "In the date translation application, you will observe that most of the time attention helps predict the year, and hasn't much impact on predicting the day/month." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Congratulations!\n", + "\n", + "\n", + "You have come to the end of this assignment \n", + "\n", + " **Here's what you should remember from this notebook**:\n", + "\n", + "- Machine translation models can be used to map from one sequence to another. They are useful not just for translating human languages (like French->English) but also for tasks like date format translation. \n", + "- An attention mechanism allows a network to focus on the most relevant parts of the input when producing a specific part of the output. \n", + "- A network using an attention mechanism can translate from inputs of length $T_x$ to outputs of length $T_y$, where $T_x$ and $T_y$ can be different. \n", + "- You can visualize attention weights $\\alpha^{\\langle t,t' \\rangle}$ to see what the network is paying attention to while generating each output." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Congratulations on finishing this assignment! You are now able to implement an attention model and use it to learn complex mappings from one sequence to another. " + ] + } + ], + "metadata": { + "coursera": { + "course_slug": "nlp-sequence-models", + "graded_item_id": "n16CQ", + "launcher_item_id": "npjGi" + }, + "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.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Sequence Models/Week 3/Machine Translation/images/attn_mechanism.png b/Sequence Models/Week 3/Machine Translation/images/attn_mechanism.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 3/Machine Translation/images/attn_model.png b/Sequence Models/Week 3/Machine Translation/images/attn_model.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 3/Machine Translation/images/date_attention.png b/Sequence Models/Week 3/Machine Translation/images/date_attention.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 3/Machine Translation/images/date_attention2.png b/Sequence Models/Week 3/Machine Translation/images/date_attention2.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 3/Machine Translation/images/poorly_trained_model.png b/Sequence Models/Week 3/Machine Translation/images/poorly_trained_model.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 3/Machine Translation/images/table.png b/Sequence Models/Week 3/Machine Translation/images/table.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 3/Sequence models & Attention mechanism.pdf b/Sequence Models/Week 3/Sequence models & Attention mechanism.pdf new file mode 100644 index 0000000..a33e142 Binary files /dev/null and b/Sequence Models/Week 3/Sequence models & Attention mechanism.pdf differ diff --git a/Sequence Models/Week 3/Trigger word detection/Trigger word detection - v1.ipynb b/Sequence Models/Week 3/Trigger word detection/Trigger word detection - v1.ipynb new file mode 100644 index 0000000..97dfa86 --- /dev/null +++ b/Sequence Models/Week 3/Trigger word detection/Trigger word detection - v1.ipynb @@ -0,0 +1,1816 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Trigger Word Detection\n", + "\n", + "Welcome to the final programming assignment of this specialization! \n", + "\n", + "In this week's videos, you learned about applying deep learning to speech recognition. In this assignment, you will construct a speech dataset and implement an algorithm for trigger word detection (sometimes also called keyword detection, or wakeword detection). Trigger word detection is the technology that allows devices like Amazon Alexa, Google Home, Apple Siri, and Baidu DuerOS to wake up upon hearing a certain word. \n", + "\n", + "For this exercise, our trigger word will be \"Activate.\" Every time it hears you say \"activate,\" it will make a \"chiming\" sound. By the end of this assignment, you will be able to record a clip of yourself talking, and have the algorithm trigger a chime when it detects you saying \"activate.\" \n", + "\n", + "After completing this assignment, perhaps you can also extend it to run on your laptop so that every time you say \"activate\" it starts up your favorite app, or turns on a network connected lamp in your house, or triggers some other event? \n", + "\n", + "\n", + "\n", + "In this assignment you will learn to: \n", + "- Structure a speech recognition project\n", + "- Synthesize and process audio recordings to create train/dev datasets\n", + "- Train a trigger word detection model and make predictions\n", + "\n", + "Lets get started! Run the following cell to load the package you are going to use. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "from pydub import AudioSegment\n", + "import random\n", + "import sys\n", + "import io\n", + "import os\n", + "import glob\n", + "import IPython\n", + "from td_utils import *\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 1 - Data synthesis: Creating a speech dataset \n", + "\n", + "Let's start by building a dataset for your trigger word detection algorithm. A speech dataset should ideally be as close as possible to the application you will want to run it on. In this case, you'd like to detect the word \"activate\" in working environments (library, home, offices, open-spaces ...). You thus need to create recordings with a mix of positive words (\"activate\") and negative words (random words other than activate) on different background sounds. Let's see how you can create such a dataset. \n", + "\n", + "## 1.1 - Listening to the data \n", + "\n", + "One of your friends is helping you out on this project, and they've gone to libraries, cafes, restaurants, homes and offices all around the region to record background noises, as well as snippets of audio of people saying positive/negative words. This dataset includes people speaking in a variety of accents. \n", + "\n", + "In the raw_data directory, you can find a subset of the raw audio files of the positive words, negative words, and background noise. You will use these audio files to synthesize a dataset to train the model. The \"activate\" directory contains positive examples of people saying the word \"activate\". The \"negatives\" directory contains negative examples of people saying random words other than \"activate\". There is one word per audio recording. The \"backgrounds\" directory contains 10 second clips of background noise in different environments.\n", + "\n", + "Run the cells below to listen to some examples." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "IPython.display.Audio(\"./raw_data/activates/1.wav\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "IPython.display.Audio(\"./raw_data/negatives/4.wav\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "IPython.display.Audio(\"./raw_data/backgrounds/1.wav\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You will use these three type of recordings (positives/negatives/backgrounds) to create a labelled dataset." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1.2 - From audio recordings to spectrograms\n", + "\n", + "What really is an audio recording? A microphone records little variations in air pressure over time, and it is these little variations in air pressure that your ear also perceives as sound. You can think of an audio recording is a long list of numbers measuring the little air pressure changes detected by the microphone. We will use audio sampled at 44100 Hz (or 44100 Hertz). This means the microphone gives us 44100 numbers per second. Thus, a 10 second audio clip is represented by 441000 numbers (= $10 \\times 44100$). \n", + "\n", + "It is quite difficult to figure out from this \"raw\" representation of audio whether the word \"activate\" was said. In order to help your sequence model more easily learn to detect triggerwords, we will compute a *spectrogram* of the audio. The spectrogram tells us how much different frequencies are present in an audio clip at a moment in time. \n", + "\n", + "(If you've ever taken an advanced class on signal processing or on Fourier transforms, a spectrogram is computed by sliding a window over the raw audio signal, and calculates the most active frequencies in each window using a Fourier transform. If you don't understand the previous sentence, don't worry about it.) \n", + "\n", + "Lets see an example. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "IPython.display.Audio(\"audio_examples/example_train.wav\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = graph_spectrogram(\"audio_examples/example_train.wav\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The graph above represents how active each frequency is (y axis) over a number of time-steps (x axis). \n", + "\n", + "\n", + "
**Figure 1**: Spectrogram of an audio recording, where the color shows the degree to which different frequencies are present (loud) in the audio at different points in time. Green squares means a certain frequency is more active or more present in the audio clip (louder); blue squares denote less active frequencies.
\n", + "\n", + "The dimension of the output spectrogram depends upon the hyperparameters of the spectrogram software and the length of the input. In this notebook, we will be working with 10 second audio clips as the \"standard length\" for our training examples. The number of timesteps of the spectrogram will be 5511. You'll see later that the spectrogram will be the input $x$ into the network, and so $T_x = 5511$.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time steps in audio recording before spectrogram (441000,)\n", + "Time steps in input after spectrogram (101, 5511)\n" + ] + } + ], + "source": [ + "_, data = wavfile.read(\"audio_examples/example_train.wav\")\n", + "print(\"Time steps in audio recording before spectrogram\", data[:,0].shape)\n", + "print(\"Time steps in input after spectrogram\", x.shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, you can define:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "Tx = 5511 # The number of time steps input to the model from the spectrogram\n", + "n_freq = 101 # Number of frequencies input to the model at each time step of the spectrogram" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that even with 10 seconds being our default training example length, 10 seconds of time can be discretized to different numbers of value. You've seen 441000 (raw audio) and 5511 (spectrogram). In the former case, each step represents $10/441000 \\approx 0.000023$ seconds. In the second case, each step represents $10/5511 \\approx 0.0018$ seconds. \n", + "\n", + "For the 10sec of audio, the key values you will see in this assignment are:\n", + "\n", + "- $441000$ (raw audio)\n", + "- $5511 = T_x$ (spectrogram output, and dimension of input to the neural network). \n", + "- $10000$ (used by the `pydub` module to synthesize audio) \n", + "- $1375 = T_y$ (the number of steps in the output of the GRU you'll build). \n", + "\n", + "Note that each of these representations correspond to exactly 10 seconds of time. It's just that they are discretizing them to different degrees. All of these are hyperparameters and can be changed (except the 441000, which is a function of the microphone). We have chosen values that are within the standard ranges uses for speech systems. \n", + "\n", + "Consider the $T_y = 1375$ number above. This means that for the output of the model, we discretize the 10s into 1375 time-intervals (each one of length $10/1375 \\approx 0.0072$s) and try to predict for each of these intervals whether someone recently finished saying \"activate.\" \n", + "\n", + "Consider also the 10000 number above. This corresponds to discretizing the 10sec clip into 10/10000 = 0.001 second itervals. 0.001 seconds is also called 1 millisecond, or 1ms. So when we say we are discretizing according to 1ms intervals, it means we are using 10,000 steps. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "Ty = 1375 # The number of time steps in the output of our model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1.3 - Generating a single training example\n", + "\n", + "Because speech data is hard to acquire and label, you will synthesize your training data using the audio clips of activates, negatives, and backgrounds. It is quite slow to record lots of 10 second audio clips with random \"activates\" in it. Instead, it is easier to record lots of positives and negative words, and record background noise separately (or download background noise from free online sources). \n", + "\n", + "To synthesize a single training example, you will:\n", + "\n", + "- Pick a random 10 second background audio clip\n", + "- Randomly insert 0-4 audio clips of \"activate\" into this 10sec clip\n", + "- Randomly insert 0-2 audio clips of negative words into this 10sec clip\n", + "\n", + "Because you had synthesized the word \"activate\" into the background clip, you know exactly when in the 10sec clip the \"activate\" makes its appearance. You'll see later that this makes it easier to generate the labels $y^{\\langle t \\rangle}$ as well. \n", + "\n", + "You will use the pydub package to manipulate audio. Pydub converts raw audio files into lists of Pydub data structures (it is not important to know the details here). Pydub uses 1ms as the discretization interval (1ms is 1 millisecond = 1/1000 seconds) which is why a 10sec clip is always represented using 10,000 steps. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "background len: 10000\n", + "activate[0] len: 916\n", + "activate[1] len: 1579\n" + ] + } + ], + "source": [ + "# Load audio segments using pydub \n", + "activates, negatives, backgrounds = load_raw_audio()\n", + "\n", + "print(\"background len: \" + str(len(backgrounds[0]))) # Should be 10,000, since it is a 10 sec clip\n", + "print(\"activate[0] len: \" + str(len(activates[0]))) # Maybe around 1000, since an \"activate\" audio clip is usually around 1 sec (but varies a lot)\n", + "print(\"activate[1] len: \" + str(len(activates[1]))) # Different \"activate\" clips can have different lengths " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Overlaying positive/negative words on the background**:\n", + "\n", + "Given a 10sec background clip and a short audio clip (positive or negative word), you need to be able to \"add\" or \"insert\" the word's short audio clip onto the background. To ensure audio segments inserted onto the background do not overlap, you will keep track of the times of previously inserted audio clips. You will be inserting multiple clips of positive/negative words onto the background, and you don't want to insert an \"activate\" or a random word somewhere that overlaps with another clip you had previously added. \n", + "\n", + "For clarity, when you insert a 1sec \"activate\" onto a 10sec clip of cafe noise, you end up with a 10sec clip that sounds like someone sayng \"activate\" in a cafe, with \"activate\" superimposed on the background cafe noise. You do *not* end up with an 11 sec clip. You'll see later how pydub allows you to do this. \n", + "\n", + "**Creating the labels at the same time you overlay**:\n", + "\n", + "Recall also that the labels $y^{\\langle t \\rangle}$ represent whether or not someone has just finished saying \"activate.\" Given a background clip, we can initialize $y^{\\langle t \\rangle}=0$ for all $t$, since the clip doesn't contain any \"activates.\" \n", + "\n", + "When you insert or overlay an \"activate\" clip, you will also update labels for $y^{\\langle t \\rangle}$, so that 50 steps of the output now have target label 1. You will train a GRU to detect when someone has *finished* saying \"activate\". For example, suppose the synthesized \"activate\" clip ends at the 5sec mark in the 10sec audio---exactly halfway into the clip. Recall that $T_y = 1375$, so timestep $687 = $ `int(1375*0.5)` corresponds to the moment at 5sec into the audio. So, you will set $y^{\\langle 688 \\rangle} = 1$. Further, you would quite satisfied if the GRU detects \"activate\" anywhere within a short time-internal after this moment, so we actually set 50 consecutive values of the label $y^{\\langle t \\rangle}$ to 1. Specifically, we have $y^{\\langle 688 \\rangle} = y^{\\langle 689 \\rangle} = \\cdots = y^{\\langle 737 \\rangle} = 1$. \n", + "\n", + "This is another reason for synthesizing the training data: It's relatively straightforward to generate these labels $y^{\\langle t \\rangle}$ as described above. In contrast, if you have 10sec of audio recorded on a microphone, it's quite time consuming for a person to listen to it and mark manually exactly when \"activate\" finished. \n", + "\n", + "Here's a figure illustrating the labels $y^{\\langle t \\rangle}$, for a clip which we have inserted \"activate\", \"innocent\", activate\", \"baby.\" Note that the positive labels \"1\" are associated only with the positive words. \n", + "\n", + "\n", + "
**Figure 2**
\n", + "\n", + "To implement the training set synthesis process, you will use the following helper functions. All of these function will use a 1ms discretization interval, so the 10sec of audio is alwsys discretized into 10,000 steps. \n", + "\n", + "1. `get_random_time_segment(segment_ms)` gets a random time segment in our background audio\n", + "2. `is_overlapping(segment_time, existing_segments)` checks if a time segment overlaps with existing segments\n", + "3. `insert_audio_clip(background, audio_clip, existing_times)` inserts an audio segment at a random time in our background audio using `get_random_time_segment` and `is_overlapping`\n", + "4. `insert_ones(y, segment_end_ms)` inserts 1's into our label vector y after the word \"activate\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The function `get_random_time_segment(segment_ms)` returns a random time segment onto which we can insert an audio clip of duration `segment_ms`. Read through the code to make sure you understand what it is doing. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def get_random_time_segment(segment_ms):\n", + " \"\"\"\n", + " Gets a random time segment of duration segment_ms in a 10,000 ms audio clip.\n", + " \n", + " Arguments:\n", + " segment_ms -- the duration of the audio clip in ms (\"ms\" stands for \"milliseconds\")\n", + " \n", + " Returns:\n", + " segment_time -- a tuple of (segment_start, segment_end) in ms\n", + " \"\"\"\n", + " \n", + " segment_start = np.random.randint(low=0, high=10000-segment_ms) # Make sure segment doesn't run past the 10sec background \n", + " segment_end = segment_start + segment_ms - 1\n", + " \n", + " return (segment_start, segment_end)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, suppose you have inserted audio clips at segments (1000,1800) and (3400,4500). I.e., the first segment starts at step 1000, and ends at step 1800. Now, if we are considering inserting a new audio clip at (3000,3600) does this overlap with one of the previously inserted segments? In this case, (3000,3600) and (3400,4500) overlap, so we should decide against inserting a clip here. \n", + "\n", + "For the purpose of this function, define (100,200) and (200,250) to be overlapping, since they overlap at timestep 200. However, (100,199) and (200,250) are non-overlapping. \n", + "\n", + "**Exercise**: Implement `is_overlapping(segment_time, existing_segments)` to check if a new time segment overlaps with any of the previous segments. You will need to carry out 2 steps:\n", + "\n", + "1. Create a \"False\" flag, that you will later set to \"True\" if you find that there is an overlap.\n", + "2. Loop over the previous_segments' start and end times. Compare these times to the segment's start and end times. If there is an overlap, set the flag defined in (1) as True. You can use:\n", + "```python\n", + "for ....:\n", + " if ... <= ... and ... >= ...:\n", + " ...\n", + "```\n", + "Hint: There is overlap if the segment starts before the previous segment ends, and the segment ends after the previous segment starts." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: is_overlapping\n", + "\n", + "def is_overlapping(segment_time, previous_segments):\n", + " \"\"\"\n", + " Checks if the time of a segment overlaps with the times of existing segments.\n", + " \n", + " Arguments:\n", + " segment_time -- a tuple of (segment_start, segment_end) for the new segment\n", + " previous_segments -- a list of tuples of (segment_start, segment_end) for the existing segments\n", + " \n", + " Returns:\n", + " True if the time segment overlaps with any of the existing segments, False otherwise\n", + " \"\"\"\n", + " \n", + " segment_start, segment_end = segment_time\n", + " \n", + " ### START CODE HERE ### (≈ 4 line)\n", + " # Step 1: Initialize overlap as a \"False\" flag. (≈ 1 line)\n", + " overlap = False\n", + " \n", + " # Step 2: loop over the previous_segments start and end times.\n", + " # Compare start/end times and set the flag to True if there is an overlap (≈ 3 lines)\n", + " for previous_start, previous_end in previous_segments:\n", + " if segment_start <= previous_end and segment_end >= previous_start:\n", + " overlap = True\n", + " ### END CODE HERE ###\n", + "\n", + " return overlap" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overlap 1 = False\n", + "Overlap 2 = True\n" + ] + } + ], + "source": [ + "overlap1 = is_overlapping((950, 1430), [(2000, 2550), (260, 949)])\n", + "overlap2 = is_overlapping((2305, 2950), [(824, 1532), (1900, 2305), (3424, 3656)])\n", + "print(\"Overlap 1 = \", overlap1)\n", + "print(\"Overlap 2 = \", overlap2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **Overlap 1**\n", + " \n", + " False\n", + "
\n", + " **Overlap 2**\n", + " \n", + " True\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, lets use the previous helper functions to insert a new audio clip onto the 10sec background at a random time, but making sure that any newly inserted segment doesn't overlap with the previous segments. \n", + "\n", + "**Exercise**: Implement `insert_audio_clip()` to overlay an audio clip onto the background 10sec clip. You will need to carry out 4 steps:\n", + "\n", + "1. Get a random time segment of the right duration in ms.\n", + "2. Make sure that the time segment does not overlap with any of the previous time segments. If it is overlapping, then go back to step 1 and pick a new time segment.\n", + "3. Add the new time segment to the list of existing time segments, so as to keep track of all the segments you've inserted. \n", + "4. Overlay the audio clip over the background using pydub. We have implemented this for you." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: insert_audio_clip\n", + "\n", + "def insert_audio_clip(background, audio_clip, previous_segments):\n", + " \"\"\"\n", + " Insert a new audio segment over the background noise at a random time step, ensuring that the \n", + " audio segment does not overlap with existing segments.\n", + " \n", + " Arguments:\n", + " background -- a 10 second background audio recording. \n", + " audio_clip -- the audio clip to be inserted/overlaid. \n", + " previous_segments -- times where audio segments have already been placed\n", + " \n", + " Returns:\n", + " new_background -- the updated background audio\n", + " \"\"\"\n", + " \n", + " # Get the duration of the audio clip in ms\n", + " segment_ms = len(audio_clip)\n", + " \n", + " ### START CODE HERE ### \n", + " # Step 1: Use one of the helper functions to pick a random time segment onto which to insert \n", + " # the new audio clip. (≈ 1 line)\n", + " segment_time = get_random_time_segment(segment_ms)\n", + " \n", + " # Step 2: Check if the new segment_time overlaps with one of the previous_segments. If so, keep \n", + " # picking new segment_time at random until it doesn't overlap. (≈ 2 lines)\n", + " while is_overlapping(segment_time, previous_segments):\n", + " segment_time = get_random_time_segment(segment_ms)\n", + "\n", + " # Step 3: Add the new segment_time to the list of previous_segments (≈ 1 line)\n", + " previous_segments.append(segment_time)\n", + " ### END CODE HERE ###\n", + " \n", + " # Step 4: Superpose audio segment and background\n", + " new_background = background.overlay(audio_clip, position = segment_time[0])\n", + " \n", + " return new_background, segment_time" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Segment Time: (2254, 3169)\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.random.seed(5)\n", + "audio_clip, segment_time = insert_audio_clip(backgrounds[0], activates[0], [(3790, 4400)])\n", + "audio_clip.export(\"insert_test.wav\", format=\"wav\")\n", + "print(\"Segment Time: \", segment_time)\n", + "IPython.display.Audio(\"insert_test.wav\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **Segment Time**\n", + " \n", + " (2254, 3169)\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Expected audio\n", + "IPython.display.Audio(\"audio_examples/insert_reference.wav\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, implement code to update the labels $y^{\\langle t \\rangle}$, assuming you just inserted an \"activate.\" In the code below, `y` is a `(1,1375)` dimensional vector, since $T_y = 1375$. \n", + "\n", + "If the \"activate\" ended at time step $t$, then set $y^{\\langle t+1 \\rangle} = 1$ as well as for up to 49 additional consecutive values. However, make sure you don't run off the end of the array and try to update `y[0][1375]`, since the valid indices are `y[0][0]` through `y[0][1374]` because $T_y = 1375$. So if \"activate\" ends at step 1370, you would get only `y[0][1371] = y[0][1372] = y[0][1373] = y[0][1374] = 1`\n", + "\n", + "**Exercise**: Implement `insert_ones()`. You can use a for loop. (If you are an expert in python's slice operations, feel free also to use slicing to vectorize this.) If a segment ends at `segment_end_ms` (using a 10000 step discretization), to convert it to the indexing for the outputs $y$ (using a $1375$ step discretization), we will use this formula: \n", + "```\n", + " segment_end_y = int(segment_end_ms * Ty / 10000.0)\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: insert_ones\n", + "\n", + "def insert_ones(y, segment_end_ms):\n", + " \"\"\"\n", + " Update the label vector y. The labels of the 50 output steps strictly after the end of the segment \n", + " should be set to 1. By strictly we mean that the label of segment_end_y should be 0 while, the\n", + " 50 followinf labels should be ones.\n", + " \n", + " \n", + " Arguments:\n", + " y -- numpy array of shape (1, Ty), the labels of the training example\n", + " segment_end_ms -- the end time of the segment in ms\n", + " \n", + " Returns:\n", + " y -- updated labels\n", + " \"\"\"\n", + " \n", + " # duration of the background (in terms of spectrogram time-steps)\n", + " segment_end_y = int(segment_end_ms * Ty / 10000.0)\n", + " \n", + " # Add 1 to the correct index in the background label (y)\n", + " ### START CODE HERE ### (≈ 3 lines)\n", + " for i in range(segment_end_y+1, segment_end_y+51):\n", + " if i < Ty:\n", + " y[0, i] = 1.0\n", + " ### END CODE HERE ###\n", + " \n", + " return y" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sanity checks: 0.0 1.0 0.0\n" + ] + }, + { + "data": { + "image/png": "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\naTImQ5ZhwDo99wskzUTEPRHxqKQ9kraN7LNN0kdi4GZJp9g+s+VaAQA1rayxzxpJh4aWD0t6fo19\n1kj6+nFVN4eb7p7VH19/Z9s/Fj3z3aPHGu3/1Yce0Uvfc9OYqgGk7yebC1kn3Ftje7sGwzZav379\nkn7GSU9cqU1nnNRmWeihs55+sl5xTr2Tw1993jqGZtCJn37GU3Xxs09f7jIk1Qv3I5LWDS2vrdY1\n3UcRsUvSLkmamppa0tvc+c88Vec/8/ylfCsm1MVnn66Lz85xwAFdqTPmvl/SJtsbbZ8g6VJJe0f2\n2Svp8mrWzIWSvhkRrQ/JAADqWbTnHhFHbV8l6QZJKyTtjogDtq+stu+UtE/SJZJmJD0i6YrxlQwA\nWEytMfeI2KdBgA+v2zn0OiS9qd3SAABLxSdUAaBAhDsAFIhwB4ACEe4AUCDCHQAK5Fimj8zanpV0\n3xK/fZWkh1ospwt9q5l6x69vNVPv+NWp+ZkRsXqxH7Rs4X48bE9HxNRy19FE32qm3vHrW83UO35t\n1sywDAAUiHAHgAL1Ndx3LXcBS9C3mql3/PpWM/WOX2s193LMHQCwsL723AEAC+hduC/2sO7lYHud\n7X+3faftA7bfXK0/zfa/2P5y9e+pQ9/z1upvOGj75ctU9wrb/237+p7Ue4rtj9v+ku27bL8gc822\nf7tqD3fY/pjtH89Ur+3dth+0fcfQusb12T7f9u3Vtvfb43s0yjw1v6tqE7fZ/gfbp2Spea56h7b9\nru2wvWos9UZEb740uOXwVyT9hKQTJN0qaXOCus6UdF71+mRJd2vwMPE/l7SjWr9D0jur15ur2p8o\naWP1N61Yhrp/R9LfSrq+Ws5e719JemP1+gRJp2StWYPHTN4r6UnV8t9Len2meiW9SNJ5ku4YWte4\nPkn/JelCDR5Z/mlJWzuu+WWSVlav35mp5rnqrdav0+A26vdJWjWOevvWc6/zsO7ORcTXI+IL1etv\nS7pLg4N7mwaBpOrfX6xeb5O0JyK+GxH3anAf/Au6rNn2WkmvkHTt0OrM9T5VgwPlQ5IUEY9GxP9l\nrlmDW2o/yfZKSSdK+lqmeiPis5IeHlndqD7bZ0p6SkTcHIMU+sjQ93RSc0TcGBFHq8WbNXgSXIqa\n5/k/lqT3Svo9ScMXPVutt2/hPt+DuNOwvUHScyV9XtIZ8cMnUj0g6YzqdYa/430aNK7hJ01nrnej\npFlJf1kNJV1r+8lKWnNEHJH0F5Lu1+BB8d+MiBuVtN4hTetbU70eXb9cfl2Dnq2UtGbb2yQdiYhb\nRza1Wm/fwj012ydJ+oSk34qIbw1vq95xU0xNsv1KSQ9GxC3z7ZOp3spKDU5vr4mI50r6jgbDBj+Q\nqeZqrHqbBm9Kz5D0ZNuvHd4nU71zyV7fKNtvk3RU0keXu5b52D5R0u9Levu4f1ffwr3Wg7iXg+0n\naBDsH42I66rV/1OdUqn698Fq/XL/HT8n6VW2v6rB0NbP2/4b5a1XGvRWDkfE56vlj2sQ9llr/gVJ\n90bEbER8T9J1kn42cb2PaVrfEf1wGGR4fadsv17SKyW9pnpTknLW/CwN3vBvrY6/tZK+YPvparne\nvoV7nYd1d666cv0hSXdFxHuGNu2V9Lrq9eskfWpo/aW2n2h7o6RNGlww6UREvDUi1kbEBg3+D/8t\nIl6btd6q5gckHbJ9drXqJZLuVN6a75d0oe0Tq/bxEg2uxWSt9zGN6quGcL5l+8Lq77x86Hs6YXuL\nBkOMr4qIR4Y2pas5Im6PiNMjYkN1/B3WYDLGA63XO44rxOP80uBB3HdrcCX5bctdT1XTCzU4fb1N\n0herr0skPU3SZyR9WdK/Sjpt6HveVv0NBzXG2QU1ar9IP5wtk7peSc+RNF39P39S0qmZa5b0R5K+\nJOkOSX+twSyINPVK+pgG1wO+V4XMG5ZSn6Sp6m/8iqQPqPpwZIc1z2gwVv3YsbczS81z1Tuy/auq\nZsu0XS+fUAWAAvVtWAYAUAPhDgAFItwBoECEOwAUiHAHgAIR7gBQIMIdAApEuANAgf4fVXUoGewl\nMn8AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "arr1 = insert_ones(np.zeros((1, Ty)), 9700)\n", + "plt.plot(insert_ones(arr1, 4251)[0,:])\n", + "print(\"sanity checks:\", arr1[0][1333], arr1[0][634], arr1[0][635])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **sanity checks**:\n", + " \n", + " 0.0 1.0 0.0\n", + "
\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, you can use `insert_audio_clip` and `insert_ones` to create a new training example.\n", + "\n", + "**Exercise**: Implement `create_training_example()`. You will need to carry out the following steps:\n", + "\n", + "1. Initialize the label vector $y$ as a numpy array of zeros and shape $(1, T_y)$.\n", + "2. Initialize the set of existing segments to an empty list.\n", + "3. Randomly select 0 to 4 \"activate\" audio clips, and insert them onto the 10sec clip. Also insert labels at the correct position in the label vector $y$.\n", + "4. Randomly select 0 to 2 negative audio clips, and insert them into the 10sec clip. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: create_training_example\n", + "\n", + "def create_training_example(background, activates, negatives):\n", + " \"\"\"\n", + " Creates a training example with a given background, activates, and negatives.\n", + " \n", + " Arguments:\n", + " background -- a 10 second background audio recording\n", + " activates -- a list of audio segments of the word \"activate\"\n", + " negatives -- a list of audio segments of random words that are not \"activate\"\n", + " \n", + " Returns:\n", + " x -- the spectrogram of the training example\n", + " y -- the label at each time step of the spectrogram\n", + " \"\"\"\n", + " \n", + " # Set the random seed\n", + " np.random.seed(18)\n", + " \n", + " # Make background quieter\n", + " background = background - 20\n", + "\n", + " ### START CODE HERE ###\n", + " # Step 1: Initialize y (label vector) of zeros (≈ 1 line)\n", + " y = np.zeros((1, Ty))\n", + "\n", + " # Step 2: Initialize segment times as empty list (≈ 1 line)\n", + " previous_segments = []\n", + " ### END CODE HERE ###\n", + " \n", + " # Select 0-4 random \"activate\" audio clips from the entire list of \"activates\" recordings\n", + " number_of_activates = np.random.randint(0, 5)\n", + " random_indices = np.random.randint(len(activates), size=number_of_activates)\n", + " random_activates = [activates[i] for i in random_indices]\n", + " \n", + " ### START CODE HERE ### (≈ 3 lines)\n", + " # Step 3: Loop over randomly selected \"activate\" clips and insert in background\n", + " for random_activate in random_activates:\n", + " # Insert the audio clip on the background\n", + " background, segment_time = insert_audio_clip(background, random_activate, previous_segments)\n", + " # Retrieve segment_start and segment_end from segment_time\n", + " segment_start, segment_end = segment_time\n", + " # Insert labels in \"y\"\n", + " y = insert_ones(y, segment_end)\n", + " ### END CODE HERE ###\n", + "\n", + " # Select 0-2 random negatives audio recordings from the entire list of \"negatives\" recordings\n", + " number_of_negatives = np.random.randint(0, 3)\n", + " random_indices = np.random.randint(len(negatives), size=number_of_negatives)\n", + " random_negatives = [negatives[i] for i in random_indices]\n", + "\n", + " ### START CODE HERE ### (≈ 2 lines)\n", + " # Step 4: Loop over randomly selected negative clips and insert in background\n", + " for random_negative in random_negatives:\n", + " # Insert the audio clip on the background \n", + " background, _ = insert_audio_clip(background, random_negative, previous_segments)\n", + " ### END CODE HERE ###\n", + " \n", + " # Standardize the volume of the audio clip \n", + " background = match_target_amplitude(background, -20.0)\n", + "\n", + " # Export new training example \n", + " file_handle = background.export(\"train\" + \".wav\", format=\"wav\")\n", + " print(\"File (train.wav) was saved in your directory.\")\n", + " \n", + " # Get and plot spectrogram of the new recording (background with superposition of positive and negatives)\n", + " x = graph_spectrogram(\"train.wav\")\n", + " \n", + " return x, y" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "File (train.wav) was saved in your directory.\n" + ] + }, + { + "data": { + "image/png": "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\nrkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x, y = create_training_example(backgrounds[0], activates, negatives)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now you can listen to the training example you created and compare it to the spectrogram generated above." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "IPython.display.Audio(\"train.wav\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "IPython.display.Audio(\"audio_examples/train_reference.wav\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, you can plot the associated labels for the generated training example." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nQv8PcimiUyGDpLEAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(y[0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1.4 - Full training set\n", + "\n", + "You've now implemented the code needed to generate a single training example. We used this process to generate a large training set. To save time, we've already generated a set of training examples. " + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Load preprocessed training examples\n", + "X = np.load(\"./XY_train/X.npy\")\n", + "Y = np.load(\"./XY_train/Y.npy\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1.5 - Development set\n", + "\n", + "To test our model, we recorded a development set of 25 examples. While our training data is synthesized, we want to create a development set using the same distribution as the real inputs. Thus, we recorded 25 10-second audio clips of people saying \"activate\" and other random words, and labeled them by hand. This follows the principle described in Course 3 that we should create the dev set to be as similar as possible to the test set distribution; that's why our dev set uses real rather than synthesized audio. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Load preprocessed dev set examples\n", + "X_dev = np.load(\"./XY_dev/X_dev.npy\")\n", + "Y_dev = np.load(\"./XY_dev/Y_dev.npy\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2 - Model\n", + "\n", + "Now that you've built a dataset, lets write and train a trigger word detection model! \n", + "\n", + "The model will use 1-D convolutional layers, GRU layers, and dense layers. Let's load the packages that will allow you to use these layers in Keras. This might take a minute to load. " + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + } + ], + "source": [ + "from keras.callbacks import ModelCheckpoint\n", + "from keras.models import Model, load_model, Sequential\n", + "from keras.layers import Dense, Activation, Dropout, Input, Masking, TimeDistributed, LSTM, Conv1D\n", + "from keras.layers import GRU, Bidirectional, BatchNormalization, Reshape\n", + "from keras.optimizers import Adam" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.1 - Build the model\n", + "\n", + "Here is the architecture we will use. Take some time to look over the model and see if it makes sense. \n", + "\n", + "\n", + "
**Figure 3**
\n", + "\n", + "One key step of this model is the 1D convolutional step (near the bottom of Figure 3). It inputs the 5511 step spectrogram, and outputs a 1375 step output, which is then further processed by multiple layers to get the final $T_y = 1375$ step output. This layer plays a role similar to the 2D convolutions you saw in Course 4, of extracting low-level features and then possibly generating an output of a smaller dimension. \n", + "\n", + "Computationally, the 1-D conv layer also helps speed up the model because now the GRU has to process only 1375 timesteps rather than 5511 timesteps. The two GRU layers read the sequence of inputs from left to right, then ultimately uses a dense+sigmoid layer to make a prediction for $y^{\\langle t \\rangle}$. Because $y$ is binary valued (0 or 1), we use a sigmoid output at the last layer to estimate the chance of the output being 1, corresponding to the user having just said \"activate.\"\n", + "\n", + "Note that we use a uni-directional RNN rather than a bi-directional RNN. This is really important for trigger word detection, since we want to be able to detect the trigger word almost immediately after it is said. If we used a bi-directional RNN, we would have to wait for the whole 10sec of audio to be recorded before we could tell if \"activate\" was said in the first second of the audio clip. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Implementing the model can be done in four steps:\n", + " \n", + "**Step 1**: CONV layer. Use `Conv1D()` to implement this, with 196 filters, \n", + "a filter size of 15 (`kernel_size=15`), and stride of 4. [[See documentation.](https://keras.io/layers/convolutional/#conv1d)]\n", + "\n", + "**Step 2**: First GRU layer. To generate the GRU layer, use:\n", + "```\n", + "X = GRU(units = 128, return_sequences = True)(X)\n", + "```\n", + "Setting `return_sequences=True` ensures that all the GRU's hidden states are fed to the next layer. Remember to follow this with Dropout and BatchNorm layers. \n", + "\n", + "**Step 3**: Second GRU layer. This is similar to the previous GRU layer (remember to use `return_sequences=True`), but has an extra dropout layer. \n", + "\n", + "**Step 4**: Create a time-distributed dense layer as follows: \n", + "```\n", + "X = TimeDistributed(Dense(1, activation = \"sigmoid\"))(X)\n", + "```\n", + "This creates a dense layer followed by a sigmoid, so that the parameters used for the dense layer are the same for every time step. [[See documentation](https://keras.io/layers/wrappers/).]\n", + "\n", + "**Exercise**: Implement `model()`, the architecture is presented in Figure 3." + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# GRADED FUNCTION: model\n", + "\n", + "def model(input_shape):\n", + " \"\"\"\n", + " Function creating the model's graph in Keras.\n", + " \n", + " Argument:\n", + " input_shape -- shape of the model's input data (using Keras conventions)\n", + "\n", + " Returns:\n", + " model -- Keras model instance\n", + " \"\"\"\n", + " \n", + " X_input = Input(shape = input_shape)\n", + " \n", + " ### START CODE HERE ###\n", + " \n", + " # Step 1: CONV layer (≈4 lines)\n", + " X = Conv1D(196, 15, strides=4)(X_input) # CONV1D\n", + " X = BatchNormalization()(X) # Batch normalization\n", + " X = Activation('relu')(X) # ReLu activation\n", + " X = Dropout(0.8)(X) # dropout (use 0.8)\n", + "\n", + " # Step 2: First GRU Layer (≈4 lines)\n", + " X = GRU(units = 128, return_sequences=True)(X) # GRU (use 128 units and return the sequences)\n", + " X = Dropout(0.8)(X) # dropout (use 0.8)\n", + " X = BatchNormalization()(X) # Batch normalization\n", + " \n", + " # Step 3: Second GRU Layer (≈4 lines)\n", + " X = GRU(units = 128, return_sequences=True)(X) # GRU (use 128 units and return the sequences)\n", + " X = Dropout(0.8)(X) # dropout (use 0.8)\n", + " X = BatchNormalization()(X) # Batch normalization\n", + " X = Dropout(0.8)(X) # dropout (use 0.8)\n", + " \n", + " # Step 4: Time-distributed dense layer (≈1 line)\n", + " X = TimeDistributed(Dense(1, activation = \"sigmoid\"))(X) # time distributed (sigmoid)\n", + "\n", + " ### END CODE HERE ###\n", + "\n", + " model = Model(inputs = X_input, outputs = X)\n", + " \n", + " return model " + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model = model(input_shape = (Tx, n_freq))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's print the model summary to keep track of the shapes." + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "input_3 (InputLayer) (None, 5511, 101) 0 \n", + "_________________________________________________________________\n", + "conv1d_1 (Conv1D) (None, 1375, 196) 297136 \n", + "_________________________________________________________________\n", + "batch_normalization_1 (Batch (None, 1375, 196) 784 \n", + "_________________________________________________________________\n", + "activation_1 (Activation) (None, 1375, 196) 0 \n", + "_________________________________________________________________\n", + "dropout_1 (Dropout) (None, 1375, 196) 0 \n", + "_________________________________________________________________\n", + "gru_1 (GRU) (None, 1375, 128) 124800 \n", + "_________________________________________________________________\n", + "dropout_2 (Dropout) (None, 1375, 128) 0 \n", + "_________________________________________________________________\n", + "batch_normalization_2 (Batch (None, 1375, 128) 512 \n", + "_________________________________________________________________\n", + "gru_2 (GRU) (None, 1375, 128) 98688 \n", + "_________________________________________________________________\n", + "dropout_3 (Dropout) (None, 1375, 128) 0 \n", + "_________________________________________________________________\n", + "batch_normalization_3 (Batch (None, 1375, 128) 512 \n", + "_________________________________________________________________\n", + "dropout_4 (Dropout) (None, 1375, 128) 0 \n", + "_________________________________________________________________\n", + "time_distributed_1 (TimeDist (None, 1375, 1) 129 \n", + "=================================================================\n", + "Total params: 522,561\n", + "Trainable params: 521,657\n", + "Non-trainable params: 904\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Expected Output**:\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " **Total params**\n", + " \n", + " 522,561\n", + "
\n", + " **Trainable params**\n", + " \n", + " 521,657\n", + "
\n", + " **Non-trainable params**\n", + " \n", + " 904\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The output of the network is of shape (None, 1375, 1) while the input is (None, 5511, 101). The Conv1D has reduced the number of steps from 5511 at spectrogram to 1375. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.2 - Fit the model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Trigger word detection takes a long time to train. To save time, we've already trained a model for about 3 hours on a GPU using the architecture you built above, and a large training set of about 4000 examples. Let's load the model. " + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model = load_model('./models/tr_model.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can train the model further, using the Adam optimizer and binary cross entropy loss, as follows. This will run quickly because we are training just for one epoch and with a small training set of 26 examples. " + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "opt = Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, decay=0.01)\n", + "model.compile(loss='binary_crossentropy', optimizer=opt, metrics=[\"accuracy\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/1\n", + "26/26 [==============================] - 23s - loss: 0.0727 - acc: 0.9806 \n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.fit(X, Y, batch_size = 5, epochs=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.3 - Test the model\n", + "\n", + "Finally, let's see how your model performs on the dev set." + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "25/25 [==============================] - 4s\n", + "Dev set accuracy = 0.94600725174\n" + ] + } + ], + "source": [ + "loss, acc = model.evaluate(X_dev, Y_dev)\n", + "print(\"Dev set accuracy = \", acc)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This looks pretty good! However, accuracy isn't a great metric for this task, since the labels are heavily skewed to 0's, so a neural network that just outputs 0's would get slightly over 90% accuracy. We could define more useful metrics such as F1 score or Precision/Recall. But let's not bother with that here, and instead just empirically see how the model does. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3 - Making Predictions\n", + "\n", + "Now that you have built a working model for trigger word detection, let's use it to make predictions. This code snippet runs audio (saved in a wav file) through the network. \n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def detect_triggerword(filename):\n", + " plt.subplot(2, 1, 1)\n", + "\n", + " x = graph_spectrogram(filename)\n", + " # the spectogram outputs (freqs, Tx) and we want (Tx, freqs) to input into the model\n", + " x = x.swapaxes(0,1)\n", + " x = np.expand_dims(x, axis=0)\n", + " predictions = model.predict(x)\n", + " \n", + " plt.subplot(2, 1, 2)\n", + " plt.plot(predictions[0,:,0])\n", + " plt.ylabel('probability')\n", + " plt.show()\n", + " return predictions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once you've estimated the probability of having detected the word \"activate\" at each output step, you can trigger a \"chiming\" sound to play when the probability is above a certain threshold. Further, $y^{\\langle t \\rangle}$ might be near 1 for many values in a row after \"activate\" is said, yet we want to chime only once. So we will insert a chime sound at most once every 75 output steps. This will help prevent us from inserting two chimes for a single instance of \"activate\". (This plays a role similar to non-max suppression from computer vision.) \n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "chime_file = \"audio_examples/chime.wav\"\n", + "def chime_on_activate(filename, predictions, threshold):\n", + " audio_clip = AudioSegment.from_wav(filename)\n", + " chime = AudioSegment.from_wav(chime_file)\n", + " Ty = predictions.shape[1]\n", + " # Step 1: Initialize the number of consecutive output steps to 0\n", + " consecutive_timesteps = 0\n", + " # Step 2: Loop over the output steps in the y\n", + " for i in range(Ty):\n", + " # Step 3: Increment consecutive output steps\n", + " consecutive_timesteps += 1\n", + " # Step 4: If prediction is higher than the threshold and more than 75 consecutive output steps have passed\n", + " if predictions[0,i,0] > threshold and consecutive_timesteps > 75:\n", + " # Step 5: Superpose audio and background using pydub\n", + " audio_clip = audio_clip.overlay(chime, position = ((i / Ty) * audio_clip.duration_seconds)*1000)\n", + " # Step 6: Reset consecutive output steps to 0\n", + " consecutive_timesteps = 0\n", + " \n", + " audio_clip.export(\"chime_output.wav\", format='wav')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3.3 - Test on dev examples" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's explore how our model performs on two unseen audio clips from the development set. Lets first listen to the two dev set clips. " + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "IPython.display.Audio(\"./raw_data/dev/1.wav\")" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "IPython.display.Audio(\"./raw_data/dev/2.wav\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now lets run the model on these audio clips and see if it adds a chime after \"activate\"!" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nRK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "filename = \"./raw_data/dev/1.wav\"\n", + "prediction = detect_triggerword(filename)\n", + "chime_on_activate(filename, prediction, 0.5)\n", + "IPython.display.Audio(\"./chime_output.wav\")" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "filename = \"./raw_data/dev/2.wav\"\n", + "prediction = detect_triggerword(filename)\n", + "chime_on_activate(filename, prediction, 0.5)\n", + "IPython.display.Audio(\"./chime_output.wav\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Congratulations \n", + "\n", + "You've come to the end of this assignment! \n", + "\n", + "Here's what you should remember:\n", + "- Data synthesis is an effective way to create a large training set for speech problems, specifically trigger word detection. \n", + "- Using a spectrogram and optionally a 1D conv layer is a common pre-processing step prior to passing audio data to an RNN, GRU or LSTM.\n", + "- An end-to-end deep learning approach can be used to built a very effective trigger word detection system. \n", + "\n", + "*Congratulations* on finishing the fimal assignment! \n", + "\n", + "Thank you for sticking with us through the end and for all the hard work you've put into learning deep learning. We hope you have enjoyed the course! \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 4 - Try your own example! (OPTIONAL/UNGRADED)\n", + "\n", + "In this optional and ungraded portion of this notebook, you can try your model on your own audio clips! \n", + "\n", + "Record a 10 second audio clip of you saying the word \"activate\" and other random words, and upload it to the Coursera hub as `myaudio.wav`. Be sure to upload the audio as a wav file. If your audio is recorded in a different format (such as mp3) there is free software that you can find online for converting it to wav. If your audio recording is not 10 seconds, the code below will either trim or pad it as needed to make it 10 seconds. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Preprocess the audio to the correct format\n", + "def preprocess_audio(filename):\n", + " # Trim or pad audio segment to 10000ms\n", + " padding = AudioSegment.silent(duration=10000)\n", + " segment = AudioSegment.from_wav(filename)[:10000]\n", + " segment = padding.overlay(segment)\n", + " # Set frame rate to 44100\n", + " segment = segment.set_frame_rate(44100)\n", + " # Export as wav\n", + " segment.export(filename, format='wav')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once you've uploaded your audio file to Coursera, put the path to your file in the variable below." + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "your_filename = \"audio_examples/my_audio.wav\"" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 80, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "preprocess_audio(your_filename)\n", + "IPython.display.Audio(your_filename) # listen to the audio you uploaded " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, use the model to predict when you say activate in the 10 second audio clip, and trigger a chime. If beeps are not being added appropriately, try to adjust the chime_threshold." + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n9gAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "chime_threshold = 0.5\n", + "prediction = detect_triggerword(your_filename)\n", + "chime_on_activate(your_filename, prediction, chime_threshold)\n", + "IPython.display.Audio(\"./chime_output.wav\")" + ] + } + ], + "metadata": { + "coursera": { + "course_slug": "nlp-sequence-models", + "graded_item_id": "rSupZ", + "launcher_item_id": "cvGhe" + }, + "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.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Sequence Models/Week 3/Trigger word detection/audio_examples/chime.wav b/Sequence Models/Week 3/Trigger word detection/audio_examples/chime.wav new file mode 100644 index 0000000..6664b18 Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/audio_examples/chime.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/audio_examples/example_train.wav b/Sequence Models/Week 3/Trigger word detection/audio_examples/example_train.wav new file mode 100644 index 0000000..e9f1e4c Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/audio_examples/example_train.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/audio_examples/insert_reference.wav b/Sequence Models/Week 3/Trigger word detection/audio_examples/insert_reference.wav new file mode 100644 index 0000000..94c731b Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/audio_examples/insert_reference.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/audio_examples/my_audio.wav b/Sequence Models/Week 3/Trigger word detection/audio_examples/my_audio.wav new file mode 100644 index 0000000..6d71c2b Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/audio_examples/my_audio.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/audio_examples/train_reference.wav b/Sequence Models/Week 3/Trigger word detection/audio_examples/train_reference.wav new file mode 100644 index 0000000..2244b8e Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/audio_examples/train_reference.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/chime_output.wav b/Sequence Models/Week 3/Trigger word detection/chime_output.wav new file mode 100644 index 0000000..7c5faed Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/chime_output.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/images/label_diagram.png b/Sequence Models/Week 3/Trigger word detection/images/label_diagram.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 3/Trigger word detection/images/model.png b/Sequence Models/Week 3/Trigger word detection/images/model.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 3/Trigger word detection/images/ones_reference.png b/Sequence Models/Week 3/Trigger word detection/images/ones_reference.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 3/Trigger word detection/images/sound.png b/Sequence Models/Week 3/Trigger word detection/images/sound.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 3/Trigger word detection/images/spectrogram.png b/Sequence Models/Week 3/Trigger word detection/images/spectrogram.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 3/Trigger word detection/images/train_label.png b/Sequence Models/Week 3/Trigger word detection/images/train_label.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 3/Trigger word detection/images/train_reference.png b/Sequence Models/Week 3/Trigger word detection/images/train_reference.png new file mode 100644 index 0000000..e69de29 diff --git a/Sequence Models/Week 3/Trigger word detection/insert_test.wav b/Sequence Models/Week 3/Trigger word detection/insert_test.wav new file mode 100644 index 0000000..94c731b Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/insert_test.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/activates/1.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/1.wav new file mode 100644 index 0000000..0146f4a Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/1.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/activates/1_act2.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/1_act2.wav new file mode 100644 index 0000000..b52b630 Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/1_act2.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/activates/1_act3.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/1_act3.wav new file mode 100644 index 0000000..0d4773c Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/1_act3.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/activates/2.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/2.wav new file mode 100644 index 0000000..c09e24a Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/2.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/activates/2_act2.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/2_act2.wav new file mode 100644 index 0000000..1698732 Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/2_act2.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/activates/2_act3.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/2_act3.wav new file mode 100644 index 0000000..068e59e Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/2_act3.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/activates/3.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/3.wav new file mode 100644 index 0000000..c7145f3 Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/3.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/activates/3_act2.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/3_act2.wav new file mode 100644 index 0000000..e8e7ff4 Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/3_act2.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/activates/3_act3.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/3_act3.wav new file mode 100644 index 0000000..d84b975 Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/3_act3.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/activates/4_act2.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/4_act2.wav new file mode 100644 index 0000000..adfd11a Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/activates/4_act2.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/backgrounds/1.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/backgrounds/1.wav new file mode 100644 index 0000000..64a0602 Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/backgrounds/1.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/backgrounds/2.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/backgrounds/2.wav new file mode 100644 index 0000000..dc4347f Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/backgrounds/2.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/dev/1.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/dev/1.wav new file mode 100644 index 0000000..0406be3 Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/dev/1.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/dev/2.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/dev/2.wav new file mode 100644 index 0000000..a8c51af Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/dev/2.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/1.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/1.wav new file mode 100644 index 0000000..7534988 Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/1.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/1_0.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/1_0.wav new file mode 100644 index 0000000..80d738d Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/1_0.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/2.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/2.wav new file mode 100644 index 0000000..3762c19 Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/2.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/2_1.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/2_1.wav new file mode 100644 index 0000000..544d88f Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/2_1.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/3.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/3.wav new file mode 100644 index 0000000..9508d20 Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/3.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/3_2.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/3_2.wav new file mode 100644 index 0000000..a1aa045 Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/3_2.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/4.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/4.wav new file mode 100644 index 0000000..7a3b426 Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/4.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/4_0.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/4_0.wav new file mode 100644 index 0000000..c483d39 Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/4_0.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/5.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/5.wav new file mode 100644 index 0000000..c1a888a Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/5.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/5_1.wav b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/5_1.wav new file mode 100644 index 0000000..c4bd093 Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/raw_data/negatives/5_1.wav differ diff --git a/Sequence Models/Week 3/Trigger word detection/train.wav b/Sequence Models/Week 3/Trigger word detection/train.wav new file mode 100644 index 0000000..2244b8e Binary files /dev/null and b/Sequence Models/Week 3/Trigger word detection/train.wav differ