{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import math\n",
    "\n",
    "from keras import backend as K\n",
    "from keras.callbacks import ModelCheckpoint\n",
    "\n",
    "from keras.layers import Input, Dense, Lambda, Layer, Add, Multiply, Dropout, SimpleRNN, Flatten, regularizers, LSTM\n",
    "from keras.models import Model, Sequential\n",
    "from keras.utils import plot_model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Cargar Datos\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x_train shape: (15071, 420)\n",
      "x_test shape: (100, 420)\n",
      "y_train shape: (15071, 1)\n",
      "y_test shape: (100, 1)\n",
      "input shape: (420,)\n"
     ]
    }
   ],
   "source": [
    "data = np.load('CMAPSS_FD001.npz', allow_pickle=True)\n",
    "\n",
    "\n",
    "x_train = data['x_train']\n",
    "x_test = data['x_test']\n",
    "y_train = data['y_train']\n",
    "y_test = data['y_test']\n",
    "\n",
    "print('x_train shape:', x_train.shape)\n",
    "print('x_test shape:',x_test.shape)\n",
    "print('y_train shape:',y_train.shape)\n",
    "print('y_test shape:',y_test.shape)\n",
    "\n",
    "\n",
    "\n",
    "input_shape = x_train.shape[1:]\n",
    "\n",
    "print('input shape:',input_shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Funciones para calcular el costo ELBO"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def nll(y_true, y_pred):\n",
    "    \"\"\" Negative log likelihood (Bernoulli). \"\"\"\n",
    "\n",
    "    # keras.losses.binary_crossentropy gives the mean\n",
    "    # over the last axis. we require the sum\n",
    "    return K.sum(K.binary_crossentropy(y_true, y_pred), axis=-1)\n",
    "\n",
    "\n",
    "class KLDivergenceLayer(Layer):\n",
    "\n",
    "    \"\"\" Identity transform layer that adds KL divergence\n",
    "    to the final model loss.\n",
    "    \"\"\"\n",
    "\n",
    "    def __init__(self, *args, **kwargs):\n",
    "        self.is_placeholder = True\n",
    "        super(KLDivergenceLayer, self).__init__(*args, **kwargs)\n",
    "\n",
    "    def call(self, inputs):\n",
    "\n",
    "        mu, log_var = inputs\n",
    "\n",
    "        kl_batch = - .5 * K.sum(1 + log_var -\n",
    "                                K.square(mu) -\n",
    "                                K.exp(log_var), axis=-1)\n",
    "\n",
    "        self.add_loss(K.mean(kl_batch), inputs=inputs)\n",
    "\n",
    "        return inputs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Parametros del modelo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#%%# Initialize model hyper parameters. The time_window = 30 for FD001 and 19 for FD004\n",
    "latent_dim = 16\n",
    "time_window = 19 \n",
    "sensors = 14\n",
    "batch_size = 128\n",
    "epochs = 50\n",
    "epsilon_std = 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Modelo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "#%%# Build Encoder\n",
    "input_layer = Input(shape = input_shape)\n",
    "encoded = Dense(units = 35, activation = 'relu', name = 'Encoder_Hidden_1')(input_layer)\n",
    "encoded = Dense(units = 25, activation = 'relu', name = 'Encoder_Hidden_2')(encoded)\n",
    "encoded = Dense(units = 15, activation = 'relu', name = 'Encoder_Hidden_3')(encoded)\n",
    "\n",
    "z_mu = Dense(latent_dim, name = 'z_mu')(encoded)\n",
    "z_log_var = Dense(latent_dim, name = 'z_log_var')(encoded)\n",
    "\n",
    "z_mu, z_log_var = KLDivergenceLayer()([z_mu, z_log_var])\n",
    "z_sigma = Lambda(lambda t: K.exp(.5*t))(z_log_var)\n",
    "\n",
    "eps = Input(tensor = K.random_normal(stddev = epsilon_std, shape=(K.shape(input_layer)[0], latent_dim)), name = 'eps')\n",
    "\n",
    "z_eps = Multiply()([z_sigma, eps])\n",
    "z = Add()([z_mu, z_eps])\n",
    "\n",
    "#%%# Build Decoder - using Sequential API\n",
    "decoder = Sequential([\n",
    "    Dense(units = 15, activation = 'relu', input_shape = (latent_dim,), name = 'Decoder_Hidden_1'),\n",
    "    Dense(units = 25, activation = 'relu', name = 'Decoder_Hidden_2'),\n",
    "    Dense(units = 420, activation = 'sigmoid', name = 'Decoder_Output')\n",
    "], name = 'Decoder')\n",
    "\n",
    "#%%# Link Encoder and Decoder layers\n",
    "x_pred = decoder(z)\n",
    "\n",
    "## Instantiate Encoder and VAE models\n",
    "encoder = Model(input_layer, z_mu)\n",
    "\n",
    "vae = Model(inputs=[input_layer, eps], outputs = x_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "input_3 (InputLayer)            (None, 420)          0                                            \n",
      "__________________________________________________________________________________________________\n",
      "Encoder_Hidden_1 (Dense)        (None, 35)           14735       input_3[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "Encoder_Hidden_2 (Dense)        (None, 25)           900         Encoder_Hidden_1[0][0]           \n",
      "__________________________________________________________________________________________________\n",
      "Encoder_Hidden_3 (Dense)        (None, 15)           390         Encoder_Hidden_2[0][0]           \n",
      "__________________________________________________________________________________________________\n",
      "z_mu (Dense)                    (None, 16)           256         Encoder_Hidden_3[0][0]           \n",
      "__________________________________________________________________________________________________\n",
      "z_log_var (Dense)               (None, 16)           256         Encoder_Hidden_3[0][0]           \n",
      "__________________________________________________________________________________________________\n",
      "kl_divergence_layer_3 (KLDiverg [(None, 16), (None,  0           z_mu[0][0]                       \n",
      "                                                                 z_log_var[0][0]                  \n",
      "==================================================================================================\n",
      "Total params: 16,537\n",
      "Trainable params: 16,537\n",
      "Non-trainable params: 0\n",
      "__________________________________________________________________________________________________\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "Decoder_Hidden_1 (Dense)     (None, 15)                255       \n",
      "_________________________________________________________________\n",
      "Decoder_Hidden_2 (Dense)     (None, 25)                400       \n",
      "_________________________________________________________________\n",
      "Decoder_Output (Dense)       (None, 420)               10920     \n",
      "=================================================================\n",
      "Total params: 11,575\n",
      "Trainable params: 11,575\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "input_3 (InputLayer)            (None, 420)          0                                            \n",
      "__________________________________________________________________________________________________\n",
      "Encoder_Hidden_1 (Dense)        (None, 35)           14735       input_3[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "Encoder_Hidden_2 (Dense)        (None, 25)           900         Encoder_Hidden_1[0][0]           \n",
      "__________________________________________________________________________________________________\n",
      "Encoder_Hidden_3 (Dense)        (None, 15)           390         Encoder_Hidden_2[0][0]           \n",
      "__________________________________________________________________________________________________\n",
      "z_mu (Dense)                    (None, 16)           256         Encoder_Hidden_3[0][0]           \n",
      "__________________________________________________________________________________________________\n",
      "z_log_var (Dense)               (None, 16)           256         Encoder_Hidden_3[0][0]           \n",
      "__________________________________________________________________________________________________\n",
      "kl_divergence_layer_3 (KLDiverg [(None, 16), (None,  0           z_mu[0][0]                       \n",
      "                                                                 z_log_var[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "lambda_3 (Lambda)               (None, 16)           0           kl_divergence_layer_3[0][1]      \n",
      "__________________________________________________________________________________________________\n",
      "eps (InputLayer)                (None, 16)           0                                            \n",
      "__________________________________________________________________________________________________\n",
      "multiply_3 (Multiply)           (None, 16)           0           lambda_3[0][0]                   \n",
      "                                                                 eps[0][0]                        \n",
      "__________________________________________________________________________________________________\n",
      "add_3 (Add)                     (None, 16)           0           kl_divergence_layer_3[0][0]      \n",
      "                                                                 multiply_3[0][0]                 \n",
      "__________________________________________________________________________________________________\n",
      "Decoder (Sequential)            (None, 420)          11575       add_3[0][0]                      \n",
      "==================================================================================================\n",
      "Total params: 28,112\n",
      "Trainable params: 28,112\n",
      "Non-trainable params: 0\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "## VAE compiling\n",
    "vae.compile(optimizer = 'adam', loss = nll)\n",
    "\n",
    "## Print models' summaries and plot models\n",
    "encoder.summary()\n",
    "decoder.summary()\n",
    "vae.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "plot_model(encoder, to_file = 'VAE_RNN_Encoder.png', show_shapes = True)\n",
    "plot_model(decoder, to_file = 'VAE_RNN_Decoder.png', show_shapes = True)\n",
    "plot_model(vae, to_file = 'VAE_RNN.png', show_shapes = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 13563 samples, validate on 1508 samples\n",
      "Epoch 1/50\n",
      "13563/13563 [==============================] - 2s 119us/step - loss: 285.2562 - val_loss: 280.2504\n",
      "Epoch 2/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 277.4438 - val_loss: 276.9414\n",
      "Epoch 3/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 276.1806 - val_loss: 276.3337\n",
      "Epoch 4/50\n",
      "13563/13563 [==============================] - 1s 47us/step - loss: 275.5990 - val_loss: 275.7562\n",
      "Epoch 5/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 274.8433 - val_loss: 274.9348\n",
      "Epoch 6/50\n",
      "13563/13563 [==============================] - 1s 50us/step - loss: 274.3172 - val_loss: 274.6124\n",
      "Epoch 7/50\n",
      "13563/13563 [==============================] - 1s 59us/step - loss: 274.0179 - val_loss: 274.4025\n",
      "Epoch 8/50\n",
      "13563/13563 [==============================] - 1s 51us/step - loss: 273.8344 - val_loss: 274.2659\n",
      "Epoch 9/50\n",
      "13563/13563 [==============================] - 1s 50us/step - loss: 273.7242 - val_loss: 274.1368\n",
      "Epoch 10/50\n",
      "13563/13563 [==============================] - 1s 50us/step - loss: 273.6090 - val_loss: 274.0044\n",
      "Epoch 11/50\n",
      "13563/13563 [==============================] - 1s 52us/step - loss: 273.5536 - val_loss: 273.9102\n",
      "Epoch 12/50\n",
      "13563/13563 [==============================] - 1s 47us/step - loss: 273.4769 - val_loss: 273.8956\n",
      "Epoch 13/50\n",
      "13563/13563 [==============================] - 1s 47us/step - loss: 273.4168 - val_loss: 273.8469\n",
      "Epoch 14/50\n",
      "13563/13563 [==============================] - 1s 47us/step - loss: 273.3835 - val_loss: 273.7817\n",
      "Epoch 15/50\n",
      "13563/13563 [==============================] - 1s 47us/step - loss: 273.3554 - val_loss: 273.7322\n",
      "Epoch 16/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 273.3676 - val_loss: 273.7379\n",
      "Epoch 17/50\n",
      "13563/13563 [==============================] - 1s 47us/step - loss: 273.3395 - val_loss: 273.8026\n",
      "Epoch 18/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 273.3396 - val_loss: 273.7197\n",
      "Epoch 19/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 273.3191 - val_loss: 273.8329\n",
      "Epoch 20/50\n",
      "13563/13563 [==============================] - 1s 51us/step - loss: 273.3177 - val_loss: 273.7841\n",
      "Epoch 21/50\n",
      "13563/13563 [==============================] - 1s 50us/step - loss: 273.3156 - val_loss: 273.7641\n",
      "Epoch 22/50\n",
      "13563/13563 [==============================] - 1s 58us/step - loss: 273.2837 - val_loss: 273.7412\n",
      "Epoch 23/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 273.2896 - val_loss: 273.6630\n",
      "Epoch 24/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 273.2902 - val_loss: 273.6906\n",
      "Epoch 25/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 273.2814 - val_loss: 273.7487\n",
      "Epoch 26/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 273.2958 - val_loss: 273.6955\n",
      "Epoch 27/50\n",
      "13563/13563 [==============================] - 1s 47us/step - loss: 273.2669 - val_loss: 273.6021\n",
      "Epoch 28/50\n",
      "13563/13563 [==============================] - 1s 47us/step - loss: 273.2801 - val_loss: 273.7006\n",
      "Epoch 29/50\n",
      "13563/13563 [==============================] - 1s 47us/step - loss: 273.2692 - val_loss: 273.6783\n",
      "Epoch 30/50\n",
      "13563/13563 [==============================] - 1s 53us/step - loss: 273.2800 - val_loss: 273.6830\n",
      "Epoch 31/50\n",
      "13563/13563 [==============================] - 1s 52us/step - loss: 273.2566 - val_loss: 273.6863\n",
      "Epoch 32/50\n",
      "13563/13563 [==============================] - 1s 52us/step - loss: 273.2357 - val_loss: 273.6322\n",
      "Epoch 33/50\n",
      "13563/13563 [==============================] - 1s 47us/step - loss: 273.2607 - val_loss: 273.6720\n",
      "Epoch 34/50\n",
      "13563/13563 [==============================] - 1s 49us/step - loss: 273.2446 - val_loss: 273.6187\n",
      "Epoch 35/50\n",
      "13563/13563 [==============================] - 1s 52us/step - loss: 273.2600 - val_loss: 273.6881\n",
      "Epoch 36/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 273.2340 - val_loss: 273.6642\n",
      "Epoch 37/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 273.2399 - val_loss: 273.5986\n",
      "Epoch 38/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 273.2449 - val_loss: 273.6472\n",
      "Epoch 39/50\n",
      "13563/13563 [==============================] - 1s 52us/step - loss: 273.2408 - val_loss: 273.6756\n",
      "Epoch 40/50\n",
      "13563/13563 [==============================] - 1s 50us/step - loss: 273.2414 - val_loss: 273.5997\n",
      "Epoch 41/50\n",
      "13563/13563 [==============================] - 1s 51us/step - loss: 273.2214 - val_loss: 273.5941\n",
      "Epoch 42/50\n",
      "13563/13563 [==============================] - 1s 47us/step - loss: 273.2344 - val_loss: 273.6279\n",
      "Epoch 43/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 273.2177 - val_loss: 273.6124\n",
      "Epoch 44/50\n",
      "13563/13563 [==============================] - 1s 47us/step - loss: 273.2007 - val_loss: 273.6340\n",
      "Epoch 45/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 273.2013 - val_loss: 273.6051\n",
      "Epoch 46/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 273.2002 - val_loss: 273.5777\n",
      "Epoch 47/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 273.2084 - val_loss: 273.5881\n",
      "Epoch 48/50\n",
      "13563/13563 [==============================] - 1s 48us/step - loss: 273.2023 - val_loss: 273.5947\n",
      "Epoch 49/50\n",
      "13563/13563 [==============================] - 1s 53us/step - loss: 273.1924 - val_loss: 273.6250\n",
      "Epoch 50/50\n",
      "13563/13563 [==============================] - 1s 49us/step - loss: 273.1849 - val_loss: 273.5925\n"
     ]
    }
   ],
   "source": [
    "\n",
    "#%%# VAE training\n",
    "vae_train = vae.fit(x_train, x_train, epochs = epochs, batch_size = batch_size, validation_split = 0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#%% Plot Plot the loss function history for the training and validation datasets\n",
    "plt.plot(vae_train.history['loss'])\n",
    "plt.plot(vae_train.history['val_loss'])\n",
    "plt.title('VAE-RNN Model Loss')\n",
    "plt.ylabel('Loss')\n",
    "plt.xlabel('Epoch')\n",
    "plt.legend(['train', 'validation'], loc='upper right')\n",
    "plt.show()\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1/1 [==============================] - 0s 142ms/step\n",
      "(15071, 16)\n",
      "(100, 16)\n"
     ]
    }
   ],
   "source": [
    "#%% Evaluate the model metrics \n",
    "eps1 = K.random_normal(stddev = epsilon_std, shape = (K.shape(x_test)[0], K.shape(x_test)[1]))\n",
    "test_loss = vae.evaluate(x_test, eps1, steps = 1)\n",
    "test_RMSE = math.sqrt(test_loss)\n",
    "#%%\n",
    "## Transform test data into latent space and compile fault classifier (diagnosis)\n",
    "z_train = encoder.predict(x_train)\n",
    "z_test = encoder.predict(x_test)\n",
    "\n",
    "print(z_train.shape)\n",
    "print(z_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 13563 samples, validate on 1508 samples\n",
      "Epoch 1/100\n",
      "13563/13563 [==============================] - 1s 65us/step - loss: 8048.6371 - val_loss: 7725.0008\n",
      "Epoch 2/100\n",
      "13563/13563 [==============================] - 0s 27us/step - loss: 5746.4139 - val_loss: 3247.5322\n",
      "Epoch 3/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 1378.5170 - val_loss: 639.1434\n",
      "Epoch 4/100\n",
      "13563/13563 [==============================] - 0s 28us/step - loss: 624.9502 - val_loss: 546.4336\n",
      "Epoch 5/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 543.5113 - val_loss: 481.7958\n",
      "Epoch 6/100\n",
      "13563/13563 [==============================] - 0s 27us/step - loss: 489.3176 - val_loss: 436.7748\n",
      "Epoch 7/100\n",
      "13563/13563 [==============================] - 0s 28us/step - loss: 458.1025 - val_loss: 413.2096\n",
      "Epoch 8/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 441.3456 - val_loss: 398.5560\n",
      "Epoch 9/100\n",
      "13563/13563 [==============================] - 0s 30us/step - loss: 432.7243 - val_loss: 391.6157\n",
      "Epoch 10/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 427.1759 - val_loss: 389.3169\n",
      "Epoch 11/100\n",
      "13563/13563 [==============================] - 0s 30us/step - loss: 423.4902 - val_loss: 380.8741\n",
      "Epoch 12/100\n",
      "13563/13563 [==============================] - 0s 27us/step - loss: 420.0028 - val_loss: 379.3430\n",
      "Epoch 13/100\n",
      "13563/13563 [==============================] - 0s 29us/step - loss: 417.0747 - val_loss: 377.2233\n",
      "Epoch 14/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 414.6958 - val_loss: 372.5558\n",
      "Epoch 15/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 412.5129 - val_loss: 369.3624\n",
      "Epoch 16/100\n",
      "13563/13563 [==============================] - 0s 28us/step - loss: 410.4254 - val_loss: 367.8214\n",
      "Epoch 17/100\n",
      "13563/13563 [==============================] - 0s 28us/step - loss: 409.1299 - val_loss: 365.4892\n",
      "Epoch 18/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 407.8399 - val_loss: 363.2726\n",
      "Epoch 19/100\n",
      "13563/13563 [==============================] - 0s 24us/step - loss: 406.7832 - val_loss: 361.8402\n",
      "Epoch 20/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 405.5539 - val_loss: 361.5370\n",
      "Epoch 21/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 404.5889 - val_loss: 360.1340\n",
      "Epoch 22/100\n",
      "13563/13563 [==============================] - 0s 24us/step - loss: 403.4668 - val_loss: 361.7630\n",
      "Epoch 23/100\n",
      "13563/13563 [==============================] - 0s 28us/step - loss: 403.0658 - val_loss: 358.3676\n",
      "Epoch 24/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 402.1898 - val_loss: 357.5242\n",
      "Epoch 25/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 401.9727 - val_loss: 356.3749\n",
      "Epoch 26/100\n",
      "13563/13563 [==============================] - 0s 24us/step - loss: 401.7207 - val_loss: 357.3449\n",
      "Epoch 27/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 401.0878 - val_loss: 356.1086\n",
      "Epoch 28/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 400.6600 - val_loss: 355.6464\n",
      "Epoch 29/100\n",
      "13563/13563 [==============================] - 0s 24us/step - loss: 399.8994 - val_loss: 354.9606\n",
      "Epoch 30/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 400.0589 - val_loss: 354.4806\n",
      "Epoch 31/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 398.9960 - val_loss: 354.5640\n",
      "Epoch 32/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 398.9630 - val_loss: 353.9134\n",
      "Epoch 33/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 398.4606 - val_loss: 353.4113\n",
      "Epoch 34/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 398.4760 - val_loss: 352.8643\n",
      "Epoch 35/100\n",
      "13563/13563 [==============================] - 0s 24us/step - loss: 397.9257 - val_loss: 354.3033\n",
      "Epoch 36/100\n",
      "13563/13563 [==============================] - 0s 24us/step - loss: 398.0178 - val_loss: 355.0584\n",
      "Epoch 37/100\n",
      "13563/13563 [==============================] - 0s 24us/step - loss: 397.2323 - val_loss: 352.4254\n",
      "Epoch 38/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 397.5981 - val_loss: 352.1206\n",
      "Epoch 39/100\n",
      "13563/13563 [==============================] - 0s 24us/step - loss: 396.8491 - val_loss: 351.9747\n",
      "Epoch 40/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 397.1060 - val_loss: 351.3102\n",
      "Epoch 41/100\n",
      "13563/13563 [==============================] - 0s 27us/step - loss: 396.5819 - val_loss: 351.6234\n",
      "Epoch 42/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 396.1690 - val_loss: 350.9447\n",
      "Epoch 43/100\n",
      "13563/13563 [==============================] - 0s 28us/step - loss: 395.8777 - val_loss: 351.8933\n",
      "Epoch 44/100\n",
      "13563/13563 [==============================] - 0s 29us/step - loss: 395.9845 - val_loss: 350.5962\n",
      "Epoch 45/100\n",
      "13563/13563 [==============================] - 0s 30us/step - loss: 395.8549 - val_loss: 351.1947\n",
      "Epoch 46/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 395.3114 - val_loss: 350.1616\n",
      "Epoch 47/100\n",
      "13563/13563 [==============================] - 0s 34us/step - loss: 395.0818 - val_loss: 349.9066\n",
      "Epoch 48/100\n",
      "13563/13563 [==============================] - 0s 31us/step - loss: 395.2712 - val_loss: 350.8688\n",
      "Epoch 49/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 394.9915 - val_loss: 351.5230\n",
      "Epoch 50/100\n",
      "13563/13563 [==============================] - 0s 34us/step - loss: 394.6912 - val_loss: 349.6351\n",
      "Epoch 51/100\n",
      "13563/13563 [==============================] - 0s 32us/step - loss: 394.6365 - val_loss: 350.0386\n",
      "Epoch 52/100\n",
      "13563/13563 [==============================] - 0s 27us/step - loss: 394.1190 - val_loss: 349.1370\n",
      "Epoch 53/100\n",
      "13563/13563 [==============================] - 0s 27us/step - loss: 394.0260 - val_loss: 356.2318\n",
      "Epoch 54/100\n",
      "13563/13563 [==============================] - 0s 27us/step - loss: 394.3929 - val_loss: 348.9807\n",
      "Epoch 55/100\n",
      "13563/13563 [==============================] - 0s 27us/step - loss: 393.9573 - val_loss: 349.0347\n",
      "Epoch 56/100\n",
      "13563/13563 [==============================] - 0s 27us/step - loss: 394.0164 - val_loss: 349.0777\n",
      "Epoch 57/100\n",
      "13563/13563 [==============================] - 0s 27us/step - loss: 393.4289 - val_loss: 348.8892\n",
      "Epoch 58/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 393.5168 - val_loss: 348.5821\n",
      "Epoch 59/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 393.4081 - val_loss: 348.3980\n",
      "Epoch 60/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 392.8929 - val_loss: 350.7290\n",
      "Epoch 61/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 393.0085 - val_loss: 348.2282\n",
      "Epoch 62/100\n",
      "13563/13563 [==============================] - 0s 30us/step - loss: 392.5253 - val_loss: 349.1397\n",
      "Epoch 63/100\n",
      "13563/13563 [==============================] - 0s 28us/step - loss: 393.2614 - val_loss: 348.7284\n",
      "Epoch 64/100\n",
      "13563/13563 [==============================] - 0s 29us/step - loss: 393.4357 - val_loss: 352.3504\n",
      "Epoch 65/100\n",
      "13563/13563 [==============================] - 0s 35us/step - loss: 392.7893 - val_loss: 349.2679\n",
      "Epoch 66/100\n",
      "13563/13563 [==============================] - 0s 27us/step - loss: 392.3705 - val_loss: 349.2148\n",
      "Epoch 67/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 392.2211 - val_loss: 348.4048\n",
      "Epoch 68/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 393.0167 - val_loss: 349.9527\n",
      "Epoch 69/100\n",
      "13563/13563 [==============================] - 0s 27us/step - loss: 392.1263 - val_loss: 347.6246\n",
      "Epoch 70/100\n",
      "13563/13563 [==============================] - 0s 28us/step - loss: 391.7959 - val_loss: 347.2047\n",
      "Epoch 71/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 391.8003 - val_loss: 347.2654\n",
      "Epoch 72/100\n",
      "13563/13563 [==============================] - 0s 27us/step - loss: 391.7221 - val_loss: 346.8459\n",
      "Epoch 73/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 391.4989 - val_loss: 348.3241\n",
      "Epoch 74/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 391.4438 - val_loss: 347.2319\n",
      "Epoch 75/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 391.6937 - val_loss: 347.1491\n",
      "Epoch 76/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 391.4299 - val_loss: 347.4608\n",
      "Epoch 77/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 391.4798 - val_loss: 347.2163\n",
      "Epoch 78/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 391.2884 - val_loss: 348.0098\n",
      "Epoch 79/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 391.0337 - val_loss: 347.5079\n",
      "Epoch 80/100\n",
      "13563/13563 [==============================] - 0s 33us/step - loss: 390.8869 - val_loss: 346.8936\n",
      "Epoch 81/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 391.4135 - val_loss: 347.6304\n",
      "Epoch 82/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 390.8705 - val_loss: 346.2930\n",
      "Epoch 83/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 390.4888 - val_loss: 346.2096\n",
      "Epoch 84/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 390.4545 - val_loss: 346.2734\n",
      "Epoch 85/100\n",
      "13563/13563 [==============================] - 0s 25us/step - loss: 390.2899 - val_loss: 346.2172\n",
      "Epoch 86/100\n",
      "13563/13563 [==============================] - 0s 31us/step - loss: 390.8291 - val_loss: 346.3463\n",
      "Epoch 87/100\n",
      "13563/13563 [==============================] - 0s 29us/step - loss: 390.3510 - val_loss: 345.9579\n",
      "Epoch 88/100\n",
      "13563/13563 [==============================] - 0s 28us/step - loss: 390.4447 - val_loss: 346.5854\n",
      "Epoch 89/100\n",
      "13563/13563 [==============================] - 0s 31us/step - loss: 390.1291 - val_loss: 347.1974\n",
      "Epoch 90/100\n",
      "13563/13563 [==============================] - 0s 27us/step - loss: 389.9328 - val_loss: 346.8692\n",
      "Epoch 91/100\n",
      "13563/13563 [==============================] - 0s 26us/step - loss: 390.0710 - val_loss: 345.2778\n",
      "Epoch 92/100\n",
      "13563/13563 [==============================] - 0s 29us/step - loss: 389.7818 - val_loss: 345.3348\n",
      "Epoch 93/100\n",
      "13563/13563 [==============================] - 0s 30us/step - loss: 389.4681 - val_loss: 346.2174\n",
      "Epoch 94/100\n",
      "13563/13563 [==============================] - 0s 30us/step - loss: 389.6133 - val_loss: 345.3454\n",
      "Epoch 95/100\n",
      "13563/13563 [==============================] - 0s 31us/step - loss: 389.3609 - val_loss: 346.0566\n",
      "Epoch 96/100\n",
      "13563/13563 [==============================] - 0s 30us/step - loss: 389.2734 - val_loss: 345.1881\n",
      "Epoch 97/100\n",
      "13563/13563 [==============================] - 0s 29us/step - loss: 389.7344 - val_loss: 346.0313\n",
      "Epoch 98/100\n",
      "13563/13563 [==============================] - 0s 36us/step - loss: 389.2057 - val_loss: 346.8571\n",
      "Epoch 99/100\n",
      "13563/13563 [==============================] - 0s 28us/step - loss: 388.9284 - val_loss: 345.0015\n",
      "Epoch 100/100\n",
      "13563/13563 [==============================] - 0s 28us/step - loss: 389.0138 - val_loss: 346.4833\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense_1 (Dense)              (None, 64)                1088      \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 16)                1040      \n",
      "_________________________________________________________________\n",
      "dense_3 (Dense)              (None, 1)                 17        \n",
      "=================================================================\n",
      "Total params: 2,145\n",
      "Trainable params: 2,145\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "prog = Sequential()\n",
    "prog.add(Dense(64, activation = 'relu', input_dim = latent_dim))\n",
    "prog.add(Dense(16, activation = 'relu'))\n",
    "prog.add(Dense(1))\n",
    "\n",
    "prog.compile(optimizer = 'adam', loss = 'mean_squared_error')\n",
    "\n",
    "\n",
    "\n",
    "#%%# Fit and train fault classifier model\n",
    "prog_history = prog.fit(z_train, y_train, batch_size = 128, epochs = 100, validation_split = 0.1)\n",
    "\n",
    "prog.summary()\n",
    "plot_model(prog, to_file = 'MLP_Prognostics.png', show_shapes = True)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\r",
      "100/100 [==============================] - 0s 30us/step\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "#%% Plot Plot the loss function history for the training and validation datasets\n",
    "plt.plot(prog_history.history['loss'])\n",
    "plt.plot(prog_history.history['val_loss'])\n",
    "plt.title('RUL Prognosis Model Loss')\n",
    "plt.ylabel('Loss')\n",
    "plt.xlabel('Epoch')\n",
    "plt.legend(['train', 'validation'], loc='upper right')\n",
    "plt.show()\n",
    "\n",
    "#%% Evaluate the model metrics \n",
    "test_loss_prog = prog.evaluate(z_test, y_test, batch_size = batch_size)\n",
    "test_loss_prog_RMSE = math.sqrt(test_loss_prog)\n",
    "\n",
    "#%%### Plot the real and predicted RUL to evaluate the model performance\n",
    "RUL_pred = prog.predict(z_test)\n",
    "    \n",
    "prediction_results = np.asarray(np.column_stack((y_test, RUL_pred)))\n",
    "prediction_results = sorted(prediction_results, key= lambda x: x[0])\n",
    "prediction_results = np.asarray(prediction_results)\n",
    "\n",
    "plt.figure()\n",
    "plt.plot(np.asarray(np.asarray(prediction_results[:,0])),linestyle='-',linewidth=0.5,marker='o', markersize=3, label = 'True')\n",
    "plt.plot(np.asarray(np.asarray(prediction_results[:,1])),linestyle='-',linewidth=0.5,marker='^', markersize=3, label = 'Prediction')\n",
    "plt.xlabel('Test samples')\n",
    "plt.ylabel('RUL')\n",
    "plt.legend()\n",
    "plt.title('C-MAPSS (sorted)')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
