{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### Dataset Loading and testing" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2018-09-10T17:23:56.626722Z", "start_time": "2018-09-10T17:23:56.401992Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n", "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": [ "%load_ext autoreload\n", "\n", "\n", "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": 4, "metadata": { "ExecuteTime": { "end_time": "2018-09-10T17:24:05.691367Z", "start_time": "2018-09-10T17:24:05.656603Z" }, "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", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\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 \n", "\n", "\n", "\n", "#make bottleneck layers\n", "\n", "\n", "\n", "\n", "\n", "\n", "def resnetb():\n", " model = Sequential()\n", " \n", " #first layer6\n", " model.add(Dense(256, input_dim=8, kernel_initializer='normal', \n", " name='first'))\n", " model.add(PReLU(alpha_initializer='zeros', alpha_regularizer=None))\n", " model.add(Reshape((8, 32)))\n", " \n", " \n", " #resnet block\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", "# model.add(Conv1D(filters=32, kernel_size=3, strides=1, padding='same', \n", "# dilation_rate=1, \n", "# kernel_initializer='normal'))\n", " \n", " \n", " \n", " #Last layer\n", " model.add(Flatten())\n", " \n", " #compile model\n", " model.compile(loss=naive_percent_loss, optimizer='adam', metrics=[calc_mre_K])\n", " \n", " return model\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "import os\n", "os.environ[\"CUDA_DEVICE_ORDER\"]=\"PCI_BUS_ID\" \n", "os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"0\"\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "start_time": "2018-09-11T06:18:24.194Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/hegder/anaconda3/envs/deep/lib/python3.6/site-packages/keras/backend/mxnet_backend.py:89: UserWarning: MXNet Backend performs best with `channels_first` format. Using `channels_last` will significantly reduce performance due to the Transpose operations. For performance improvement, please use this API`keras.utils.to_channels_first(x_input)`to transform `channels_last` data to `channels_first` format and also please change the `image_data_format` in `keras.json` to `channels_first`.Note: `x_input` is a Numpy tensor or a list of Numpy tensorRefer to: https://github.com/awslabs/keras-apache-mxnet/tree/master/docs/mxnet_backend/performance_guide.md\n", " train_symbol = func(*args, **kwargs)\n", "/home/hegder/anaconda3/envs/deep/lib/python3.6/site-packages/keras/backend/mxnet_backend.py:92: UserWarning: MXNet Backend performs best with `channels_first` format. Using `channels_last` will significantly reduce performance due to the Transpose operations. For performance improvement, please use this API`keras.utils.to_channels_first(x_input)`to transform `channels_last` data to `channels_first` format and also please change the `image_data_format` in `keras.json` to `channels_first`.Note: `x_input` is a Numpy tensor or a list of Numpy tensorRefer to: https://github.com/awslabs/keras-apache-mxnet/tree/master/docs/mxnet_backend/performance_guide.md\n", " test_symbol = func(*args, **kwargs)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "__________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", "input_9 (InputLayer) (None, 8) 0 \n", "__________________________________________________________________________________________________\n", "dense_10 (Dense) (None, 256) 2304 input_9[0][0] \n", "__________________________________________________________________________________________________\n", "activation_50 (Activation) (None, 256) 0 dense_10[0][0] \n", "__________________________________________________________________________________________________\n", "reshape_15 (Reshape) (None, 256, 1) 0 activation_50[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_113 (Conv1D) (None, 256, 32) 64 reshape_15[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_116 (Conv1D) (None, 256, 4) 132 conv1d_113[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_114 (Conv1D) (None, 256, 4) 132 conv1d_113[0][0] \n", "__________________________________________________________________________________________________\n", "activation_51 (Activation) (None, 256, 4) 0 conv1d_116[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_115 (Conv1D) (None, 256, 8) 104 conv1d_114[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_117 (Conv1D) (None, 256, 8) 168 activation_51[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_118 (Conv1D) (None, 256, 16) 528 conv1d_113[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate_22 (Concatenate) (None, 256, 32) 0 conv1d_115[0][0] \n", " conv1d_117[0][0] \n", " conv1d_118[0][0] \n", "__________________________________________________________________________________________________\n", "add_22 (Add) (None, 256, 32) 0 conv1d_113[0][0] \n", " concatenate_22[0][0] \n", "__________________________________________________________________________________________________\n", "activation_52 (Activation) (None, 256, 32) 0 add_22[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_121 (Conv1D) (None, 256, 4) 132 activation_52[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_119 (Conv1D) (None, 256, 4) 132 activation_52[0][0] \n", "__________________________________________________________________________________________________\n", "activation_53 (Activation) (None, 256, 4) 0 conv1d_121[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_120 (Conv1D) (None, 256, 8) 104 conv1d_119[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_122 (Conv1D) (None, 256, 8) 168 activation_53[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_123 (Conv1D) (None, 256, 16) 528 activation_52[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate_23 (Concatenate) (None, 256, 32) 0 conv1d_120[0][0] \n", " conv1d_122[0][0] \n", " conv1d_123[0][0] \n", "__________________________________________________________________________________________________\n", "add_23 (Add) (None, 256, 32) 0 activation_52[0][0] \n", " concatenate_23[0][0] \n", "__________________________________________________________________________________________________\n", "activation_54 (Activation) (None, 256, 32) 0 add_23[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_126 (Conv1D) (None, 256, 4) 132 activation_54[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_124 (Conv1D) (None, 256, 4) 132 activation_54[0][0] \n", "__________________________________________________________________________________________________\n", "activation_55 (Activation) (None, 256, 4) 0 conv1d_126[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_125 (Conv1D) (None, 256, 8) 104 conv1d_124[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_127 (Conv1D) (None, 256, 8) 168 activation_55[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_128 (Conv1D) (None, 256, 16) 528 activation_54[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate_24 (Concatenate) (None, 256, 32) 0 conv1d_125[0][0] \n", " conv1d_127[0][0] \n", " conv1d_128[0][0] \n", "__________________________________________________________________________________________________\n", "add_24 (Add) (None, 256, 32) 0 activation_54[0][0] \n", " concatenate_24[0][0] \n", "__________________________________________________________________________________________________\n", "activation_56 (Activation) (None, 256, 32) 0 add_24[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_131 (Conv1D) (None, 256, 4) 132 activation_56[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_129 (Conv1D) (None, 256, 4) 132 activation_56[0][0] \n", "__________________________________________________________________________________________________\n", "activation_57 (Activation) (None, 256, 4) 0 conv1d_131[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_130 (Conv1D) (None, 256, 8) 104 conv1d_129[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_132 (Conv1D) (None, 256, 8) 168 activation_57[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_133 (Conv1D) (None, 256, 16) 528 activation_56[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate_25 (Concatenate) (None, 256, 32) 0 conv1d_130[0][0] \n", " conv1d_132[0][0] \n", " conv1d_133[0][0] \n", "__________________________________________________________________________________________________\n", "add_25 (Add) (None, 256, 32) 0 activation_56[0][0] \n", " concatenate_25[0][0] \n", "__________________________________________________________________________________________________\n", "activation_58 (Activation) (None, 256, 32) 0 add_25[0][0] \n", "__________________________________________________________________________________________________\n", "reshape_16 (Reshape) (None, 32, 256) 0 activation_58[0][0] \n", "__________________________________________________________________________________________________\n", "max_pooling1d_8 (MaxPooling1D) (None, 1, 256) 0 reshape_16[0][0] \n", "__________________________________________________________________________________________________\n", "flatten_8 (Flatten) (None, 256) 0 max_pooling1d_8[0][0] \n", "==================================================================================================\n", "Total params: 6,624\n", "Trainable params: 6,624\n", "Non-trainable params: 0\n", "__________________________________________________________________________________________________\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Train on 48000 samples, validate on 12000 samples\n", "Epoch 1/2000\n", " 128/48000 [..............................] - ETA: 1:04 - loss: 16338.7124 - calc_mre_K: 99.7236" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/hegder/anaconda3/envs/deep/lib/python3.6/site-packages/mxnet/module/bucketing_module.py:408: UserWarning: Optimizer created manually outside Module but rescale_grad is not normalized to 1.0/batch_size/num_workers (1.0 vs. 0.015625). Is this intended?\n", " force_init=force_init)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "48000/48000 [==============================] - 71s 1ms/step - loss: 4381.9101 - calc_mre_K: 26.7451 - val_loss: 2897.5120 - val_calc_mre_K: 17.7086\n", "Epoch 2/2000\n", "15552/48000 [========>.....................] - ETA: 46s - loss: 2791.7469 - calc_mre_K: 17.0395" ] } ], "source": [ "from keras.models import Model\n", "from keras.layers import Input, Add, AveragePooling1D, MaxPooling1D, Concatenate\n", "\n", "a = Input(shape=(8,))\n", "first = Dense(256, kernel_initializer='normal')(a)\n", "#first = Dense(128, kernel_initializer='normal')(first)\n", "#first = BatchNormalization()(first)\n", "first= Activation('relu')(first)\n", "\n", "first = Reshape((256,1))(first)\n", "#first = UpSampling1D(size = 2)(first)\n", "first = Conv1D(filters=32, kernel_size=1, strides=1, padding='same', \n", " kernel_initializer='normal', activation='relu')(first)\n", "#first = UpSampling1D(size = 2)(first)\n", "\n", "\n", "\n", "\n", "# first_1 = Conv1D(filters=4, kernel_size=1, strides=1, padding='same', \n", "# kernel_initializer='normal')(first)\n", "# first_1 = Activation('relu')(first_1)\n", "# first_1 = Conv1D(filters=8, kernel_size=3, strides=1, padding='same', \n", "# kernel_initializer='normal')(first_1)\n", "first_2 = Conv1D(filters=4, kernel_size=1, strides=1, padding='same', \n", " kernel_initializer='normal')(first)\n", "#first_2 = Activation('relu')(first_2)\n", "first_2 = Conv1D(filters=8, kernel_size=3, strides=1, padding='same', \n", " kernel_initializer='normal')(first_2)\n", "first_3 = Conv1D(filters=4, kernel_size=1, strides=1, padding='same', \n", " kernel_initializer='normal')(first)\n", "first_3 = Activation('relu')(first_3)\n", "first_3 = Conv1D(filters=8, kernel_size=5, strides=1, padding='same', \n", " kernel_initializer='normal')(first_3)\n", "first_4 = Conv1D(filters=16, kernel_size=1, strides=1, padding='same', \n", " kernel_initializer='normal')(first)\n", "list_of_tensors = [first_2, first_3, first_4]\n", "conc = Concatenate()(list_of_tensors)\n", "first = Add()([first, conc])\n", "first= Activation('relu')(first)\n", "\n", "\n", "\n", "# first_1 = Conv1D(filters=4, kernel_size=1, strides=1, padding='same', \n", "# kernel_initializer='normal')(first)\n", "# first_1 = Activation('relu')(first_1)\n", "# first_1 = Conv1D(filters=8, kernel_size=3, strides=1, padding='same', \n", "# kernel_initializer='normal')(first_1)\n", "first_2 = Conv1D(filters=4, kernel_size=1, strides=1, padding='same', \n", " kernel_initializer='normal')(first)\n", "#first_2 = Activation('relu')(first_2)\n", "first_2 = Conv1D(filters=8, kernel_size=3, strides=1, padding='same', \n", " kernel_initializer='normal')(first_2)\n", "first_3 = Conv1D(filters=4, kernel_size=1, strides=1, padding='same', \n", " kernel_initializer='normal')(first)\n", "first_3 = Activation('relu')(first_3)\n", "first_3 = Conv1D(filters=8, kernel_size=5, strides=1, padding='same', \n", " kernel_initializer='normal')(first_3)\n", "first_4 = Conv1D(filters=16, kernel_size=1, strides=1, padding='same', \n", " kernel_initializer='normal')(first)\n", "list_of_tensors = [first_2, first_3, first_4]\n", "conc = Concatenate()(list_of_tensors)\n", "first = Add()([first, conc])\n", "first= Activation('relu')(first)\n", "\n", "\n", "\n", "\n", "# first_1 = Conv1D(filters=4, kernel_size=1, strides=1, padding='same', \n", "# kernel_initializer='normal')(first)\n", "# first_1 = Activation('relu')(first_1)\n", "# first_1 = Conv1D(filters=8, kernel_size=3, strides=1, padding='same', \n", "# kernel_initializer='normal')(first_1)\n", "first_2 = Conv1D(filters=4, kernel_size=1, strides=1, padding='same', \n", " kernel_initializer='normal')(first)\n", "#first_2 = Activation('relu')(first_2)\n", "first_2 = Conv1D(filters=8, kernel_size=3, strides=1, padding='same', \n", " kernel_initializer='normal')(first_2)\n", "first_3 = Conv1D(filters=4, kernel_size=1, strides=1, padding='same', \n", " kernel_initializer='normal')(first)\n", "first_3 = Activation('relu')(first_3)\n", "first_3 = Conv1D(filters=8, kernel_size=5, strides=1, padding='same', \n", " kernel_initializer='normal')(first_3)\n", "first_4 = Conv1D(filters=16, kernel_size=1, strides=1, padding='same', \n", " kernel_initializer='normal')(first)\n", "list_of_tensors = [first_2, first_3, first_4]\n", "conc = Concatenate()(list_of_tensors)\n", "first = Add()([first, conc])\n", "first= Activation('relu')(first)\n", "\n", "# first_1 = Conv1D(filters=4, kernel_size=1, strides=1, padding='same', \n", "# kernel_initializer='normal')(first)\n", "# first_1 = Activation('relu')(first_1)\n", "# first_1 = Conv1D(filters=8, kernel_size=3, strides=1, padding='same', \n", "# kernel_initializer='normal')(first_1)\n", "first_2 = Conv1D(filters=4, kernel_size=1, strides=1, padding='same', \n", " kernel_initializer='normal')(first)\n", "#first_2 = Activation('relu')(first_2)\n", "first_2 = Conv1D(filters=8, kernel_size=3, strides=1, padding='same', \n", " kernel_initializer='normal')(first_2)\n", "first_3 = Conv1D(filters=4, kernel_size=1, strides=1, padding='same', \n", " kernel_initializer='normal')(first)\n", "first_3 = Activation('relu')(first_3)\n", "first_3 = Conv1D(filters=8, kernel_size=5, strides=1, padding='same', \n", " kernel_initializer='normal')(first_3)\n", "first_4 = Conv1D(filters=16, kernel_size=1, strides=1, padding='same', \n", " kernel_initializer='normal')(first)\n", "list_of_tensors = [first_2, first_3, first_4]\n", "conc = Concatenate()(list_of_tensors)\n", "first = Add()([first, conc])\n", "first= Activation('relu')(first)\n", "\n", "\n", "\n", "\n", "\n", "first = Reshape((32,256))(first)\n", "first = MaxPooling1D(pool_size=32, strides=None, padding='same')(first)\n", "last = Flatten()(first)\n", "\n", "model = Model(inputs=a, outputs=last)\n", "model.compile(loss=naive_percent_loss, optimizer='nadam', metrics=[calc_mre_K])\n", "\n", "model.summary()\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", "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=2000, \n", " verbose=1,\n", " validation_data=(x_v, y_v))\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Model testing" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2018-09-09T10:18:16.923710Z", "start_time": "2018-09-09T09:45:44.002898Z" }, "code_folding": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/hegder/anaconda3/envs/deep/lib/python3.6/site-packages/keras/backend/mxnet_backend.py:89: UserWarning: MXNet Backend performs best with `channels_first` format. Using `channels_last` will significantly reduce performance due to the Transpose operations. For performance improvement, please use this API`keras.utils.to_channels_first(x_input)`to transform `channels_last` data to `channels_first` format and also please change the `image_data_format` in `keras.json` to `channels_first`.Note: `x_input` is a Numpy tensor or a list of Numpy tensorRefer to: https://github.com/awslabs/keras-apache-mxnet/tree/master/docs/mxnet_backend/performance_guide.md\n", " train_symbol = func(*args, **kwargs)\n", "/home/hegder/anaconda3/envs/deep/lib/python3.6/site-packages/keras/backend/mxnet_backend.py:92: UserWarning: MXNet Backend performs best with `channels_first` format. Using `channels_last` will significantly reduce performance due to the Transpose operations. For performance improvement, please use this API`keras.utils.to_channels_first(x_input)`to transform `channels_last` data to `channels_first` format and also please change the `image_data_format` in `keras.json` to `channels_first`.Note: `x_input` is a Numpy tensor or a list of Numpy tensorRefer to: https://github.com/awslabs/keras-apache-mxnet/tree/master/docs/mxnet_backend/performance_guide.md\n", " test_symbol = func(*args, **kwargs)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "__________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", "input_1 (InputLayer) (None, 8) 0 \n", "__________________________________________________________________________________________________\n", "dense_1 (Dense) (None, 256) 2304 input_1[0][0] \n", "__________________________________________________________________________________________________\n", "p_re_lu_1 (PReLU) (None, 256) 256 dense_1[0][0] \n", "__________________________________________________________________________________________________\n", "reshape_1 (Reshape) (None, 8, 32) 0 p_re_lu_1[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_1 (Conv1D) (None, 8, 16) 528 reshape_1[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_1 (BatchNor (None, 8, 16) 32 conv1d_1[0][0] \n", "__________________________________________________________________________________________________\n", "activation_1 (Activation) (None, 8, 16) 0 batch_normalization_1[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_2 (Conv1D) (None, 8, 16) 784 activation_1[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_2 (BatchNor (None, 8, 16) 32 conv1d_2[0][0] \n", "__________________________________________________________________________________________________\n", "activation_2 (Activation) (None, 8, 16) 0 batch_normalization_2[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_3 (Conv1D) (None, 8, 32) 544 activation_2[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_3 (BatchNor (None, 8, 32) 32 conv1d_3[0][0] \n", "__________________________________________________________________________________________________\n", "add_1 (Add) (None, 8, 32) 0 batch_normalization_3[0][0] \n", " reshape_1[0][0] \n", "__________________________________________________________________________________________________\n", "p_re_lu_2 (PReLU) (None, 8, 32) 256 add_1[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_4 (Conv1D) (None, 8, 16) 528 p_re_lu_2[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_4 (BatchNor (None, 8, 16) 32 conv1d_4[0][0] \n", "__________________________________________________________________________________________________\n", "activation_3 (Activation) (None, 8, 16) 0 batch_normalization_4[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_5 (Conv1D) (None, 8, 16) 784 activation_3[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_5 (BatchNor (None, 8, 16) 32 conv1d_5[0][0] \n", "__________________________________________________________________________________________________\n", "activation_4 (Activation) (None, 8, 16) 0 batch_normalization_5[0][0] \n", "__________________________________________________________________________________________________\n", "conv1d_6 (Conv1D) (None, 8, 32) 544 activation_4[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_6 (BatchNor (None, 8, 32) 32 conv1d_6[0][0] \n", "__________________________________________________________________________________________________\n", "add_2 (Add) (None, 8, 32) 0 batch_normalization_6[0][0] \n", " p_re_lu_2[0][0] \n", "__________________________________________________________________________________________________\n", "p_re_lu_3 (PReLU) (None, 8, 32) 256 add_2[0][0] \n", "__________________________________________________________________________________________________\n", "flatten_1 (Flatten) (None, 256) 0 p_re_lu_3[0][0] \n", "==================================================================================================\n", "Total params: 6,976\n", "Trainable params: 6,880\n", "Non-trainable params: 96\n", "__________________________________________________________________________________________________\n", "Train on 48000 samples, validate on 12000 samples\n", "Epoch 1/2000\n", " 128/48000 [..............................] - ETA: 9:12 - loss: 13212.7954 - calc_mre_K: 80.6445 " ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/hegder/anaconda3/envs/deep/lib/python3.6/site-packages/mxnet/module/bucketing_module.py:408: UserWarning: Optimizer created manually outside Module but rescale_grad is not normalized to 1.0/batch_size/num_workers (1.0 vs. 0.015625). Is this intended?\n", " force_init=force_init)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "48000/48000 [==============================] - 47s 986us/step - loss: 6872.8330 - calc_mre_K: 41.9484 - val_loss: 3910.1943 - val_calc_mre_K: 23.8984\n", "Epoch 2/2000\n", "48000/48000 [==============================] - 46s 957us/step - loss: 2069.6967 - calc_mre_K: 12.6324 - val_loss: 952.9631 - val_calc_mre_K: 5.8240\n", "Epoch 3/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 714.5887 - calc_mre_K: 4.3615 - val_loss: 591.4588 - val_calc_mre_K: 3.6147\n", "Epoch 4/2000\n", "48000/48000 [==============================] - 46s 957us/step - loss: 591.9463 - calc_mre_K: 3.6130 - val_loss: 476.9995 - val_calc_mre_K: 2.9152\n", "Epoch 5/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 548.6800 - calc_mre_K: 3.3489 - val_loss: 484.1725 - val_calc_mre_K: 2.9590\n", "Epoch 6/2000\n", "48000/48000 [==============================] - 46s 957us/step - loss: 511.5884 - calc_mre_K: 3.1225 - val_loss: 522.0742 - val_calc_mre_K: 3.1907\n", "Epoch 7/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 490.5430 - calc_mre_K: 2.9940 - val_loss: 399.2196 - val_calc_mre_K: 2.4400\n", "Epoch 8/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 474.8025 - calc_mre_K: 2.8980 - val_loss: 392.6091 - val_calc_mre_K: 2.3994\n", "Epoch 9/2000\n", "48000/48000 [==============================] - 46s 957us/step - loss: 458.7873 - calc_mre_K: 2.8002 - val_loss: 374.8112 - val_calc_mre_K: 2.2907\n", "Epoch 10/2000\n", "48000/48000 [==============================] - 46s 959us/step - loss: 444.3666 - calc_mre_K: 2.7122 - val_loss: 378.5928 - val_calc_mre_K: 2.3138\n", "Epoch 11/2000\n", "48000/48000 [==============================] - 46s 957us/step - loss: 433.6344 - calc_mre_K: 2.6467 - val_loss: 366.6433 - val_calc_mre_K: 2.2408\n", "Epoch 12/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 422.1692 - calc_mre_K: 2.5767 - val_loss: 358.7977 - val_calc_mre_K: 2.1928\n", "Epoch 13/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 410.4512 - calc_mre_K: 2.5052 - val_loss: 369.2477 - val_calc_mre_K: 2.2567\n", "Epoch 14/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 399.3498 - calc_mre_K: 2.4374 - val_loss: 355.4807 - val_calc_mre_K: 2.1725\n", "Epoch 15/2000\n", "48000/48000 [==============================] - 46s 957us/step - loss: 387.2967 - calc_mre_K: 2.3639 - val_loss: 331.1552 - val_calc_mre_K: 2.0239\n", "Epoch 16/2000\n", "48000/48000 [==============================] - 46s 957us/step - loss: 378.4766 - calc_mre_K: 2.3100 - val_loss: 334.3060 - val_calc_mre_K: 2.0432\n", "Epoch 17/2000\n", "48000/48000 [==============================] - 46s 957us/step - loss: 370.7427 - calc_mre_K: 2.2628 - val_loss: 333.3913 - val_calc_mre_K: 2.0376\n", "Epoch 18/2000\n", "48000/48000 [==============================] - 46s 957us/step - loss: 367.0586 - calc_mre_K: 2.2403 - val_loss: 330.2903 - val_calc_mre_K: 2.0186\n", "Epoch 19/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 358.6370 - calc_mre_K: 2.1889 - val_loss: 327.4912 - val_calc_mre_K: 2.0015\n", "Epoch 20/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 354.1946 - calc_mre_K: 2.1618 - val_loss: 321.0245 - val_calc_mre_K: 1.9620\n", "Epoch 21/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 351.0319 - calc_mre_K: 2.1425 - val_loss: 350.8513 - val_calc_mre_K: 2.1443\n", "Epoch 22/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 347.6705 - calc_mre_K: 2.1220 - val_loss: 340.3013 - val_calc_mre_K: 2.0799\n", "Epoch 23/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 341.5272 - calc_mre_K: 2.0845 - val_loss: 334.5411 - val_calc_mre_K: 2.0446\n", "Epoch 24/2000\n", "48000/48000 [==============================] - 46s 957us/step - loss: 339.3780 - calc_mre_K: 2.0714 - val_loss: 305.6745 - val_calc_mre_K: 1.8682\n", "Epoch 25/2000\n", "48000/48000 [==============================] - 46s 957us/step - loss: 335.3852 - calc_mre_K: 2.0470 - val_loss: 306.7326 - val_calc_mre_K: 1.8747\n", "Epoch 26/2000\n", "48000/48000 [==============================] - 46s 957us/step - loss: 331.1583 - calc_mre_K: 2.0212 - val_loss: 303.5000 - val_calc_mre_K: 1.8549\n", "Epoch 27/2000\n", "48000/48000 [==============================] - 46s 957us/step - loss: 327.5454 - calc_mre_K: 1.9992 - val_loss: 312.3306 - val_calc_mre_K: 1.9089\n", "Epoch 28/2000\n", "48000/48000 [==============================] - 46s 957us/step - loss: 325.0663 - calc_mre_K: 1.9840 - val_loss: 302.2129 - val_calc_mre_K: 1.8470\n", "Epoch 29/2000\n", "48000/48000 [==============================] - 45s 944us/step - loss: 321.4895 - calc_mre_K: 1.9622 - val_loss: 302.8835 - val_calc_mre_K: 1.8511\n", "Epoch 30/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 320.0211 - calc_mre_K: 1.9533 - val_loss: 308.1119 - val_calc_mre_K: 1.8831\n", "Epoch 31/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 317.1353 - calc_mre_K: 1.9356 - val_loss: 296.7091 - val_calc_mre_K: 1.8134\n", "Epoch 32/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 315.1523 - calc_mre_K: 1.9235 - val_loss: 295.3089 - val_calc_mre_K: 1.8048\n", "Epoch 33/2000\n", "48000/48000 [==============================] - 45s 941us/step - loss: 313.1056 - calc_mre_K: 1.9110 - val_loss: 306.5475 - val_calc_mre_K: 1.8735\n", "Epoch 34/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 313.1183 - calc_mre_K: 1.9111 - val_loss: 282.0987 - val_calc_mre_K: 1.7241\n", "Epoch 35/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 309.3947 - calc_mre_K: 1.8884 - val_loss: 286.0275 - val_calc_mre_K: 1.7481\n", "Epoch 36/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 308.1774 - calc_mre_K: 1.8810 - val_loss: 291.1862 - val_calc_mre_K: 1.7797\n", "Epoch 37/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 306.2845 - calc_mre_K: 1.8694 - val_loss: 312.3886 - val_calc_mre_K: 1.9092\n", "Epoch 38/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 304.7772 - calc_mre_K: 1.8602 - val_loss: 288.6524 - val_calc_mre_K: 1.7642\n", "Epoch 39/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 303.3615 - calc_mre_K: 1.8516 - val_loss: 292.1752 - val_calc_mre_K: 1.7857\n", "Epoch 40/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 303.0454 - calc_mre_K: 1.8496 - val_loss: 280.9955 - val_calc_mre_K: 1.7174\n", "Epoch 41/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 301.3106 - calc_mre_K: 1.8391 - val_loss: 272.7065 - val_calc_mre_K: 1.6667\n", "Epoch 42/2000\n", "48000/48000 [==============================] - 46s 958us/step - loss: 300.7613 - calc_mre_K: 1.8357 - val_loss: 275.6420 - val_calc_mre_K: 1.6847\n", "Epoch 43/2000\n", "23552/48000 [=============>................] - ETA: 22s - loss: 299.4164 - calc_mre_K: 1.8275" ] }, { "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 44\u001b[0m \u001b[0mepochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m2000\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 45\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---> 46\u001b[0;31m validation_data=(x_v, y_v))\n\u001b[0m\u001b[1;32m 47\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\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 1430\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1431\u001b[0m \u001b[0;31m# update weight\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1432\u001b[0;31m \u001b[0mweight\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m-=\u001b[0m \u001b[0mlr\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mm_t_bar\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv_t_prime\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mepsilon\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1433\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1434\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mregister\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;36m__truediv__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 280\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 281\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__truediv__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 282\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mdivide\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 283\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 284\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__rtruediv__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\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;36mdivide\u001b[0;34m(lhs, rhs)\u001b[0m\n\u001b[1;32m 2715\u001b[0m \u001b[0moperator\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtruediv\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2716\u001b[0m \u001b[0m_internal\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_div_scalar\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2717\u001b[0;31m _internal._rdiv_scalar)\n\u001b[0m\u001b[1;32m 2718\u001b[0m \u001b[0;31m# pylint: enable= no-member, protected-access\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2719\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;36m_ufunc_helper\u001b[0;34m(lhs, rhs, fn_array, fn_scalar, lfn_scalar, rfn_scalar)\u001b[0m\n\u001b[1;32m 2429\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2430\u001b[0m \u001b[0;31m#pylint: disable= too-many-arguments, no-member, protected-access\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2431\u001b[0;31m \u001b[0;32mdef\u001b[0m \u001b[0m_ufunc_helper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlhs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrhs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfn_array\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfn_scalar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlfn_scalar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrfn_scalar\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\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 2432\u001b[0m \"\"\" Helper function for element-wise operation.\n\u001b[1;32m 2433\u001b[0m \u001b[0mThe\u001b[0m \u001b[0mfunction\u001b[0m \u001b[0mwill\u001b[0m \u001b[0mperform\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mlike\u001b[0m \u001b[0mbroadcasting\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mneeded\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mcall\u001b[0m \u001b[0mdifferent\u001b[0m \u001b[0mfunctions\u001b[0m\u001b[0;34m.\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", "# model = resnetb()\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", "\n", " \n", " \n", "import scnets as scn\n", "\n", "model = scn.resnet(in_size=8, \n", " out_size=256,\n", " num_units=2,\n", " red_dim=16,\n", " batch_size=64,\n", " ker_size=3)\n", "\n", "# from keras import optimizers\n", "# sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)\n", "model.compile(loss=naive_percent_loss, optimizer='nadam', metrics=[calc_mre_K])\n", "\n", "model.summary() \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=2000, \n", " verbose=1,\n", " validation_data=(x_v, y_v))\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": 8, "metadata": { "ExecuteTime": { "end_time": "2018-09-11T05:19:22.582666Z", "start_time": "2018-09-11T05:19:17.536151Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.5546035071694175\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVAAAAFACAYAAADqPiRCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3XmcnfP5//HXNZNlssuGEIQGlURCNtROG0slrbVJqVJL6YJqfaullba/+qqiqqjyraLVoAjSWqOIECQhkhAkkSAS2ci+TWau3x+f+8yciZk5Z87c95w5c97Px+M8zn3ucy/XPZO58rk/223ujoiINFxJvgMQESlUSqAiIjlSAhURyZESqIhIjpRARURypAQqIpIjJVARkRwpgYqI5EgJVEQkR63yHUBj9OjRw/v06ZPvMESkhZk+ffoKd++ZabuCTqB9+vRh2rRp+Q5DRFoYM/sgm+10Cy8ikiMlUBGRHCmBiojkqKDrQEXyrby8nEWLFrFp06Z8hyI5KCsro3fv3rRu3Tqn/ZVARRph0aJFdOrUiT59+mBm+Q5HGsDdWblyJYsWLWL33XfP6Ri6hRdphE2bNtG9e3clzwJkZnTv3r1Rdw9KoCKNpORZuBr7u1MCFRHJkRKoSAFbtWoVt956a077Hn/88axatSrmiIpL0STQZWs28c9XP2TpGrWWSstRXwKtqKiod9/HH3+c7bbbLtZ4tm7dWu/numSKtbkqmgT6/or1/Hz8LOYvW5fvUERic/nllzN//nz2228/LrvsMp5//nmOPPJIvvnNb7LvvvsC8PWvf50hQ4bQv39/br/99qp9+/Tpw4oVK1i4cCH77LMP5513Hv3792fEiBFs3Ljxc+davnw5J598MsOGDWPYsGG89NJLAIwdO5bzzz+fESNGcOaZZ3LXXXdx6qmnMnLkSEaMGIG7c9lllzFgwAD23Xdf7r//foBaYy00RdONKVVVrIc4S1J+NeEt3l68JtZj9tupM1eN7F/n99dccw2zZ89mxowZQEhKr732GrNnz67qmnPnnXfSrVs3Nm7cyLBhwzj55JPp3r17jePMnTuXcePGcccdd3Daaafx0EMPccYZZ9TY5uKLL+ZHP/oRhxxyCB9++CHHHHMMc+bMAWD69OlMnjyZdu3acddddzFlyhRmzpxJt27deOihh5gxYwZvvvkmK1asYNiwYRx22GEAn4u10BRPAo1a21wZVFq44cOH10hIN910E+PHjwfgo48+Yu7cuZ9LoLvvvjv77bcfAEOGDGHhwoWfO+7EiRN5++23qz6vWbOGtWvXAjBq1CjatWtX9d1XvvIVunXrBsDkyZMZM2YMpaWl7LDDDhx++OFMnTqVzp07fy7WQlNECTS8u8qgkpD6SopNqUOHDlXLzz//PBMnTmTKlCm0b9+eI444otZ+j23btq1aLi0trfUWvrKykilTptRIlLWdc9vPXk+pZdv9Ck3R1IFW3cIrf0oL0qlTp6pSYG1Wr15N165dad++Pe+88w6vvPJKzucaMWIEN998c9XnVLVBJocddhj3338/FRUVLF++nEmTJjF8+PCc42hOiieBVpVARVqO7t27c/DBBzNgwAAuu+yyz31/7LHHsnXrVgYOHMgvfvELDjzwwJzPddNNNzFt2jQGDhxIv379uO2227La78QTT2TgwIEMGjSIo446imuvvZYdd9wx5ziaE6uveN3cDR061LOdUHn6B59x8p9f5q6zh3HE3tsnHJkUizlz5rDPPvvkOwxphNp+h2Y23d2HZtpXJVARkRwVTwJNLSiDikhMiieBproxKYOKSEyKJoGWREXQysr8xiEiLUfRJFAjVQIVEYlH8STQVCNSAfc6EJHmpWgSaIrSpxS7jh07ArB48WJOOeWUWrc54ogjyNRF8MYbb2TDhg1Vn4txeryiSaDVJdD8xiHSXOy00048+OCDOe+/bQJNYnq8ujSXafOKJ4FqPiZpgX7605/WmA907NixXH/99axbt46jjz6awYMHs++++/Loo49+bt+FCxcyYMAAADZu3Mjo0aMZOHAg3/jGN2qMhb/wwgsZOnQo/fv356qrrgLCqKTFixdz5JFHcuSRRwLV0+MB3HDDDQwYMIABAwZw4403Vp2vpU2bV3yTiSh/SlKeuBw+mRXvMXfcF467ps6vR48ezSWXXML3vvc9AB544AGefPJJysrKGD9+PJ07d2bFihUceOCBjBo1qs5nAP35z3+mffv2zJw5k5kzZzJ48OCq737729/SrVs3KioqOProo5k5cyYXXXQRN9xwA8899xw9evSocazp06fzt7/9jVdffRV354ADDuDwww+na9euLW7avOJLoPkNQyRW+++/P8uWLWPx4sUsX76crl27suuuu1JeXs7Pf/5zJk2aRElJCR9//DFLly6tcwz6pEmTuOiiiwAYOHAgAwcOrPrugQce4Pbbb2fr1q0sWbKEt99+u8b325o8eTInnnhi1UxLJ510Ei+++CKjRo1qcdPmFU8CRfOBSsLqKSkm6ZRTTuHBBx/kk08+YfTo0QDce++9LF++nOnTp9O6dWv69OmT8fG9tZVOFyxYwHXXXcfUqVPp2rUrZ511Vsbj1NfTpaVNm1c8daCaD1RaqNGjR3Pffffx4IMPVrWqr169mu23357WrVvz3HPP8cEHH9R7jMMOO4x7770XgNmzZzNz5kwglP46dOhAly5dWLp0KU888UTVPnVNpXfYYYfxyCOPsGHDBtavX8/48eM59NBDs76eQpo2ryATqJmNNLPbV69enf0+0btKoNLS9O/fn7Vr17LzzjvTq1cvAE4//XSmTZvG0KFDuffee/niF79Y7zEuvPBC1q1bx8CBA7n22murEs+gQYPYf//96d+/P9/5znc4+OCDq/Y5//zzOe6446oakVIGDx7MWWedxfDhwznggAM499xz2X///bO+nkKaNq9oprObt2wtX75hEjeN2Z9Rg3ZKODIpFprOrvBpOruspOpAC/c/DBFpXoomgdbRe0NEJGfFk0CjdxVAJW66qylcjf3dFU8C1XygkoCysjJWrlypJFqA3J2VK1dSVlaW8zGKqB9ooH/nEqfevXuzaNEili9fnu9QJAdlZWX07t075/2LJoGWmDrSS/xat26dyAgXKQxFdAsf3iuVQUUkJkWTQFOUPkUkLkWTQE2z2YlIzIoogaoVXkTiVTwJNHpXFaiIxKV4EqjmAxWRmBVPAtV8oCISs+JJoJoPVERiVjwJNHpXCVRE4lI0CRTVgYpIzIomgVY91lhFUBGJSfEkUJVARSRmxZNAo3cVQEUkLsWTQE2P9BCReBVPAo3elT5FJC7Fk0DVhiQiMSuiBJqaTEREJB5Fk0BbLZ7GlLY/YPvP3sh3KCLSQhRNArXKcnrZp5RUbMp3KCLSQhRNAqWkNQDmFXkORERaiqJJoFYSLtUqlUBFJB5Fk0ApKY0WKvMahoi0HBkfa2xmBwFnAIcCvYCNwGzgP8A/3H11ohHGxErCpaoEKiJxqbcEamZPAOcCTwHHEhJoP+BKoAx41MxGJR1kHCxVAlUdqIjEJFMJ9FvuvmKbdeuA16PX9WbWI5HI4mZRHajrFl5E4lFvCbSW5ImZHW1mI82sdV3bNEdWGkqgaoUXkbhkrANNZ2bXA1sILTEXAscnEVQiLNWNaWueAxGRlqLeBGpm1wG/SWso2hU4LVqelWRgcasqgVbqFl5E4pGpG9N44H4z+6GZlQL3AK8AM4Dbkw4uTpaqA1U3JhGJSaY60Jfc/VhgFfBktO4Adx/k7jc1RYBxsdKosK1uTCISk0zdmFqZ2VeBpcCJwP5m9piZDWyS6GIUCtBgKIGKSDwyNSI9Qrhdbw+c7u7fNrOdgF+bmbv7eYlHGBPVgYpI3DIl0N3c/QQza0Oo+8TdFwPnmtl+iUcXo6qO9CqBikhMMiXQ281sBmEe4uvTv3D3GYlFlYRoKGeJ6kBFJCb1JlB3/xPwpyaKJVlRHagrgYpITDI1Il1pZl3r+f4oMzsh/rASoLHwIhKzTLfws4B/m9kmwtj35YRJRPYE9gMmAlcnGmFcVAIVkZhluoV/lDDj0p7AwYTZmNYA/wDOd/eNyYcYk6gE6hVKoCISj6zGwrv7XGBuwrEky4wKSkBj4UUkJsUzIz1QTitKKrbkOwwRaSGKKoFuoQ0llUqgIhKPokqg5daaksrN+Q5DRFqIbJ6JVAacQHgm0k6kPRPJ3d9KNrx4baW1buFFJDaZ5gMdC4wEngdeBZYRujHtBVwTJdcfu/vMZMOMxxZrQ2lleb7DEJEWIlMJdKq7j63juxvMbHvCJMsFYau1ppXrFl5E4pGpH+h/6vrOzFq5+zJCqbQgVJS0VglURGKTaSjn5LTlv2/z9WuJRJSgcmtDK1cdqIjEI1MrfIe05f7bfGcxx5K4SmtFSaU60otIPDIlUM/xu2bJzCjAsEWkmcrUiLSdmZ1ISLTbmdlJ0XoDuiQaWRLMwJVARSQemRLoC8CotOWRad9NijMQM9sDuALo4u6nxHns6nOU4EqgIhKTTK3wZzfm4GZ2J6ET/jJ3H5C2/ljgj0Ap8H/ufo27vw+cY2YPNuacGeKhUrfwIhKTjEM5zazUzHqkfW5jZueb2Zwsjn8XcOy2xwNuAY4D+gFjzKxfg6LOlZVgrofKiUg8MnVjGg18Csw0sxfM7EjgfULyOz3Twd19UrR/uuHAPHd/3923APcBX8s24Ch5TzOzacuXL892t9TeqBFJROKSqQR6JTDE3XcCfgQ8CfzQ3U9099dzPOfOwEdpnxcBO5tZdzO7jfDs+Z/VtbO73+7uQ919aM+ePRt25oLreCUizVmmRqQt7j4PwN1fN7MF7j6+keesLY25u68ELmjksTMowdSIJCIxyZRAtzezS9M+d0z/7O435HDORcAuaZ97A4tzOE6DuYHpFl5EYpIpgd4BdKrncy6mAnua2e7Ax8Bo4JuNPGaWVAcqIvHJ1I3pV405uJmNA44AepjZIuAqd/+rmf0AeIrQjenOpptX1FQNKiKxyTQf6E31fe/uF2X4fkwd6x8HHs8YXexMt/AiEptMt/AXEGaff4BQT1nYBTiNhReRGGVKoL2AU4FvAFuB+4GH3P2zpANLhkqgIhKfevuBuvtKd7/N3Y8EzgK2A94ys281RXBxcyvsArSINC8ZHyoHYGaDgTHAV4AngOlJBpVFPCOBkX379m34vuoHKiIxyTSU81dmNh24lDAb01B3P8fd326S6Org7hPc/fwuXRo6o55u4UUkPplKoL8gjH0fFL2uDpMShw6V7j4w2fBipkYkEYlRpgS6e5NE0WTUD1RE4pMpgX7oGWYgNjPLtE2zYbqFF5H4ZJqN6Tkz+6GZ1Xj2ezQn6FFmdjfw7eTCi5tu4UUkPplKoMcC3wHGRWPXVwFlhCGYTwN/cPcZyYYYHzfdwotIfDKNhd8E3ArcamatgR7ARndf1RTBxU+38CISn6z6gQK4ezmwJMFYkqc6UBGJUcZnIomISO0KMoGa2Ugzu3316tUN3VMlUBGJTbZP5ZzYFMFkK+eRSLqFF5EYZUyg7l4BbDCzho6bbHacEiVQEYlNto1Im4BZZvYMsD61MtOEys2OSqAiEqNsE+h/oleBs9QgfkxT24lII2WVQN39bjNrA+wVrXo36tZUWKISqHs0r4iISCNkOx/oEcDdwELCeMhdzOzb7j4pudDiV1HSljK2UOmhNlREpDGyvYW/Hhjh7u8CmNlewDhgSFKBJaG8VQc6spHKSg+DUUVEGiHbfqCtU8kTwN3fA1onE1JyvG1nWlklGzesz7yxiEgG2ZZAp5nZX4G/R59PJ8+P9chFSVknANat/YwuXTrnORoRKXTZJtALge8DFxHqQCcRJhkpLG06AlCxaW2eAxGRliBjAjWzUuCv7n4GcEPyISXHLaqx8Mr8BiIiLUK2I5F6Rt2YmoVcx8Kn+n4WygT6ItK8ZXsLvxB4ycweo+ZIpLyUSN19AjBh6NCh5zVsT0sdIPaYRKT4ZJtAF0evEqBTcuEky5Q/RSRG2daBdnT3y5ognoRFt/AaDy8iMci2DnRwE8SSuOo6UDUiiUjjZXsLPyOq//wXNetAH04kqoToFl5E4pRtAu0GrASOSlvnQEEl0KpbeGVQEYlBtrMxnZ10IE2iagomJVARabx660DN7IG05d9t893TSQWVlKr0WakEKiKNl6kRac+05a9s813PmGNJXjQSSXfwIhKHTAm0vlRTcGmoJNWIVHihi0gzlKkOtL2Z7U9ItO2iZYte7ZIOLnZqhheRGGVKoEuonkDkE2pOJvJJIhElSh3pRSQ+9SZQdz+yqQJpElUFUCVQEWm8bGekb1Zyno1Jk4mISIwKMoG6+wR3P79Lly4N27GqFV4JVEQaryATaK6q+oEqf4pIDLJKoBacYWa/jD7vambDkw0tfqaRSCISo2xLoLcCBwFjos9rgVsSiShB6sUkInHKdjKRA9x9sJm9AeDunzWnR3xkT9PZiUh8si2BlkcTKzuAmfUECi8L6RZeRGKUbQK9CRgPbG9mvwUmA1cnFlVCUt2YKnUPLyIxyHY6u3vNbDpwNOE++OvuPifRyJKQ+u9CCVREYpBVAjWzPwL3u3vBNRylK6nqSJ/fOESkZcj2Fv514Eozm2dmvzezoUkGlZjUM5HyHIaItAxZJVB3v9vdjweGA+8BvzOzuYlGlgA9VE5E4tTQkUh9gS8CfYB3Yo+mqagIKiIxyHYkUqrE+WvgLWCIu49MNLIkWKoVXiVQEWm8bDvSLwAOcvcVSQaTNKtaUhFURBqv3gRqZl9093eA14BdzWzX9O/d/fUkg4udqRVeROKTqQR6KXA+cH0t3zk1nxPfZMxsJDCyb9++DdqvJDWdnTKoiMQg04z050eLx7n7pvTvzKwssagycPcJwIShQ4ee16AdNZ+diMQo21b4l7Nc16wZeqyxiMQnUx3ojsDO1HwiJ0BnoH3CscWvajo7tcKLSONlqgM9BjgL6E3NJ3KuBX6eUEyJUwFUROKQqQ70buBuMzvZ3R9qopgSUz0SSSlURBov29mYHjKzrwL9gbK09b9OKrAkpBKoKYGKSAyyHYl0G/AN4IeEmsRTgd0SjCsRpslERCRG2bbCf8ndzwQ+c/dfEZ6PtEtyYSXD9FhjEYlRtgl0Y/S+wcx2AsqB3ZMJKXlqhReROGQ7Fv7fZrYd8HvC3KAO/F9iUSXELPM2IiLZyrYR6TfR4kNm9m+gzN1XJxdWMvRYYxGJU6aO9CfV8x3u/nD8ISVIdaAiEqNMJdD65vx0oKASaOqpnKZ2eBGJQaaO9Gc3VSBNwTShsojEKNt+oDuY2V/N7Inocz8zOyfZ0JKg+UBFJD7ZdmO6C3gK2Cn6/B5wSRIBJUmNSCISp2wTaA93fwCoBHD3rUBFYlElxKonBM1rHCLSMmSbQNebWXeizGNmBwIF142JEk0mIiLxybYj/aXAY8AXzOwloCdhPHxB0UPlRCRO2Xakf93MDgf2JuShd929PNHI6pHrM5GsRP1ARSQ+2d7C4+5b3f0td58NHGFmzyQYV6ZYJrj7+V26dGnYjiXh/wur3JpAVCJSbOpNoGZ2lJm9Z2brzOwfUfelacA1wJ+bJsQYtQpTmZZUbslzICLSEmQqgV5PeKxxd+BB4BXg7+4+pOCGcQIlraO5oLduqn9DEZEsZKoDdXd/Plp+xMyWu/sfE44pMW3LwnPwKrcogYpI42VKoNttM6GIpX8utFJou/YdAKgo35hhSxGRzDIl0BeoOaFI+ueCm0ykNLqFVwlUROJQVJOJpBqRXHWgIhKDrLsxtQilranE8HIlUBFpvOJKoGZsoTWmOlARiUFxJVBgi5VhFSqBikjjZTsWHjP7EtAnfR93vyeBmBLV2ddwyLqn8x2GiLQAWSVQM/s78AVgBtXT2DlQcAkUoIzN+Q5BRFqAbEugQ4F+3gJm4Zja+St8Ye1UuuU7EBEpeNnWgc4GdkwykKayuU1X2rhKoCLSeNmWQHsAb5vZa1B9/+vuoxKJKkltO9LeN4Xnephl3l5EpA7ZJtCxSQbRlEradqTEnE0b1lLWoXO+wxGRApbthMovJB1IU2lV1hGAtWtWKYGKSKNk+1jjA81sajQv6BYzqzCzNUkHl4Q27cMkzGvXrMpzJCJS6LJtRLoZGAPMBdoB50brCk7b9p0A2LCuIPO/iDQjWXekd/d5Zlbq7hXA38zs5QTjSkxZ+3DbvmGdSqAi0jjZJtANZtYGmGFm1wJLgA7JhZWcdh3DLXybpTOBE/IbjIgUtGxv4b8VbfsDYD2wC3ByUkElqX2vvQDYfcG4PEciIoUu21b4D8ysHdDL3X+VcEyJ6tghFJy7bPwwz5GISKHLthV+JGEc/JPR5/3M7LEkA0tKSas2+Q5BRFqIbG/hxwLDgVUA7j6DMDNTXpjZSDO7ffXq1Q3fuaR1/AGJSFHKNoFudfccslUy3H2Cu5/fpUuXhu9cUnRToIpIQrJthZ9tZt8ESs1sT+AioCC7MYmIxCXb4tgPgf6EiUTGAWuAS5IKKmnvdRjCGjrmOwwRKXDZtsJvAK6IXgWvpE0HOq9fx9YPXqXVbgfkOxwRKVD1JtBMLe0FOZ0dsP3mDwAof+lmJVARyVmmEuhBwEeE2/ZXgZYxgWZZJ9gAW9avpl2+YxGRgpWpDnRH4OfAAOCPwFeAFe7+QiFPcbd+v/MAWNa+b54jEZFCVm8CdfcKd3/S3b8NHAjMA543sx82SXQJ6Tr4awB8srVTniMRkUKWsRXezNqa2UnAP4DvAzcBDycdWJLK2oUW+EMX3Agr5+c5GhEpVPUmUDO7m9DfczDwK3cf5u6/cfePmyS6pJSmjUYaNzp/cYhIQcvUiPQtwuxLewEXWfVD2Axwdy/4Z2J4xZYW0jImIk0tUx1oibt3il6d016dCj15Luh5NACVlOY5EhEpVEU7MLx9x5D/yzdvyHMkIlKoijaBdu1YBkBl+eYMW4qI1K5oE2ib/iMBWND6C3mOREQKVdEmUL74VQD6b5gKaz/JczAiUoiKN4Gmu37vfEcgIgVICVREJEfFnUC/P7V6eeLYvIUhIoWpuBNoz72qlyf/ASor8xeLiBSc4k6g27r9MCjfmO8oRKRAKIEeeWX18iez4L2n8heLiBQUJdCDL675+ePp+YlDRAqOEmirNvCztMmlXr4pf7GISEFRAgVou80TOsd2gc3rwB1m/gu2ariniHyeEmjKaffU/Py/O8O7j8PD58LEX+UnJhFp1pRAU/p9DTr0rLnuvm+G9zkTYPl7TR+TiDRrSqDpfjK39vWrP4RbhoVb+5dURyoigRJoOjPY7ZD6t3nmF1BRDpNvhDWLmyYuEWmWlEC3dcaDmbdZ/g5MvApu2Cf5eESk2VIC3VbrdtB55/q3ua2WUmplpW7xRYqMEmhtLpic/bY3DoTbDoVbhofPz/wCFr8Rlss3haT65n3xxygieacEWpv23WDsavjxe/CFo+rfdtUH8MlMWJnWAHX7EWGS5vefD5+fuSqpSEUkj5RA69NpB/jWeDjxLw3f9/q9Ydw3wnJlee3bzBgH61fmHp+I5JUSaDYGjQ4d7fc4Mrf9K7Z+ft2KufDIBTD+u42LTUTyplW+A8iFmY0ERvbt27fpTtrva+GVct/p8M6/s9t38+pwS99px/B51Yewcn5Y3vhp6A614j3Y44js41m/ErwSOvbMvK2IJMLcPd8x5Gzo0KE+bdq0/AWweS38cRBsyPI2/KAfwMGXwHV1JP7ew+CQH4UH3i1/Dzr3gradat92bJfofXXD4xaRepnZdHcfmmk73cI3RttO8D/vZ5/Eptxcd/IEWDS1evjoLcPgf3uHlnyAx34YkuaW9Y2LWURiowQal58tgjMehrP+0/hjpT9a5MZ94e3H4PVospOrd4LX/17PvhXhJSKJK8g60GapbSfoe3RYvmRWGO75p8G5HWvLuurl9cvggW/V/P6th6uXl7wJvQZVf75hHyhpDZe+ldu5RSRrKoEmYbtdofsXYMx9YXmPIxq2/zW71P/9/P9WL//lMFg4GZ6/Bqb+H6xbCmsWwYp54futm6sbrEQkVmpEaiofvw5zn4EO3eE/P07+fDvtD7seBHP+HWaTuvxDKOtS/f2SN0PSPfUumH43dOgBu32puqeASBHLthFJt/BNZefB4QUw4GSYdF1oVErK0rerh5RCKIlOuBim3wXfnxpKrgD/b/ua+33v1TCyasmbsEN/2O+btR+/Yis89TP48BW44MVELkGkuVMCzYd2XeGY30Kv/WCn/aDHniERbfgU7hsTzzkqtnkMyfJ3QvKE0MJfl1sPqPl5p8Ghv+t/fwPDzoOvXheS8baJV6QI6Ra+uakoB4uqpj94Cd4aDx+9Bktnw9FXwbN5frzI2NXw4vXw7K+r1512T81BBkn47APouluy5xCJqB9ooSptDSWl4bX7YXDCH+C7L8Jl78Ohl8IvP4Mjr4COO0LPLzZ9fC//qWbyBHjgzNBHtb6H7816EK7uHbbZtBru/xa883j95xp/ATz6/TApyx8HhmNAaCB7/LKa3b1E8kC38IWgpCQ0PqWWD/+f8HKHV26FvY6FLr3huavhpRvh8MvhhWuSieXpK+v+bv5/oXwDzHsWZtxbvX77/rAs6la15uNQlTDnsfDabrfwH8XXtqkP/ng6vDkuLJe2De+L34B9Twndupa9DUPOhh361dzPPRx37+PDf0bSMrmHfw877R+eJJEnuoVvqSorQxJasyg8pqS+EVBNqcsusPqjz6//zlPw1iNw7P9C+Ua4utfntxlyNkz/W/XnC18OI7VmPxTqlF+/JywveAEOuRS+XM80gpvXwgvXwlFXQqu2jb8ugI2rQk+Hhv5Br1sOM+8LQ33zkQxWfQQ3DgjL338Neu5d+3ZzJsCn78PBF4cEtmVd3UONkzbrQXjoHDj5r+E/1ZipFb7YlZTALsOAqMEoNdy0fCNggMMdR8GI38Ans2HYOWHoaKsyGDMO/n5iMnHVljwB7jwmvB/x05DcapOePKv2GwGVW2Hv42DCRdXrJ98As/4FbTqGRLr3cTX3e+F3oTqi624waExj6jnoAAAOLklEQVT4uXy2MNQ1DzkrbFO+MQxKKK3lz6R8IyybA6Vt4LaDq9eP+C186Qdhec4EeOrnIameMxFal9V+XePPD6X3BS/C8PNCPffof4Y+xE0hvbfG07+A0x+ofbv7zwjvB18c/rOacBH88PXQ5zllw6ehkbS+/wiWvQPrPml4/+h0K6Kn5K6o40GQTUQJtNi0ble9/L0p4b3vl8P7Lz8FLCTfK5aGetgVc+HPBzVdfL/rk/22n8wKyRPg7hM+/30qWT95efiDHzQG9joGVs6DrVvCdxXloUvXynnV+024GI6/Dh7/SZhQ+4yHw8TZL/0RvnpDmE1r4tgwImzPETXP+c5/4IDvwryJ1QkH4NXb4JBLar+OjZ+F97lPhRfArQeFEt4VnxD+w6NmAn71L9CpF/QblemnlFl6VYdnWa/8blR/veK96gS6Yh7cPCT87IafV/e+qZ4e2c4h4Z7X2/T6KIFKtZLS6uXUH+sO/eCnH4Tx9e22g7VLQiPQnAmhJHL3qFCSWDgZPny5aePNdi7VzxaG17uPw17HwXtPhJIlhORam8d/Et7n/zc0mk2+IXz+9P3qJw0AzH265n6lrcITW5/7fzXXT7yqOoHOnRh6Moy8Ebr3DQliW6nhvOuWwV8OBSuFny4I62b+C574n7BcXxL6bGGo4tg+Q2Ojpf3eV84L1T8lObQvfxqNeHvvyeoEWlkZStSDz6xZUt1W+cZQr73zkJrrJ10Xfp4/+6jhSXTeRPjHyfA/C8JTJhKgBCqZtduuerlL7/DaoX/4fO4z1d+9eH0oFe48JDQ2fXlsSDbpCSff3nsivNf1lIDapJInZL6WTas/nzxTxnaBsu1g06rwOfUcrfpUbAnHTFn+Ljx8bvXn//wEdjkA3rgHvnRRmLXr1LtC392X/xS26bZHOO/Rv4Rpd8KuB4b/CA+5NMzu9c9Tq4/32QKYdG0YQPHH/cIgiR36h5J6SmVlddIfNxpOvTskqzeiSW7mRf9BHPrj0P/4pRvD6+dLoE376uNs3Rzq6Xf7UniCw6boMTobVsD850Lc//1N2Hb+syEZfvV6ePP+uute134S3jv0DHcMEAaG7HFE5p91DtSIJMlIv+1avxIWvhh6CZz9RLjtvn6v8N3pD8Kk38POQ+GVW/IXb3N1yI9g8h/C8hVLQ0JJcgTbtnbcF77+Z3j4u9U9Kb48NlRhZJIeO4Qk9v4LwDY555sPwD9PC8un3h2qUFL/yWSyfT844cbQX3rYOXBz1O5zwAWhRLtgEnzrEfhCw54mkW0jkhKo5Ef5xlACSS/dbloDU26BVm2gfY/QSLF9f/juC2EwwV3Hh+2GnFU9qgrg0J/Ai9elff5xKAGJAOx7Gpx8R4N2UQKVli3VZQhCSXftUti8JkyGkrq9m/cs/OOksHzABWH9/P+G28aUwWeG46Rud6VlauCTG5RARSDU11VuDaXadOUbQ5etVDVDZWVogS5tFbri/PsSePvR8FTWnvtA245h5NTcp0LXqMVvwDFXh/6bb/wDjr0mtMAvrGVilV6DYLeDw6CHlO59a7b8S6I2XfEpZa1LM28YUQIVyYfN68Izssq6hIaX9If+VWyFR78Xnou1Q7/weeksWDStutUfQhXFLgeGp7Z22QV+NDvUJabqHU/7e/Uk25fMgnu+DifdEapD6pvEe8x9odHn2N/BvGdCY8+wc0PDS+oBiR13DH00G2L7fqG+sTlTCfTzlEClRVsyEzrvXD2Md9VHsF002faGT0OC7rRDzX3SG+8qK0Ld8W619ON1D9+nBgksnhFKxW07hq5PL1wThghvXhu2bd8t9H/94KXQ97V739DtrXWHUDXywJkhIR/649CKD3DVqjD4oe+XoeMOoaGn2x6h9D/1DthxUM0eC8O/GwYhLJkJi1//fD12/5NqPo0hvfHpgAvh42nhuWIlrar7B6dctapB3aCUQEUkP8o3he5XZZ1zP0ZlZUiWbTqEUWSp/xhWzg9dub4YNShOui4k5KN/UftxxnYJ/Vx/uVIJdFtKoCJSr81rw6CJuobR1kFj4UVEEp7sRPOBiojkSAlURCRHSqAiIjlSAhURyZESqIhIjpRARURypAQqIpIjJVARkRwpgYqI5EgJVEQkRwU9Ft7MlgMfNGCXHsCKhMLR+Zv3+Yv52vN9/kK89t3cvWemjQo6gTaUmU3LZoIAnb/lnb+Yrz3f52/J165beBGRHCmBiojkqNgS6O06f9Gev5ivPd/nb7HXXlR1oCIicSq2EqiISGyUQEVEclQ0CdTMjjWzd81snpldnsDxdzGz58xsjpm9ZWYXR+vHmtnHZjYjeh2fts/PonjeNbNjYohhoZnNis4zLVrXzcyeMbO50XvXaL2Z2U3R+WeaWT3Pw83q3HunXeMMM1tjZpckef1mdqeZLTOz2WnrGny9ZvbtaPu5ZvbtRpz792b2TnT88Wa2XbS+j5ltTPsZ3Ja2z5DodzYvii+rJ5/Vcf4G/6xz/buo4/z3p517oZnNSOL66/lba5LffQ3u3uJfQCkwH9gDaAO8CfSL+Ry9gMHRcifgPaAfMBb4SS3b94viaAvsHsVX2sgYFgI9tll3LXB5tHw58Lto+XjgCcCAA4FXY/55fwLsluT1A4cBg4HZuV4v0A14P3rvGi13zfHcI4BW0fLv0s7dJ327bY7zGnBQFNcTwHGNuPYG/awb83dR2/m3+f564JdJXH89f2tN8rtPfxVLCXQ4MM/d33f3LcB9wNfiPIG7L3H316PltcAcYOd6dvkacJ+7b3b3BcC8KM64fQ24O1q+G/h62vp7PHgF2M7MesV0zqOB+e5e3yixRl+/u08CPq3luA253mOAZ9z9U3f/DHgGODaXc7v70+6eeiD5K0Dv+o4Rnb+zu0/x8Bd9T1q8DT5/Per6Wef8d1Hf+aNS5GnAuPqOkev11/O31iS/+3TFkkB3Bj5K+7yI+pNbo5hZH2B/4NVo1Q+iW4c7U7cVCcXkwNNmNt3Mzo/W7eDuSyD8wwO2T/D8KaOp+cfTVNcPDb/epOL4DqHUk7K7mb1hZi+Y2aFpMS2K+dwN+Vknde2HAkvdfW7aukSuf5u/tSb/3RdLAq2tXiWR/ltm1hF4CLjE3dcAfwa+AOwHLCHc2iQV08HuPhg4Dvi+mR1WX6gJnB8zawOMAv4VrWrK6683tDrOF3scZnYFsBW4N1q1BNjV3fcHLgX+aWadEzh3Q3/WSf0OxlDzP9BErr+Wv7U6N63jPI2+/mJJoIuAXdI+9wYWx30SM2tN+IXe6+4PA7j7UnevcPdK4A6qb1Njj8ndF0fvy4Dx0bmWpm7No/dlSZ0/chzwursvjWJpsuuPNPR6Y40jaog4ATg9ui0lunVeGS1PJ9Q77hWdO/02v1HnzuFnHfvvwMxaAScB96fFFfv11/a3Rh5+98WSQKcCe5rZ7lEJaTTwWJwniOp9/grMcfcb0tan1yueCKRaLR8DRptZWzPbHdiTUKGe6/k7mFmn1DKhQWN2dJ5U6+K3gUfTzn9m1EJ5ILA6dfvTSDVKH011/Wkaer1PASPMrGt0yzsiWtdgZnYs8FNglLtvSFvf08xKo+U9CNf6fnT+tWZ2YPTv58y0eHM5f0N/1kn8XXwZeMfdq27N477+uv7WyMfvviEtToX8IrTEvUf43++KBI5/CKH4PxOYEb2OB/4OzIrWPwb0Stvniiied8my9bWe8+9BaEV9E3grdY1Ad+BZYG703i1ab8At0flnAUNj+Bm0B1YCXdLWJXb9hES9BCgnlCbOyeV6CfWV86LX2Y049zxCnVrq939btO3J0e/kTeB1YGTacYYSEt184Gai0YE5nr/BP+tc/y5qO3+0/i7ggm22jfX6qftvrUl+9+kvDeUUEclRsdzCi4jETglURCRHSqAiIjlSAhURyZESqIhIjpRAJTFmVmE1Z2iKbRYsCzP8zM68ZTLM7Agz+3e+zi/NQ6t8ByAt2kZ33y/fQTRHZlbq7hX5jkMaRyVQaXIW5or8nZm9Fr36Rut3M7Nno8kwnjWzXaP1O1iYX/PN6PWl6FClZnaHhTkhnzazdrWc6y4Lc0G+bGbvm9kp0foaJUgzu9nMzkqL72ozm2Jm08xssJk9ZWbzzeyCtMN3juJ628xuM7OSaP8R0b6vm9m/ojHbqeP+0swmA6fG/5OVpqYEKklqt80t/DfSvlvj7sMJo09ujNbdTJh2bCBhIo6bovU3AS+4+yDCHJRvRev3BG5x9/7AKsKIl9r0IoxeOQG4JsvYP3L3g4AXCaNrTiHMJfnrtG2GAz8G9iVM4nGSmfUArgS+7GFil2mECTRSNrn7Ie5+X5ZxSDOmW3hJUn238OPS3v8QLR9EmIgCwrDEa6PlowjjpIlue1dHY5cXuPuMaJvphIl7a/OIhwk23jazHbKMPTUmfBbQ0cO8k2vNbJNFM80Dr7n7+wBmNo6QpDcRJvd9KQzZpg0wJe249yMthhKo5IvXsVzXNrXZnLZcAXzuFr6W7VJTmG2l5h1YWR37VG6zfyXVfzfbxpeaIu0Zdx9TRyzr61gvBUi38JIv30h7T5XQXibMCARwOjA5Wn4WuBBC44uFuSQb6wOgXzRDURfCLPoNNTyayaiEcB2TCTPRH5xWr9vezPaKIV5phlQClSS1s+jBYpEn3T3Vlamtmb1K+E88VVq7CLjTzC4DlgNnR+svBm43s3MIJc0LCTMB5czdPzKzBwgz+swF3sjhMFMIdar7ApOA8e5eGTVGjTOzttF2VxJmPJIWRrMxSZMzs4WEKcVW5DsWkcbQLbyISI5UAhURyZFKoCIiOVICFRHJkRKoiEiOlEBFRHKkBCoikqP/Dw1aTl4eiN49AAAAAElFTkSuQmCC\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": 22, "metadata": { "ExecuteTime": { "end_time": "2018-09-11T05:20:18.681457Z", "start_time": "2018-09-11T05:20:18.464333Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[61 39 36 40 61 42 68 46]\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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7TY5OTkJmZmZU4BRh5ujTLqIiIiIiIiIiIjUhq4RERH5SvKeOJvNZkVEROThqY4+/Jw6jEdEREREREREREROHTYleWtO5ffyiPlcJXpFRERERERERETklHDVVVe1Xb58eWBNrBUTE9MtIyOj2ta4EyZMiDredV977bVmY8aMaXO85ynRKyIiIiIiIiIiIqeETz75ZGvv3r1L6+p6r732Wsu6upYSvSIiIiIiIiIiItLg5Ofn284666yO8fHxCZ06dUqcPHly0379+sUvXLgwGCA4OPi08ePHxyQmJnYZNGhQ3IIFC4L79esX36pVq24ffvhhYzi0unbo0KEd58yZE3rwtc4999wOiYmJXTp27Jj40ksvNQe48847Y8rKymydO3dOGDVqVDuASZMmhXfr1q1L586dE6699tq2TqcTgFdffbVZbGxs1759+8YvWrSo0R95vkr0ioiIiIiIiIiISIMzc+bMsKioqIqNGzeu/+2335Ivu+yy/KrHS0pKbEOHDi1ITk7eEBIS4nr88cdjfvrpp9TPPvts09NPPx1zPNf68MMP05KTkzesWrVq/dtvv90iMzPTPmnSpPSAgAB3SkrK+tmzZ29ZsWJF4IwZM8KTkpJSUlJS1ttsNuutt95qtnXrVr/nn38+etGiRSk//fRTampqatAfeb7V9pAQEREREREREREROVGxE+b2rq21056/aPnhxnv16lXy2GOPtR4/fnzMxRdfnDds2LDCqsf9/Pys0aNH5wMkJiaWBAQEuAMCAqx+/fqVpKen+x9PDC+88EKLuXPnNgHIzMz0S05ODoyKiiqqOmfevHmh69atC+7Ro0cXgNLSUltkZKRz4cKFIQMGDCiIjo52Alx22WW7U1NTj7uPsBK9IiIiIiIiIiIi0uB07969bMWKFes///zzxo899ljM/PnzD6jodTgcls3maXhgs9kICAiwAOx2Oy6Xy+yb43a7veeUlZUd0iFhzpw5oT/++GNoUlJSSmhoqLtfv37xJSUlh8yzLMtcccUVuyZOnJhedfyDDz5oYow54eer1g0iInLysiwoyAK3y9eRiIiIiIiISD2TlpbmFxoa6r7zzjt333fffVmrVq0KPt41OnToUJ6cnBzscrnYtGmT35o1a0IOnrN3715748aNXaGhoe6VK1cGrl692jvH4XBYZWVlBmDYsGH5c+bMaZqe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q3Ou5pzbB+wF1iySpuicm2tbPuB92577RnD/ALDFOTfunKsB24D1AM65FlA3s8Jh8iYiIiIiIoegH74QERERWb7wOr3Pw5+R+hTwHqAE3BSkeRMwDFzonGuY2XYgEzx3C3A1MIo/wxf8wPBHnXP/5xDvu2gaM9sI1NpWtYBskH45urexWF+xaWYx55x3kNdkF9me15XO69p2Gn8GtIiIiIiIPEOa0SsiIiKyfD8GXg1MOedazrkpoB//8g13BGn6gL1BkPcVwGltr/8ycA1+sPeWYN23gbeaWR7AzJ5lZiNd77uUNBHn3DT+9YMvCVZd0/b0HPBMZtFuBTY/g9ctKriEw4RzrnG0tikiIiIicipSoFdERERk+R4AhoA7u9bNBpc9APgicJGZ3YM/u/fhMKFzbgt+kHWXc248WPcd/Esr3GFmD+AHgDsCsUtJs4i3AZ8yszvwZ/jOBut/iP/ja+0/xrYUtwIvX0b6w3kFcNtR3J6IiIiIyCnJnHMrnQcREREROUbMLO+cmw8evxdY65x71xFsby3wOefc5Ucpf18F3uec23o0ticiIiIicqrSNXpFRERETm6vMrP34ff7ngR+70g25pwbN7N/MLNe51zpSLZlZingawryioiIiIgcOc3oFREREREREREREVnldI1eERERERERERERkVVOgV4RERERERERERGRVU6BXhEREREREREREZFVToFeERERERERERERkVVOgV4RERERERERERGRVU6BXhEREREREREREZFV7v8DJZrnhqiffOMAAAAASUVORK5CYII=\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", "\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", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Inverse scattering " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-09-06T10:51:07.996778Z", "start_time": "2018-09-06T10:49:19.324Z" } }, "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-09-06T10:51:07.997455Z", "start_time": "2018-09-06T10:49:19.326Z" }, "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": 1, "metadata": { "ExecuteTime": { "end_time": "2018-09-08T09:40:51.323101Z", "start_time": "2018-09-08T09:40:50.155098Z" }, "hidden": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using MXNet backend\n", "/home/hegder/anaconda3/envs/deep/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96, got 88\n", " return f(*args, **kwds)\n", "/home/hegder/anaconda3/envs/deep/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96, got 88\n", " return f(*args, **kwds)\n" ] }, { "ename": "NameError", "evalue": "name 'naive_percent_loss' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\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 34\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 35\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 36\u001b[0;31m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mloss\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnaive_percent_loss\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptimizer\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'adam'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmetrics\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcalc_mre_K\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 37\u001b[0m \u001b[0;31m#model.summary()\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mNameError\u001b[0m: name 'naive_percent_loss' is not defined" ] } ], "source": [ "\n", "from keras.models import Model\n", "from keras.layers import Input, Add, Lambda, Dense\n", "import numpy as np\n", "\n", "\n", "def dropper(x):\n", " ms = 4\n", " #print(x.shape)\n", " \n", " \n", " \n", " return x**2\n", "# msk = np.array([1,1,1,1,0,0,0,0])\n", "\n", "\n", "a = Input(shape=(1,))\n", "b = Dense(8, input_dim=1, kernel_initializer='normal', activation='linear', \n", " name='dummy', use_bias=False)(a)\n", "b = Lambda(dropper)(b)\n", "b = Dense(256)(b)\n", "# #b = Lambda()\n", "# a = Lambda(dropper)(a)\n", "# \n", "\n", "model = Model(inputs=a, outputs=b)\n", "\n", "# model = Sequential()\n", "# model.add(Dense(256, input_dim=8))\n", "# #model.add(Lambda(lambda x: x**2))\n", "# model.add(Lambda(dropper))\n", "# model.add(Dense(256))\n", "\n", "\n", "\n", "model.compile(loss=naive_percent_loss, optimizer='adam', metrics=[calc_mre_K])\n", "#model.summary()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-09-08T07:43:32.243716Z", "start_time": "2018-09-08T07:43:32.234126Z" }, "hidden": true }, "outputs": [], "source": [ "a" ] }, { "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 }