{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### Dataset Loading and testing" ] }, { "cell_type": "code", "execution_count": 483, "metadata": { "ExecuteTime": { "end_time": "2018-09-02T16:42:58.148203Z", "start_time": "2018-09-02T16:42:57.927207Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dataset has been loaded\n", "x-train (60000, 8)\n", "x-test (40000, 8)\n", "y-train (60000, 256)\n", "y-test (40000, 256)\n" ] } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import h5py\n", "from sklearn.model_selection import train_test_split\n", "\n", "#now load this dataset \n", "h5f = h5py.File('./datasets/s8_sio2tio2_v2.h5','r')\n", "X = h5f['sizes'][:]\n", "Y = h5f['spectrum'][:]\n", "\n", "#get the ranges of the loaded data\n", "num_layers = X.shape[1]\n", "num_lpoints = Y.shape[1]\n", "size_max = np.amax(X)\n", "size_min = np.amin(X)\n", "size_av = 0.5*(size_max + size_min)\n", "\n", "#this information is not given in the dataset\n", "lam_min = 300\n", "lam_max = 1200\n", "lams = np.linspace(lam_min, lam_max, num_lpoints)\n", "\n", "#create a train - test split of the dataset\n", "x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.4, random_state=42)\n", "\n", "# normalize inputs \n", "x_train = (x_train - 50)/20 \n", "x_test = (x_test - 50)/20 \n", "\n", "print(\"Dataset has been loaded\")\n", "print(\"x-train\", x_train.shape)\n", "print(\"x-test \", x_test.shape)\n", "print(\"y-train\", y_train.shape)\n", "print(\"y-test \", y_test.shape)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Model Development" ] }, { "cell_type": "code", "execution_count": 746, "metadata": { "ExecuteTime": { "end_time": "2018-09-04T10:26:04.064211Z", "start_time": "2018-09-04T10:26:04.030548Z" }, "code_folding": [] }, "outputs": [], "source": [ "from keras import backend as K\n", "from keras.models import Sequential, Model\n", "from keras.layers import Dense, Dropout, Reshape, UpSampling1D, Conv1D, Flatten, Activation\n", "from keras.utils import np_utils, multi_gpu_model\n", "from keras.regularizers import l2\n", "from keras.wrappers.scikit_learn import KerasRegressor\n", "from keras.optimizers import Adam\n", "from keras.layers.normalization import BatchNormalization\n", "from keras.layers import PReLU\n", "\n", "\n", "from sklearn.model_selection import cross_val_score, KFold\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.pipeline import Pipeline\n", "\n", "num_gpus = 2\n", "gpu_list = [\"gpu(%d)\" % i for i in range(num_gpus)]\n", "\n", "\n", "\n", "#define various models here\n", "#naive percentage loss\n", "def size_percent_loss(y_true, y_pred):\n", " y_true_a = 0.5*y_true*(size_max - size_min) + size_av\n", " y_pred_a = 0.5*y_pred*(size_max - size_min) + size_av\n", " y_err = np.abs(y_true_a - y_pred_a)/y_true_a\n", " y_err_f = K.flatten(y_err)\n", " return K.sum(y_err_f)\n", "\n", "#naive percentage loss\n", "def naive_percent_loss(y_true, y_pred):\n", " y_err = np.abs(y_true - y_pred)/y_true\n", " y_err_f = K.flatten(y_err)\n", " return K.sum(y_err_f)\n", "\n", "\n", "#function to test performance on testset \n", "def calc_mre(y_true, y_pred):\n", " y_err = 100*np.abs(y_true - y_pred)/y_true\n", " return np.mean(y_err)\n", "\n", "#function to test performance on testset \n", "def calc_mre_K(y_true, y_pred):\n", " y_err = 100*np.abs(y_true - y_pred)/y_true\n", " return K.mean(y_err)\n", "\n", "\n", "\n", "def naiveploss_mgpu_model():\n", " # create model\n", " model = Sequential()\n", " model = multi_gpu_model(model, gpus=num_gpus)\n", " model.add(Dense(250, input_dim=x_train.shape[1], kernel_initializer='normal', activation='relu', \n", " name='first' ))\n", " model.add(Dense(250, input_dim=x_train.shape[1], kernel_initializer='normal', activation='relu', \n", " name='second' ))\n", " model.add(Dense(250, input_dim=x_train.shape[1], kernel_initializer='normal', activation='relu', \n", " name='third' ))\n", " model.add(Dense(250, input_dim=x_train.shape[1], kernel_initializer='normal', activation='relu', \n", " name='fourth' ))\n", " model.add(Dense(250, kernel_initializer='normal', name='last'))\n", " # Compile model\n", " model.compile(loss=naive_percent_loss, optimizer='adam', context = gpu_list)\n", " return model\n", "\n", "def naiveploss_model():\n", " # create model\n", " model = Sequential()\n", " model.add(Dense(256, input_dim=x_train.shape[1], kernel_initializer='normal', activation='relu', \n", " name='first' ))\n", " model.add(Dense(256, input_dim=x_train.shape[1], kernel_initializer='normal', activation='relu', \n", " name='second' ))\n", " model.add(Dense(256, input_dim=x_train.shape[1], kernel_initializer='normal', activation='relu', \n", " name='third' ))\n", " model.add(Dense(256, input_dim=x_train.shape[1], kernel_initializer='normal', activation='relu', \n", " name='fourth' ))\n", " model.add(Dense(256, kernel_initializer='normal', name='last'))\n", " # Compile model\n", " model.compile(loss=naive_percent_loss, optimizer='adam', metrics=['accuracy'])\n", " return model\n", "\n", "import timeit\n", "#here we must have a function that calls the training routine n times and then gives avg and stddev \n", "# of the resulting figures\n", "def net_performance(modelfunc, num_trials=3, batch_size=32, num_epochs=200, num_gpus=2):\n", " models = []\n", " train_err = np.ones(num_trials)\n", " test_err = np.ones(num_trials)\n", " val_err = np.ones(num_trials)\n", " train_time = np.ones(num_trials)\n", " for tnum in np.arange(num_trials):\n", " print(\"iteration: \" + str(tnum + 1))\n", " model_curr = modelfunc()\n", " x_t, x_v, y_t, y_v = train_test_split(x_train, y_train, test_size=0.2, random_state=42)\n", " start_time = timeit.default_timer()\n", " history = model_curr.fit(x_t, y_t,\n", " batch_size=batch_size*num_gpus,\n", " epochs=num_epochs, \n", " verbose=1,\n", " validation_data=(x_v, y_v))\n", " train_time[tnum] = timeit.default_timer() - start_time\n", " models.append(model_curr)\n", " train_err[tnum] = (100.0/num_lpoints)*history.history['loss'][-1]/(batch_size*num_gpus)\n", " val_err[tnum] = (100.0/num_lpoints)*history.history['val_loss'][-1]/(batch_size*num_gpus)\n", " test_err[tnum] = calc_mre(y_test, models[tnum].predict(x_test))\n", " return train_err, val_err, test_err, train_time\n", "\n", "#staging area for new models \n", "def plot_training_history(history, factor):\n", " loss, val_loss = history.history['loss'], history.history['val_loss']\n", " loss = np.asarray(loss)/(factor)\n", " val_loss = np.asarray(val_loss)/(factor)\n", " epochs = len(loss)\n", " \n", " fig, axs = plt.subplots(1,1, figsize=(5,5))\n", " axs.semilogy(np.arange(1, epochs + 1), loss, label='train error')\n", " axs.semilogy(np.arange(1, epochs + 1), val_loss, label='validation error')\n", " axs.set_xlabel('Epoch number')\n", " axs.set_ylabel('Mean Relative Error (MRE) (%)')\n", " axs.legend(loc=\"best\")\n", "\n", "from keras.utils import to_channels_first\n", "\n", "def conv1d_lkyrelu():\n", " \n", " #gpu_list = [\"gpu(%d)\" % i for i in range(num_gpus)]\n", " \n", " # create model\n", " model = Sequential()\n", " \n", " model.add(Dense(256, input_dim=8, kernel_initializer='normal', \n", " name='first'))\n", " #model.add(BatchNormalization())\n", " #model.add(Activation('relu')) \n", " model.add(PReLU(alpha_initializer='zeros', alpha_regularizer=None))\n", " \n", " model.add(Reshape((4, 64)))\n", " model.add(UpSampling1D(size=2))\n", " \n", " \n", " model.add(Conv1D(filters=64, kernel_size=3, strides=1, padding='same', \n", " dilation_rate=1, \n", " kernel_initializer='normal'))\n", " model.add(PReLU(alpha_initializer='zeros', alpha_regularizer=None))\n", " \n", "# model.add(Conv1D(filters=32, kernel_size=3, strides=1, padding='same', \n", "# dilation_rate=1, kernel_initializer='normal'))\n", "# model.add(PReLU(alpha_initializer='zeros', alpha_regularizer=None))\n", " \n", " model.add(Conv1D(filters=32, kernel_size=3, strides=1, padding='same', \n", " dilation_rate=1, \n", " kernel_initializer='normal'))\n", " model.add(PReLU(alpha_initializer='zeros', alpha_regularizer=None))\n", "\n", "\n", "# model.add(Conv1D(filters=32, kernel_size=3, strides=1, padding='same', \n", "# dilation_rate=1, kernel_initializer='normal'))\n", "# model.add(PReLU(alpha_initializer='ones', alpha_regularizer=None)) \n", " \n", "# model.add(Conv1D(filters=32, kernel_size=3, strides=1, padding='same', \n", "# dilation_rate=1, kernel_initializer='normal'))\n", "# model.add(PReLU(alpha_initializer='ones', alpha_regularizer=None)) \n", " \n", " model.add(Flatten())\n", " # Compile model\n", " model.compile(loss=naive_percent_loss, optimizer='adam', metrics=[calc_mre_K])\n", " return model\n", " \n", " \n", "def conv1d_model_bnorm():\n", " \n", " #gpu_list = [\"gpu(%d)\" % i for i in range(num_gpus)]\n", " \n", " # create model\n", " model = Sequential()\n", " \n", " model.add(Dense(256, input_dim=8, kernel_initializer='normal', \n", " name='first' ))\n", " #model.add(BatchNormalization())\n", " model.add(Activation('relu'))\n", " #model.add(Dropout(0.2))\n", " \n", " model.add(Reshape((4, 64)))\n", " model.add(UpSampling1D(size=2))\n", " \n", " model.add(Conv1D(filters=64, kernel_size=3, strides=1, padding='same', \n", " dilation_rate=1, kernel_initializer='normal'))\n", " #model.add(BatchNormalization())\n", " model.add(Activation('relu'))\n", " #model.add(Dropout(0.2))\n", " #model.add(UpSampling1D(size=5))\n", "\n", " model.add(Conv1D(filters=32, kernel_size=3, strides=1, padding='same', \n", " dilation_rate=1, kernel_initializer='normal'))\n", " model.add(Activation('relu'))\n", " #model.add(Dropout(0.3))\n", " \n", "# model.add(Conv1D(filters=64, kernel_size=3, strides=1, padding='same', \n", "# dilation_rate=1, kernel_initializer='normal'))\n", "# model.add(Activation('relu')) \n", "# model.add(Dropout(0.3))\n", "\n", "# model.add(Conv1D(filters=32, kernel_size=3, strides=1, padding='same', \n", "# dilation_rate=1, kernel_initializer='normal'))\n", "# model.add(Activation('relu')) \n", " \n", "# model.add(Conv1D(filters=32, kernel_size=3, strides=1, padding='same', \n", "# dilation_rate=1, kernel_initializer='normal'))\n", "# model.add(Activation('relu')) \n", " \n", "# model.add(Conv1D(filters=32, kernel_size=3, strides=1, padding='same', \n", "# dilation_rate=1, kernel_initializer='normal'))\n", "# model.add(Activation('relu')) \n", " \n", "# model.add(Conv1D(filters=32, kernel_size=3, strides=1, padding='same', \n", "# dilation_rate=1, kernel_initializer='normal'))\n", "# model.add(Activation('relu')) \n", " \n", " model.add(Conv1D(filters=32, kernel_size=3, strides=1, padding='same', \n", " dilation_rate=1, kernel_initializer='normal'))\n", " model.add(Activation('relu')) \n", " \n", " \n", " \n", " model.add(Flatten())\n", " # Compile model\n", "# if num_gpus == 1:\n", " model.compile(loss=naive_percent_loss, optimizer='adam', metrics=[calc_mre_K])\n", "# else:\n", "# model.compile(loss=naive_percent_loss, optimizer='adam', metrics=['accuracy'], context = gpu_list)\n", " \n", " \n", " return model " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Model testing" ] }, { "cell_type": "code", "execution_count": 748, "metadata": { "ExecuteTime": { "end_time": "2018-09-04T10:38:51.530477Z", "start_time": "2018-09-04T10:38:23.390061Z" }, "code_folding": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "first (Dense) (None, 256) 2304 \n", "_________________________________________________________________\n", "p_re_lu_67 (PReLU) (None, 256) 256 \n", "_________________________________________________________________\n", "reshape_120 (Reshape) (None, 4, 64) 0 \n", "_________________________________________________________________\n", "up_sampling1d_152 (UpSamplin (None, 8, 64) 0 \n", "_________________________________________________________________\n", "conv1d_332 (Conv1D) (None, 8, 64) 12352 \n", "_________________________________________________________________\n", "p_re_lu_68 (PReLU) (None, 8, 64) 512 \n", "_________________________________________________________________\n", "conv1d_333 (Conv1D) (None, 8, 32) 6176 \n", "_________________________________________________________________\n", "p_re_lu_69 (PReLU) (None, 8, 32) 256 \n", "_________________________________________________________________\n", "flatten_116 (Flatten) (None, 256) 0 \n", "=================================================================\n", "Total params: 21,856\n", "Trainable params: 21,856\n", "Non-trainable params: 0\n", "_________________________________________________________________\n", "Train on 48000 samples, validate on 12000 samples\n", "Epoch 1/500\n", "48000/48000 [==============================] - 2s 49us/step - loss: 1979.6062 - calc_mre_K: 12.0826 - val_loss: 819.8865 - val_calc_mre_K: 5.0107\n", "Epoch 2/500\n", "48000/48000 [==============================] - 2s 50us/step - loss: 611.7904 - calc_mre_K: 3.7341 - val_loss: 472.0185 - val_calc_mre_K: 2.8846\n", "Epoch 3/500\n", "48000/48000 [==============================] - 2s 50us/step - loss: 436.2288 - calc_mre_K: 2.6625 - val_loss: 398.1224 - val_calc_mre_K: 2.4330\n", "Epoch 4/500\n", "48000/48000 [==============================] - 2s 51us/step - loss: 378.2709 - calc_mre_K: 2.3088 - val_loss: 352.2149 - val_calc_mre_K: 2.1525\n", "Epoch 5/500\n", "48000/48000 [==============================] - 2s 51us/step - loss: 349.7337 - calc_mre_K: 2.1346 - val_loss: 337.6177 - val_calc_mre_K: 2.0633\n", "Epoch 6/500\n", "48000/48000 [==============================] - 2s 49us/step - loss: 329.9034 - calc_mre_K: 2.0136 - val_loss: 325.8134 - val_calc_mre_K: 1.9912\n", "Epoch 7/500\n", "48000/48000 [==============================] - 2s 51us/step - loss: 313.1064 - calc_mre_K: 1.9110 - val_loss: 302.2152 - val_calc_mre_K: 1.8470\n", "Epoch 8/500\n", "48000/48000 [==============================] - 2s 50us/step - loss: 299.0120 - calc_mre_K: 1.8250 - val_loss: 300.6700 - val_calc_mre_K: 1.8375\n", "Epoch 9/500\n", "48000/48000 [==============================] - 2s 50us/step - loss: 286.7933 - calc_mre_K: 1.7504 - val_loss: 275.8293 - val_calc_mre_K: 1.6857\n", "Epoch 10/500\n", "48000/48000 [==============================] - 2s 51us/step - loss: 277.5582 - calc_mre_K: 1.6941 - val_loss: 271.5552 - val_calc_mre_K: 1.6596\n", "Epoch 11/500\n", "48000/48000 [==============================] - 2s 50us/step - loss: 272.6734 - calc_mre_K: 1.6643 - val_loss: 264.7725 - val_calc_mre_K: 1.6181\n", "Epoch 12/500\n", "27200/48000 [================>.............] - ETA: 0s - loss: 260.8438 - calc_mre_K: 1.5921" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0mepochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m500\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[0mverbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 27\u001b[0;31m validation_data=(x_v, y_v))\n\u001b[0m\u001b[1;32m 28\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 29\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/deep/lib/python3.6/site-packages/keras/models.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)\u001b[0m\n\u001b[1;32m 1094\u001b[0m \u001b[0minitial_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minitial_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1095\u001b[0m \u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1096\u001b[0;31m validation_steps=validation_steps)\n\u001b[0m\u001b[1;32m 1097\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1098\u001b[0m def evaluate(self, x=None, y=None,\n", "\u001b[0;32m~/anaconda3/envs/deep/lib/python3.6/site-packages/keras/engine/training.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)\u001b[0m\n\u001b[1;32m 1703\u001b[0m \u001b[0minitial_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minitial_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1704\u001b[0m \u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1705\u001b[0;31m validation_steps=validation_steps)\n\u001b[0m\u001b[1;32m 1706\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1707\u001b[0m def evaluate(self, x=None, y=None,\n", "\u001b[0;32m~/anaconda3/envs/deep/lib/python3.6/site-packages/keras/engine/training.py\u001b[0m in \u001b[0;36m_fit_loop\u001b[0;34m(self, f, ins, out_labels, batch_size, epochs, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics, initial_epoch, steps_per_epoch, validation_steps)\u001b[0m\n\u001b[1;32m 1234\u001b[0m \u001b[0mins_batch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mins_batch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtoarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1235\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1236\u001b[0;31m \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mins_batch\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1237\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1238\u001b[0m \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/deep/lib/python3.6/site-packages/keras/backend/mxnet_backend.py\u001b[0m in \u001b[0;36mtrain_function\u001b[0;34m(inputs)\u001b[0m\n\u001b[1;32m 4566\u001b[0m provide_data=data_shapes, provide_label=label_shapes)\n\u001b[1;32m 4567\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_module\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward_backward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4568\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_module\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4569\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_update\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_train_updates\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4570\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_weights_dirty\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/deep/lib/python3.6/site-packages/mxnet/module/bucketing_module.py\u001b[0m in \u001b[0;36mupdate\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 474\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbinded\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mparams_initialized\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptimizer_initialized\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 475\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_params_dirty\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 476\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_curr_module\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 477\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 478\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_outputs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmerge_multi_context\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/deep/lib/python3.6/site-packages/mxnet/module/module.py\u001b[0m in \u001b[0;36mupdate\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 656\u001b[0m \u001b[0mnum_device\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_context\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 657\u001b[0m \u001b[0mkvstore\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_kvstore\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 658\u001b[0;31m param_names=self._exec_group.param_names)\n\u001b[0m\u001b[1;32m 659\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 660\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_outputs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmerge_multi_context\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/deep/lib/python3.6/site-packages/mxnet/model.py\u001b[0m in \u001b[0;36m_update_params\u001b[0;34m(param_arrays, grad_arrays, updater, num_device, kvstore, param_names)\u001b[0m\n\u001b[1;32m 155\u001b[0m \u001b[0;31m# use a better solution later\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 156\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 157\u001b[0;31m \u001b[0mupdater\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mnum_device\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 158\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 159\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/deep/lib/python3.6/site-packages/mxnet/optimizer.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, index, grad, weight)\u001b[0m\n\u001b[1;32m 1469\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msync_state_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstates\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweight\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1470\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstates_synced\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1471\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptimizer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate_multi_precision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgrad\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstates\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1472\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1473\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0msync_state_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/deep/lib/python3.6/site-packages/mxnet/optimizer.py\u001b[0m in \u001b[0;36mupdate_multi_precision\u001b[0;34m(self, index, weight, grad, state)\u001b[0m\n\u001b[1;32m 271\u001b[0m \u001b[0mcast\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mweight_master_copy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mweight\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mweight\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 272\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 273\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgrad\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 274\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 275\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mset_learning_rate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/deep/lib/python3.6/site-packages/mxnet/optimizer.py\u001b[0m in \u001b[0;36mupdate\u001b[0;34m(self, index, weight, grad, state)\u001b[0m\n\u001b[1;32m 1044\u001b[0m \u001b[0;32massert\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgrad\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mNDArray\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1045\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_update_count\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1046\u001b[0;31m \u001b[0mlr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_lr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1047\u001b[0m \u001b[0mwd\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_wd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1048\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/deep/lib/python3.6/site-packages/keras/backend/mxnet_backend.py\u001b[0m in \u001b[0;36m_get_lr\u001b[0;34m(self, _)\u001b[0m\n\u001b[1;32m 4724\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4725\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_lr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4726\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtensor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masscalar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1.\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecay\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtensor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masscalar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnum_update\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4727\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4728\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_config\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/deep/lib/python3.6/site-packages/mxnet/ndarray/ndarray.py\u001b[0m in \u001b[0;36masscalar\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1892\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1893\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"The current array is not a scalar\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1894\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masnumpy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1895\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1896\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/deep/lib/python3.6/site-packages/mxnet/ndarray/ndarray.py\u001b[0m in \u001b[0;36masnumpy\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1870\u001b[0m [1, 1, 1]], dtype=int32)\n\u001b[1;32m 1871\u001b[0m \"\"\"\n\u001b[0;32m-> 1872\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mempty\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1873\u001b[0m check_call(_LIB.MXNDArraySyncCopyToCPU(\n\u001b[1;32m 1874\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/envs/deep/lib/python3.6/site-packages/mxnet/ndarray/ndarray.py\u001b[0m in \u001b[0;36mshape\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1733\u001b[0m \u001b[0mpdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mctypes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPOINTER\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmx_uint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1734\u001b[0m check_call(_LIB.MXNDArrayGetShape(\n\u001b[0;32m-> 1735\u001b[0;31m self.handle, ctypes.byref(ndim), ctypes.byref(pdata)))\n\u001b[0m\u001b[1;32m 1736\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mndim\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# pylint: disable=invalid-slice-index\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1737\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "import warnings\n", "warnings.filterwarnings('ignore')\n", "\n", "\n", "\n", "model = conv1d_lkyrelu()\n", "#model = conv1d_model_bnorm()\n", "#model = conv1d_model(1)\n", "\n", "#model = naiveploss_model()\n", "model.summary()\n", "\n", " \n", "# from IPython.display import SVG\n", "# from keras.utils.vis_utils import model_to_dot\n", "\n", "# #SVG(model_to_dot(model).create(prog='dot', format='svg'))\n", " \n", " \n", "x_t, x_v, y_t, y_v = train_test_split(x_train, y_train, test_size=0.2, random_state=42)\n", "# model = naiveploss_mgpu_model()\n", "# model.summary() \n", "history = model.fit(x_t, y_t,\n", " batch_size=64,\n", " epochs=500, \n", " verbose=1,\n", " validation_data=(x_v, y_v))\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "y_pred = model.predict(x_test)\n", "print(calc_mre(y_test, y_pred))\n", "\n" ] }, { "cell_type": "code", "execution_count": 740, "metadata": { "ExecuteTime": { "end_time": "2018-09-03T18:24:58.171791Z", "start_time": "2018-09-03T18:24:55.343054Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.6742554311426924\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "y_pred = model.predict(x_test)\n", "print(calc_mre(y_test, y_pred))\n", "#history60 = history\n", "plot_training_history(history, 64*2.56)" ] }, { "cell_type": "code", "execution_count": 739, "metadata": { "ExecuteTime": { "end_time": "2018-09-03T18:21:33.009653Z", "start_time": "2018-09-03T18:21:32.795882Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[41 66 32 45 42 44 32 69]\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 739, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABXoAAAFNCAYAAAC+BtcHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3Xd4lFX6xvHvmZlMegIJIQESWuhViqFJU1FUfnZUUEF3wcK6q66ua2HXtaxl7eyCBcTe1l5YUekdBQSEEELvJUAK6ZmZ8/sjIYTekkxC7s91cTnvec+c956ok/DkzPMaay0iIiIiIiIiIiIiUn05/B1ARERERERERERERM6MCr0iIiIiIiIiIiIi1ZwKvSIiIiIiIiIiIiLVnAq9IiIiIiIiIiIiItWcCr0iIiIiIiIiIiIi1ZwKvSIiIiIiIiIiIiLVnAq9IiIiIifBGPOwMWZCyePGxhhrjHGVHH9vjBnu34SVwxiz0RhzYQWsO8MYM+IY5w75eouIiIiIyJH0w7KIiIjISbDWPnWcc5dUZpbTZYzpB7xvrY33dxYRERERESlf2tErIiIiIiIiIiIiUs2p0CsiIiJShjHmr8aYbcaY/caY1caYC0rG/2GMef8Yzzmk7YAxZqQxZlXJGsnGmM4l4w8aY9aVGb/qODmcJe0iDsxfbIxJKDnX0xjzizEms+SfPcs879Yy115vjLm9ZDwU+B6ob4zJLvlT3xjjKJNrrzHmv8aYqDLr3WyM2VRy7pETfO2ijTHfGmOySnI9aYyZU+b8MXMf5bU/b4zZY4xZD1x2vOuKiIiIiIgKvSIiIiKljDEtgbuAc6214cDFwMZTXGMw8A9gGBABXA7sLTm9DugNRAKPAe8bY+odY6k/A0OAS0vW+R2QW1KEnQSMAaKBF4FJxpjokuftBgaVPOdW4CVjTGdrbQ5wCbDdWhtW8mc78CfgSqAvUB9IB8aWvJY2wKvAzSXnooHjtX0YC+QAccDwkj8Hvi4nyl3WyJLX0AnoClx7nGuKiIiIiAgq9IqIiIiU5QUCgTbGmABr7UZr7bpTXGME8C9r7S+22Fpr7SYAa+2n1trt1lqftfYTYA2QdJx1RltrV5ess8xau5fi3a1rrLXvWWs91tqPgBTg/0quMclau67kOTOBHykuLh/L7cAj1tqt1toCiovU15bc+Oxa4Dtr7aySc38DfEdbxBjjBK4BHrXW5lprk4F3ykw5bu7DXAe8bK3dYq3dBzx9nPwiIiIiIoIKvSIiIiKlrLVrgXsoLnbuNsZ8bIypf4rLJFC8c/cIxphhxpilxpgMY0wG0A6oc4rr1Ac2HTa2CWhQco1LjDELjDH7Sq5x6XGuAdAI+LJMplUUF7xjS6615cDEkl3Be4+6CsRQfKPfLWXGyj4+bu7DHHLdozxPREREREQOo0KviIiISBnW2g+ttedRXAC1wLOnuMQWIPHwQWNMI2A8xa0hoq21tYAVgDmVdYDtJdnKaghsM8YEAp8DzwOxJdf4X5lr2GNc5xJrba0yf4KstduAHRQXnA+8hhCK2y4cTRrg4dDWDgllHh8z91HWOuS6JfNEREREROQ4VOgVERERKWGMaWmMOb+kYJoP5FG8u/VUTADuN8Z0McWalRR5QykutKaVXOtWinf0Hm+dJ4wxzUvW6VDSz/Z/QAtjzFBjjMsYcz3QBvgOcFPceiIN8BhjLgEuKrPmLiDaGBNZZuw14J8lGTHGxBhjrig59xkwyBhznjHGDTzOMX5+tNZ6gS+AfxhjQowxrSjuU3zA8XIf7r/An4wx8caY2sCDx/k6iYiIiIgIKvSKiIiIlBUIPAPsAXYCdYGHT2UBa+2nwD+BD4H9wFdAVEnP2heA+RQXXNsDc4+z1IsUFzx/BLKAN4Hgkj69g4D7KG6j8AAwyFq7x1q7n+Kbq/2X4puqDQW+KZMtBfgIWF/SqqE+8ErJnB+NMfuBBUC3kvkrgT+UvJYdJWtuPU7muyi+0dxO4L2SaxWUrHXM3EdZZzzwA7AMWEJxAVlERERERI7DWHu0T/CJiIiIiJwZY8yzQJy1dri/s4iIiIiInO20o1dEREREyoUxplVJiwljjEkCfg986e9cIiIiIiI1gcvfAURERETkrBFOcbuG+sBuiltVfO3XRCIiIiIiNYRaN4iIiIiIiIiIiIhUc2rdICIiIiIiIiIiIlLNqdArIiIiIiIiIiIiUs1VSI/eOnXq2MaNG1fE0iIiIiIiIiIiItXK4sWL91hrY/ydo7ItXry4rsvlmgC0QxtOz5QPWOHxeEZ06dJl99EmVEiht3HjxixatKgilhYREREREREREalWjDGb/J3BH1wu14S4uLjWMTEx6Q6HQzcKOwM+n8+kpaW12blz5wTg8qPNUSVdREREREREREREKkK7mJiYLBV5z5zD4bAxMTGZFO+OPvqcSswjIiIiIiIiIiIiNYdDRd7yU/K1PGY9V4VeERERERERERERqRGuv/76RosXLw4qj7UaNGjQfseOHcdtjfvggw/Gneq6Y8aMiR42bFjDU32eCr0iIiIiIiIiIiJSI3zyySebunTpkl9Z1xszZky9yrqWCr0iIiIiIiIiIiJy1snKynL069evWcuWLds0b9687fjx42snJSW1nDVrVghASEhIpzvvvLNB27ZtW/fs2bPF9OnTQ5KSklrGx8e3/+CDDyLhyN21/fv3b/bdd9+FH36tCy+8MLFt27atmzVr1vb555+vAzBq1KgGBQUFjlatWrW5/PLLmwCMGzcuqn379q1btWrVZujQoY08Hg8Ar7zySnTjxo3bnXvuuS3nzZsXdjqvV4VeEREREREREREROet88cUXEXFxcUWrV69OXrNmzcqrr746q+z5vLw8R//+/fevXLlyVWhoqHf06NENZs+enfrpp5+ufeKJJxqcyrU++OCDjStXrly1dOnS5Ndffz12586dznHjxm0LDAz0paSkJH/zzTcblixZEvTZZ59FLVq0KCUlJSXZ4XDY1157LXrTpk0BzzzzTP158+alzJ49OzU1NTX4dF7vcXtIiIiIiIiIiIiIiJypxg9O6lJRa2985rLFRxvv3Llz3iOPPJJw5513NrjiiisyBw4cmF32fEBAgL322muzANq2bZsXGBjoCwwMtElJSXnbtm1zn0qGZ599NnbSpEm1AHbu3BmwcuXKoLi4uJyycyZPnhy+YsWKkI4dO7YGyM/Pd9StW9cza9as0O7du++vX7++B+Dqq6/el5qaesp9hE+q0GuMqQVMANoBFvidtXb+qV5MREREREREREREpDJ06NChYMmSJcmff/555COPPNJgypQph+zodblc1uEobnjgcDgIDAy0AE6nE6/Xaw7M8fl8pc8pKCg4okPCd999Fz5z5szwRYsWpYSHh/uSkpJa5uXlHTHPWmsGDx68d+zYsdvKjr/33nu1jDFn/HpPtnXDK8Bka20roCOw6oyvLCIi4i8+H2TvBmv9nUREREREREQqyMaNGwPCw8N9o0aN2nfPPffsWrp0aciprpGYmFi4cuXKEK/Xy9q1awOWL18eevicjIwMZ2RkpDc8PNz3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+OnxOwjEx6lKTFCbCtPgpqi1aNm6xqgrGm62zE2ER9J1pNJudVZQ5BKlQK+IiIiIiIiIiCzIzGioraGhdieby5Z4qGjIOUd4aprxsbNExgaZmRgiPjlMcnqUX6+/gvGZBGMzccan4zRFzjIQbWGYBppq/BdidUQ2LHNu9a+W7N692z355JOrXq+IiIiIiIiIiGw8sWSKmViKpprAejdlTZjZU8653evdDtnYlNErIiIiIiIiIiLrKujzEvR517sZIhXNs94NEBEREREREREREZHzo0CviIiIiIiIiIiISIVToFdERERERERERESkwinQKyIiIiIiIiIiIlLhFOgVERERERERERERqXAK9IqIiIiIiIiIiIhUOAV6RURERERERERERCqcAr0iIiIiIiIiIiIiFU6BXhEREREREREREZEKp0CviIiIiIiIiIiISIVToFdERERERERERESkwinQKyIiIiIiIiIiIlLhFOgVERERERERERERqXAK9IqIiIiIiIiIiIhUOAV6RURERERERERERCqcAr0iIiIiIiIiIiIiFU6BXpELJO3SvP9H7+ehow+td1NERERERERERGSD8a13A0QuFd84/g0eOfYIjxx7hOn4NG+96q3r3SQREREREREREdkglNErcgEkUgk+ue+TXNF8BXduvZOPPvVRHjjwwLxy8VScnw3+jGQ6uQ6tFBERERERERGRSqWMXpEL4GtHv8aZyBnuf8X93Nx1Mz6Pj0/s+wSJdILfu/b3OD11moePPswjxx5hPDbOXdvu4kO/8CG8Hu96N11ERERERERERCqAAr1SMQ6NHuLvD/09d2y5g9s3377ezVm26cQ0nznwGW7svJE93XswM/7iZX+Bz3x8ev+neezUYxwdP4rXvNy+6XY6azr58uEv4/P4uG/PfQr2ioiIiIiIiIjIkhTolYtef6SfT+z7BI++8Cge8/AvL/wLr9vxOt5z03uoD9Svd/OW9KVDX2Jsdoy/vuGvMTMAvB4v973sPmr8NfzwzA9593Xv5g0730B7dTsADcEGPvX0p/Calw/u+SAe011WRERERERERERkYcsK9JrZK4GPA17gs865D69pq0SAsdkxvvDzL/Dg4QcxM3776t/mLbvewpcPf5nPPfM59g7s5b4997GnZ896N3VBY7NjfPHgF3nF5ldwTds1RdM85uHem+8t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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import snlay as snlay\n", "#here we test edge cases where failure happens\n", "#size = np.array([70, 60, 50, 40, 30, 20, 10, 10])\n", "#size = np.array([70, 70, 70, 70, 70, 70, 70, 70])\n", "#size = np.array([30, 30, 30, 30, 30, 30, 30, 30])\n", "\n", "#size = np.array([65, 65, 65, 65, 55, 65, 35, 65])\n", "#size = np.array([68, 30, 38, 60, 63, 60, 68, 68])\n", "\n", "size = np.random.randint(30, 71, 8)\n", "mats = np.array([3, 4, 3, 4, 3, 4, 3, 4])\n", "spec_ac = snlay.calc_spectrum(size, mats, lams)\n", "\n", "print(size)\n", "\n", "\n", "size = (size - 50.0)/20.0\n", "\n", "\n", "spec = model.predict(np.expand_dims(size, axis = 0))\n", "\n", "#spec = model.predict(size)\n", "# print(spec.shape)\n", "spec = np.ravel(spec)\n", "\n", "\n", "fig1 = plt.figure(figsize=(22,5))\n", "ax = fig1.add_subplot(1,1,1)\n", "ax.set_title('silica coated gold')\n", "ax.set_xlabel('Wavelength (nm)')\n", "plt.plot(lams, spec_ac, linewidth=3, label='simulated')\n", "plt.plot(lams, spec, '--', linewidth=3, label='predicted')\n", "plt.plot(lams, np.abs(spec_ac - spec)/spec_ac, label='error')\n", "\n", "plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Model Benchmarking" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-08-24T08:36:24.025196Z", "start_time": "2018-08-24T07:15:19.871311Z" }, "code_folding": [], "scrolled": true }, "outputs": [], "source": [ "#Here is where we in-depth model evaluation and benchmarking\n", "\n", "#model = naiveploss_model()\n", "train_e, val_e, test_e, train_t = net_performance(naiveploss_model, 5, 64, 500, 1)\n", "\n", "print(\"Training duration\")\n", "print(np.mean(train_t), np.std(train_t))\n", "\n", "print(\"Training error\")\n", "print(np.mean(train_e), np.std(train_e))\n", "\n", "print(\"Validation error\")\n", "print(np.mean(val_e), np.std(val_e))\n", "\n", "print(\"Testing error\")\n", "print(train_e)\n", "print(np.mean(train_e), np.std(train_e))\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\\\\7]=/ we record the timing and resource consumption \n", "'\n", "- naiveploss, \n", "\n", " Total params: 253,250, \n", " training size: 48,000 val size 12,000 test size: 40,000 \n", " \n", " 1 gpu case, 500 epochs, 64 batch size. \n", " Training duration\n", "970.6306939371977 162.52772916709793\n", "Training error\n", "0.28162434966405236 0.004849006439278184\n", "Validation error\n", "0.28847073678970336 0.01748113934849215\n", "Testing error\n", "[0.28093684 0.29020114 0.28278018 0.27629951 0.27790407]\n", "0.28162434966405236 0.004849006439278184\n", " \n", " \n", " 2 gpu case, 500 epochs, 64 batch size. \n", " Training duration\n", "1415.9011616169942 72.01714343631177\n", "Training error\n", "0.14291583093007407 0.0017661558666610126\n", "Validation error\n", "0.14036797358194988 0.005636169118478038\n", "Testing error\n", "[0.14436209 0.14525352 0.14023539 0.14201304 0.14271513]\n", "0.14291583093007407 0.0017661558666610126\n", " \n", " \n" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true }, "source": [ "### Inverse scattering " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-08-28T04:46:28.710011Z", "start_time": "2018-08-28T04:46:20.687025Z" }, "hidden": true }, "outputs": [], "source": [ "\n", "\n", "model_d = Sequential()\n", "model_d.add(Dense(8, input_dim=1, kernel_initializer='normal', activation='linear', \n", " name='dummy', use_bias=False))\n", "\n", "for layer in model.layers:\n", " model_d.add(layer)\n", "\n", "for layer in model_d.layers[1:]:\n", " layer.trainable = False\n", "\n", "for ind in range(1,len(model_d.layers)):\n", " model_d.layers[ind].set_weights(model.layers[ind-1].get_weights())\n", "\n", "model_d.compile(loss=naive_percent_loss, optimizer='adam') \n", " \n", " \n", "#model_d.summary()\n", "\n", "\n", "# # let us create a target spectrum first\n", "import snlay as snlay\n", "#size = np.array([60, 65, 65, 65, 35, 35, 35, 35])\n", "size = np.random.randint(30,70,8)\n", "mats = np.array([3, 4, 3, 4, 3, 4, 3, 4])\n", "target = snlay.calc_spectrum(size, mats, lams)\n", "\n", "print(size)\n", "\n", "# #do the training here\n", "xd_t = np.ones((1,1))\n", "yd_t = target.reshape(1,250)\n", "\n", "\n", "\n", "\n", "\n", "history = model_d.fit(xd_t, yd_t,\n", " batch_size=1,\n", " epochs=5000, \n", " verbose=0)\n", "\n", "# #here is the final result\n", "size_out = model_d.get_layer('dummy')\n", "wts = size_out.get_weights()\n", "wts = np.array(wts).ravel()\n", "size_res= 0.5*wts*(size_max - size_min) + size_av\n", "size_res_rounded = np.round(size_res)\n", "\n", "spec_zer = model_d.predict(xd_t).ravel()\n", "achieved = snlay.calc_spectrum(size_res_rounded, mats, lams)\n", "\n", "\n", "fig1 = plt.figure(figsize=(22,5))\n", "ax = fig1.add_subplot(1,1,1)\n", "#plt.plot(lams, spec_zer, label='new model')\n", "plt.plot(lams, target, linewidth=2, label='target')\n", "plt.plot(lams, achieved, '--', linewidth=3, label='achieved')\n", "plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)\n", "\n", "print(size_res_rounded)\n" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true }, "source": [ "### Model shipment" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-08-25T05:32:45.730860Z", "start_time": "2018-08-25T05:32:45.701134Z" }, "hidden": true }, "outputs": [], "source": [ "\n", " \n", "from keras.models import load_model\n", "\n", "#Creates a HDF5 file 'my_model.h5'\n", "model.save('my_model.h5')\n", "\n", "# Deletes the existing model\n", "#del model \n", "\n", "# Returns a compiled model identical to the previous one\n", "#model = load_model('my_model.h5')\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "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.6.6" } }, "nbformat": 4, "nbformat_minor": 2 }