├── CNN ├── CNN1D.ipynb ├── CNN1D_Optimize.ipynb ├── CNN1D_v1.0.json └── readme.md ├── CNN1D_Optimize v0.3.ipynb ├── LSTM └── LSTM_Autoencoder.ipynb └── README.md /CNN/CNN1D.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "CNN1D.ipynb", 7 | "version": "0.3.2", 8 | "provenance": [], 9 | "include_colab_link": true 10 | }, 11 | "kernelspec": { 12 | "name": "python3", 13 | "display_name": "Python 3" 14 | }, 15 | "accelerator": "GPU" 16 | }, 17 | "cells": [ 18 | { 19 | "cell_type": "markdown", 20 | "metadata": { 21 | "id": "view-in-github", 22 | "colab_type": "text" 23 | }, 24 | "source": [ 25 | "\"Open" 26 | ] 27 | }, 28 | { 29 | "metadata": { 30 | "id": "ontfmefnFpH9", 31 | "colab_type": "code", 32 | "outputId": "7fa6d14c-f279-4626-c873-a9e98f6f5a75", 33 | "colab": { 34 | "base_uri": "https://localhost:8080/", 35 | "height": 1962 36 | } 37 | }, 38 | "cell_type": "code", 39 | "source": [ 40 | "#Additional Packages to Install\n", 41 | "# !pip install pydrive\n", 42 | "# !pip install git+https://github.com/hyperopt/hyperopt.\n", 43 | "# !pip install kopt\n", 44 | "# !pip install oauth2client\n", 45 | "# !pip install tensorboardcolab\n", 46 | "\n", 47 | "import numpy as np\n", 48 | "import matplotlib.pyplot as plt\n", 49 | "import tensorflow as tf\n", 50 | "from tensorboardcolab import *\n", 51 | "import pydrive\n", 52 | "from keras.layers import Dense,Conv1D,RepeatVector,TimeDistributed,Input\n", 53 | "from keras.layers import Conv1D,MaxPooling1D,UpSampling1D\n", 54 | "from keras.layers import Activation,BatchNormalization\n", 55 | "from keras.models import Model,Sequential\n", 56 | "from keras.optimizers import RMSprop\n", 57 | "from sklearn.preprocessing import MinMaxScaler\n", 58 | "from pydrive.auth import GoogleAuth\n", 59 | "from pydrive.drive import GoogleDrive\n", 60 | "from google.colab import auth\n", 61 | "from oauth2client.client import GoogleCredentials\n", 62 | "from kopt import CompileFN, KMongoTrials, test_fn\n", 63 | "from hyperopt import fmin, tpe, hp, STATUS_OK, Trials\n", 64 | "\n", 65 | "\n", 66 | "#Authenticate/Create PyDrive client \n", 67 | "# auth.authenticate_user()\n", 68 | "# gauth = GoogleAuth()\n", 69 | "# gauth.credentials = GoogleCredentials.get_application_default()\n", 70 | "# drive = GoogleDrive(gauth)\n", 71 | "\n", 72 | "\n", 73 | "\n", 74 | "\n", 75 | "tbc=TensorBoardColab()\n", 76 | "batch_size = 1000\n", 77 | "\n", 78 | "\n", 79 | "def create_data():\n", 80 | " length = 1\n", 81 | " dt = 0.0005\n", 82 | " noise_factor = 0.35\n", 83 | " data = []\n", 84 | " data_noisy = []\n", 85 | " for i in range(batch_size):\n", 86 | " freq = 30*np.random.random() + 1\n", 87 | " t = np.arange(0,length,dt)\n", 88 | " #signal = np.arange(-0.5*length,0.5*length,dt)\n", 89 | " signal = np.sin(2*np.pi*freq*t)\n", 90 | " noisy_signal = signal+noise_factor*np.random.rand(len(t))\n", 91 | " data.append(signal)\n", 92 | " data_noisy.append(noisy_signal)\n", 93 | " data = np.array(data)\n", 94 | " data_noisy = np.array(data_noisy)\n", 95 | " return t,data, data_noisy\n", 96 | "#Create Test/Train Data\n", 97 | "t,signal,signal_noisy = create_data()\n", 98 | "\n", 99 | "#Scale Data - Need a better scaler than MinMaxScaler\n", 100 | "scaler = MinMaxScaler(feature_range = (0,1))\n", 101 | "data = np.vstack((signal,signal_noisy))\n", 102 | "data = scaler.fit_transform(data)\n", 103 | "signal = data[0:batch_size][:]\n", 104 | "signal_noisy = data[batch_size:2*batch_size][:]\n", 105 | "\n", 106 | "#Prediction Data\n", 107 | "x_pred = signal_noisy[0][:]\n", 108 | "#Pre Autoencoder\n", 109 | "x_pred_pre = signal_noisy[0] \n", 110 | "x_pred_pre = x_pred_pre.reshape((-1,len(x_pred_pre)))\n", 111 | "x_pred_pre = scaler.inverse_transform(x_pred_pre)\n", 112 | "#Clean\n", 113 | "clean_signal = signal[0][:]\n", 114 | "clean_signal = clean_signal.reshape((-1,len(clean_signal)))\n", 115 | "clean_signal = scaler.inverse_transform(clean_signal)\n", 116 | "\n", 117 | "#Input Shaping\n", 118 | "features = 1\n", 119 | "timesteps = len(signal[0])\n", 120 | "shape = (batch_size,timesteps,features)\n", 121 | "#Input shape should equal [samples, timesteps, features]\n", 122 | "x = signal.reshape(shape)\n", 123 | "y = signal_noisy.reshape(shape)\n", 124 | "#x_pred = x_pred.reshape(1,timesteps,features)\n", 125 | "\n", 126 | "\n", 127 | "#A custom loss function may work better than some \n", 128 | "#of the loss functionss provided by Keras\n", 129 | "#Here is a loss function from Hvass Labs that\n", 130 | "#invokes a warmup period\n", 131 | "warmup_steps = 10\n", 132 | "def loss_mse_warmup(y_true, y_pred):\n", 133 | " \n", 134 | "\n", 135 | " \n", 136 | " y_true_slice = y_true[:, warmup_steps:, :]\n", 137 | " y_pred_slice = y_pred[:, warmup_steps:, :]\n", 138 | "\n", 139 | " # These sliced tensors both have this shape:\n", 140 | " # [batch_size, sequence_length - warmup_steps, num_y_signals]\n", 141 | "\n", 142 | " # Calculate the MSE loss for each value in these tensors.\n", 143 | " # This outputs a 3-rank tensor of the same shape.\n", 144 | " loss = tf.losses.mean_squared_error(labels=y_true_slice,\n", 145 | " predictions=y_pred_slice)\n", 146 | "\n", 147 | " # Keras may reduce this across the first axis (the batch)\n", 148 | " # but the semantics are unclear, so to be sure we use\n", 149 | " # the loss across the entire tensor, we reduce it to a\n", 150 | " # single scalar with the mean function.\n", 151 | " loss_mean = tf.reduce_mean(loss)\n", 152 | "\n", 153 | " return loss_mean\n", 154 | "\n", 155 | "#For Optimization\n", 156 | "def create_autoencoder(inputs,params):\n", 157 | " encoded = inputs\n", 158 | " encoded_filter_range = np.linspace(params['max_filters'],params['min_filters']\n", 159 | " ,params['layers'])\n", 160 | " \n", 161 | " for num_filters in encoded_filter_range: \n", 162 | " encoded = Conv1D(num_filters,params['kernel_size'],padding = 'same')(encoded)\n", 163 | " \n", 164 | " if(num_filters==max_filters):\n", 165 | " encoded = BatchNormalization()(encoded)\n", 166 | " \n", 167 | " encoded = Activation('relu')(encoded)\n", 168 | " encoded = MaxPooling1D(2,padding = 'same')(encoded)\n", 169 | " \n", 170 | " decoded_filter_range = np.linspace(min_filters,max_filters,layers)\n", 171 | " for num_filters in decoded_filter_range: \n", 172 | " encoded = Conv1D(num_filters,params['kernel_size'],padding = 'same')(encoded)\n", 173 | " \n", 174 | " encoded = Activation('relu')(encoded)\n", 175 | " encoded = UpSampling1D(2)(encoded)\n", 176 | " \n", 177 | " decoded = Conv1D(1,params['kernel_size'],activation = 'sigmoid',padding = 'same')(encoded)\n", 178 | " \n", 179 | " autoencoder = Model(inputs,decoded)\n", 180 | " \n", 181 | " return autoencoder\n", 182 | "\n", 183 | "\n", 184 | "#NOT THE OPTIMIZED MODEL\n", 185 | "def create_Conv1D():\n", 186 | " inputs = Input(shape = (timesteps,features))\n", 187 | " \n", 188 | " encoded = Conv1D(32,3, padding = 'same')(inputs)\n", 189 | " encoded = BatchNormalization()(encoded)\n", 190 | " encoded = Activation('relu')(encoded)\n", 191 | " encoded = MaxPooling1D(2,padding = 'same')(encoded)\n", 192 | " \n", 193 | " \n", 194 | " encoded = Conv1D(16,3,padding = 'same')(encoded)\n", 195 | " encoded = Activation('relu')(encoded)\n", 196 | " encoded = MaxPooling1D(2,padding = 'same')(encoded)\n", 197 | " \n", 198 | " encoded = Conv1D(8,3, padding = 'same')(encoded)\n", 199 | " encoded = Activation('relu')(encoded)\n", 200 | " encoded = MaxPooling1D(2,padding = 'same')(encoded)\n", 201 | " \n", 202 | " \n", 203 | " decoded = Conv1D(8,3,padding = 'same')(encoded)\n", 204 | " decoded = Activation('relu')(decoded)\n", 205 | " decoded = UpSampling1D(2)(decoded)\n", 206 | " \n", 207 | " decoded = Conv1D(16,3, padding = 'same')(decoded)\n", 208 | " decoded = Activation('relu')(decoded)\n", 209 | " decoded = UpSampling1D(2)(decoded)\n", 210 | " \n", 211 | " decoded = Conv1D(32,3,padding = 'same')(decoded)\n", 212 | " decoded = Activation('relu')(decoded)\n", 213 | " decoded = UpSampling1D(2)(decoded)\n", 214 | " \n", 215 | " decoded = Conv1D(1,3,activation = 'sigmoid',padding = 'same')(decoded)\n", 216 | " \n", 217 | " autoencoder = Model(inputs,decoded)\n", 218 | " \n", 219 | " return autoencoder\n", 220 | "\n", 221 | "\n", 222 | "\n", 223 | "\n", 224 | "\n", 225 | "def nn_predict(model,prediction_data):\n", 226 | " pad_length = timesteps-(np.size(prediction_data)%timesteps)\n", 227 | " if pad_length != timesteps:\n", 228 | " prediction_data = np.pad(prediction_data,[(0,0),(0,pad_length)],\n", 229 | " mode = 'constant', constant_values = 0)\n", 230 | " \n", 231 | " prediction_data = prediction_data.reshape((-1,timesteps))\n", 232 | " \n", 233 | " predicted_data = []\n", 234 | " \n", 235 | " for i in range(np.size(prediction_data,0)):\n", 236 | " pred_part = prediction_data[i].reshape(1,timesteps,features) \n", 237 | " pred_part = model.predict(pred_part)\n", 238 | " predicted_data.append(pred_part)\n", 239 | " \n", 240 | " predicted_data = (np.array(predicted_data)).flatten()\n", 241 | " \n", 242 | " predicted_data = predicted_data.reshape(-1,len(predicted_data))\n", 243 | " predicted_data = scaler.inverse_transform(predicted_data)\n", 244 | " return predicted_data\n", 245 | "\n", 246 | "\n", 247 | "\n", 248 | "#NN HyperParameters\n", 249 | "epochs = 1\n", 250 | "optimizer = RMSprop(lr=1e-3)\n", 251 | "\n", 252 | "\n", 253 | "#NN Fitting\n", 254 | "autoencoder = create_Conv1D()\n", 255 | "autoencoder.compile(optimizer = optimizer, loss = 'mse')\n", 256 | "autoencoder.summary()\n", 257 | "\n", 258 | "autoencoder.fit(y,x,epochs=epochs, verbose = 0,\n", 259 | " callbacks=[TensorBoardColabCallback(tbc)])\n", 260 | "\n", 261 | "\n", 262 | "\n", 263 | "#Prediction Data\n", 264 | "prediction = nn_predict(autoencoder,x_pred).flatten()\n", 265 | "\n", 266 | " \n", 267 | "#Plot Prediction \n", 268 | "fig = plt.figure()\n", 269 | "ax = plt.subplot(111)\n", 270 | "ax.plot(t,prediction,label = 'Denoised Signal')\n", 271 | "ax.plot(t,clean_signal.flatten(), label = 'Clean Signal')\n", 272 | "ax.plot(t,x_pred_pre.flatten(), label = 'Noisy Signal')\n", 273 | "plt.xlim(0,0.25)\n", 274 | "ax.legend(loc = 3)\n", 275 | " \n", 276 | " \n", 277 | "#Save Model to Google Drive\n", 278 | "# autoencoder.save('model.h5', include_optimizer=False)\n", 279 | "# model_file = drive.CreateFile({'title' : 'CNN1D_v1.0.h5'})\n", 280 | "# model_file.SetContentFile('model.h5')\n", 281 | "# model_file.Upload()\n", 282 | "# drive.CreateFile({'id': model_file.get('id')})\n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " " 289 | ], 290 | "execution_count": 2, 291 | "outputs": [ 292 | { 293 | "output_type": "stream", 294 | "text": [ 295 | "Requirement already satisfied: pydrive in /usr/local/lib/python3.6/dist-packages (1.3.1)\n", 296 | "Requirement already satisfied: google-api-python-client>=1.2 in /usr/local/lib/python3.6/dist-packages (from pydrive) (1.6.7)\n", 297 | "Requirement already satisfied: oauth2client>=4.0.0 in /usr/local/lib/python3.6/dist-packages (from pydrive) (4.1.3)\n", 298 | "Requirement already satisfied: PyYAML>=3.0 in /usr/local/lib/python3.6/dist-packages (from pydrive) (3.13)\n", 299 | "Requirement already satisfied: httplib2<1dev,>=0.9.2 in /usr/local/lib/python3.6/dist-packages (from google-api-python-client>=1.2->pydrive) (0.11.3)\n", 300 | "Requirement already satisfied: uritemplate<4dev,>=3.0.0 in /usr/local/lib/python3.6/dist-packages (from google-api-python-client>=1.2->pydrive) (3.0.0)\n", 301 | "Requirement already satisfied: six<2dev,>=1.6.1 in /usr/local/lib/python3.6/dist-packages (from google-api-python-client>=1.2->pydrive) (1.11.0)\n", 302 | "Requirement already satisfied: pyasn1-modules>=0.0.5 in /usr/local/lib/python3.6/dist-packages (from oauth2client>=4.0.0->pydrive) (0.2.2)\n", 303 | "Requirement already satisfied: rsa>=3.1.4 in /usr/local/lib/python3.6/dist-packages (from oauth2client>=4.0.0->pydrive) (4.0)\n", 304 | "Requirement already satisfied: pyasn1>=0.1.7 in /usr/local/lib/python3.6/dist-packages (from oauth2client>=4.0.0->pydrive) (0.4.4)\n", 305 | "Collecting git+https://github.com/hyperopt/hyperopt.\n", 306 | " Cloning https://github.com/hyperopt/hyperopt. to /tmp/pip-req-build-4t8air2a\n", 307 | "fatal: could not read Username for 'https://github.com': No such device or address\n", 308 | "\u001b[31mCommand \"git clone -q https://github.com/hyperopt/hyperopt. /tmp/pip-req-build-4t8air2a\" failed with error code 128 in None\u001b[0m\n", 309 | "Collecting kopt\n", 310 | " Downloading https://files.pythonhosted.org/packages/a7/e2/650da402870396bcf6660e98e55499f6ec7d05c8443f3bfb2c0e64dda172/kopt-0.1.0.tar.gz\n", 311 | "Requirement already satisfied: future in /usr/local/lib/python3.6/dist-packages (from kopt) (0.16.0)\n", 312 | "Requirement already satisfied: pyyaml in /usr/local/lib/python3.6/dist-packages (from kopt) (3.13)\n", 313 | "Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from kopt) (1.14.6)\n", 314 | "Requirement already satisfied: pandas in /usr/local/lib/python3.6/dist-packages (from kopt) (0.22.0)\n", 315 | "Requirement already satisfied: scipy in /usr/local/lib/python3.6/dist-packages (from kopt) (1.1.0)\n", 316 | "Requirement already satisfied: scikit-learn>=0.18 in /usr/local/lib/python3.6/dist-packages (from kopt) (0.20.1)\n", 317 | "Requirement already satisfied: matplotlib in /usr/local/lib/python3.6/dist-packages (from kopt) (2.1.2)\n", 318 | "Requirement already satisfied: keras>=2.0.4 in /usr/local/lib/python3.6/dist-packages (from kopt) (2.2.4)\n", 319 | "Requirement already satisfied: hyperopt in /usr/local/lib/python3.6/dist-packages (from kopt) (0.1.1)\n", 320 | "Requirement already satisfied: pytz>=2011k in /usr/local/lib/python3.6/dist-packages (from pandas->kopt) (2018.7)\n", 321 | "Requirement already satisfied: python-dateutil>=2 in /usr/local/lib/python3.6/dist-packages (from pandas->kopt) (2.5.3)\n", 322 | "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib->kopt) (0.10.0)\n", 323 | "Requirement already satisfied: six>=1.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib->kopt) (1.11.0)\n", 324 | "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->kopt) (2.3.0)\n", 325 | "Requirement already satisfied: h5py in /usr/local/lib/python3.6/dist-packages (from keras>=2.0.4->kopt) (2.8.0)\n", 326 | "Requirement already satisfied: keras-preprocessing>=1.0.5 in /usr/local/lib/python3.6/dist-packages (from keras>=2.0.4->kopt) (1.0.5)\n", 327 | "Requirement already satisfied: keras-applications>=1.0.6 in /usr/local/lib/python3.6/dist-packages (from keras>=2.0.4->kopt) (1.0.6)\n", 328 | "Requirement already satisfied: pymongo in /usr/local/lib/python3.6/dist-packages (from hyperopt->kopt) (3.7.2)\n", 329 | "Requirement already satisfied: networkx in /usr/local/lib/python3.6/dist-packages (from hyperopt->kopt) (2.2)\n", 330 | "Requirement already satisfied: decorator>=4.3.0 in /usr/local/lib/python3.6/dist-packages (from networkx->hyperopt->kopt) (4.3.0)\n", 331 | "Building wheels for collected packages: kopt\n", 332 | " Running setup.py bdist_wheel for kopt ... \u001b[?25l-\b \bdone\n", 333 | "\u001b[?25h Stored in directory: /root/.cache/pip/wheels/21/07/fb/61d6d91da2defece9f6f91aa94f4370fc920324e28eb9010a9\n", 334 | "Successfully built kopt\n", 335 | "Installing collected packages: kopt\n", 336 | "Successfully installed kopt-0.1.0\n", 337 | "Wait for 8 seconds...\n", 338 | "TensorBoard link:\n", 339 | "http://a5f902a5.ngrok.io\n", 340 | "_________________________________________________________________\n", 341 | "Layer (type) Output Shape Param # \n", 342 | "=================================================================\n", 343 | "input_1 (InputLayer) (None, 2000, 1) 0 \n", 344 | "_________________________________________________________________\n", 345 | "conv1d_1 (Conv1D) (None, 2000, 32) 128 \n", 346 | "_________________________________________________________________\n", 347 | "batch_normalization_1 (Batch (None, 2000, 32) 128 \n", 348 | "_________________________________________________________________\n", 349 | "activation_1 (Activation) (None, 2000, 32) 0 \n", 350 | "_________________________________________________________________\n", 351 | "max_pooling1d_1 (MaxPooling1 (None, 1000, 32) 0 \n", 352 | "_________________________________________________________________\n", 353 | "conv1d_2 (Conv1D) (None, 1000, 16) 1552 \n", 354 | "_________________________________________________________________\n", 355 | "activation_2 (Activation) (None, 1000, 16) 0 \n", 356 | "_________________________________________________________________\n", 357 | "max_pooling1d_2 (MaxPooling1 (None, 500, 16) 0 \n", 358 | "_________________________________________________________________\n", 359 | "conv1d_3 (Conv1D) (None, 500, 8) 392 \n", 360 | "_________________________________________________________________\n", 361 | "activation_3 (Activation) (None, 500, 8) 0 \n", 362 | "_________________________________________________________________\n", 363 | "max_pooling1d_3 (MaxPooling1 (None, 250, 8) 0 \n", 364 | "_________________________________________________________________\n", 365 | "conv1d_4 (Conv1D) (None, 250, 8) 200 \n", 366 | "_________________________________________________________________\n", 367 | "activation_4 (Activation) (None, 250, 8) 0 \n", 368 | "_________________________________________________________________\n", 369 | "up_sampling1d_1 (UpSampling1 (None, 500, 8) 0 \n", 370 | "_________________________________________________________________\n", 371 | "conv1d_5 (Conv1D) (None, 500, 16) 400 \n", 372 | "_________________________________________________________________\n", 373 | "activation_5 (Activation) (None, 500, 16) 0 \n", 374 | "_________________________________________________________________\n", 375 | "up_sampling1d_2 (UpSampling1 (None, 1000, 16) 0 \n", 376 | "_________________________________________________________________\n", 377 | "conv1d_6 (Conv1D) (None, 1000, 32) 1568 \n", 378 | "_________________________________________________________________\n", 379 | "activation_6 (Activation) (None, 1000, 32) 0 \n", 380 | "_________________________________________________________________\n", 381 | "up_sampling1d_3 (UpSampling1 (None, 2000, 32) 0 \n", 382 | "_________________________________________________________________\n", 383 | "conv1d_7 (Conv1D) (None, 2000, 1) 97 \n", 384 | "=================================================================\n", 385 | "Total params: 4,465\n", 386 | "Trainable params: 4,401\n", 387 | "Non-trainable params: 64\n", 388 | "_________________________________________________________________\n" 389 | ], 390 | "name": "stdout" 391 | }, 392 | { 393 | "output_type": "execute_result", 394 | "data": { 395 | "text/plain": [ 396 | "" 397 | ] 398 | }, 399 | "metadata": { 400 | "tags": [] 401 | }, 402 | "execution_count": 2 403 | }, 404 | { 405 | "output_type": "display_data", 406 | "data": { 407 | "image/png": "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\nF5OIOPWylQcAAAAASUVORK5CYII=\n", 408 | "text/plain": [ 409 | "" 410 | ] 411 | }, 412 | "metadata": { 413 | "tags": [] 414 | } 415 | } 416 | ] 417 | } 418 | ] 419 | } 420 | -------------------------------------------------------------------------------- /CNN/CNN1D_Optimize.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Copy of CNN1D Optimize.ipynb", 7 | "version": "0.3.2", 8 | "provenance": [], 9 | "private_outputs": true, 10 | "collapsed_sections": [], 11 | "include_colab_link": true 12 | }, 13 | "kernelspec": { 14 | "name": "python3", 15 | "display_name": "Python 3" 16 | }, 17 | "accelerator": "GPU" 18 | }, 19 | "cells": [ 20 | { 21 | "cell_type": "markdown", 22 | "metadata": { 23 | "id": "view-in-github", 24 | "colab_type": "text" 25 | }, 26 | "source": [ 27 | "\"Open" 28 | ] 29 | }, 30 | { 31 | "metadata": { 32 | "id": "ontfmefnFpH9", 33 | "colab_type": "code", 34 | "colab": {} 35 | }, 36 | "cell_type": "code", 37 | "source": [ 38 | "#Additional Packages to Install\n", 39 | "# !pip install pydrive\n", 40 | "# !pip install git+https://github.com/hyperopt/hyperopt.git\n", 41 | "# !pip install kopt\n", 42 | "# !pip install oauth2client\n", 43 | "# !pip install tensorboardcolab\n", 44 | "# !pip install pymongo\n", 45 | "# !pip install git+https://github.com/rthalley/dnspython.git\n", 46 | "# !pip install dnspython\n", 47 | "\n", 48 | "import numpy as np\n", 49 | "import pandas as pd\n", 50 | "import matplotlib.pyplot as plt\n", 51 | "import tensorflow as tf\n", 52 | "import pydrive\n", 53 | "import pymongo\n", 54 | "import dns\n", 55 | "from tensorboardcolab import *\n", 56 | "from random import randint\n", 57 | "from keras.layers import Dense,Conv1D,Input\n", 58 | "from keras.layers import MaxPooling1D,UpSampling1D\n", 59 | "from keras.layers import Activation,BatchNormalization\n", 60 | "from keras.models import Model\n", 61 | "from keras.optimizers import RMSprop\n", 62 | "from sklearn.preprocessing import MinMaxScaler\n", 63 | "from pydrive.auth import GoogleAuth\n", 64 | "from pydrive.drive import GoogleDrive\n", 65 | "from google.colab import auth\n", 66 | "from oauth2client.client import GoogleCredentials\n", 67 | "from kopt import CompileFN, KMongoTrials, test_fn\n", 68 | "from hyperopt import fmin, tpe, hp, STATUS_OK, Trials\n", 69 | "from hyperopt.mongoexp import MongoTrials\n", 70 | "from google.colab import drive\n", 71 | "\n", 72 | "\n", 73 | "\n", 74 | "\n", 75 | "\n", 76 | "\n", 77 | "#MongoTrials\n", 78 | "SRV_string = ''\n", 79 | "client = pymongo.MongoClient(SRV_string)\n", 80 | "client.test_database\n", 81 | "print(client)\n", 82 | "hostname = ''\n", 83 | "port = 27017\n", 84 | "\n", 85 | "\n", 86 | "\n", 87 | "\n", 88 | "\n", 89 | "# #Authenticate/Create PyDrive client \n", 90 | "# auth.authenticate_user()\n", 91 | "# gauth = GoogleAuth()\n", 92 | "# gauth.credentials = GoogleCredentials.get_application_default()\n", 93 | "# drive = GoogleDrive(gauth)\n", 94 | "\n", 95 | "#Altrnative Saving Method\n", 96 | "drive.mount('/content/gdrive')\n", 97 | "\n", 98 | " \n", 99 | "#tbc=TensorBoardColab()\n", 100 | "batch_size = 1000\n", 101 | "validation_split = 0.15\n", 102 | "timesteps = 2000\n", 103 | "features = 1\n", 104 | "global timesteps\n", 105 | "global fe#atures\n", 106 | "\n", 107 | "\n", 108 | "#Generate Test/Train Data\n", 109 | "def create_data(timesteps = 2000):\n", 110 | " length = 1\n", 111 | " dt = 0.0005\n", 112 | " noise_factor = 0.35\n", 113 | " data_1 = []\n", 114 | " data_noisy_1 = []\n", 115 | " for i in range(batch_size):\n", 116 | " freq = 30*np.random.random() + 1\n", 117 | " t = np.arange(0,length,dt)\n", 118 | " #signal = np.arange(-0.5*length,0.5*length,dt)\n", 119 | " signal = np.sin(2*np.pi*freq*t)\n", 120 | " noisy_signal = signal+noise_factor*np.random.rand(len(t))\n", 121 | " data_1.append(signal)\n", 122 | " data_noisy_1.append(noisy_signal)\n", 123 | " data_1 = np.array(data_1)\n", 124 | " data_noisy_1 = np.array(data_noisy_1)\n", 125 | " \n", 126 | " #Scale Data - Need a better scaler than MinMaxScaler\n", 127 | " scaler = MinMaxScaler(feature_range = (0,1))\n", 128 | " data_1 = np.vstack((data_1,data_noisy_1))\n", 129 | " data_1 = scaler.fit_transform(data_1)\n", 130 | " signal = data_1[0:batch_size][:]\n", 131 | " signal_noisy = data_1[batch_size:2*batch_size][:]\n", 132 | " \n", 133 | " #Input Shaping\n", 134 | " features = 1\n", 135 | " timesteps = len(signal[0])\n", 136 | " shape = (batch_size,timesteps,features)\n", 137 | " #Input shape should equal [samples, timesteps, features]\n", 138 | " x = signal.reshape(shape)\n", 139 | " y = signal_noisy.reshape(shape)\n", 140 | " \n", 141 | " split_point = int((1-validation_split)*batch_size)\n", 142 | " \n", 143 | " x_train = x[0:split_point,:,:]\n", 144 | " y_train = y[0:split_point,:,:]\n", 145 | " x_test = x[split_point:batch_size,:,:]\n", 146 | " y_test = y[split_point:batch_size][:]\n", 147 | "\n", 148 | " return (x_train,y_train,features),(x_test,y_test)\n", 149 | "\n", 150 | "def calculate_compressions_window_range(timesteps = 2000,window_size = 2,layers = 3,\n", 151 | " filter_spacing = None):\n", 152 | " window_range = []\n", 153 | " for i in range(layers):\n", 154 | " if timesteps%window_size != 0:\n", 155 | " if timesteps%2 == 0:\n", 156 | " tmp_window = 2\n", 157 | " elif timesteps%3 == 0:\n", 158 | " tmp_window = 3\n", 159 | " elif timesteps%5 == 0:\n", 160 | " tmp_window = 5\n", 161 | " elif timesteps%7 == 0:\n", 162 | " tmp_window = 7\n", 163 | " window_range.append(tmp_window)\n", 164 | " timesteps /= tmp_window\n", 165 | " else:\n", 166 | " window_range.append(window_size)\n", 167 | " timesteps /= window_size\n", 168 | " \n", 169 | " if filter_spacing == 'half':\n", 170 | " window_range = window_range[0:layers]\n", 171 | " \n", 172 | " \n", 173 | " return window_range \n", 174 | "\n", 175 | "def create_filter_range(filter_spacing,max_filters,min_filters,layers):\n", 176 | " #Linear Filter Range\n", 177 | " if filter_spacing == 'lin':\n", 178 | " filter_range = np.linspace(max_filters,min_filters,layers,\n", 179 | " dtype = 'int64')\n", 180 | " #Half Filter Range\n", 181 | " if filter_spacing == 'half':\n", 182 | " if max_filters%2 != 0:\n", 183 | " max_filters+=1\n", 184 | " if min_filters%2 != 0:\n", 185 | " min_filters+=1\n", 186 | " filter_range = [max_filters]\n", 187 | " x = max_filters\n", 188 | " while x> min_filters:\n", 189 | " x = x/2\n", 190 | " filter_range.append(x)\n", 191 | " if filter_range[-1] < min_filters:\n", 192 | " del filter_range[-1]\n", 193 | " filter_range = np.asarray(filter_range,dtype = 'int64')\n", 194 | " \n", 195 | " #Random Filter Range\n", 196 | " if filter_spacing == 'random':\n", 197 | " filter_range = [randint(min_filters, max_filters) for z in range(layers)]\n", 198 | " filter_range.sort(reverse= True)\n", 199 | " filter_range = np.asarray(filter_range)\n", 200 | " \n", 201 | " return filter_range\n", 202 | " \n", 203 | "\n", 204 | "#Gnerate Model For Optimization\n", 205 | "def create_autoencoder(train_data,max_filters = 32, min_filters = 8, layers = 3,\n", 206 | " kernel_size = 3,window_size = 2,filter_spacing = 'lin'):\n", 207 | " \n", 208 | " timesteps = 2000\n", 209 | " features = 1\n", 210 | " \n", 211 | " filter_range = create_filter_range(filter_spacing,max_filters,min_filters,\n", 212 | " layers)\n", 213 | " layers = len(filter_range)\n", 214 | " \n", 215 | " window_range = calculate_compressions_window_range(window_size = window_size,\n", 216 | " layers = layers)\n", 217 | " \n", 218 | " \n", 219 | " inputs = Input(shape = (timesteps,features),name = 'Input')\n", 220 | " encoded = inputs\n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " conv_name = ''\n", 225 | " count = 1\n", 226 | " for num_filters in filter_range: \n", 227 | " conv_name = 'Conv_Layer_No._{0}'.format(count)\n", 228 | " encoded = Conv1D(num_filters,kernel_size,padding = 'same',name = conv_name)(encoded)\n", 229 | " count+=1\n", 230 | " if(num_filters==max_filters):\n", 231 | " encoded = BatchNormalization()(encoded)\n", 232 | " \n", 233 | " encoded = Activation('relu')(encoded)\n", 234 | " encoded = MaxPooling1D(window_range[count-2],padding = 'same')(encoded)\n", 235 | " \n", 236 | " filter_range = np.sort(filter_range)\n", 237 | " for num_filters in filter_range: \n", 238 | " conv_name = 'Conv_Layer_No._{0}'.format(count)\n", 239 | " encoded = Conv1D(num_filters,kernel_size,padding = 'same',name = conv_name)(encoded)\n", 240 | " count+=1\n", 241 | " encoded = Activation('relu')(encoded)\n", 242 | " encoded = UpSampling1D(window_range[-(count-layers-1)])(encoded)\n", 243 | " \n", 244 | " decoded = Conv1D(1,kernel_size,activation = 'sigmoid',padding = 'same')(encoded)\n", 245 | " \n", 246 | " autoencoder = Model(inputs,decoded)\n", 247 | " autoencoder.summary()\n", 248 | " optimizer = RMSprop(lr=1e-3)\n", 249 | " autoencoder.compile(optimizer = optimizer, loss = 'mse')\n", 250 | " \n", 251 | " return autoencoder\n", 252 | "\n", 253 | "\n", 254 | "\n", 255 | "\n", 256 | "\n", 257 | "#HyperParameter Range\n", 258 | "hyper_params = {\n", 259 | " \"data\":{\n", 260 | " 'timesteps': 2000\n", 261 | " \n", 262 | " \n", 263 | " },\n", 264 | " \"model\":{\n", 265 | " \"max_filters\":hp.choice('mx_filters',np.arange(32,320,dtype = 'int32')),\n", 266 | " \"min_filters\":hp.choice('mn_filters',np.arange(4,32,dtype = 'int32')),\n", 267 | " 'layers':hp.choice('ly',np.arange(1,3,dtype = 'int32')),\n", 268 | " 'filter_spacing':hp.choice('fs',['lin','half'])\n", 269 | " \n", 270 | " },\n", 271 | " \"fit\":{\n", 272 | " 'epochs': 1,\n", 273 | " 'patience': 3\n", 274 | " }\n", 275 | "}\n", 276 | "\n", 277 | "\n", 278 | "\n", 279 | "#NN Evaluation\n", 280 | "db_name = 'Autoencoder'\n", 281 | "exp_name ='exp_1'\n", 282 | "objective = CompileFN(db_name,exp_name,\n", 283 | " data_fn = create_data,\n", 284 | " model_fn = create_autoencoder,\n", 285 | " loss_metric = 'loss',\n", 286 | " loss_metric_mode = 'min',\n", 287 | " valid_split = None,\n", 288 | " save_model = 'best',\n", 289 | " save_results = True)\n", 290 | " \n", 291 | " \n", 292 | "\n", 293 | "\n", 294 | "# model_file.Upload()\n", 295 | "# drive.CreateFile({'id': model_file.get('id')})\n", 296 | "\n", 297 | "#test_fn(objective, hyper_params)\n", 298 | "trials = Trials()\n", 299 | "best = fmin(objective, hyper_params, trials=trials, algo=tpe.suggest, max_evals=2)\n", 300 | "\n", 301 | "trial_data = trials.results\n", 302 | "print(trial_data)\n", 303 | "\n", 304 | "val_loss = []\n", 305 | "loss = []\n", 306 | "filter_spacing = []\n", 307 | "max_filters = []\n", 308 | "min_filters = []\n", 309 | "layers = []\n", 310 | "for i in range(len(trial_data)):\n", 311 | " trial = trial_data[i]\n", 312 | " val_loss.append('%.6f'%(trial['history']['loss']['val_loss'][0])) \n", 313 | " loss.append('%.6f'%(trial['history']['loss']['loss'][0]))\n", 314 | " filter_spacing.append(trial['param']['model']['filter_spacing'])\n", 315 | " max_filters.append(trial['param']['model']['max_filters'])\n", 316 | " min_filters.append(trial['param']['model']['min_filters'])\n", 317 | " layers.append(trial['param']['model']['layers'])\n", 318 | "\n", 319 | "\n", 320 | "new_dict = {'val_loss':val_loss,'loss':loss,\n", 321 | " 'f_spacing':filter_spacing,'max_f':max_filters,'min_f':min_filters}\n", 322 | "\n", 323 | "data_frame = pd.DataFrame.from_dict(new_dict, orient='columns')\n", 324 | "print(data_frame)\n", 325 | " \n", 326 | "\n", 327 | "#Mongo Trials - Cont'd\n", 328 | "#trials = MongoTrials(SRV_string,exp_key = 'Optimization_1')\n", 329 | "#trials = MongoTrials('mongo://{0}:{1}/{2}/jobs'.format(hostname,port,db_name), exp_key='exp1')\n", 330 | "#trials = KMongoTrials(db_name, exp_name,\n", 331 | "# ip=hostname,\n", 332 | "# port=port)\n", 333 | "\n", 334 | "\n", 335 | "#Save Results to Google Drive\n", 336 | "\n", 337 | "with open('/content/gdrive/My Drive/Optimization_Results.txt', 'w') as f:\n", 338 | " f.write('{0}'.format(data_frame))\n", 339 | "!cat /content/gdrive/My\\ Drive/Optimization_Results.txt\n", 340 | "# model_file = drive.CreateFile({'title' : 'Optimization_Data.txt'})\n", 341 | "# model_file.SetContentFile(data_frame)\n", 342 | "# model_file.Upload()\n", 343 | "# drive.CreateFile({'id': model_file.get('id')})\n", 344 | "\n", 345 | "\n", 346 | " \n", 347 | "#Save Model to Google Drive\n", 348 | "# model_file = drive.CreateFile({'title' : 'CNN1D_v1.0.h5'})\n", 349 | "# model_file.SetContentFile('model.h5')\n", 350 | "# model_file.Upload()\n", 351 | "# drive.CreateFile({'id': model_file.get('id')})\n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " " 358 | ], 359 | "execution_count": 0, 360 | "outputs": [] 361 | } 362 | ] 363 | } 364 | -------------------------------------------------------------------------------- /CNN/CNN1D_v1.0.json: -------------------------------------------------------------------------------- 1 | { 2 | "architecture": { 3 | "backend": "tensorflow", 4 | "class_name": "Model", 5 | "config": { 6 | "input_layers": [ 7 | [ 8 | "input_1", 9 | 0, 10 | 0 11 | ] 12 | ], 13 | "layers": [ 14 | { 15 | "class_name": "InputLayer", 16 | "config": { 17 | "batch_input_shape": [ 18 | null, 19 | 2000, 20 | 1 21 | ], 22 | "dtype": "float32", 23 | "name": "input_1", 24 | "sparse": false 25 | }, 26 | "inbound_nodes": [], 27 | "name": "input_1" 28 | }, 29 | { 30 | "class_name": "Conv1D", 31 | "config": { 32 | "activation": "linear", 33 | "activity_regularizer": null, 34 | "bias_constraint": null, 35 | "bias_initializer": { 36 | "class_name": "Zeros", 37 | "config": {} 38 | }, 39 | "bias_regularizer": null, 40 | "data_format": "channels_last", 41 | "dilation_rate": [ 42 | 1 43 | ], 44 | "filters": 32, 45 | "kernel_constraint": null, 46 | "kernel_initializer": { 47 | "class_name": "VarianceScaling", 48 | "config": { 49 | "distribution": "uniform", 50 | "mode": "fan_avg", 51 | "scale": 1.0, 52 | "seed": null 53 | } 54 | }, 55 | "kernel_regularizer": null, 56 | "kernel_size": [ 57 | 3 58 | ], 59 | "name": "conv1d_1", 60 | "padding": "same", 61 | "strides": [ 62 | 1 63 | ], 64 | "trainable": true, 65 | "use_bias": true 66 | }, 67 | "inbound_nodes": [ 68 | [ 69 | [ 70 | "input_1", 71 | 0, 72 | 0, 73 | {} 74 | ] 75 | ] 76 | ], 77 | "name": "conv1d_1" 78 | }, 79 | { 80 | "class_name": "BatchNormalization", 81 | "config": { 82 | "axis": -1, 83 | "beta_constraint": null, 84 | "beta_initializer": { 85 | "class_name": "Zeros", 86 | "config": {} 87 | }, 88 | "beta_regularizer": null, 89 | "center": true, 90 | "epsilon": 0.001, 91 | "gamma_constraint": null, 92 | "gamma_initializer": { 93 | "class_name": "Ones", 94 | "config": {} 95 | }, 96 | "gamma_regularizer": null, 97 | "momentum": 0.99, 98 | "moving_mean_initializer": { 99 | "class_name": "Zeros", 100 | "config": {} 101 | }, 102 | "moving_variance_initializer": { 103 | "class_name": "Ones", 104 | "config": {} 105 | }, 106 | "name": "batch_normalization_1", 107 | "scale": true, 108 | "trainable": true 109 | }, 110 | "inbound_nodes": [ 111 | [ 112 | [ 113 | "conv1d_1", 114 | 0, 115 | 0, 116 | {} 117 | ] 118 | ] 119 | ], 120 | "name": "batch_normalization_1" 121 | }, 122 | { 123 | "class_name": "Activation", 124 | "config": { 125 | "activation": "relu", 126 | "name": "activation_1", 127 | "trainable": true 128 | }, 129 | "inbound_nodes": [ 130 | [ 131 | [ 132 | "batch_normalization_1", 133 | 0, 134 | 0, 135 | {} 136 | ] 137 | ] 138 | ], 139 | "name": "activation_1" 140 | }, 141 | { 142 | "class_name": "MaxPooling1D", 143 | "config": { 144 | "data_format": "channels_last", 145 | "name": "max_pooling1d_1", 146 | "padding": "same", 147 | "pool_size": [ 148 | 2 149 | ], 150 | "strides": [ 151 | 2 152 | ], 153 | "trainable": true 154 | }, 155 | "inbound_nodes": [ 156 | [ 157 | [ 158 | "activation_1", 159 | 0, 160 | 0, 161 | {} 162 | ] 163 | ] 164 | ], 165 | "name": "max_pooling1d_1" 166 | }, 167 | { 168 | "class_name": "Conv1D", 169 | "config": { 170 | "activation": "linear", 171 | "activity_regularizer": null, 172 | "bias_constraint": null, 173 | "bias_initializer": { 174 | "class_name": "Zeros", 175 | "config": {} 176 | }, 177 | "bias_regularizer": null, 178 | "data_format": "channels_last", 179 | "dilation_rate": [ 180 | 1 181 | ], 182 | "filters": 16, 183 | "kernel_constraint": null, 184 | "kernel_initializer": { 185 | "class_name": "VarianceScaling", 186 | "config": { 187 | "distribution": "uniform", 188 | "mode": "fan_avg", 189 | "scale": 1.0, 190 | "seed": null 191 | } 192 | }, 193 | "kernel_regularizer": null, 194 | "kernel_size": [ 195 | 3 196 | ], 197 | "name": "conv1d_2", 198 | "padding": "same", 199 | "strides": [ 200 | 1 201 | ], 202 | "trainable": true, 203 | "use_bias": true 204 | }, 205 | "inbound_nodes": [ 206 | [ 207 | [ 208 | "max_pooling1d_1", 209 | 0, 210 | 0, 211 | {} 212 | ] 213 | ] 214 | ], 215 | "name": "conv1d_2" 216 | }, 217 | { 218 | "class_name": "Activation", 219 | "config": { 220 | "activation": "relu", 221 | "name": "activation_2", 222 | "trainable": true 223 | }, 224 | "inbound_nodes": [ 225 | [ 226 | [ 227 | "conv1d_2", 228 | 0, 229 | 0, 230 | {} 231 | ] 232 | ] 233 | ], 234 | "name": "activation_2" 235 | }, 236 | { 237 | "class_name": "MaxPooling1D", 238 | "config": { 239 | "data_format": "channels_last", 240 | "name": "max_pooling1d_2", 241 | "padding": "same", 242 | "pool_size": [ 243 | 2 244 | ], 245 | "strides": [ 246 | 2 247 | ], 248 | "trainable": true 249 | }, 250 | "inbound_nodes": [ 251 | [ 252 | [ 253 | "activation_2", 254 | 0, 255 | 0, 256 | {} 257 | ] 258 | ] 259 | ], 260 | "name": "max_pooling1d_2" 261 | }, 262 | { 263 | "class_name": "Conv1D", 264 | "config": { 265 | "activation": "linear", 266 | "activity_regularizer": null, 267 | "bias_constraint": null, 268 | "bias_initializer": { 269 | "class_name": "Zeros", 270 | "config": {} 271 | }, 272 | "bias_regularizer": null, 273 | "data_format": "channels_last", 274 | "dilation_rate": [ 275 | 1 276 | ], 277 | "filters": 8, 278 | "kernel_constraint": null, 279 | "kernel_initializer": { 280 | "class_name": "VarianceScaling", 281 | "config": { 282 | "distribution": "uniform", 283 | "mode": "fan_avg", 284 | "scale": 1.0, 285 | "seed": null 286 | } 287 | }, 288 | "kernel_regularizer": null, 289 | "kernel_size": [ 290 | 3 291 | ], 292 | "name": "conv1d_3", 293 | "padding": "same", 294 | "strides": [ 295 | 1 296 | ], 297 | "trainable": true, 298 | "use_bias": true 299 | }, 300 | "inbound_nodes": [ 301 | [ 302 | [ 303 | "max_pooling1d_2", 304 | 0, 305 | 0, 306 | {} 307 | ] 308 | ] 309 | ], 310 | "name": "conv1d_3" 311 | }, 312 | { 313 | "class_name": "Activation", 314 | "config": { 315 | "activation": "relu", 316 | "name": "activation_3", 317 | "trainable": true 318 | }, 319 | "inbound_nodes": [ 320 | [ 321 | [ 322 | "conv1d_3", 323 | 0, 324 | 0, 325 | {} 326 | ] 327 | ] 328 | ], 329 | "name": "activation_3" 330 | }, 331 | { 332 | "class_name": "MaxPooling1D", 333 | "config": { 334 | "data_format": "channels_last", 335 | "name": "max_pooling1d_3", 336 | "padding": "same", 337 | "pool_size": [ 338 | 2 339 | ], 340 | "strides": [ 341 | 2 342 | ], 343 | "trainable": true 344 | }, 345 | "inbound_nodes": [ 346 | [ 347 | [ 348 | "activation_3", 349 | 0, 350 | 0, 351 | {} 352 | ] 353 | ] 354 | ], 355 | "name": "max_pooling1d_3" 356 | }, 357 | { 358 | "class_name": "Conv1D", 359 | "config": { 360 | "activation": "linear", 361 | "activity_regularizer": null, 362 | "bias_constraint": null, 363 | "bias_initializer": { 364 | "class_name": "Zeros", 365 | "config": {} 366 | }, 367 | "bias_regularizer": null, 368 | "data_format": "channels_last", 369 | "dilation_rate": [ 370 | 1 371 | ], 372 | "filters": 8, 373 | "kernel_constraint": null, 374 | "kernel_initializer": { 375 | "class_name": "VarianceScaling", 376 | "config": { 377 | "distribution": "uniform", 378 | "mode": "fan_avg", 379 | "scale": 1.0, 380 | "seed": null 381 | } 382 | }, 383 | "kernel_regularizer": null, 384 | "kernel_size": [ 385 | 3 386 | ], 387 | "name": "conv1d_4", 388 | "padding": "same", 389 | "strides": [ 390 | 1 391 | ], 392 | "trainable": true, 393 | "use_bias": true 394 | }, 395 | "inbound_nodes": [ 396 | [ 397 | [ 398 | "max_pooling1d_3", 399 | 0, 400 | 0, 401 | {} 402 | ] 403 | ] 404 | ], 405 | "name": "conv1d_4" 406 | }, 407 | { 408 | "class_name": "Activation", 409 | "config": { 410 | "activation": "relu", 411 | "name": "activation_4", 412 | "trainable": true 413 | }, 414 | "inbound_nodes": [ 415 | [ 416 | [ 417 | "conv1d_4", 418 | 0, 419 | 0, 420 | {} 421 | ] 422 | ] 423 | ], 424 | "name": "activation_4" 425 | }, 426 | { 427 | "class_name": "UpSampling1D", 428 | "config": { 429 | "name": "up_sampling1d_1", 430 | "size": 2, 431 | "trainable": true 432 | }, 433 | "inbound_nodes": [ 434 | [ 435 | [ 436 | "activation_4", 437 | 0, 438 | 0, 439 | {} 440 | ] 441 | ] 442 | ], 443 | "name": "up_sampling1d_1" 444 | }, 445 | { 446 | "class_name": "Conv1D", 447 | "config": { 448 | "activation": "linear", 449 | "activity_regularizer": null, 450 | "bias_constraint": null, 451 | "bias_initializer": { 452 | "class_name": "Zeros", 453 | "config": {} 454 | }, 455 | "bias_regularizer": null, 456 | "data_format": "channels_last", 457 | "dilation_rate": [ 458 | 1 459 | ], 460 | "filters": 16, 461 | "kernel_constraint": null, 462 | "kernel_initializer": { 463 | "class_name": "VarianceScaling", 464 | "config": { 465 | "distribution": "uniform", 466 | "mode": "fan_avg", 467 | "scale": 1.0, 468 | "seed": null 469 | } 470 | }, 471 | "kernel_regularizer": null, 472 | "kernel_size": [ 473 | 3 474 | ], 475 | "name": "conv1d_5", 476 | "padding": "same", 477 | "strides": [ 478 | 1 479 | ], 480 | "trainable": true, 481 | "use_bias": true 482 | }, 483 | "inbound_nodes": [ 484 | [ 485 | [ 486 | "up_sampling1d_1", 487 | 0, 488 | 0, 489 | {} 490 | ] 491 | ] 492 | ], 493 | "name": "conv1d_5" 494 | }, 495 | { 496 | "class_name": "Activation", 497 | "config": { 498 | "activation": "relu", 499 | "name": "activation_5", 500 | "trainable": true 501 | }, 502 | "inbound_nodes": [ 503 | [ 504 | [ 505 | "conv1d_5", 506 | 0, 507 | 0, 508 | {} 509 | ] 510 | ] 511 | ], 512 | "name": "activation_5" 513 | }, 514 | { 515 | "class_name": "UpSampling1D", 516 | "config": { 517 | "name": "up_sampling1d_2", 518 | "size": 2, 519 | "trainable": true 520 | }, 521 | "inbound_nodes": [ 522 | [ 523 | [ 524 | "activation_5", 525 | 0, 526 | 0, 527 | {} 528 | ] 529 | ] 530 | ], 531 | "name": "up_sampling1d_2" 532 | }, 533 | { 534 | "class_name": "Conv1D", 535 | "config": { 536 | "activation": "linear", 537 | "activity_regularizer": null, 538 | "bias_constraint": null, 539 | "bias_initializer": { 540 | "class_name": "Zeros", 541 | "config": {} 542 | }, 543 | "bias_regularizer": null, 544 | "data_format": "channels_last", 545 | "dilation_rate": [ 546 | 1 547 | ], 548 | "filters": 32, 549 | "kernel_constraint": null, 550 | "kernel_initializer": { 551 | "class_name": "VarianceScaling", 552 | "config": { 553 | "distribution": "uniform", 554 | "mode": "fan_avg", 555 | "scale": 1.0, 556 | "seed": null 557 | } 558 | }, 559 | "kernel_regularizer": null, 560 | "kernel_size": [ 561 | 3 562 | ], 563 | "name": "conv1d_6", 564 | "padding": "same", 565 | "strides": [ 566 | 1 567 | ], 568 | "trainable": true, 569 | "use_bias": true 570 | }, 571 | "inbound_nodes": [ 572 | [ 573 | [ 574 | "up_sampling1d_2", 575 | 0, 576 | 0, 577 | {} 578 | ] 579 | ] 580 | ], 581 | "name": "conv1d_6" 582 | }, 583 | { 584 | "class_name": "Activation", 585 | "config": { 586 | "activation": "relu", 587 | "name": "activation_6", 588 | "trainable": true 589 | }, 590 | "inbound_nodes": [ 591 | [ 592 | [ 593 | "conv1d_6", 594 | 0, 595 | 0, 596 | {} 597 | ] 598 | ] 599 | ], 600 | "name": "activation_6" 601 | }, 602 | { 603 | "class_name": "UpSampling1D", 604 | "config": { 605 | "name": "up_sampling1d_3", 606 | "size": 2, 607 | "trainable": true 608 | }, 609 | "inbound_nodes": [ 610 | [ 611 | [ 612 | "activation_6", 613 | 0, 614 | 0, 615 | {} 616 | ] 617 | ] 618 | ], 619 | "name": "up_sampling1d_3" 620 | }, 621 | { 622 | "class_name": "Conv1D", 623 | "config": { 624 | "activation": "sigmoid", 625 | "activity_regularizer": null, 626 | "bias_constraint": null, 627 | "bias_initializer": { 628 | "class_name": "Zeros", 629 | "config": {} 630 | }, 631 | "bias_regularizer": null, 632 | "data_format": "channels_last", 633 | "dilation_rate": [ 634 | 1 635 | ], 636 | "filters": 1, 637 | "kernel_constraint": null, 638 | "kernel_initializer": { 639 | "class_name": "VarianceScaling", 640 | "config": { 641 | "distribution": "uniform", 642 | "mode": "fan_avg", 643 | "scale": 1.0, 644 | "seed": null 645 | } 646 | }, 647 | "kernel_regularizer": null, 648 | "kernel_size": [ 649 | 3 650 | ], 651 | "name": "conv1d_7", 652 | "padding": "same", 653 | "strides": [ 654 | 1 655 | ], 656 | "trainable": true, 657 | "use_bias": true 658 | }, 659 | "inbound_nodes": [ 660 | [ 661 | [ 662 | "up_sampling1d_3", 663 | 0, 664 | 0, 665 | {} 666 | ] 667 | ] 668 | ], 669 | "name": "conv1d_7" 670 | } 671 | ], 672 | "name": "model_1", 673 | "output_layers": [ 674 | [ 675 | "conv1d_7", 676 | 0, 677 | 0 678 | ] 679 | ] 680 | }, 681 | "keras_version": "2.2.4" 682 | }, 683 | "average_pooling_2d_same_offset": false, 684 | "average_pooling_2d_valid_offset": false, 685 | "conv2d_same_offset_depth_1": false, 686 | "conv2d_same_offset_depth_2": false, 687 | "conv2d_valid_offset_depth_1": false, 688 | "conv2d_valid_offset_depth_2": false, 689 | "hash": "52eb9d5fb2ab23766f31d123e2d04aeb2f7217af4423aae720a314e08a24c709", 690 | "image_data_format": "channels_last", 691 | "input_shapes": [ 692 | [ 693 | 1, 694 | 1, 695 | 1, 696 | 2000, 697 | 1 698 | ] 699 | ], 700 | "max_pooling_2d_same_offset": false, 701 | "max_pooling_2d_valid_offset": false, 702 | "separable_conv2d_same_offset_depth_1": false, 703 | "separable_conv2d_same_offset_depth_2": false, 704 | "separable_conv2d_valid_offset_depth_1": false, 705 | "separable_conv2d_valid_offset_depth_2": false, 706 | "tests": [ 707 | { 708 | "inputs": [ 709 | { 710 | "shape": [ 711 | 1, 712 | 1, 713 | 1, 714 | 2000, 715 | 1 716 | ], 717 | "values": [ 718 | "rJafPpoMuT83gYg+tT3kPy4K876swIw+4BGPPu30BL+tsAO/rAIovyO0vL120La+hyopP6nYBb+VzBM/X0Scvwo+eD96u6U/kkheP/6xQ79KCXG+awAfvsixJT07eAq+yxLJvkjDmr9rdY8/GqMbPj2c6T/Syry9M3YgwBY1Sj/KygvAd23Sv5fXUr+sbzI+ooAEwN0+oL7ymRzAo5uZP2PpRD/9nH6/mSjwvvCUrr+qw7Q/VgPAPd2SOj/FvkU/qoYAQIZMT77p6uU/Cv6gP5kN7b8Fq2a+shrTv7rXgT5LlBm/xSJQv9Z+vz3o6bI/86GwPuxxaz9hhYs/Q48QvbsgTj8vzNA/GbozwGhEo790VZk/oEpAv3dI1r4yzxu/wkC1Pl++JD9Th28+r0EJvwPLs76X2ss+q5aAv57UC7/eDvG+AveGv8dv1T+yEAI/EH8+vw5XIb5GozQ+JhyuP4rnAL8xZqg/64qIP4UqM0CFpoW/e9ogPp/R0r4nTqG9ybADwCKAjL8A/8k+EJU3QAa2dT+Srd8+bjquvwq4lT7Gx4Y+QefRPxOuyD5XHtW/b+6PvyCGZb+VL+a9vz6gPw0LJ78uNNG+JXpKPxHthz6FMBm/O9YFv3+Y1L+ltXU/ljjGva0k4L/yg4q9NGPpPp83777QM/Y/iLU8v7vS+L4OzRu/MT2Bvi0GQb83iyw+RIl5vLGhWD4efqi/9UunvdWDzT4iXpW/7zFkv1higL/h15C/R5tdv7qiQz3CfcY8XjsWPlIkVL9sbAI/nua3v+v0wL9l07q/zrJHvxMosL7XmJ0/xrzJP1hZ3D3X0Wc/Qcw6v+EKMr/n1h4/E+9ov4Vntr2MWYM/WD5uPhCIUb/WTyK/kRIovEAuGb8uccM9I4ztvqPHwr2Ga8a9pn1pPxsSCcCaiB042NpKv2aBGb7oKuQ/mTkLP3t0oD78BeS+2ubHv5SoFD+/Jwa/jzy4v8wdjL/s0AO+NCQcvmdGAb/UjAc/n/2pv2QVjb2uqCE/", 719 | "NQw7PiYzor+Vz9m/BpQ0v1RENL9T04U/352yv4WrPL86Xxu9yz+Jv+bqWD8f7fY86b2oPoD+ib92b7U/RTUowNVpi7/dqQC/p/FEPxPMLr16kb4/VpEHvt8Uc79Z172+5QlEPpBCXT+jIru+QyI5vtZWVL8+rZg+bvN5v8LtK792Oxc/aD7VP6tt4T+E/Kg+U/PAv/XYYT9C+UI+q7w4v4sQNT9HwcC+ZIUBwOWK2z7MfZC6WcD2Pd/yAL9zPMS/xYMAPxFbJz7CU2c+8CEpPWFHnj8K4pg/PRRwP+taDL74V8G+Wdk3vxeGoL/9vR+/ufD9voG3jb9B+Q0/0ZXKvvv19L6NGwHA+oAvP0iREED4wMy//MogvXAlgL8XKaY9EhrEvSKvsjypS7q/c8lCPzIlkr9GatY+exsxP2NZnT5jhKo/zgf9vhziH0CptNa9E5WbPrBzlr/6UPq/3yw0vUnM2r5KAWA/CcJbvcP1sT+6EXe+K/KvP+HnhD5HvoS/FfxrPxsYEcDfH1a/Rr8FwEqiTr6SF9g9Duf0vrMoFb6hA5q+v8V/P43eq71fjj2/XEpgP0E6Vj4kD10+nFTcvltEyb1P8R9AuViQP5zzND96fhM/4JM+P84i2T9Kv2o+wDlHPOe+qj+7w3C+UYJqv0gjTj7GYsS/9+0KwIncLj+YjV+/SFnaPmFJhr31rD6/7bSEvwWv376jCnc/DD4xvmu5Ez8TQuO+wZG1vzAJPb7FVSc/R8V7v3KNab+Lc70+t6KCvtedDb6aHdm+v0bsvhTxsD7xhEO/DmfZv1vUKz+dsQ4+0rP4PgSthD8TNpm9App4v/t9qr6VN5k/W54Pv8Lcq76vyQ8/zx+wvrworb/8XII+7v8vvn1Eqb4HN04/oWwQv8bk6T8jwTS+0IKBPvehJb9JYn6/F162v9xtO78VEIw/Yxubv7MIiL5lcQFAI+VwP07G9D0zLmy/v81cP7keQj/8mUC+UmNDP+UStb/pZgi/Cf+JvnONqz+Y9mY/", 720 | "aTGSP7OwAT8+Qui/XZgjP9x8pD6HDVW+VdyOv3RgQb/8IKu/bw0XvG82Zz9hbYm/d4qjPpWQAj9p8RG9gmdLPhy7Xb+fRtk/oP0QPECCu79rt1q+wszAPxjh8b4c456+JDWVvtdx876enHo/qqXbvkK6CkDMaKE+R/ckvqjf/D/ZcLs/SFBGvJLWIb5VFQ3AvGoUvqOXbT4TdSq+58AtP1kxkj02wjs/ziVmv3ij1L9O1cw/YIhaPsidHT/fhTe/h7LRPafv9LxpB0G+zFnov3wsg79TKvQ+3mdRv/MDxD3TZA2/YBkuPREFFD74P62/kIQSvqS4Nj7pcsK/eb08vln1Br/pp5W/TT0FvwWUgb1/npm/TK+GP5PMWb8lty6/5nGRvnLZpL9ODGI/trxDPpsQ/L5/uOc/Q7blvqXp0L9EVQTAtFCDvik79D7uYYO/irY6P//5rj69cEg/RVEgv85aFz/j5V6/bhcwQHH2Kr6RGAW+AEWAPlKkmb4hR5M+XYl/vsCQ0j+viiE9tsywvq6Qk78eaHm/VYGcv5Htbj+fbxo/aLTAP18ePT/Ld3M/tI/4v7tSVb9W4XY9DvUcP3gsyL/vMYM/t6U3v6aImT8pZTe/ouydvomv2r5OUYY+nlJLP7Zvjr8Z0lQ+D/WRvx/9nr6oeVk+rCDZvj/QsT0L3oU+QESTv506jT8NTw0+mLngPtpaxj1B6+E6FrKlO2MPd7/g8Wg/4R1OP+d+tT51Ymw/ww0vP65aSr9LoRo/YkZiP9ALJL1tPJ8+mDrwv/V9CD2CVew89rYwPug/Hr1VkJ4+vYoXvlrcOb+W32M/V2WPP7YAGD/uBFm/KRkLwGmBI79jQXC/eXwjvzNJrL/gnCU+H/Kju9twOL/3aei9lv+dPx+TK75/GAs/6x2NvyxK9r+jWne+078kP666/j/F6mg+0hWovvRK4z8lvvA+Nbydv5Xl7z1nLDLAMrd4P7hYhz4n6OI+7FskwLTzXT7WJwVANR+5Pcg9Zz8tS4q/", 721 | "23UpP9cJWz/Xiom+LKkZPwp76b4bSzQ+21MSvvU48r8LXIc/y7vbv2CHVj6KYWq+b8uDvoe2IMCI5Ok/gMIZP/gOir8s7M8+VdHAv83X/r5hUpK90CsvvzShgz8rbiI/dSwiPv3NuD84SKE/PUcKv0jz8D/pIRw/4OaIv2SAoz84ft8/7P3Hvs8Cij/hlPg9LIeCvv4tWb9GfZE+Hv0Zv6hnzL4PW6U/ocKqP3/IfL9dvDa/iuLavsM1DMBLTJE/JFq6P4ABsT/hUdy/2k9pvuk3577Z4528J5ckvQFXwT3AeS497Okbvyo8Rb4XUay/M/+DPkczrb8wJhq/jpQev8eNo70B28i/SRUTQG8k4D5PdM6/tSoLP83DtT80e7A+yww8v4J/UT9m0Qs/s+A4P5gthj7bm7W/wuDzvfI0vj8Nyoy/+d8bPgV6BMAvH96+0UWjv4ewML+O+6M/u5VHv3v6ED+CWCA++VTBvjJPuz/5HaI/70GeP+wVZD8RlVE+izjov8nA0T94Mte+OUJev8WXkL/AaxQ/1eIQwGHCm7/JjRq/1Q4GPgHnPD92sPa+AXlvveJvhT4aVTo/Y2emP5pjjr9yMJQ/JdYNv2CNrL9ReTC/kjInvgdV7r98siS/fYI6v6Ky378z9Hk+16HJv8fjBL2OGXc9c5uYvj3y9r4eo8O/CRcGP29uRD7rRKe+J459PqCWBL6I0WG+tWYDv8MOnr8il7u9tZtBQPaVVL+zewG/VqV8P6t5GD6z8t0/WiOavjUtzb6rnNy/YE46u1Lls78gDHg8qhxSv2ZLGD9V7x0/TKeFP5+rHr7BqG++GXL7P057Sb+iwEc/LwA7vrOV2r6BIOS+I/JRP1MZzLxE7A2/whcVvmCptD69BCa96JnovjyGAj6hYYm/UjKHv3M+Tb+frlU87borPw3syj9nC4a/OY60vrOMhL4lIu++AKYYvxwOCkCLNnM+IzRtv8pJkj7BxbU/PQy5P8gQq7+yRe89zQMHv2IfgD4C+cq+", 722 | "4o8uP9hPur9EYBTAk6KQv6BGJD9nTqq9876QvmiEFUD6dZi/Rh/9vwucNT7xrUK+raNAvyspYL+cRkI+tnFPv2pAUj+G/6g+/OPzP1XiDj6EjYW+IwNNP+azWj8OcbM//HaiP5d45D6obbu+DlrQPjhxUD+odak9lRPJP5UHlL9JBzq/n4KAvoL7Qr/ifX++i6qnv6sXgr/VYZW+r25DPclspj8vVI0/hj4swCIkNr7fF6Y+EST/PoEFNr/stD2/4kNYPmCoXj4A6IW/MTJMv4r6jD/934i/rPFSv/ojOT/ChfQ/jSZ4v7YVcL+/B+q+7HTmv+8yYD8EnRa+ECOBvyMyUb8RdyA949i3vo7BTr8MyNy++Y1GP36+Fj+GPag+gJoFwDSznb7lHxI+u04oP+y24b/yOwq/PBhtv/9yS77iAdC/FEm2uSIGEr5HJKW+NfCbPmVhoT3VAT0/FTE4P7okXr7h28o+WyX5PJGWFj0j6wg/baKdvf4wDEBCPI0/UOYlvzR3C75Q/nk7127Cv247b79DBiu9rhXJvcm4sb9Gugy+PpU8vrianb8hHmm+GqLPv2SJgj9YQ2q/AqGJP8g9AECYT72+4p6Av9o4Wz7k9Bq/kCvuPQvQeD5zNQQ966WzPlbTOz/1bMy/OQGIP/uz1j6HZHw9/IJwPAa0nT9A1ji/f+CtPxfk2L/8kXa+80tVv2yqob6qV/i+bl9FP4lekz/+vXY9r7XSPWYf9j5YG9291sBSP8ilLT+Ms3o9/YAcP6zhnr/wYqs/D/EfPvtPnL5qN4Y/Onpuv4trmb1LKfC+eyKtvvVX4L5Dhsg/zziVPalFp7+9RhI/5xxgP7f0ST+/xOs9YzGfvy5Tkr67+4W/Y9imvx4PuL/9kIc/HlOFP60eGsB1cqy/0wPDPq20/L+y14s/jsh/v9G1Nb8wnnm/PZSkv98ze7/qZIM/Z6G9P61JgL6tWGu/+HY3wPCIgj7tvE0/k3WnPX+upL769i6/RdOyv1/v175/AwO+", 723 | "v2DzPkW+67+VRzQ+4X6OP7FoBj9VJ7k9Wgy9Pn0Ihj/jpYg/83/Cv/1usT5n5Dg/+BhuvwChAj/g9Jq/vjN5vZSEnT9ibzG8r4srwF3TBr41KwO/wgHIPgQfiz8gYG8+bRJBPwidzj4ju9W/iVGcv19tvD0beUi+IzupvzsvlD+LsAw/HTkWv9wmBL45uZQ+YU52vhE4D8C9W9K/2ba9PjM3175f6RG/gB+KvqvhKb8TcSe/gh4IQIUx278pcao/5k16v9c5YL9sis2+njUrPKsyp75DJ5u/8EkjPw2RgL/ySJc/+d1+P/8WFD1THtw/a1QovzgO1b6CcBc/BIH6PU21Rr/enre+Ue+RPu0msb6HNAM/THk7Px6ZiD5KWVE/0aj8v9kq0z6ygie+t4yDv6CahL8JtI0/urkSQIimiz/8n7s+HiTSP+69br5qKUS//GiLPmFPRj+rqSY+OzaMP7AJbj9asw0/sZjcPjpdc7+8TKo/T6PTP2raVr/TRRRAp1uavtARlj4n7hM/5DLSPwOF3j7XniS+XaoGPz42kz5h/c+/BNs5Psl+zL0rb5g+Dy/av/2Ngj2+NQQ/Ic1lv1zE0z3zuM2+rE7wv1N1qz/Eb+6+QnG6Pp1amD9626g/o5BVPmZNTD6ctbg/stIYPks2oT+rZaq/jsV/v2Yswz7sRV2/lA9Kv8SUzD6BKjS+Nd+FP2UVmb7Ziom/xfKwv1X3QT8vrbw/2clAPx8Y5b7xrFA9AgfTv380UT7N1zK/AR/SP8/Y8D71RMM/Um/Lvo3FvD/dpiK+08q1viN3Pz4qzci++o+dPlMwDL9dsgRAp/BPP9gMmb+dxB3A8TOrvm8U/T7U3I6+rSgev1Monb7Gg6E/cgyKvPBOij9sac69sZ4gP7GUdL+IxQlAZiY/wEwBaz8Dsdk+SDcwv4mdGL/SrgW/PaNNvhqhyz9e5ZW/G8V7vvyTYr6wmaM/4EGXP9I9qD99MWo/B5wYP1AXtj9yG94/Qz6Dvv1QOj/pLLm/", 724 | "dcXeP2PrKz/I1Di/843Zv83UHj5DSDu+WhPOv+ScUT38JXy/wwyqPblvTj9aWjPAXpIWv9dYj78EqxS/mg8ZwGRAL8DihpG/VLsuPs55ND9q75U+QNgMPxOK+T6AqzS/tq9NP4yoBr7+IyQ/Ga6hv+P65D9b8Oq/PoUnP2kdUr8l/UI+FFmYP6vMqD3w7Ya/aEf3vjqldb9FxY+/B8wLvx/QB8ArWc6/2Dm3v8ggHL/cvoQ/ZcshP3yzTzweMfO/LNd/v6XeyT9cXxS/PMwLwHnmHUDQa+u+of9gv4Raqb8t+pS/zeAGv9iKDz+hCoq/Nw7uPvn9fb+OabE+PA+lP+G4177Jqwa/5WBwPmBJIj/OMVI/Pq4xvi+72T6rcdy+DX3GP8c2hD0ZCCK/VswSPO2Izr8Mlc0+/mcavueYGMBj8+O+Swsev7ThzT6fLTW/6OSOPmy+Qr/8Hls+B26HP4dbxz9PKZg7hXtZPhFCNb/vB3G/WU+uuzkIPb8Jj7G/PPpov3JFhz9gPHe/B7tmPbCHpj+vTwy/92qDvwP5/T2zxme/gQvQvXHNjD9b65o+WhTPv+LXWb8KeCG9/nm5P/2hxLviX9+/3Z2Ev4JnWT+k9Yc/qoOEv5Z6Y792+Du/EyizPpFt5b/Qehy/O5GavzgffLsGzUy/rOMSQIjFpT/3Iuu9SsjvvrbZr79/NCu/A9OZPsHwXD+VcAO+3CKVvXAR4D2Y4KQ/7aCbv8UahL9XWas9o74yPcHs2T0qxos+rhPvPkf/qb+qyL8/fXjmP2aBGT5XKC+//K02P9BKY78WjpQ+tceov2aokL+iqAg/v+YaQEtroj7Occm/TYsguwGI/r1mlFm/Z3wjwGX3ib+jdlK/Fbi8vvrGe78blyrAhpNgv68SBT5MhUq/vJLmPxAiXb/NsG+/e7KdvuOT+j8y3FM9DwPvv1ZaOz4XKsY9YH+Avys4RL9XIIA+AqjcP8GaqL9PXoA+OnTcPvemEr537jq/N8ehv+k/O7/eqpu+", 725 | "trd3vQlC7L1be8C/hhQNwCzyiT4tCLG/sEkCPw+amT6ActA//WekP6ZFv7//P/e+P8q4vlOsv74+Mra8aaYbP+ClGT+4Js2+86UAPz0XTb/BK7I/6uHjP+8QML+34THAn1XYv4NZLr9JIIw+Bdfdv/W79L/XZP4/chTSP1sSCkATe6K/cMvDPwMS/b79/oq/9fvlP1WaUb9VmAk+/J4NvgjfEj+e0mM/FeLRPxIrQz/KNdk+Xz3PPV6J5L8D7pS/u+sHP2fhsz+g4TO+9yC1v9Ylwb4P51+/aOUCP1TVEz8o5Te/qCNZP17MBD5yTI+/eMqBvRCkJT5owwc/iEYCQB9BKL89ReK+nALaPzPi/T+Araw+aDBFPuJWPz/GdJ+/2kwYvYVAgr9r/jS//YIhv0AikD5LVTy/YmYHv4Jejb8Lat8+XzUOvxMz4b5Coiq/bUT6vhfErr/3ixc/siiXPwdQhD5y16E/s5WAvzkngj9qYCM+1T0MwNBB2b8doru/enACQPPR9z8BJlm/UiT2vGAdG79j1/g+zPyoPqi4QD/AdtC/U7KzP2Vyub5sz2m/gAqGPvHLir4NeiU+BAolP+gjDj1lYIo+XWDTvktelb6P1UI+2F0vP+UI+j4x2nu/f9Ayvvs8HD+bckk/zo/Bv1qXsDym5ak/ZQMAQHpGEcCKp3A+Xjs1vhqTzj5qAze/wFZuv4W6HD4Y2Ra/eFNMv7oXob9Zd7+/FwAGwKcu479NXDbAZpmiv7MboL5apeK+HLcRv+9fUL8S/dc/nD9sPwA/qr/ppC2/nlHOP8lIs75nxis/4YaSO+5jjTzySaS+G1HbPqQjgL8vp3C/PwJYPhzJaL/roxS/0II/v/4DN7+bwzY/vi20P+JSs74/NQ2/yfMyP8XQ8j8IDgRAJoaRPgH7DT3fwRlALJXev2Dos7/eNOM++ufEvpzxgj5fgoi93EyQvawUcb+Xxuy+72FIv6WltL8oBUM/SgBzPZ2Azr30AgI/LXHovh56XD84OpS+", 726 | "kFDBvz6FCz/7v10/4wsDwO+qUr2IjcC/KrUsv5sKPb97yae+OoJ1vxdc6b08or67p9F1v6/cGD4LhoE/MZ92vmLQBkAPOF2/hzLCvrKW473VYYc9bAsgQAR2Ir+XjZY9HLh/v0Hroz3JUA4/yxVKPyuaPb6kX8W+7e61vlwydj+Gv449yofBPsdhnD0kJ/s+2HnxPsL2ED8tnwbAjVkvv1OsdD9J81K/7XQSP9qeFD9bOg+/6g6XPl2xBcDbEM6/Ov8rv9MEaT9mT46/8sOTvw9n5j4cV129llSlv6MWZD/OgYO/ggKvPwpuoz8nJRC/FwKjv6eoSz/jjBg/m5P7PgkFQL91FeS/duCRvxDVB7+VKlK/bmktPxMfJD+oBam/eYluv46dK7+6aq0/sSyFP+68mz8dKyQ98Y/yP6xPS79Dwok+uPrkPzanab/6j6W/zjOCP2I7sT8gLA+/x/Cpv5OtAkB3DbO/pJD9PGj/Rz64/ja/2yHKvvmeKD+tLTK/yQ/2P7q53b7DsyY/uvc0Ps/75z1MZwu/X14jv+tZcD7P8W+/lwbkPkOA374a/VVAs9ufP3uAIcBvpjS/5xT0P3HDCbzj0Cu/SDqKPxCJ9T7mboY/7xfrvPlrmD+XWbe+mewzv8UEYj6IHxI/NeK7vlEGML9ouaY/8lSWvyxS7z5IfwPAvFvyv015r75yUoe8IcqEPYi/Sb/Xcza9W0r0PszSlL/VoFK/Bn6DvzbDDr+qd++/2d2Nv4V91D/17Ge+FxSLvrzwiD+UFPQ+hzEZvlzog79yss2/p1adP38H+r2URjq/Z1uRPqQlrT/gkNe9MjKHv47Jpb8Ju7+/vEGyP9bRlb/uxMa+ofjFP05j0r17ciw/g3nyvnKobT/Eh6E/Hd56P8KFtb58Yaq/bSu7v0arob+uCn2/yyGHP++UoL9FXKq/dqS5P52wjr+jekQ+ppcGP+2YsD+3FwdASz6wPlfwbD/c9H2+yBX6vAT2Tr8MzPi+9FaSvtrTEz/yauK/", 727 | "tDagP3hsyj4bEIQ/+KIrv93c2z3vT7c/I1E+Px4vfL9nbcW9yFCuP8gvwj+4ECLA6zGHPtjBPj/RehRAJIwZQBx1vD67rg6/8UcrvtB8dz9fz+a+W/9gQGCogz654pA/vW+gPoT1Dz8R19G9D0ORvufaTL5Gryy/p23Ave1Cgb9nU5g+mRdSv2c0Pz8PUc4/GONdv3WSUb+VqJO/D/4rvicNsD9Rih/A5/IqP/Y5R7+NmOu/qMfKv1zewL3j+8W+eb+gPvi5wD6Rdt8+SQUdvyIX+j0VDWO+KmOuvf6x1T8ytb0+28HPP3Eser9QIbW/Z3qHv7DRNz8w/Ay/p0IyvzC/q76zbGe/40nnPqjFQkB5NIq/8mCgvwLSi79xkre/pAi5vsoFNL5EBwU/DSPyPufq4L6FcI2+SAH1PlHohb9NNbi/kVXFP9HFIr/T3ck+0Sc1PwuJNr4top+/r316PhVgcL/RHnC/aLDJPuyNXL9e5sO/vBryPuT71D9366u/1XqHPfwnJz+WNk8/jB/0PkssFz/XPCw/1kamvy6wpb6rGQs/L2Wtv0m4oT4FCd49wenbP0WRWj86orc+Vx3uPZ82oD9gqI6/H+ENQF+V875SQ6q/rQWWviqh5T8HPZa/7zAwPzdzC8CTU64/yhJHvl/a9r5EyZW/ooIZvzA/1L7IQZw/8GG2vm0mJEB1qQnAM2qCP6PnLL9/+bW6YXXlP7+IXT8PhR7AgzQxvwcWIz99sHY/NzadvtWIML6mJGe98rujP+fV+b1L4QvA1S0Ov8XmAj8AWjM/q8iLvyGnKL6DKPE+RQYYwL/cED/ZSUW/cGlsv9/sPr46SQU/jvMqvuzEuj/0YHu/tR6ivzJ3y709Zg2/3J93P56fsL5//8S/Bb1yPwl5iT2syec80+/8vv859z70K1w/PoGTP8B+Lj9pDAE/lLGJv26E9D4RVrE/jFYPQE+f5r7OoO4+USwmP1QkHj6Ieby+A3Yjv+bg4by4u+S/Rc8cPIPszD8YgTu/", 728 | "A4hWP056BMCUQbK9DmsKv1WRpj/W+pq/4kZ6vjLZ5Lwf3Ya/FcFRvNW2+L1UAO89OLcVv2ACkD3T9XY+d5OHP6r50b6KSbW/KE7cPgGN/75GMhw+pv7DvvMXjz/SO9k+gYH8vhd3tj6i8e49vbtAP74R/z4JLI4/OJUvvAybWz9bvu6+cBncvoantz+Q04M/lOrPP1Mfxr2GnJY+BOYgPymSDL7/hly/rWNXP00dGb8ggeS+WKtsv++2qz272rO//8rRv9VXUL8FepA/4X1nvpHCnz+rBdQ+fnwKPm6Qlj93Aao/s9CdP1AZST52imc/J7wOPx2+n78ehh09JUWKvdvxOT88heq+re3CvoyXCL9kSQm+I/BRv0dV3T7hJQ+/JUNQv+pPyj/ga5s+P1LhP4FHLL88U4u9x2Vbv4CXgL8=" 729 | ] 730 | } 731 | ], 732 | "outputs": [ 733 | { 734 | "shape": [ 735 | 1, 736 | 1, 737 | 1, 738 | 2000, 739 | 1 740 | ], 741 | "values": [ 742 | "KviELijCNzIg8YszKYK4NVbmLzcZ74U4p5oDOarSQjknSzQ5n8r/OLTDAzlcwTA4iq9lN/APzTWXcIA0ZozqMksiYTIWYiUzKynEM/RtEDQ4psEzsBm1M67D2TPvIjszVSuUMo55cDIRLy4y8chfMh4yZzITilMyIvlQMsiRQDKw8jMy7J6OMm3HwzJ//sQyFXeIM1K8pTPaU4AzYK4HNFaBQjQSarg033NjNQv1hTZkUxY3TcSWN6opkTiDUCU5Cff+OFpxozi00Xg4ndIQOD1rrTdESQo3MVaaNjy/mjaCBQc3x5JYNg2S+TVMmBg2/6t0NYdXZDR2+Ao0BC8nM2UpZDLtPCc0BQobNRTYSzVzlpE2mcSINy+5hjeLkqw4XmAgOYJKWDhjb/Q3ypSXN1Yv4DblsGs1kR2qNIRJQzM4zs4yVErQNAXpZzab4G43rRJ4N1Z3UDZdYMw2U0QpNzE1yja5Y6c3PF2vN1uDljfU5JU3M773Nmwj2TYTW6o2vKO9NhbKJjZr9Ns1cB/DNZH5lTVJcrc1Zn7mNBblqzSGQdQ0ldGzNC2FljQGCYA06S4CNKZtkTN7Zrkzf82FM7rmXzNwLOozMP1iNHODDDXLDpw1/ZnSNXsO/zUTXy42Mc9qNjNeBDbY5tE1CTHPNUUGpDXA3uo12SmLNXFhXDWFDDo1EGA8NWO0LjUZ6RU11erfNGQC2zR4HuM0XIfwNC+7JjUE0R41SP4xNT7FHTX+mhA13M4BNTyoBzUDCNY0BBOgNIHHWjXT3ww2ZJCONpsmPDdpnIM3ZOfDN0k4CDiiUxU4Kw//Nxdm+zefc/43TBQRONluUTh+BEI43jcYODc18zclm4A3wFw5N0HC5TbUbnA2WwsaNlvJCTbRHtk1TCfDNYaYwjUQt701mjEUNtSbUjb3VIk2+K91NshsUzYEkiU2WPGaNbF6DjVDf8w0setlNPHoLDRMVOMzwbqOM8QHjTMaEsYzJnPpM2v/yTP7VMMzR+6bM8ya1DP1AZMz", 743 | "XXBSM9PkrjNxyCQ0bNR1NH9poTRz93s0aESNNGz9ezRYHSo0KgyRNCvsxjTr2NE03FImNZdaPDUQ1iQ1L9YYNS0iSDV1fEA19G5gNbgncDW4qtM1nxNjNvXtJTbNKWo2SmGlNk2mVzY+3Vw20OiLNlsx+zUbFbk131DONQPT5TRMPhE0aRBsNAUbpjTwYj41Ds3KNW5iljWpeoI1ofW2NePWGTa2qv81wIQANv6tOTaBa142pS/ANn+3fTaM5rc2fGLxNn/3Fjc7jS839pgnN1Si2DZEMo028+fGNtUknTZ6dYg24+cqNp5oUTZEZIw2q59KNpjEyTVBfdw1UjhsNcU25DTjC2U1JKy3NdDkgjUXVvE1BHQJNuj0HjbGIpQ21HazNtSH8ja1AQg3AWQiN0i7WTdRKaY3+dGXN+XrTjcDkT83aqAQNzvY7DZSYQ03C/3+NoMyIjeQzzk3nCJVN/klTDcKopA2hXEdNjpCBDYiNmc1sMMTNYgZzzRYeDQ0wer5MxKROzS9mpo0Dq2ZNHDZdzXa+g020LkENqZMLTdcU9g3oMQ/OETrXzgRCaU4xK7GOC1OlTgIQ704l2t2OP/BMzjL0Jk3WYJXN6ZlSzfLIK02FF0ONhlS7TWpn8U0LMmZMz2oCzRjOT80PR1kNP4BJDVP6Cg1HhzKNCPcYjVWlcI1xvimNUywaDX7+j41lQD3NIexATVrGe40MYGfNKGMjTTqh6A0e2XvNBCD+zQkkg811bIGNaixDjXVSTA1l6I0Naf2dDXtYbE1AmQVNhw8hTaH/t42dRQsNzReqzc+Ffc3uEIsODKmUTgwAoA4eq+ZONisljhBCsg4vg6WOGbhlzhXpHQ4btKCOKbUlTiOK4M42bZxOD4ZbDgk3zM4lZP7NzK7HjgKkxI4DRL8N4yG8jepepM3sVBqN4wWazd9l643MFWfN6nvhTf2ZLA3GyeCN937hzdbB4c3iskIN4vnpzac5zQ2NgLVNb8PkTUzOmc1ty0yNc672zR0ztc0", 744 | "lWTWNCc06zTuTr80YQ7cNCMSzDRuKdk0v77yNPdEQTV9zMc11XxINmFxwDbcPwU3jHo3N+W/NzcdPaE3Ss2fN9sXUjePe7g34GMDOGnNEjiwCTs4udgcOFkoGzhJ7Ow3Evc2OAGI/DfzUuI3h4ocOKi/0jeYjKI3dyOGN+CzCjeU25Y2Dn7FNquPmTZdmsk2IAXBNqOaWzabWgo29z8bNps1WTYQiMM1JhMSNQEYojQET+Ezqc//M/1ooTOhElIz5jCKM7oWnDPx9eszKyUPNFzKVjSu/Yk0g3KINGgfyTR1Vt00+zQXNZyZLjWBQjE1+00cNWIzKjVjYmY1FhVINZSvaTXIyEY16AGFNWw5gjU70Vg14kdCNcwXWDXS88k0HA0qNFQ3mjTQNAg1V/EHNfxwYzUqcoA1Y4LQNcUckDYxxL42UVzmNruSGTe7xFU3q77tN82zaDin0Sg4lGXTN7L6CThc6AA4Fov9N1GrVThFVDs4S38cOAnteDiGnUI4IykzODGWAjjdtOs3TIDlNwfsnDcdP4c3PFGCN9sqeTfvSDk3BkqmN3j0vjfBfDM4umAfODfi6jcwU7M3qyPMN+n+ATgQMk431GPnNv7vuzaRvpw2dxSjNproPjarhB82cwMyNnF3iDYPufI2NSUhN5GZZDfXKYg39dDLNyZYNDgtpYY4yPypOJGspjj6n4g4sPqAOKpfgzj/c5A4fyJoOBYCTDiMASI4O+4qOCcACji6UcQ3cLmQN3MWjTcq/SM3e223NqOuEzYSgZE1JI+HNciFNTVfZSU1aL+5ND/mZTSmqEg0U9PDM9E5LTNXaaIyC38HMuSWzzEcrdwxDgWmMdclxjHv0/Yy+roPNH42VzSATuo0GEOlNF4C/zTc5yA17vDWNPapvTS/97g08y2dNG/hJDRR+h8ziT/GMi+tWDL5FJYxyx+AMneyrzIogaEyZN7fMgU+ezIginsyeabvMp92djPXDW0zPFp2MwtdtjMJQukzYTFtNIfD8TNTPt0z", 745 | "210TNNEkFjSi6As0LhBoNCNzAzTwtHUz9ZL1M5nHsDPtkYYz5hGpM2H2+jNqbII0w58aNV0WGzU+I9Y0bvsTNZzyRDWr8JA1wxXlNVNlGTZLTZ42GAIaN4JQLjfGqVI3tYx8Nziwmjd0dqI37FVAODn2KDicLZQ4RizeOJGY0jhnvhQ55K7EN/QAizfjYDw35puENgXdQDasQfQ1J3AONRJ2PTSl6ro0BmEFNSE7gTUWCwg21MwFNo1M1jUd8N81GzAZNuA2xTWgQ6Q1HveSNQ8teDVdNnE1tfAmNVNYIzWseis16A2ONWLEDjZy1Xc2x9FbNqy0AzZ+jIw2+8aLNjfjRzYHcBc2xCblNUI26zVe2+o1yCywNWGIVzVO8TA1EXwhNZIIKzUFOhQ1DasHNQgt6zR7oO80K/oGNdYuDjViKSA162g5NXcyVjXXJEI18sOxNXdQBTYkZ8w17FsmNpcplzZtN3g2bMpANhVNLzbqw441yi7MNOc6VzQJ3DEz5oIZMm5J1TKOYokzrIUiNGUhJDVmgso1U80JNiqD0TbDHWg33ZPgNi9KkzZIkEA2RdOuNZkj6zXl8bU1WnylM7E0SzJLxZ8ykegyM7zZujPBCegzFlvmM8rdAzQfIzU0hnxxNIcOlzQfnrI09B+tNFVNCTUDYw41sXwDNUmMFTUtMg01jo2CNccCNTbLTbM27afdNnkOlTZWVQY3W4wCN1LGkTaUw8g2NXkHNx1HYzfN1bQ3/d8VODNaJThdhXU4G+mWOGNkMjhQtwM4ZqjCN+vMpze8GHg3lzEfN9R+dzduX8s3V2DzN6kZ9jdKjx84Zlc0ODuifTi6kI04eYyaOBckiDhgJVE4Q8QgOErKzDcQ+q43bVmBN1fddDfMvW43s9OQN410sDdf5bw3z2T2N1Sy8zdiKTY43lmfOKAdgTgXtJQ49KBSOMVWWjgtE1M4qcvJNyXSVTfADSs3wZUcNlOhKTXoDb80Gv1GNHcRuTNs7JAzw+sAM5a7njLLKK4y", 746 | "Et++MhQEhTMlNRc03SwCNQ0ceTXTR8k18coNNpSmizb+e9c2sBc+NxUptjfqg8M3PlCiOD5UqjnLs5s598jmOdPXAzrXm4s5NxMyOTfqgjnbTz45IRIvOaMeRzl6Hak4IC1SOJIaKze28c82UsVWNi49nzXnmXQ1nrMwNdK5NDT5sYsznESPNEa7UzX4rUw1qW63NVoFjTVbhXw1bSKHNdTePjUa23U1Zul+NVu3djU0V6c1f0nJNX0QsDXp1Qg23EJFNo97ADZOoLc1lzadNdGxQjWqJC41aPwDNfuTzTScAdE0pjVcNDgh/jPzc/kzERTXM+C+ADSMBb0zyhfDM5pyBzTk++8zUzzjM8jGsTMF0EAz4POiMg9JezIlXDkx61AwMNFl9zBfZGMxYx/RMYqbUjO4mYE04PbCNOCVgjbsyj43B3mVN0rJ5TdnwBI4+ohdOACrmzj3Oic5Rk1DOQCoYjkIJFQ5GFtlOX6FRzmGmL84HW4VOM2rDjhb1Ow21j3MNTwstDXnW7s1rdmNNVBeizXEaE411vssNWRsNTVlXk81tZjrNUw+YTbNyrs2jzM3N5REpDfQK5g3c9azNzOlrDeaqKY3KgKZNwRlbzeD0jk3OD8PN+YHKjerRh43dLYMN1GuLDeHtYo3xGAFOGPCQzjNJbI4P2juOCGxNzm3bzw5z1YcOZOnKDnQ5gM5kdMmOReD3DiCIWE4NxmBONpm0zjLjQU56GEYOT8RZTnsnxE5/CjLOBGQCTlyV9c4RkGxOPDPrTgLFMY4yUK7OCxKuDj6j6o4UyGGOIT7XDjxaz84eeMhN78EKDbDXO40KGNdMyjGrzGE9kgwH2xCLcqSqStwJS0tUTyiLg39ajBjR00xQZ7IMTd2PjJ761UyPfg6MnpICjIX0tMx/mbEMRH51zFCreYxv2maMY8hmTG3jJsxLZj1MahJITLLyDMyUhlUMrY8gzKqTboy6Dn8MhjOBzPI+lUzGy6fM28WjTPTuxk0ux57NFmdYjRB3t00", 747 | "1Q9KNXBcYzWYslg16Y+FNcwZLDVQywE16u05NVhzjTRcv9gzaIMBNOYuFjTL2BU05chhNOyrNDTXcUs0GnJ7NH9GnDT8r2E0ml8VNBQUPDS83Jo0a2EDNTvXiTSNNc80hKg2NeyaUzVyh1I1012UNaWGWDUfLQE1j5LuNL80pDRR0EI002QcNP4PJTT80CA0dllJNL9XhDTwLMI0qJ1hNbuGATZzy002YHuUNpgAszYLn9M22wfXNmfMATdt3eI2T+u1NgtXDDeyj2U3S1aCNzq01jenciI4BfgTOBtfOziEnng4+IEROF4itjeE28Q3/INSNxCSKje2Bxs3IlWNNja6Qja6AR42dc0YNknl/zU9SdE1rg48NSeaLTUZAFs1PcVGNQhmNDbbIMo2WxAwN4U/dzh9d4o5c8/OOSnvLzqc8kU6r+rxOfwMrTl8QUg58w4hOesyMDkINEY5IftKOT0QWDltjg85VZ7lOLrFCDk2ItM4VOy0OL0woThQGjM467vaNzaH8TYbkUc2kn7GNQZlvzTAGTU0dbikMxYC+zIGFpEylQAxM2BclDP5SKMzms0/NCbUajSn6Zc0NknWNHTtDjUltII1gzYaNps2fjYLWx83MqWxN7cv3TdLtPk37KjGN05EFzdTQAk3MX4BNxb9sDYpe8U2ZJfNNlu0KzeKnEQ3Ez3/NucKvjZWoLM2kpekNnSPvjblN6A2abCUNg74gTbvPec2+B06N5IHdjeKwsE3flfyN+u5AzgKbd43wG8pOIhDxTdcx5A3cgWoNzwrWjf/cGE3fDA8Nz2sgTbgQsQ1xIO0Nb/wijXFbHY1ft2YNb/LOTWAgP40eWIgNUfAtzUtOqY1DDWXNauDOzbmr7A1G3a0NL8RgDQtC+IyndGdMQYILTPI0ks05DKONHtZqTVnBVA25rtmNvnSnTcvhw04vjiFN5QFKje8RfA2SElUNnzKpjV6Flg1cvzJNKvshDRsykk12PbHNXNwBjY1/Ko1/oWvNTPZ0DUCskM1", 748 | "bCYjNQwLHzSaMMwz4OFdM4v4gzL8mMExe5ehMAvPry4t5RktiqiBLYhS3S1z8Z4tzeEVLrLeKi5Ndwou7kgbLwEpGDCk7WcxpTY5Mlgr7jIKN4UzZtjFM6+KbTSM2ns0SidQNJJWRzTZqo00MXjVNG/V0TTBuZQ0WFnRNBNZOzUcSRY1fC1eNJS3wjMuU4wzpfASM+UriTK1ZgcyaziQMS4kjjGdEG8yCyNiM9muQjRf3dc0HTGWNLP8STUprak1U/p1NTVFYTX2BTE1JWuENfgeyjW5e8M2YxrcNk9mTjiF6JA4WHi0NyoDEDdfs4M2gYlvNgTucjaZe1I2Css2NoaClzahWXk2VtqSNpUZYTY4MvM1SWmdNQqF3TXUc7Y0pWyeM8dXizM6S4Mz451tMyT9ojNAFV4z7mZWM/H6CTTmonQ0RNzKNEU/JTVkwVs1pUfsNXBvVDa1GGY2dOKBNoJXfDbOokw2qRNRNjbGjTaSFWA2FOw1NoVukDai+Jk22h+iNsMBSjakaCE2ZaguNgbOBzYxwOo1+ROqNYusVzWi2BU1y4bnNO9fpjQYFpA0u06RNFTqijQkzDY0VMImNFiVODQIBSU0zDQbNEjoFDSj5As01tEXNLY/QDSszZ00QK7ONJG/azUc6Bc27y61NqGcSjfzyaI31/rKNwhy1TdngtY3rQfONzly0zcgPbQ3TfvVN0TL/jf47Ag4LpkLOEYwHzh5SQo4Sw78N14uvjcJZqE3QK+ENx/idDdOaTc3YkYlNyU6lDaYczA2S1E7NrO8yzVrHL41TyJpNWVU0zSME1s0FRqTM/gEyTJHfUgy4GaSMQ7mCDEm+WowI6WgL0c+Vy/xb5QvfVC7L3+72S9q1Q8wEmUoME/OWDCUmZUwgSOmMDOltDF4t9Yy9qLSM74g6DS3ipc1bZQBNvrgSDafPYE2krkNNhn85DV7EfU1kTvwNVrSPTZPqic2z70RNlRkGDYY/Y81XsQXNZiLzjQmMTQ0d+jLM5IGnDMKx3Ez", 749 | "1MRjM8Tf+DOk/YI08YelNLyWijW6lSo2fYpPNjn1vzY5ElU3+Gw4N0Sb+TarqqA2vvjxNUZViTWTSyo1p3dgM8LTADK3bxky7Y+GMpsBmTKwXFIyZDydMdwUEzIHMXky7L4SMtg9TzOtT88zOPTuM2Y7XzVI9Eo2yrhrNr+MrTacr9o2TSZLNpwAHjZMJ/M1TMwjNrsdCTevAQI3bYYMNxtt9TbDsgw21x6dNfKQtDUiISA1TM8dNar8NzUYRUU1S2tRNZ3DwTUg6ko2Fq0xNvfypDbliKw2SjCrNrF9ADcvNFo3y5eZN8Dcxje4/xw4mxFQOMRQyTjeSOY4xRO2OJ7BjDh9zZc3eiTjNmcztjbBAkU2p4lHNm5f+zVpwKQ1q36eNY5O5zVu9gw2ThTGNSTuyTUBlo01vJ2WNSb/ZzWuq001fQ1ANWiMkTWI/QU2On/TNTLV6jSd38Q0Bd3fM+xXejL1GJkzxCo8NI8bNzQEzSs1GUjVNd3qCDaYaec2QXEwN1HywzZxnoo2hV5+Nq69djZPMaE2Q8BXNibsRzazmYI2qE2GNgaZjjaUep42+OXHNm2DFTclEjQ3IkmUN1ad3zdce6k3DU15N+1MIDcWV2A2Rh0ONc0IkTRlaMIyhg6WMSRnlDKsypozs0Z1NHwqAzU5LiQ1/cItNWkyVzWd+T81GV0MNBCEFjPc0pcyffqzMbDeDTFG7dkvZnudL4su7i86cfwwyL6NMTitoDFAX/Qx3kRLMlWVGjNfZvwzhNh3NJmQ9TSD48E1wTQfNuHWBTdPRqg3t64COIjVhjg3O2Y45gAkOPfPJDjtoQE4Z+zyNxHSwDdYLs83UGXGN1fJHjjQcVc4em10ONh26DgStag4ek8aOC67KThcm+g3yiF0N83RtjeIiaQ3vSK8NwxmkTebSgI3uGejNvIMlTboMp42jyIDNnTvVDVAycw0eVsWNBOL6jP4KXgzBAcbM7kwaDPU/2EzIeRtM8tjZTOq9BIzQJvoMgWj8TIJ7xYy", 750 | "TwEMMRvVvTELB48y/2qjMuXEdjO3jgU0hQEnNL1mNDUo0Q82Ie7cNkXKhzevXAw4qUJ5OGOpmDh3JSY5rS0IOZLR1DgfRAg5xGoUOTgA9TjmWPg46zDSOAC7szicp4Y4pSl6OKywGTgRWu43IwapN8MyWzfm9jM39xj9Nh1PfzYS8g82O8SENaSQUzXfwlM1dpoQNfk5GjVXCwc11qLIND8/iTSP3BI0UBqJM6UTVTP+2SEzy8UPM4Sf7jK22S0z1S6CMzm4ljM82sUz4YDqMysGETRHWxs0TJ4ANKfvzzMHTo8z4JJtM7YiVjNZLjIzm+JDMx2JXzNswmwzu8mhM7LNFjQpGKE0+8wbNbHaYzU8jp01A2u4NSaLKjYak4U2+cV6NvehqjaaqAQ3+NZnN1TuqDeP4tc3BvUTOFkgPDjsYyk43VB6OAM9pziA1gA52DM1ObqdYTmEH4Y5kKyVOVKjyTklg6U5BBGIOadrRTkM7Sw5oGsKOUJayDgEF2k40QdMOIkmWTfWKg83hYRDNz52ozZjzRk2qKMGNtsukTXixaA0Ej5INvnyMDe90yo32VABOMAAFTgP1+837FEBOPpHaThXUL03g2UYN4j8Njdb0aE2XWCFNnJXEzZk4A814oaPNPsbiTS4RYY0NMFINBKvADRMzZ0z0AX5M0fV5TMUXM4ztE3mM4HPEDQmHjc0UqHMNM6L9DSidIc0kAu6NHBA1zRbNwA1OUAhNZAEhDWr2oQ15yZ+NVsMwDUs68o1lLy+NfwnzzXQge81gGusNZrXxTWWa8s1don5NUBOHTaJCTY2ylWXNjY09DYSD083jAmlN++IATj0ZCQ4xM1dOG4Lbjg6nss3s4FoN6YreTe8eNc2XuONNpLLSjZtKos1Zt8YNZL7VDXsnpI1IY3QNWeTPDYuUkU2H8VeNr4uhTZbQ7E2GfDtNpS1NzdjZ5s3DikeOIkI/DgHEh45zJuAOdp2XjnJffo4Jf6WOIKpLjgSZ7A3QchNN8HnSTe64Oo2", 751 | "rlDnNso5ljZ6Op42HCKeNjj5Szao4zA1AIMFNS4z2zR14vIzGmhkNXRjBjYfNuE1duGPNhL0GjfPX783Yx9pOOKXBDnn2/44re/ZOG5X0zgk+Lk4OQTTOGYZMziwluY3B4jhN/+5JDeS1GQ2UB7eNKhqGTNTxPMxrwduMZRi2y6RS3EtI+YnLtb2US+jnTExEXhMMkzUxTJrRwEzpsPYMixOZDKuHIgyhRKXMhEufTLDxlcztvMMNLC4AjS3sEk1T3AfNuLOujbhAwE3VnFwNy3eczeC4CM3KQSFN8w+zDYdPx42OC9fNuWY/ja1sRg3jNoeNzZw1zbl4Nk22wPxNoOx1jZ0s8g2m8GVNj8mjDYN+4M2sbVfNq7j4zV3fNQ1UQwUNv9nzjW9z5k1nJ6LNd+rOTUSMB01j2sINfmRiDTbyCA0/ZVXNN90qjSNUOw0tvwYNVlvHjWUXJI1gj3/NfYlEjb7yDM2FM1UNk7EXjaziJ42CA29NtnntzasgM82y23cNo3PQDcCMaU3nXWWN6o86jdgehM4rJQwOCQvADgRVA442DYCOBB/BTigwXU4/Ik3OL6h7zdwR/o3X0KWNwetPjcnMC83o6vRNrT+ZDYOCgw2CE6pNUntjTUqUos1MU2QNbyKkTU4qp41Z4evNWYfkzUcZUw1r0stNa345TQo3Zc09yj1NDtUADWJEwA1GrT8NIAxvjTXQYA08NJuNFUmpjT5dtYztjReM7jRqDMTCxAzCf38Mih9kzJYWCwytJsHMgfSlDK/HkgzEWgnNEv1tzQfMgg1AtuvNddAYjb9G4c2E5JtNhr8azZx8GU2LsmdNmBKdjYv++U1e5uSNaL/6DWz1hk2h6c7NsRGizaFqKM2EU/GNgfuFje7qpY3rXXUN2IlHDj752c4Z4NqOEiJhDh6OXg4yHqhOEhwbDgkP0U48s98N7QTAzcHZa42mG8TNhVHBzb5v981WA6VNZBcZDXkbl01YxhSNYrihTXPrJs1L++hNVQLnDXrN5Q1", 752 | "XJaRNWoBmjVNDpw1PbnGNUR+PjYQnuA2YEjRNlw4XDf6RYg3wAhkN1WXbDeV5pc3KhylN32OwTeUFRI4KskkOFlSQzgeSp44R30xOYL9VTlIxOI5O5Y9OgvARjrIfxo6re1KOiidQTrL8zE6Ap+DOshUOzqUTSA6ShYoOhD7zTmk55k5amcgOUJxyThDDZ04IiEzOO5IETjoxv03b6ivN/pzcDfR5Yo3B/l+NwZWkzckwsw3gnqfN9qMXTd2hZk35ozYN1eg7zfuvQw4i/0mODfdWTh4xro4lifHOIyVuTgwdY44sm9fONSOYjg1Zg44DpnZN8zMyDfzARM4AamFOIjGtjh+V+c4n5xBOSXKqzn5aQM6fB4HOg8kGDomDk86kMc7OnSzrjpGue46hOgYO4gXCzuu7dw7sSRdO29Iwjs=" 753 | ] 754 | } 755 | ] 756 | } 757 | ], 758 | "trainable_params": { 759 | "batch_normalization_1": { 760 | "beta": [ 761 | "cYKxvdNjAb4MGG29heiCvhpdhz64za293jpNvW33pL3+ZoO96HhDvZ5xN732zWq97sy5vRcN67zuU6O9WYoXvj9I372e7269smOTvZOVQL1INby9V0UJvqaqj7ubEAS+1Gzrvb3HDr6zNXu9cFKqveuaA734uCO+N/Mdvtq6vb0=" 762 | ], 763 | "gamma": [ 764 | "nH6APyNZgj9u7oI/08xZPwDGWj/RjII/RDJnPwVygT+ueH8/tjFNPxRGaj9fF4I/6nKAP5qefT/smnI/TkqBP33sdT/LC3c/+peCP1k5dT+DZX8/M4Y5P7TqcD/u5Hc/kOV4P+2/YD8xOIM/wwx+P+NlWz8cxmY/l3xFP/t0fj8=" 765 | ], 766 | "moving_mean": [ 767 | "xTQ2PqRYJ772T4k+lQgiPCZn1DwY2kW+0X+Iu/IveL4AufW9UASqOx/0+ztgg8g+E19VPg0HjrwLIIS9+x+Avu7h9j1glYG9oXIuPsx8Bb4ATWC+lwaaOqTYv7yXvHE+QEZYPuuJCzyQOWo+AKFOPtl8Qz7ICB28SdRtvCNPMD4=" 768 | ], 769 | "moving_variance": [ 770 | "hpM3PBL+HDxKxNE8r7TzOHEtuzmoDlg8nndbOL08qzw3WKc7eyL4Nz5Cgjj7EWA9mI18PNJpSTnKhcA6VxS2PFqAqTu2nb06FwopPGHsxzuzt4s8he9POat5tzlW3KM8UsaBPDSflzi+GZg8sAFtPLoEVDwz1hM5mZmoOXrVLTw=" 771 | ] 772 | }, 773 | "conv1d_1": { 774 | "bias": [ 775 | "OV98OdkEszlg6r63lEMkt3kwEbng0cO5gB25NmaXpLgIavm4L7ggN6DgnDhWKgm5mp0nOTIxADlvZI65udlcuJxUFzdEloW5LTWats7zCjX3RrY3sJEPutiV0znOiiq3bSSIOehDcLgWdXg4vY8TOSdIvDi+V6i4TZUTOcR3xbk=" 776 | ], 777 | "weights": [ 778 | "1QIIPh5jez1lQiI+DSRzvmJbfL1l96G8yzwaPhADpD4Q61k9OfKyvfT8G70qoRc+PA8BveQ5Sz68Uu+9wlUKvkvQr72WqSK+Q/csvZUV6z0TjqK9YGHsvMDtOr5CZ4q+8R1gvWwoB77ktU69zHw8vb+rqD2HndG89JRRvYAjLL2O8N09Zri+Pn1P0D5onta7ok7APdIDiT0xXoA+px0eviJwOz2/b5g9tS8pvNbSlr03ejG9Bki/vaRZHL7/DXu+jo6APLJArT3igAo+vQoTvt5qsTwpP6Q6kJ8wPr4lbzzighc+zwhVPXMMJL5FvhS+SmQkvqcDYL6NW0q9zaZDPkoKZrudVD6+IotDvjCtMT4JTAC9XT+0PihjMD5uBH+9hu0NPQmmAD6Z/YE+DFXYvN7p/T3pZJ694qCjPZP9ST7yijQ+aVA7Pi7fPz7nTAg9XUOHPTdQDT4hSiA+rg2+vXhyo735jCE+VLKcPQjOHz52boa+ehGPPHilaT43D8g9" 779 | ] 780 | }, 781 | "conv1d_2": { 782 | "bias": [ 783 | "4LGFOeclsD64Yji+5d+JvKUaEj6bfha+u15svi50VL68zFa9A44pvSEnNb0JZFC9GjMfvcdyUr4lvgm9XZ7RvQ==" 784 | ], 785 | "weights": [ 786 | "QuCTPAlcuT23D2y9hGeovQCMgTxT5Yk9NJ4YvqcDXD5t5rE9rE39vWTguj3HYrK9UXjMvfLUlT3evR0+M3YhPrkI9r0rRw2+Zl1WvdaKCz78AxW+wnXrvYLFKT6lHi++FiaMviosPrxEnp87C5tVvrgJOb3YajG+2UEzPPikUT3oPBK+xfjPvbTIfj0zFoy9xLMVvrl7tj1pUgM9UXK2PUnq8D3F4OS9iU7lPdqlQr6/+aG9Un87vp/A9z0oasM8yRdJvW6oP75Ol1m8ubdaPqzJD76OrRA+M0caPhAfFr6gflK+En6KPNK9V756vSO7wqkqvmQSrj2iJic8iE+DPQTViz1NoK89RbcNvidDhDsw6q49FDEAvkoK1r0pTFK9eYSCPL6Meb3WZaC9MQXDuY4btLs/lcI95bgTPkMZwL3+rh88m05RPr4LrjvwETc+A7Z3PrucCb7NXxA+2j2yPXrnajsXAQa+njOfPdwerL0UtCw+xoWEvMB2or0plgW9EVreOiJjS76LjJ09SwERvsBrUD6ExDK+E1wEPuj9HL7Qmje+ZmcVvhlSJ74kPga+ZvyuPW4Bzrz8RN+8bfQGvsaqLT3Xx/W8paykPeWJ7zxoruA957UsPsJ1FD5lAiu+azjDveSODL7XCZy9D5K6PNEQrr2URLQ8S4gCvnA6pz2IEgE+S3DoPQB0R7wQ5BO+TNSNPfSJhz1yGPM9gL0ZvW22yT0563S+1nNiPcZHZT1dhI496zdhvU7K7T08be89JIGSPe3LKz6yGrs7+MquvF23Jb5JIQ0+NXwBvOgcXb4z5WW+tUayvW9iEb7VczM97EhfPTM0Nr7WbGm8LI0cvfZoCb21mje+TzWNPUHss721oUs+mLf0vEqdIL2idg8++9KAvb1GdL1Qn0e+8UlVPVsVLb5qeu89VViEPgztwrubhhE+bp7FvaohTr0kps+9H0mRPbU6dz2syZU9Ayl0vsAgEjzfqSS+7CX5vbvDoL0HhAo+Cpzzvf8zOD1pKlI9", 787 | "DVCGPbc3G73x5PG99igzPiwBn74MtFM965UqPjtEsj3Zwg++BKyGvkuFpr7Li4+9u5y3O3mxLb4jtj29Jz9CPnIvRj4yIOc92sabPd74sT03pgg9C8PnPUm0Yj1qL/69D6lHPjheND51yYU+ztzQPW/CgL61ZVk9G27IvTrvez0nfSW+bYEpPiHkAD7IWXA+mnuUvthCMj5IAyQ+pzZnvZ3uhb1qBIi+i9oPv5MPmT2fyEi9ylcKPpEzVD2oBDY+1gxhPdpGZr4PSAg+JQnfvUjxj71+T9Q9dmm3PbUkWz6a8TY9oDsvvawBwr1kQgA9Ztm9OQCJW707J6a9dDj7vJS09b2amZ07guQpvQysJ70B6Zq+wElFPYwxDj7eG2U+Wgv5vXHmuj0FiSO/iCP0PeNrV707L+C9q+ELPhbPHz7akwa+/IM3PhskF77eZyM90WXbPUA93b0wZ2C9u+x/vjPoKr76ICm9MsnUPfMw2D3IzOW8Nm4nvViUDT731MU9XOXmvLK1vb1V9xs+d7Orvm3JCr1MnVs+Y1FMPp4usD0rLWQ+q9vYu8Zrt7tivRK9NUIPvlu7MT7z8iW9aiVGPQWfVL7BbCU+ISitPaqD6j1HdQU+Ndw9PisU372KVye+tc04Pjsde70ORA2+xoqevN2Lj73mG+A9pxv7Pc9AQrxaqw6+urgTPcF6Fb7gNRi9WK6QvCkvXz5Bmc89djcBPAwUCDsCiE8+hgVLvusRvD1081e+RFHoPYymR71lCgO+HisivTUfOz1gSR+9z3Y7vfpV/D0qhA294OxVPX0Lez68fRU+H3yTPYFSqz2/CZq9sxtLvnAItD04SDi+gPYHvl0lCr1YGww+GpXYvZsSB77Ieh49UxQKPA/lzb0huC69rMTgvHAy7724wvS9s01kvgpe5L3TVgg+NU6Zvb9X4T1S9S08Bqq9Pcd4HL4RvCg+ckEaPF4Vn71sdJE9/fC2PJUukr2qsPK8B8+dvQK5GTvHx0a+lt0KPYmz0j0gSoo9", 788 | "PlmkPRK30r2CrSA+NavKvpff6z32Oxi7im1iPdkwwz2bqUW9FgmvvYzEh7x3Xpo8gwZHPnrgkz3vR2I9XfAUPtKAw73Ymps+n4kEPrYY6b06sru9Sz2EPYUjIj6u6AI+/MJEvOr+Dr5XpB++Z9E1vVPKmLu35AM9c56+vQTker14Tp89vq4Nvv/Qi725mde9KyCKvWhV6biu3PC9Iz+lvUQkZby20IY+5i1Eu2Cngj0FXT0+Z2nWvXtmgTxZKIS9/Q8wvP7JXz4NCTS9/JsnvsXUGj2wCo48ozVVPRq0hz3DiKy8XZc7vo7Shbw4Wia9Z0ABvjI2ejxCN4s8nJJEPHyWKr5UrSa+wP/9O0TpBb7tDW27QMpUvsAiJr11KXs9ZUwWPvOQFr21Cqs97OhzPdN2NrqaSz0+lWM2PiKCg7xApTc9eX9lvRj5w7028lW+cDyxvPVdir3awwY+l6c6PJEDJ75ujcA9RKoTvqsMqT0a9CA7+XASPqX9bT3B6FG+sKwjvpbBa72b79Y7hSsEvpwpmj2Qrp68Sw2RPkWKhD4ZiAA+YI2hPVvnMbtm7UO+f7kfPtWFAb5w67q9QaAXPlYsLz4mvtm9hY8mPm6d+720v9I9cCGsPN1YRb5JqKm9LD/8PfIN7b1HMAc+EfTcvX8cyj1ixWo+ZfI1vUYMtjs5Le09RQGoPiNrSr1AvlA+raMtu3OyUj5deMW9dU2UPDPNRbw6tFo+NBYaPmsYAT60TSC+GvcMPoBXCb7sHA0+8BRDPkN/2D1rpaC9josqPljnST4vI/O9jwYQPT7Md70yaUU+EkvQvXCPGb4JuBS+lmMQvgpwFT69a/e9C2EcvtO7iT0Iw1G+6m+1PRdbvz1BpS++q/3tvXvVMb1ChJK9fpAuvg/RKT7h1fq9DDZ4va3bMb2aC5E8u6HnvYYrmL7+X/Q9Jjg3vtrbIL70P2W+N0tIvubFAL6bk1g90SDjPelaWT3ts+G9C+YHPh2V1L06yB6+DGMePgNvRL5N3Su+", 789 | "sA5WPcjOTD4riqq8mYPSPuce/r2M7CG+P6F0vsd3nL7sZ3m+chH+PRrEIz6woGc+mxi2vGbuK74iBJY9yw1avX1/7D14KKw9jLnovLDETb3aDva9t9JcvYXYLj5QIV48xZgwPmhtiz5tTVa9JgpNPqY6fz7FbkI+SQGOPY0Xjb33+pk+Dj1YPsR8vr1JITM+3EEGvf5EwL3D7iw+SiUZPlU+tT2sMJi9SeWoPqxSLr31SQU++4PEPUFpY76K+Ju94E2svVjsHT4qA+g835K+PPyMHj4ySuM9xnNMPg6bwb2XeYm9/O7TPWFTKT6zYAQ9atdDvhZD4j0WR/w9Ln/Evewbyb0yRQK+cYWXvs03FT4RNPy9i3UUPjwdLz6sfVu8iPrbPE57PT2yME69AL1FvshfpLyXvfq8q7ZwPZlQEz4C9kA9vzjmvD2/njx2Way9yiIyvk15kD0QKpi9XbxwvtMZM74H27A+ELqNvkGIhz3Zniq9AiGqPRbMgD7RZEm+VIM8PsSFVT7H2mo81JMEvoJYLD1lHPc9HWcAPYH6Lj33F9m9mF1GvUhu+zxg6Xg9Rh0SPqBXmb36BBc+EQE5vf4Nfr1iBzu+67p3Pu3HE75nUcg97rX3vZCD2L0tg2e9cPtvPh5FIb4jAIi9GxK4PenFIb6eQNO8VOXzPa+XOz3FCnU+vfOOPbi6sT0pBxW+6gYuvkBOBj4BG589TD34PYZfgr3G7TG+OPpQvO2v971y5go8QbMwOpNkk7vDoq69SXS3PW3iaD54Uuo90zTmvONgFL36D/g8bBmxPcbLkb1yigg+UicvvsGyPDzEdrs9uMh9PZEYDT6bDe68+HW8Pcer0T0TdXQ9GyTqvcUH8T13rsY9cdkwPhd4nzvYkA8+XC7cPTtBozxuKfA9HHrwPdbp571mTye9R4o/vQXmJb4+j4A9W9pmvedwfzvceR4+9175PaDYKb3za7c7NxzbPfq5/z1mchu9M49xPj+FQD18/Tm9D5O+PQMuYb2814C7", 790 | "R7w5vhVaE73ix8S9AfslvUUKND6Ye+W9dzsNvg7ZuD1GY7a9VKAFPqHcxL3vAny+bYInvlA2jb0FuYi9e4z1vFoe1T2BBmw914QGvl6Qvrwyep49vHb+PfwHzr18ZCG+p+wXvirdA71KlHO+Doydvcp0Ab3PcLi9DIFIvS1Wgb4IycO90uPePBLBwb2F2wM8n+0ovoRyIj3KaYg876PMPQiSlD2hch++SdWZvUHZRL5PMqK9cCNwPtxXFz0MYB074eAhPsEuHj7mhY692KcsPYTJrTyUQUw9nioZPnXel71CSJQ95uyVvSulEr5KWoC8pq2XPXrUi735dO09TDSIvs+yPz5ltnc9XuAevs+1jz3HhAE+X9xXPuzFub29xiw+k57CPcD4iD3RMl48gmEYPlyFbb0xt0E9Yd7ZveCj/T1gbz+9X2LzPdn6YLxW5PE9fklLvReenL19YxU9LIy3PLAiZz5D5pe+/HZjPnAuDb55Hu89YdXUvVYnwbp3ggQ+EdABPE0/Bb2zWLu8eTU5PgTKt71aUDa97zmUPAtVJD7P4wO+dRwjvaZ6eL3yrR091NclviFwh7wmBB4+dSpfPn5Q6D2tWx++YL8kPj7Gu71s2Lm9jmJGvmnF1rtQqXI+vSxPPZ3mMT25hjW+l+8XvY5zuzy9cxA9PzLMvRXPxDuTIAK+tr1ivpsZRr3Iesm7bUUbvo8aEL7MlSo+jvkAPop4DD7e6Xg8Go4rPv5rBj738xG+cjZEvm+8lb1DgYo83ZNXvLvUMrzoTnk98G9CvdVlJb4Gs++9T3ZOPYtX6r2k5Am+co1ivvsIwD0g3La8VAQMPRFsMT5AzmS+v3phvnGQer1V+u+9NX3QPe1oCz5Y8us9iAT1vTyVrz64z5s+TxJAus9B6TxGma89YVuavX5bBz6TVGa9Sqewvn2uiD181Vc9vochvh1dqbsCwaw9j7qHvupxnj24ySM+F3b4PZXq+Dxpg3U+eO//veuMFL0rqgU+3QoYO6Q9Gr6JpZw9", 791 | "ScS3vcazzb1f9no+m+YbPvM8wTw8v9e9fQh4vts8Hb6BQFS+pA+hPbNxj70lHRE+5Rk9PveFsb7QP129XleAvX4JDz2KG36+3NzuPHdoWr7187Q9N/b4PdHZl76GtAK+yGKXvZaBLT6dmfe94yyGPo91170Yayq9SvuLvtGm0T0V84Y9M3t2Phu8Db30/eK9/AlOvYfbgj5kf5E+yb3mPIQVjLxgtw++NkxFPpnpGT42QeC99OWOPgw7AT5gOBw+sTFQvXFuyj5Za38+o24CPQxbWz7Wcfs81RBWvnPDMz7XSRK+XkkEvoLogz7c1Us91bIIPjpIxDsnjoe+zPxuPmdM7j3GYgI9kCFkPfVxhT2VwBu+AtEcPq4bc70dqhC+OJryPWu4Wj4klNw9ACcQPpQcaD4dSMc8S3tiPTomFT0mury6Atb5OwnvTT3fAA2+Cv94vlLxGT3USwO9IQSYvQmfeTyhaK69nab0PTDJYb0xgxW+DopEvdXx8735h889ytMnPsOVwL6ymEA+4WL+vRW87b2UXky+A2+4PRusWb7glju+N7EFPiyhlr373VI+2jEEPpoXyb7H/Ia+jENevecRK7xAVLa+kCCxvRUb8r259ZC+kXyAvViWab5TZTK8SBFLOx1IMD7UZJK9Stb8PbSQsr0Wu0C+9u1RvuZcBr1p/fe960KZvpJMSD6Rj+I9lLRavS3BF75rToW8lEGnvi11Hr2gnQq9ME8LvnGShbwtxvc9X63KvpVcUTw0dUG99byDvfHMvb5dnAu+BTn5vtfOFj0SM967SEU4vrAu7j24Y4u9qXxePhtV1jz7jXw+FR32PQODUb7VGSK+XMEIPiE2cT7BHoS+lhqpPSQgUD5uRSw9NDoav9HtuT0ajPu+VFt4vp34sr2BtgW+mTAiPvbwzr1dBt2+0v9ovnr2275FS0Q+W+qavliwPD6LkP6+xrW7vsNI0TyepPW9PIUHPkq6Kz28uwi+/MhRPtXQED1vr3W9hwWoPQPy4bzEWou9", 792 | "aTGAO0es+rzyC0U+2cBhvNtDaL0ixhE9Y8ZAvpHowbzeLYg9x/E8ve8gfz2cmxw8ZPGTPQjtRr4vuBe9hcAhvnf7WT61dfG8oEkzPjK8Bb4lRsW9F0UuvujYoT3U8DS+4L5RPjtmp71sWmU+k4EDvl+HwL0msgS+m/4bvQnFt70RRaY9rI6ivShjrj3tmIe9w8a6PZbVWL7iQyE+uTt1PVzeJr4tcZE9Jwe9PdwbSb3DShk890sjvqWLM738/j89HupWvezcLL5MKmG92UXQPRmR3L2C/+a9qPTJvYHjBr2vnIE9hdMbPuHaJz4jR4+9VB3uPSWnaDwO3Be+ctSHPW78MT3QCbi+tyxSPp6/6L3WIjE+T2vJvSLEF7yd+LK9ztWbvkGJA72tqoe7xb5dPh/LzLur13m+XYK0vpcQ0L3syP68kmjYvmJjUD7bK+661WWHvjnZqD3cUCE+sPY3Pl3Gdj6hnd+9TDc+Ps/eA74fDlw+g5g7PkKZZr6DWt89dT/7vRBfWTseWOe8K25+vaXD573gvEM9+RvVPXtSKb0AuAW+rlGtPVwHtr2T18g81XGcvalg9j2VPpS9nN9Ivuye172U+ZS9yGesPbBhRj3wMvs9xyWwPtDhKT6evxS+j8zkuj2fHD5t4zs+zzbRvV+2Dr7NAUE93WnQPrrGvj15bjg+kl8HPo5D0LwX6E0+DMaYO0d4zb04qi0+s3eePaPZUD6fmDw+N9HtvWHKnr3/Ohe+x4VAPvf/nz3qzma9JBGDvFYmMD638Z48fBRfPYJkZj6em9+7xDzQPMEEj73ARHU9KPAdPoco0j3Kdsq8KnAHPv6ngL0lZMM+WxJKPbqjBb6SEaC+bGlUvs9eID3XqUw+AzsOvBGiQrvh2uq9p4uLvgXNr71lUo491dUDPpVPTL3cIP68uCruvBYtXb6+Zyw+v04WvgPPQb7dKR6+bC3LPFv03D3585i5wkEVvix7Wrtq0Vw9KMUiPnxpvzwVKMc9qKdMPZ0QCz4hwfU9", 793 | "fzo5PmUQzr0bYBk+UTwSPdSGgL1DUqa99YYcvUvqLb7y1G48QjYOvv5haT1z2gc+obSbvAVrQDzdzEC+93qkvr9gBT6o0q+7i2lFvYkltL46Tby97wcwPB9EhL0Xx1080PqOPRQNoD2cwf892bbnPZ7BWb37s9Q9WggIvgviMT62zTe+pLtivstjFj4dfos8LTYIvoXYhL4mTvs8WA3XvjQt9Dxn7gI9RdwmPsbTazyYGWe8KCmYvjHuyr6Qo6g9Ly3VvWmgT74Gwjs+pkkJvsUNpL7vwF++J4SJvbzVCT57QlQ+YIgWPtTJNT58lnk99ldKvAnhn731ZzO7Rnc/PqjeP73aK9W+/3tTPvgHAL3wYYE9MzkrPv+LIb5Q59q9+YI4vav1l70Y8Iy9Sx4xvqPSp712/CO+91DovX+eBj6G40M+DivIvvRKWz4y9wG+Eoj7vRoTZb4XR9S9YhwDPgAtVj2g45e9wlM+PrJLCj2UScO9nl9lPlo/ED1tVHU+xo/YPVOvQj6t8WQ9J1auvAoHVr4TDkQ+RXV8ve4UbD7Dx9Q97JyXvZO1db5CvLc96nA6Pujkpj1HxHE9pKcCPof1Q74hex67nqYUPm29JL4QHIS7DFozvnprMT53p469DScPvjIKdT2zC3i94JsJPkrZ7L285jq9A33evVQy4z0zNpK9o6dPPZou1TvxSFs92+HwvS0xTj5EId69Dc8AvhAAuT01Gig+NlzTvXSYLz6PL0Y9X/zhvZUhAz7LFfK8twbcvQSPIj5alzU+bfLaO8PScT5/9KW9KXEMvhpU3btCVwg+Qq02Pp98Lb6/uZm9J8M8PuRpwrlVLyo+cLW6Pf65sD1Nh3I+Kqz7vVUyib4XxS6+fnqgvauOYz0V/ys+HtksPn9sBL54nZM98OsDO59Ec736bmy7+nPHPWVHTT7HhSw+Y6DxvYur/T3d7Jy93rravGSyL734hUo92aRbPpYy4DtBqza9pdJoPUJ8Ob5kVoy90f4Nu5mF2z2hWOk9" 794 | ] 795 | }, 796 | "conv1d_3": { 797 | "bias": [ 798 | "MoojvbzO5jw46sC8BM7OvcB8A71NQII8iX/hvHrFY74=" 799 | ], 800 | "weights": [ 801 | "XwsCPmsdjD58Q28+guOUvldgez4I4R8+mzGqPmFyCD5TDpI9As1BvmGKlj4VdG++2glivfAAHD7Hqho+WifuOzrOGz7Wj6y9PS1mvpe/9z3Sxvu9xL+wvsQ0mj3DsME7lIqdPuBu+r2kgDg+87uevmta5T3njs+8HSYUvgCmFD5DBog+Ah6pPZtTqD6aF6k+8NWavinzW71usgq+Nb0ivma5Xj48wQW/WpUfvUzw3r4dF8i+ZnZaPp6icr7hMoI9/KPjPYhNAL6zEO09q5FNPpnjcz1hdug9yqwQPUqtfr6m6c890S74vhQ8AL5Qe7i9p1VlProLNr4krT2+WStnPm6vFz4HsWY+R4pRvQYmh72Clsw8FlaSPlZQrb06Znc+RBRdPk9TPjwf+0A+YayEvlpYN73wnkU+vi2IvnMspb1Aers9lNb2PQNjj75J3rQ9y4ANvnE+Iz5c/U++aRZdPoUWvj2zJPW9Aa1hvesuNL4qgAQ+IXQSvpdZQD4YCPc8oIwDPtpYbz64KSY8+DVCPu6q7zt9v1y7/w55PeSx8r3OzNO9JfKEPhZbaj6CWLq9XJAfPa7E3LxDOB4+j+MNPj5Y4T0ickY+7L2/PFHMGj591jw+/ZGyPUV6Oz6cLTY+4/YVPh5GQ73yzIM9zoCBvREBZr7c/p29s6AnvjAeAb5wtx0+QtHsvELHn704Rn+9uTmWPhQRDz2nT8Y+GBUvPiflPL5QoKC+VEFtPq5Ejb33tWc91j/HvRXWXL6SnY89XBBYvVTZfDr04As+JQKDPh6/a77o6J6+rIOyvUsIaz4I2Zu+5Ox0PjQM6r4PbOU9UlmVvs3uQ72lH969sWx3PgC4vjzWFsW+oE2sPfG9hb0yL2O+TbA5vnquMD6ogRe+oFWyPbo3z73cvEW+GhlvPk6vur5GvzK+VTCZPQYQaT4AVHa+F32Ivi3EFb0T9q49rLDuO+BcUz5rnyO/zscPvgVgET1COQ68djOZvf1Kwj0Mc+O8182avGQn9L1K/Gw+", 802 | "4Ignvc0b7L2upIY+BDZavjduij4XfSG9SlfEvIG5C72HAtm9N6/4PdyKkz7O64S9O1jyPQCp2zxa86q8rcrovXXdoT39zB4+vf4FvnTusj2qqbo9872XPTC4/T2lhIY9P45lvkB4uT3s4mM+xJpkPYERfT60/z09vQPxPVVwsTyegL69qzptPvDANb4PFH2+gs5kvit11r3+tX4+psR2PsHyKD4/cTU+ka4vPlKERT5tcyE+bDhJPd2LPL4KMxy9ZifPvVlHqL36YAM+TkkiPn78wz6Y8L69K6GBvWQeFj7It2C+17nDPn+9kD4jJfg9RqsivHUNfD6gpfc7x29uPsc8jj3E8Im+ArcqvlGGCD74WY4+dDvvPWGUV776uoA+kMl2vq+Bnr68ShS+BgMwPtcjN745fTS8xHZCPopBK76UYcA9ZlBMPbQAsr5SOAY+GkmcvK8F/LzwnnI+M9xhvuorpL3/NGa9sJz8u9DTKL63iTG+S9UFvOkngL6h9h4+veOSvuzyOL6nKsK+XJAbvn+8n75ctz29a0jlPv25+r1n0tw8/kHivfmHnr3fQUS+fEV3vpy75T3shz68u4VOvpL8CD5RTxG+HLeIPB8HGj7j5sM+y0zjPjFtbj4ySLY+qGDRPY/yMb7AeOc+sgINvzlTR75YBrY+vvqivFWoZT6/aRY+PYIevp1ag74lAvi9xDsiPraMrD6hoaw8A/Alvg3AFj6x7gE+eYnaPf01h72FNFo+v76MPl09HL1XJEW+0SxUvb+sIr7g0Dm80v+Gvg5iM75Hcx0++F3tvA65S77zHnY+rrn4PIrGhz4tSFc+KfonPn+XwL5Ph9I95DeFvkv4P71eezS+e5EZvOQbST5TwjQ+CaCAvYrssD6sdOQ8lWOcvaNTnb3kcGs+ukKSux7hSD4z9Qy9GSA8PTqtYj5l8NI9uU4PvWqbhD6uXgO+MrjdvVBpuj0Mpnk9Q72SPn97aT4SQ1e+DvW5vbqkQT52+lO+04NJPia15T1u7Vg+" 803 | ] 804 | }, 805 | "conv1d_4": { 806 | "bias": [ 807 | "Z8kbPmOhsLxHcsu7mgabPcGsgr4sOJo83qg8u+CO4Dw=" 808 | ], 809 | "weights": [ 810 | "3AgfvTngeT63Smg+l843PnZ+673WicY+jUhUPFfAu75Ugt87Lq+WPvMnwr3ZWYI+Hau2vZjRujx+TIg+kxqAPelCi77nxJO+TsqcPjzyur6AMXq+H1gzPEvzWT5Ne4e+ps0yPsylOT6S5g++i5cPPrBVBrwk2cy9w413vpuULj5YsYW+YMw3vg25GD6sR6++FpW1PqwOWr7dARQ/zUEiPjh5or4Cqie+Fwp7PfLOmz4xcSm+Ke9HvXbUgz74fL89gyeLvgTyDj3KDT4+nMWXvqLu4L1BaTW+eEOfvpry5z3xYTu8nFR/vsFUn77FePi9MeCJPuYTqD1+jE6/pjQZPW9Lcj55tg4+PyisPh7xeD6N1yg9OnC7vTPcTD6FPpk+Yos/Pm059D1Bs44+rjslvkSIVj4zo+w9eAgbvo5JbD4nWtc9NzlrPuhWmz4ngIa+P8CXvpyCMr4zVQE/DrQTPhW5hb5HfnI+GewyvqEVAz5q2Zu+X40MPX3clj4AMSQ9je+jPg+VpD2IQmk+vxTgvvGsUz623UG+44d6PXFl4j1vS8w9dqSTPSFRCTzbb/09rATfvSml3L3uQJu8aoi1PgLFNL7Hy5u+ER4evjH+hT44YH++4XP7PtyDnr2q3Em8VJI9PMhKnT7LZp+9GJluPnx2zz2y8DC9taDYvmJwIj5X2lI9cANCvmuOlj7Qjxo+yneivjEJDr5HhLU+c+2DPj0e67140p299BnfPAmDuj1kZBU9x5Ysvlh4Cr5ecGK+vEXLvdQq8b0nW1Y9ECP7PY4uUr71cDi+yqXtPCr147xPgbE+cFO7PqE41r17GHY+8scnviEhxT26TQc/ybdhPghp6buHTyU+IPW7PqD0jj7bd2W+MxiyPp4mrT1Q/e89iyCuPUpNpD4QeWE9RwczvvNHD77voJm+Rbhjv2qIGT4wSyC+0PNsvl77mb1T5Ws+eua8vpgv1r30l/e+BXdjvsRuCD7mrao+WfaqPjvEGz4/ILW+zYGxvrmAHL5wMUa8" 811 | ] 812 | }, 813 | "conv1d_5": { 814 | "bias": [ 815 | "t6UrvWBHCbzmQvi9yUm5PI7exjvf3g88Q8wyPV+K6L2J21a964qevO3FXz1edUi+3UEcvesYhDw5fHI8begzvg==" 816 | ], 817 | "weights": [ 818 | "svJ6vVb4aT7y7sm94nHQvZHKgb7R/3O+nCdKPje5C776AHE8tPJoPtdDLz5OhXG+D6XKPK9enr45GJU+Fr5LvcL4Fb+6/ve9QVkxPX+DQj6Lbyo+RANgPkj8Y76DTSg+8lEJuynmcz5BJIw+YDm2ve2xID6WjKI9CS+evehIFL7z+bs+OmuUPgyylz4blYa+mdlRvt2Djb0A+7m9YqeNvkS7az6XtgS9iYg4vmrHTL68HGs+Z6ErvsD9K74bqKW8G03Lvj27Yr7jKoi+CVikvtIkEz7ZFN+97HJXPjFECb7M6km9vuVqPq6p2Tp4p5m+65UzPm8jhT5qw2E+xzg4Pka4gr0PDgw/158Av/RVED1Z8sK9AF2JPmPdIb1+eIS91VaXPr37uT14Rv08ijcyPlVSjb7on5m+7yzmPeM2xzwcYH8+pjUSvhaR5z0tX/o9sTzZvuKutjxQVFG9FudrPjgHqT2sW+09U44APcuG972VUXq+cu9jPV9xab27spQ+CtRbvqpCVb4x7eS9LWA9Pq5hjj5Y7xq88xKIPjH3Cz2ti46+7YSou07+cD4fGpq9sLOcPlUgEz62IyC+bKrFPVIzdL52al0+Ce2hvmzLhD4QmuK9IUofPolwk70aAEw+2RTovas9r74CyWG+lccJvpy/dT69vRo+9W+EPl8T4T2nQvM9ZaNdPGqsgb17YCw9K0A1PkcWrL1jbIE+RyX2vQ7yBb42dRQ9DZ0DvhWQ5z29gB8+BZvnPdrfMz1nfBu+npxgumv+nL0DSoO+bnAjPV/r4j2xbji+MsS8PeZI6TwffvU9ZXOpPfDuib5KwYK9k1+BvT6kTD4r0nQ+YqSWPt8efr4kqnc+Dn1HvsXreD7ABza9DaRvvkO/Tz5iBEs+pDyevthkf77VMHK+KCjmPC1vCzzGgUq+zikDPdApbL0RMO69W7NPvU++272y3SQ+b6OLvYDheT4yMTC+I5YbvfeIeD325Ie80N4rPvdW0j3Ajpy8QBuGPbVJdD4q3so9", 819 | "9USnvcsuJr6z3Gg+WQvHPOoySz4Lrek9xFj/PaU7F70vfgA+l9iJvo4Ho77sLmS9oDTzPQ4+2r0Rw0e+C3WXPUwlrz5UcQm/Nosivreolz7HyJs8C6plvgf7oLxRqB2+tpo5vjxZwzxBHU0+QYlGPozqQL7nOQy+sTmWO/yjKL+eJxM+1I/LvfC1Ez5f/AW+2sakPcUaJj7TJyy+j0kPPQLngT5Xyx29lJ36vG9VMT2ePiU+yf84vuZdc77BdbE9yTE8vrHWkj2Jxcy9VgOcvZcYbz5dHM49rLQqPYEnhL5J0Sq+FG0FPub5nL3jpo4+QlNeviYEwz4V/bW9iQvHPSMByT0BbFK9unGcvp15Ab13Xrk9k2GBPU13k77Jkjg+dFXJPm60sT4Knzg+H1mlPJEfuD0ZRYe+2KmCvnlHAb8K3JA+eItHPtkAIr35clK91nUEvij3nb7yrmK+RFabvhUKgj4ExAy+XwKkvgMav75C8P++nlAJvhKfQL6n6IM97bY3PlO1gj4X/4E9CiKDvtCKgz0XE8O9rv0YvoNjzbyLemi9MyNLPrdbS70VSlU+pVI+PlbZbb7Ee4W+9j8bvudLHD1Yvli9D02DPiSBYT7CZ4I+i+VDvm5GALylNQO+7OOJPdknKL70OUy+pZeSPf892T1n+jQ+E/KQPY2Jlr4Eo4E+Yl7nvVJKSL3Xnlw+keixPb+exL2cHr29lLrEvjmnsr4Mhiu+Hh9APqVE1b6J6G2/CxfQvrMElL720b2+SzARvjQZ3Tysq2O+Al2EPe3i1r2K5km8olv8unbDiL2aXIs9zEhKvbRHWz4Z6T2+CXwCviHEk7z/NqQ9sdAlPrAbzL2+xa+9jNOKPTVNkT6zpzu+cJSGvJzTGL4T/Pg9XExDPmapPT1fwiO9OGKzvdeUiD7n/2M+6TcGvqpNA77Fwg8+niSxvW8/ID6/TYe+IA5YPgO9RD7LgiU9Z3CsPjAZPL68CgO+3h91PFGe6j24FLs8nF/VvmWipT280Jk9" 820 | ] 821 | }, 822 | "conv1d_6": { 823 | "bias": [ 824 | "kHHMvApPi7234UC92XdaPRToNb3IgUA9tLedPcjRXLzYdpc7DRqJPasSA7yozIc8aYC3vbyXrzy7fSO8vt+COh6Sxb2YFpK96BRDvTmBtr13DtA8O50nPAzTLb3Gh1k83SVFvcjOoTzNngs8zUojvF6CRjwFmLo8AewXvfrO5bs=" 825 | ], 826 | "weights": [ 827 | "5BMJPileAr56GY69XeP+PJsAhb6Wdhg+s07bvoM5pbyJoMU93YsmvnoUqD1inyM/Nv2xvaD9Sr4rNiW+5PLxvdcI7jyUN849ScCSvetEur3+80y+dAb9PegDDL6Ccmm9v2hiPaf4sD3qGri9OSfqPsoRTz3BxIy8kE4GvCo1vr1NeFQ+2TfTPX/iVD6y2IU9ohFFPHK7ZbxhgmS9guwDPQChjj1A5vk9gnlFPeKzgT3GQQ8+usAxPdX6Fz7oP/K8QGQ2PTn9gj3tses97dHLvdphFz6xz5O95YjQPTnaID5uRoi9goUiPtT0jz3Jube+rypAvPF6mT5b2Uy+mY5QvqGmT77+Mt08wcoYvPYEg747cr27ThYnPoJyi71y61E8ch/CvbrrRb6qzti7WyDhPbkQ5D3Yup87AwAcvWvUu71htsK+sJwWPV5Q5j3NREy+VB+PvWbRmrxyAtW9K3+MPTzi+T3uGme9iwwqPbw+1zwPhFW+nqW+vsSnar0uPCM7JcpbvoDLE774ygA+fZk4vpEV/TyVCkC9WHqvvO+OpT0qJmK+1VL1PUFbAztoosI9COBtPjT5Pz6RJUe+8+ECvltq8b7p3WK936cdPvJ97b3Pcwk8p/NWPvsYpz1OaAG+YMz0vDiD0L5hi6w9EDmsvHG7vz1JQIs+zr0lvogqlj2vbtu+hPqXPTYxVT6zj5O+kszIPfFwBL5qpaq8PftTvqsJNL5x/D2+jojJvZz2SbxghY6+c7eXvbTiBr3ijIe+pMu3PbpelL63/N+9gXX7PU+si70OMg2+jOM8Pv8tJT7O/iC9cPrQOuZfuD35yVQ+P6MIPpMgxD0uvIu9Oe5APYzAKL5uPQO+PL6Uvgmqaj2IwJS9PVUcPHSIEr6L3Ss9gS3FvUELNr6AF5E9tw7wPe3yc77OwCs+kW0CPjQdfL0kaWs9X7qSvZQFeb1PSTG9ltlavq6RfL7nXAw9j1ZAPWgDkL3IJry9la6MPRt8Xz46Gwk+cfMJPjDfIj6gPVm+", 828 | "6iCBPaHHUjqQuSU9kuNTPn5kpT2gs4+72u71vkeUWr6fUTq9wHrNPfaUND2B3oA+agW0u07FLT18qlu+9n9Vvq5OAL5HgG094pmrPmnVGD4EhQs+YbqtvQd9ob7QbWU+k7gzvg+CQj6ihom+M383P1I/BD6MBwK/HW14vlzMF7mDvg0+aZLbvRUMCD6aDVS+TMuLPU+BI77RPZm9kxtfPqBdQb6ouuq9/d+qvXQhWD5ROcu9e/wQPsYUlruvrUa+kZaJvSNBvL3Uv7896gZRPiuHqz3691S9OjwEPttLI764Wwk+0vNzvf7b9D0yBus9kgVYvvLo9L3DE+i9K431PaCe1rth48C9EQmYPVcKyj0Iql29s9x3PMj9YD69sIA9aL4uPm87zr0jkF0+EsxPvRnA/73GvMI73RcXvXSj3z28yHQ+Y4iZvaXqKD6wLCc9kVEMvZ08GD6zSQM8u0nSPcfESD65+Ai+P/2rvQ5w5r5wqdg7dYIjPqsk4r3CDnc+k56uPHsBRb5N4/S9UyVlPlRpVD5hlHq+HPRhPRpP/7w791g+HfRGPlkpnr17uyW+WN5sPcPxgL48VKE+Prt5vjePvL2y44++1LLHvWGxTb4MKTQ+zAUovJQvj7tmhTY97g/9vt6Elz7O4ea+UIyqPfyRGD4WCWq9kN84vgnbfT6IW9+9FsmmvZ2S4DyV7QC+umxdO6I2G72HM/q96olmvD4+XD5ydlM+D7W7O5JiNz3F36K8Y5MVPgMz+rvRx0O9uaUtPdca1LwhbaY+Zg8fPHUZCD1SYQy7DF4yvdWeQj6vrH27s03KPTNFQL2XiKE9GS8kPtwqOj5SmS6+TKZsvf9aNb5h+uA9w9pBPmw2Fz6Swr29Ve7QPc6I6rypFhu96cw2vu22tz0YdAa8gSvWPniw9T2EDTW+/27BPS7Fg72Jdwm+nsVtPlDIPL1f9Fu+B1Q3vpTZpzwkpfW9ynsjPds7FL/vH5A9NOjZPYAhFz7ZADA++pmFPdRKf7yyyiA+", 829 | "udYUvj4ywT0wmii8cUCLPTs00j3mAcC8Yx6DvSdg8D0RqQA+SuVEPdw/zj1j0FQ8/4QKvm0rgD6mTHu8IZpWPm6FKb2Gg4K+6Z3rvBipGD5j5QS9AwSxvUze6D0uc2891e/evMGjJT3YIFg+Xm6kPOoy8z0Kq0s+CpT+vUeD0j3P0hE+c4+zve4tujxgq7y8/mOZPUorAT0fVsw92VinvO+E6T3WUjw9Kg9pPBMx+T15Gww+WS6IvZmIn7uOfeg8CxyIOQYWmb35VMk9nDzZvi5p8L1xiJK8ATOnvpSDmT6MMfk85Cc9vp00oL6ZWD0+f19JPklsxDzg/yS9DQYcPl6sVL6bwyq+YBqbPuue0T00Gwe/GHKVPv41+D4Bf3e9A1UdvQdHOz0q+mw+aOHbOyrDm755rLm++9lmPshp8D75sbM9b/F2PuU0QD5BprY91g8rvhVdjD1EelS85t+TPSdiPT33lhm+dR2HPgTpdT4HBxk9vNa0PvL7ib7an3U+lcrDPfMPnj1ga/Y9VMyIvdteUb1vZJw9HecKvqpsLz4JEi09Kg4kvjWvKz3SgLg+U2bAvUBa2D0eBM09NLOtPclTxj1RzHI+4NqZujRSCL60Un87qzxJvpjZfL0OyQ0+yVIgvWWlSj1MTxA+5E5DPoaT+T3udNi7pRUXvSXWiDug3Ik8/8XevK76Gj/h8Qw+UP8FvWYl3jxPF+a8fdGgu2lovT12WiY+fxuWPbz5Kj4jATm7LTnwPBxtFz6VYQ4+r9Q7vkXlxD1oHUg+6jkhO6aOzbx/58e8mfQqPhp76j27DxI+kovYvZYWhbyCHtI9bUCjvCnzcb1/H7M9/4K0vTMcSb2/SUe+8qwKOx6N8T11jmM9bN+5vRgyOz4k2dy8HHgwvpVSG74Mbp090D1ZvgOrt716ELY9CaGTPQJ2tL395js9hKeXvidQpz2+Coi9dN4Gvqyo9T0j2PO8fjQHPUY8vj0DmEG9lOb6vcj5CL+rxg4+myu4PXYCiT0cMvQ8", 830 | "ZPb2PSi7eL48RYS+YyT3PIwx8T19Se+8IgP6vTAzgz2DGse81uLYvABltr0v2I+9qCG5vSgCTr6kUQk9bD6OPp8CIj79FvG8z2sjvlvwPDsMfje9juYOvcTlJL5aNsk8JcHFvU7sqz3vlC++YmWCPne5IT0RwgE9BaQUvkPvOj2a3wy9waUhvsvnaL44Ufs91oEMvs5yYD585EW8i9gnPoz8OL6TYYm+g0KXPaOOoz5505q9XRiBvVwYW74CqqY8Z4CzvY+/Gr4gWbo9ftSrPcxd7zlzXfy95CNWvHTijbiroJQ8OFn1PYIaVL4oxZa9rloOvdG73L2uQ+w9UikGPppmJ73j0Wa9qZjqPBt72b0UezU+0g58PnRSozxy0OM9gnXKPKhuxD3p7S69uO2nvUiCOz5gVC0+tYNNvcqg3T3EzQq+C43avZhXez69Nv090YEePlu/Fj4mOdk9JViKPWbzAj764JA9IJnWPYD3L79jazO9IMTVPZI/5r0rte27fBsCPajq6b2FmWI+gg5OPtlsLT5iKIk998aEvYLZXb61b4a+aeVCvmWYLb4geQS9HLaUvvzdcL4hG4s9qh/TPehppL1aJxy+VTEzvvUROT4jgB6+iYWPvVGZPruMWEK+Z4K3vEAeGb6Kzd+9GUjcPaJPJz6FXn6+/10iPiXw/Dvr9ek97TU8vvGquTzeoPg9rv0yPotp2LtUNTG+fPKFPYiLF75zzxa9J3ZJvsad9b2kEAG+xsl/vrY70T0Ednm9uKvSPd0NDj1db66+C7gfPpxrVr5JSEE9WlYvvmI3iL5wOIC9kX39vdPMBL5KZKQ+jT7gvbcPcb57khC+JdEtvldHCL52eSA8NAMuPHscKT16IXG+B5SoPfLOIz6kCle+ZqH1vQernL4wLpo8Bk2vvfP3Rr54QaE9IapfPpi+xT1o0qO8oR6IvC+fKr4ISB0+EbyyPV7sBL7D/NI9a9CcvRG6bD0CqDQ+gW8IuyX40z18rri+wbcqvnDFj72g2oq9", 831 | "HJGOvVQOjD2yFwW9Gb5RPaN2Q7+V5CC+P7CPvhbf1b4a74o+1NpMPRYcfL420Aa+w+++vbmcwb5yxpO+bLfQvjDfkD4DDCQ9bMn9PVQONz65MRK+YSC3PWgYRj5HPyi+9NLovX0eZj4p8Nu76JzgvR+nbT3nKiE9iPAkPoyWq75eoeu9w323Pb/KAj47pYe+t7IGvq+DZTpUwmA+1crLPU2mkDoNtdc9FjU3PI3R3D097Qi+KrJ6PiFiKT7t2pg8QAWmveB1/L3JalS+E3Q9PvwrCL2zhQI+/7ZSvu3DKT63rsW+JJWsvB2stL7N2gK8eWqWvCJmd7432LM9q1KGPhbx3Lr8XpU9/7a6PfFrCT7EXbQ9OaJavuE+Ir1dffw98y6MvUyJOzw3hPW86L0rPUGrB77T8/i954A/PjPiJr1T3yE7dP5IvpjOHr68eES+u/lEPvCOb72FyZq944stPkOPqb58HRw+LkptPRwKBT4fqtK8bNkkvlEOKr7UK+y85wgYPkUjhj0Z5ug+YOuFvWdzAD6KvZ89n1RkPSJs+r1HHpU7Ie2FO+bTIz0RDYc+9SdXu+tmkb6Fwom9i8++vQMber1i15Q7Z0rEPozzWL0SEh08cxK1PeSJ871qj2M+9FDPvSdIID7Vbik+O0nHPiaxSz4bOom+EOeyvpMnNL6hJxc8TJQAPXFaiz1zoD6+KVJUvsuLGby1giC+gvUZvgEDo74R2RM+Rq8fPqp7tL0Rl8k9zTCZvsJK6j30z/o9IFvwvgpAbLt+6Kk+KDF7vhZzPD0WIbm7WW8HvuPozz1K8RO+BWEXP6nx3b4YsQw9gHtNvgI2nD10/029xXeBPpw15b7Lt5U9HwhLPcJ9m75ED3G8RNArPmyVPT4peAW+y+RZvqx9ez5bGBS+I8x8vm4vX76BfK0+w6kJvt+Ux70J7tK+aaHbviAOyj7xG3S+UgU2vkvhGjzycbK7ChWWPal94T18tyu+CYWEvqJiDr7aV1i+zNewPsCIKr4VOTi9", 832 | "Gv3+PRVWND6Bhyw+XQ3zvSq4SL5jj0s9pg0Gv2mGf76yIIi+tk0/Poxg4j7UPg4/GCYpvWhW2b7y94K+JP8RvkE2MzzSQe29BGp4uzW0zL1wvr89gESTvokGkb9xjna7EciQvsAWA74qnn4+IUIJP+PHgz48cAK/uAcBvX/+3LzXOV4+LsjfvY8Y9D5ayMw8wpewvRQUqj2Duxu+A90zPqREVr3Iz/A9dZEWPs5wHDw+DZW9RoAavccMIb3Oy2o+zFwlvh7xWb6gtS89AmeNvc8RIL39LUg+GOfwveRpiL3BZBW+WNmgu6ydjLvN/Zm+uyqjvowlDj5sfZm+48OovfB5or4k9mo+M6jNPepXDb5Sah6+CBWCPu7NPj0ag5O8fJbgvRSGEb2Z1x0+D2y5vkdrG75Cito88j5evhs/gb1PHcS+yOlnvl3Vlz7EAhq+ZR60vTH+Iz6Op3W9D1kYvdEjcb33nK++F/aOvYu8mb59UNG+npoAvnTC3ry4dmk82zyQvk9bxbxXCqe9yFAivpe6Mr5TRwE+s5cPPkrO7b0CdgQ+mbMDv/sLpD3MpYo+iEB5vFh62L2fAd6+63hKPhUsjr66qrC+MkCPvXptJz2eJ1W+4e8Vvlrblj1BSGm+q0IqvpQV4LztDvi98gsLPlPIgD7YCUk+nCzuvoL9Dr0HHeQ9MUuMPbeS1z3+mES+AfwwPnzpm73wakI7DxvrvjSI0j0yD/i9c/aSPq6v6L2LbdU8rBRWvgcltrxMPCI9IlsIPiUJUb2fmZc+zF56vf3yYz4BUmc+KiINPuvQGT6z+9w9glHuPDHrlz3w0468xJo5vkYEmT1qEBy+K2QIPgcjkz1iU569injHPf9jtb1mbyk+U1efPWSxuj0iwlA9d0UqvviIJr5se428g/gNPNEyFTzIrRW9TnDJPTdi5r3YCQ0+R+pBPlrQIr79jhG9OUgTvrTPIr7bT449WqAZvnhXDT7iLZs9igPAu6caP76CChK+AmnCvPfFqTsPmLm9", 833 | "eEs1vyyw9j2N2Sg+HB/lPfOo1L2Zzk4+dzAbvfj71jx4Fv097nO7vpnOGr2/r6e6IZi0vudTWb0j+kG+lOknPQTB9r5poJW+D10TPiGTJj79y0k+oO7FvJ/Lxr2Vo5O94L5LvEHM0D7zECq+jKYAvaM2Db8cTQ++NP7oPYbd2L2Iyqe+05+tviquSz6HKZ+8JNuLvL8I/rzgceO8o080vkJZwr3QLhU/p3nTPNeO0b6rMho+EujEvcMXtrvnPN+9vrIvvplT37y2aVq8P2RAPuvraT2lNBo9M1BKvDThAj5MrUU+ybYkPjhEEbyIkA8+VcCmuzZdIr7rCUI9CkkyvvOUkL3GDo29IrzwvXEEIT7RGDm+Nc7NPd3FYD6yiTA+3liJvJ4UYb7hBtQ7jz1sPScTijxpwi8+vcYgvsr2Hj3mcbQ9klA1vjCZKD5o5e49Gc4jPgNObD6Avha+SI4zPgJgtb1qhSm+8l3KverNA751i4O9B5C/PZve3b3jJY69lIaKvh5Ht73aoq0+4yREvS8uCj5BbZ6+t0GfPE892L7GJI09CXTrvee/FL6DoeS9pWzsPI1gl7550dE8T0xcPeC/YzvnGUc9vQn2PtVA8L6NhAo+A/eZPYOcgz29sAE/BF7xPU6/R7zbtH29DPkEv8gpBj0Gbpw+QQCQPkOxyr16RAW7ee9jvNK4tL3WGgO+PG3bviDlPL6r4da+kuiPO1L0SD5Bg3g+SpI4PtpSJL6cWEE+CvbVPEbXwr25MsM+URR+vDOWnT2Of2E++n7HPfyXTTyG6Ni9uq0dPNUahDvBVTW+JKQJvolW4j3yDPc+VN9MPpJICT21MW291eREvhwsJz716pA9W80EP4uNAL3DEwS9y6tvvgWsVzyjYTq+ae6evtmOdry6iUA+TkuXPieUm72iDYe9GUgsvjUsIL4Jyj0+1YSkPZy9Az8yAoE9gFOHPbHo3j1IqN68fhJbvmKXqb7sUR4+WA6BPvjGLz1zcBs+LG7Rvv+9cL6UylA9", 834 | "RLZaPcaRpr31xSw+E94Zvrlmer2tXxa+/x3kPYGULr7tHJC91AUjPnvQV777blu9T73WPUYyZb1CNES92sLOvSygsrx94hq+vQ5DvnSygj3gso69PdpGvmDKlz0CYyK+Z7FfvfCzBL7y1p29PcPYPWOPeb48QqG9BHMyPWBUqT0ytKu89Y90vRfiujwARSk+Zz82PQwXWr1Svbq9Vs6ZvPRJAb5AK+S8hLgbvlDOS764HAQ8Lu5PvsIDbb0ciHc96n+WPGHc1T2PE609GK0NvhO2KT4KOwI+rYhePYp/DT7mdNa943vPPcCeML6ikYY9fmwhPshP/T1mM1o+KLg2PjgriL1uMdK9p1GjPAP5Lz73nig+NWtoPiUwFr4SNJU9jTc8PboUWjzK6608Hx6Tvh1prb2wnB++UJONvJvpMr4IPuC8ewuTPIIjnj3BP0u+yX5wPPzpFT4j220+FpkYPZBf3j1wjSa+cZkVvbIp+zqoM4m9tR8VPmtRxz0cDv694zDYPaeLmL4LHYY+qaKEvt6hRT5nbjG+omwRvmVaMb69ARC+hbE4vvGiRLrfxRS+HxImvgMFWj3D+oO9ymbrPYNIyD0YhC0+Tve2PkBNSL4Ber08Rzo7PkHrCT5EsCc9maZpvPYaED6s9z2+GqaWvf2v/z0gk/s9lu4evhGp0DywRN89+0hhvlkRPj5kT+i9l540PTi/HLwmF8i8wvepvf2zWT7HQGG+86mEvuh1972JFG29UDmPvsmkib2Vi6y9nycQvje+LD6slaK9xh/dPP58B737X448r8R1vGN9mb28f548G+VTPinwzj2pETA+T+TivZ6hiD3wpFg9WPIqPl9lrL3b2L+8NMGvPRnm/D3I9/q9A6wavuCT9b2LrLM9nk81PnN7YrvmnKu6uWCwPeMuND67Nd08rUnzPd6Auj3UuLi87SVpPqfV6D2a/iC+5GBjPX1k6D1FIgS+F53Su24BEL6EEdi61ZMGvQWy9j1IeBM+P9oDvoYhIz4RSAg+" 835 | ] 836 | }, 837 | "conv1d_7": { 838 | "bias": [ 839 | "nX+lvA==" 840 | ], 841 | "weights": [ 842 | "gfppPpXhFr00KLi++VH+vYfWPD6omVU+QK09viYgRT7PWKC8Hge5PZCtorx9NUe+xK0APtFcvjv11C6+USn7vRFizjwJcM08XaVYPXVMp74DEbU98q/BvamTIz98IF2+bK1ePu/Kd71fZky+oa1WPuI3/r1dlhM93SaIPedKyb1/Caa9Hce4vYHIxL5hKS6+MjQVvcQfdr5oVSg+LuQjPSKoU75wyui9jSmAPrDbPj5M7Pg9i5Qivq/rnTzSSZG9jUobPiAeyjx4g/k6Sl7dvmlSKz6TF6++Di+APgxULL6R78O82t1gvABaID5GChk+apkAvqsxu72x1Ay+jK8ePm2sIz5nQ4Q9vb43vgHgwbuuHRe+6yZqvtqBojwx72U+MzwbPj9etzwsnLS9GTdmvmrMTL2t74C9kdM4vJbakr3Kdi++7xhhPvf71TxbvSW/PyL5vVutn75HzdA+q3yuPBeLdr6bxFe+FTJDPbqe271cdPo9FOkZvkO+oL7JkV8+" 843 | ] 844 | } 845 | } 846 | } 847 | -------------------------------------------------------------------------------- /CNN/readme.md: -------------------------------------------------------------------------------- 1 | # 1D CNN Autoencoder 2 | A denoising autoencoder that relies on one dimensional convolutional layers for denoising 3 | 4 | **Work in Progress** 5 | * Hyperparameter Optimization 6 | * Implement better Scaling Methods 7 | * Train with LFP Data 8 | * C++ Implementation 9 | -------------------------------------------------------------------------------- /CNN1D_Optimize v0.3.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Copy of CNN1D Optimize(draft).ipynb", 7 | "version": "0.3.2", 8 | "provenance": [], 9 | "collapsed_sections": [], 10 | "include_colab_link": true 11 | }, 12 | "kernelspec": { 13 | "name": "python3", 14 | "display_name": "Python 3" 15 | }, 16 | "accelerator": "GPU" 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "metadata": { 31 | "id": "ontfmefnFpH9", 32 | "colab_type": "code", 33 | "outputId": "cb39272a-87bf-403b-cba8-0e846594f65d", 34 | "colab": { 35 | "base_uri": "https://localhost:8080/", 36 | "height": 2536 37 | } 38 | }, 39 | "cell_type": "code", 40 | "source": [ 41 | "#Additional Packages to Install\n", 42 | "# !pip install pydrive\n", 43 | "# !pip install git+https://github.com/hyperopt/hyperopt.git\n", 44 | "# !pip install kopt\n", 45 | "# !pip install oauth2client\n", 46 | "# !pip install tensorboardcolab\n", 47 | "# !pip install pymongo\n", 48 | "# !pip install git+https://github.com/rthalley/dnspython.git\n", 49 | "# !pip install dnspython\n", 50 | "\n", 51 | "import numpy as np\n", 52 | "import pandas as pd\n", 53 | "import matplotlib.pyplot as plt\n", 54 | "import tensorflow as tf\n", 55 | "import pydrive\n", 56 | "import pymongo\n", 57 | "import dns\n", 58 | "from tensorboardcolab import *\n", 59 | "from random import randint\n", 60 | "from keras.layers import Dense,Conv1D,Input\n", 61 | "from keras.layers import MaxPooling1D,UpSampling1D\n", 62 | "from keras.layers import Activation,BatchNormalization\n", 63 | "from keras.models import Model\n", 64 | "from keras.optimizers import RMSprop\n", 65 | "from sklearn.preprocessing import MinMaxScaler\n", 66 | "from pydrive.auth import GoogleAuth\n", 67 | "from pydrive.drive import GoogleDrive\n", 68 | "from google.colab import auth\n", 69 | "from oauth2client.client import GoogleCredentials\n", 70 | "from kopt import CompileFN, KMongoTrials, test_fn\n", 71 | "from hyperopt import fmin, tpe, hp, STATUS_OK, Trials\n", 72 | "from hyperopt.mongoexp import MongoTrials\n", 73 | "from google.colab import drive\n", 74 | "\n", 75 | "\n", 76 | "\n", 77 | "\n", 78 | "#MongoTrials\n", 79 | "# SRV_string = ''\n", 80 | "# client = pymongo.MongoClient(SRV_string)\n", 81 | "# client.test_database\n", 82 | "# print(client)\n", 83 | "# hostname = ''\n", 84 | "# port = 27017\n", 85 | "\n", 86 | "\n", 87 | "\n", 88 | "#Mounting Google Drive\n", 89 | "# drive.mount('/content/gdrive')\n", 90 | "# #Authenticate/Create PyDrive client \n", 91 | "# auth.authenticate_user()\n", 92 | "# gauth = GoogleAuth()\n", 93 | "# gauth.credentials = GoogleCredentials.get_application_default()\n", 94 | "# drive = GoogleDrive(gauth)\n", 95 | "\n", 96 | "\n", 97 | " \n", 98 | "#tbc=TensorBoardColab()\n", 99 | "batch_size = 1000\n", 100 | "validation_split = 0.15\n", 101 | "timesteps = 2000\n", 102 | "features = 1\n", 103 | "global timesteps\n", 104 | "global features\n", 105 | "\n", 106 | "\n", 107 | "#Generate Test/Train Data\n", 108 | "def create_data(timesteps = 2000):\n", 109 | " length = 1\n", 110 | " dt = 0.0005\n", 111 | " noise_factor = 0.35\n", 112 | " data_1 = []\n", 113 | " data_noisy_1 = []\n", 114 | " for i in range(batch_size):\n", 115 | " freq = 30*np.random.random() + 1\n", 116 | " t = np.arange(0,length,dt)\n", 117 | " #signal = np.arange(-0.5*length,0.5*length,dt)\n", 118 | " signal = np.sin(2*np.pi*freq*t)\n", 119 | " noisy_signal = signal+noise_factor*np.random.rand(len(t))\n", 120 | " data_1.append(signal)\n", 121 | " data_noisy_1.append(noisy_signal)\n", 122 | " data_1 = np.array(data_1)\n", 123 | " data_noisy_1 = np.array(data_noisy_1)\n", 124 | " \n", 125 | " #Scale Data - Need a better scaler than MinMaxScaler\n", 126 | " scaler = MinMaxScaler(feature_range = (0,1))\n", 127 | " data_1 = np.vstack((data_1,data_noisy_1))\n", 128 | " data_1 = scaler.fit_transform(data_1)\n", 129 | " signal = data_1[0:batch_size][:]\n", 130 | " signal_noisy = data_1[batch_size:2*batch_size][:]\n", 131 | " \n", 132 | " #Input Shaping\n", 133 | " features = 1\n", 134 | " timesteps = len(signal[0])\n", 135 | " shape = (batch_size,timesteps,features)\n", 136 | " #Input shape should equal [samples, timesteps, features]\n", 137 | " x = signal.reshape(shape)\n", 138 | " y = signal_noisy.reshape(shape)\n", 139 | " \n", 140 | " split_point = int((1-validation_split)*batch_size)\n", 141 | " \n", 142 | " x_train = x[0:split_point,:,:]\n", 143 | " y_train = y[0:split_point,:,:]\n", 144 | " x_test = x[split_point:batch_size,:,:]\n", 145 | " y_test = y[split_point:batch_size][:]\n", 146 | "\n", 147 | " return (x_train,y_train,features),(x_test,y_test)\n", 148 | "\n", 149 | "\n", 150 | "\n", 151 | "#Gnerate Model For Optimization\n", 152 | "def create_autoencoder(train_data,max_filters = 32, min_filters = 8, layers = 3,\n", 153 | " kernel_size = 3,filter_spacing = 'lin'):\n", 154 | " \n", 155 | " timesteps = 2000\n", 156 | " features = 1\n", 157 | " inputs = Input(shape = (timesteps,features),name = 'Input')\n", 158 | " encoded = inputs\n", 159 | " \n", 160 | " #Linear Filter Range\n", 161 | " if filter_spacing == 'lin':\n", 162 | " filter_range = np.linspace(max_filters,min_filters,layers,\n", 163 | " dtype = 'int64')\n", 164 | " #Half Filter Range\n", 165 | " if filter_spacing == 'half':\n", 166 | " if max_filters%2 != 0:\n", 167 | " max_filters+=1\n", 168 | " if min_filters%2 != 0:\n", 169 | " min_filters+=1\n", 170 | " filter_range = [max_filters]\n", 171 | " x = max_filters\n", 172 | " while x> min_filters:\n", 173 | " x = x/2\n", 174 | " filter_range.append(x)\n", 175 | " if filter_range[-1] < min_filters:\n", 176 | " del filter_range[-1]\n", 177 | " filter_range = np.asarray(filter_range,dtype = 'int64')\n", 178 | " \n", 179 | " #Random Filter Range\n", 180 | " if filter_spacing == 'random':\n", 181 | " filter_range = [randint(min_filters, max_filters) for z in range(layers)]\n", 182 | " filter_range.sort(reverse= True)\n", 183 | " filter_range = np.asarray(filter_range)\n", 184 | " \n", 185 | " conv_name = ''\n", 186 | " count = 1\n", 187 | " for num_filters in filter_range: \n", 188 | " conv_name = 'Conv_Layer_No._{0}'.format(count)\n", 189 | " encoded = Conv1D(num_filters,kernel_size,padding = 'same',name = conv_name)(encoded)\n", 190 | " count+=1\n", 191 | " if(num_filters==max_filters):\n", 192 | " encoded = BatchNormalization()(encoded)\n", 193 | " \n", 194 | " encoded = Activation('relu')(encoded)\n", 195 | " encoded = MaxPooling1D(2,padding = 'same')(encoded)\n", 196 | " \n", 197 | " filter_range = np.sort(filter_range)\n", 198 | " for num_filters in filter_range: \n", 199 | " conv_name = 'Conv_Layer_No._{0}'.format(count)\n", 200 | " encoded = Conv1D(num_filters,kernel_size,padding = 'same',name = conv_name)(encoded)\n", 201 | " count+=1\n", 202 | " encoded = Activation('relu')(encoded)\n", 203 | " encoded = UpSampling1D(2)(encoded)\n", 204 | " \n", 205 | " decoded = Conv1D(1,kernel_size,activation = 'sigmoid',padding = 'same')(encoded)\n", 206 | " \n", 207 | " autoencoder = Model(inputs,decoded)\n", 208 | " autoencoder.summary()\n", 209 | " optimizer = RMSprop(lr=1e-3)\n", 210 | " autoencoder.compile(optimizer = optimizer, loss = 'mse')\n", 211 | " \n", 212 | " return autoencoder\n", 213 | "\n", 214 | "\n", 215 | "\n", 216 | "\n", 217 | "\n", 218 | "#HyperParameter Range\n", 219 | "hyper_params = {\n", 220 | " \"data\":{\n", 221 | " 'timesteps': 2000\n", 222 | " \n", 223 | " \n", 224 | " },\n", 225 | " \"model\":{\n", 226 | " \"max_filters\":hp.choice('mx_filters',np.arange(32,320,dtype = 'int32')),\n", 227 | " \"min_filters\":hp.choice('mn_filters',np.arange(4,32,dtype = 'int32')),\n", 228 | " 'layers':hp.choice('ly',np.arange(1,3,dtype = 'int32')),\n", 229 | " 'filter_spacing':hp.choice('fs',['lin','half','random'])\n", 230 | " \n", 231 | " },\n", 232 | " \"fit\":{\n", 233 | " 'epochs': 1,\n", 234 | " 'patience': 3\n", 235 | " }\n", 236 | "}\n", 237 | "\n", 238 | "\n", 239 | "\n", 240 | "#NN Evaluation\n", 241 | "db_name = 'Autoencoder'\n", 242 | "exp_name ='exp_1'\n", 243 | "objective = CompileFN(db_name,exp_name,\n", 244 | " data_fn = create_data,\n", 245 | " model_fn = create_autoencoder,\n", 246 | " loss_metric = 'loss',\n", 247 | " loss_metric_mode = 'min',\n", 248 | " valid_split = None,\n", 249 | " save_model = 'best',\n", 250 | " save_results = True)\n", 251 | " \n", 252 | " \n", 253 | "\n", 254 | "\n", 255 | "\n", 256 | "trials = Trials()\n", 257 | "best = fmin(objective, hyper_params, trials=trials, algo=tpe.suggest, max_evals=2)\n", 258 | "\n", 259 | "trial_data = trials.results\n", 260 | "\n", 261 | "#Organize trials into table\n", 262 | "val_loss = []\n", 263 | "loss = []\n", 264 | "filter_spacing = []\n", 265 | "max_filters = []\n", 266 | "min_filters = []\n", 267 | "layers = []\n", 268 | "for i in range(len(trial_data)):\n", 269 | " trial = trial_data[i]\n", 270 | " val_loss.append('%.6f'%(trial['history']['loss']['val_loss'][0])) \n", 271 | " loss.append('%.6f'%(trial['history']['loss']['loss'][0]))\n", 272 | " filter_spacing.append(trial['param']['model']['filter_spacing'])\n", 273 | " max_filters.append(trial['param']['model']['max_filters'])\n", 274 | " min_filters.append(trial['param']['model']['min_filters'])\n", 275 | " layers.append(trial['param']['model']['layers'])\n", 276 | "\n", 277 | "\n", 278 | "new_dict = {'val_loss':val_loss,'loss':loss,\n", 279 | " 'f_spacing':filter_spacing,'max_f':max_filters,'min_f':min_filters}\n", 280 | "\n", 281 | "data_frame = pd.DataFrame.from_dict(new_dict, orient='columns')\n", 282 | "print(data_frame)\n", 283 | " \n", 284 | "\n", 285 | "#Mongo Trials - Cont'd\n", 286 | "#trials = MongoTrials(SRV_string,exp_key = 'Optimization_1')\n", 287 | "#trials = MongoTrials('mongo://{0}:{1}/{2}/jobs'.format(hostname,port,db_name), exp_key='exp1')\n", 288 | "#trials = KMongoTrials(db_name, exp_name,\n", 289 | "# ip=hostname,\n", 290 | "# port=port)\n", 291 | "\n", 292 | "\n", 293 | "\n", 294 | "\n", 295 | "\n", 296 | " \n", 297 | "#Save Model to Google Drive\n", 298 | "# model_file = drive.CreateFile({'title' : 'CNN1D_v1.0.h5'})\n", 299 | "# model_file.SetContentFile('model.h5')\n", 300 | "# model_file.Upload()\n", 301 | "# drive.CreateFile({'id': model_file.get('id')})\n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " " 308 | ], 309 | "execution_count": 0, 310 | "outputs": [ 311 | { 312 | "output_type": "stream", 313 | "text": [ 314 | "2018-12-30 05:37:42,783 [INFO] tpe_transform took 0.022910 seconds\n", 315 | "2018-12-30 05:37:42,785 [INFO] TPE using 0 trials\n", 316 | "2018-12-30 05:37:42,799 [INFO] Load data...\n" 317 | ], 318 | "name": "stderr" 319 | }, 320 | { 321 | "output_type": "stream", 322 | "text": [ 323 | "MongoClient(host=['autoencoderoptimization-shard-00-02-08kaz.mongodb.net:27017', 'autoencoderoptimization-shard-00-00-08kaz.mongodb.net:27017', 'autoencoderoptimization-shard-00-01-08kaz.mongodb.net:27017'], document_class=dict, tz_aware=False, connect=True, authsource='admin', replicaset='AutoEncoderOptimization-shard-0', ssl=True, retrywrites=True)\n" 324 | ], 325 | "name": "stdout" 326 | }, 327 | { 328 | "output_type": "stream", 329 | "text": [ 330 | "2018-12-30 05:37:43,636 [INFO] Fit...\n" 331 | ], 332 | "name": "stderr" 333 | }, 334 | { 335 | "output_type": "stream", 336 | "text": [ 337 | "_________________________________________________________________\n", 338 | "Layer (type) Output Shape Param # \n", 339 | "=================================================================\n", 340 | "Input (InputLayer) (None, 2000, 1) 0 \n", 341 | "_________________________________________________________________\n", 342 | "Conv_Layer_No._1 (Conv1D) (None, 2000, 44) 176 \n", 343 | "_________________________________________________________________\n", 344 | "batch_normalization_5 (Batch (None, 2000, 44) 176 \n", 345 | "_________________________________________________________________\n", 346 | "activation_17 (Activation) (None, 2000, 44) 0 \n", 347 | "_________________________________________________________________\n", 348 | "max_pooling1d_9 (MaxPooling1 (None, 1000, 44) 0 \n", 349 | "_________________________________________________________________\n", 350 | "Conv_Layer_No._2 (Conv1D) (None, 1000, 22) 2926 \n", 351 | "_________________________________________________________________\n", 352 | "activation_18 (Activation) (None, 1000, 22) 0 \n", 353 | "_________________________________________________________________\n", 354 | "max_pooling1d_10 (MaxPooling (None, 500, 22) 0 \n", 355 | "_________________________________________________________________\n", 356 | "Conv_Layer_No._3 (Conv1D) (None, 500, 11) 737 \n", 357 | "_________________________________________________________________\n", 358 | "activation_19 (Activation) (None, 500, 11) 0 \n", 359 | "_________________________________________________________________\n", 360 | "max_pooling1d_11 (MaxPooling (None, 250, 11) 0 \n", 361 | "_________________________________________________________________\n", 362 | "Conv_Layer_No._4 (Conv1D) (None, 250, 5) 170 \n", 363 | "_________________________________________________________________\n", 364 | "activation_20 (Activation) (None, 250, 5) 0 \n", 365 | "_________________________________________________________________\n", 366 | "max_pooling1d_12 (MaxPooling (None, 125, 5) 0 \n", 367 | "_________________________________________________________________\n", 368 | "Conv_Layer_No._5 (Conv1D) (None, 125, 5) 80 \n", 369 | "_________________________________________________________________\n", 370 | "activation_21 (Activation) (None, 125, 5) 0 \n", 371 | "_________________________________________________________________\n", 372 | "up_sampling1d_9 (UpSampling1 (None, 250, 5) 0 \n", 373 | "_________________________________________________________________\n", 374 | "Conv_Layer_No._6 (Conv1D) (None, 250, 11) 176 \n", 375 | "_________________________________________________________________\n", 376 | "activation_22 (Activation) (None, 250, 11) 0 \n", 377 | "_________________________________________________________________\n", 378 | "up_sampling1d_10 (UpSampling (None, 500, 11) 0 \n", 379 | "_________________________________________________________________\n", 380 | "Conv_Layer_No._7 (Conv1D) (None, 500, 22) 748 \n", 381 | "_________________________________________________________________\n", 382 | "activation_23 (Activation) (None, 500, 22) 0 \n", 383 | "_________________________________________________________________\n", 384 | "up_sampling1d_11 (UpSampling (None, 1000, 22) 0 \n", 385 | "_________________________________________________________________\n", 386 | "Conv_Layer_No._8 (Conv1D) (None, 1000, 44) 2948 \n", 387 | "_________________________________________________________________\n", 388 | "activation_24 (Activation) (None, 1000, 44) 0 \n", 389 | "_________________________________________________________________\n", 390 | "up_sampling1d_12 (UpSampling (None, 2000, 44) 0 \n", 391 | "_________________________________________________________________\n", 392 | "conv1d_5 (Conv1D) (None, 2000, 1) 133 \n", 393 | "=================================================================\n", 394 | "Total params: 8,270\n", 395 | "Trainable params: 8,182\n", 396 | "Non-trainable params: 88\n", 397 | "_________________________________________________________________\n", 398 | "['loss']\n", 399 | "Train on 850 samples, validate on 150 samples\n", 400 | "Epoch 1/1\n", 401 | " - 9s - loss: 0.0420 - val_loss: 0.0162\n" 402 | ], 403 | "name": "stdout" 404 | }, 405 | { 406 | "output_type": "stream", 407 | "text": [ 408 | "2018-12-30 05:38:11,890 [INFO] Evaluate...\n", 409 | "2018-12-30 05:38:15,225 [INFO] Done!\n", 410 | "2018-12-30 05:38:15,253 [INFO] tpe_transform took 0.026401 seconds\n", 411 | "2018-12-30 05:38:15,254 [INFO] TPE using 1/1 trials with best loss 0.016185\n", 412 | "2018-12-30 05:38:15,265 [INFO] Load data...\n", 413 | "2018-12-30 05:38:16,061 [INFO] Fit...\n" 414 | ], 415 | "name": "stderr" 416 | }, 417 | { 418 | "output_type": "stream", 419 | "text": [ 420 | "_________________________________________________________________\n", 421 | "Layer (type) Output Shape Param # \n", 422 | "=================================================================\n", 423 | "Input (InputLayer) (None, 2000, 1) 0 \n", 424 | "_________________________________________________________________\n", 425 | "Conv_Layer_No._1 (Conv1D) (None, 2000, 290) 1160 \n", 426 | "_________________________________________________________________\n", 427 | "batch_normalization_6 (Batch (None, 2000, 290) 1160 \n", 428 | "_________________________________________________________________\n", 429 | "activation_25 (Activation) (None, 2000, 290) 0 \n", 430 | "_________________________________________________________________\n", 431 | "max_pooling1d_13 (MaxPooling (None, 1000, 290) 0 \n", 432 | "_________________________________________________________________\n", 433 | "Conv_Layer_No._2 (Conv1D) (None, 1000, 145) 126295 \n", 434 | "_________________________________________________________________\n", 435 | "activation_26 (Activation) (None, 1000, 145) 0 \n", 436 | "_________________________________________________________________\n", 437 | "max_pooling1d_14 (MaxPooling (None, 500, 145) 0 \n", 438 | "_________________________________________________________________\n", 439 | "Conv_Layer_No._3 (Conv1D) (None, 500, 72) 31392 \n", 440 | "_________________________________________________________________\n", 441 | "activation_27 (Activation) (None, 500, 72) 0 \n", 442 | "_________________________________________________________________\n", 443 | "max_pooling1d_15 (MaxPooling (None, 250, 72) 0 \n", 444 | "_________________________________________________________________\n", 445 | "Conv_Layer_No._4 (Conv1D) (None, 250, 36) 7812 \n", 446 | "_________________________________________________________________\n", 447 | "activation_28 (Activation) (None, 250, 36) 0 \n", 448 | "_________________________________________________________________\n", 449 | "max_pooling1d_16 (MaxPooling (None, 125, 36) 0 \n", 450 | "_________________________________________________________________\n", 451 | "Conv_Layer_No._5 (Conv1D) (None, 125, 36) 3924 \n", 452 | "_________________________________________________________________\n", 453 | "activation_29 (Activation) (None, 125, 36) 0 \n", 454 | "_________________________________________________________________\n", 455 | "up_sampling1d_13 (UpSampling (None, 250, 36) 0 \n", 456 | "_________________________________________________________________\n", 457 | "Conv_Layer_No._6 (Conv1D) (None, 250, 72) 7848 \n", 458 | "_________________________________________________________________\n", 459 | "activation_30 (Activation) (None, 250, 72) 0 \n", 460 | "_________________________________________________________________\n", 461 | "up_sampling1d_14 (UpSampling (None, 500, 72) 0 \n", 462 | "_________________________________________________________________\n", 463 | "Conv_Layer_No._7 (Conv1D) (None, 500, 145) 31465 \n", 464 | "_________________________________________________________________\n", 465 | "activation_31 (Activation) (None, 500, 145) 0 \n", 466 | "_________________________________________________________________\n", 467 | "up_sampling1d_15 (UpSampling (None, 1000, 145) 0 \n", 468 | "_________________________________________________________________\n", 469 | "Conv_Layer_No._8 (Conv1D) (None, 1000, 290) 126440 \n", 470 | "_________________________________________________________________\n", 471 | "activation_32 (Activation) (None, 1000, 290) 0 \n", 472 | "_________________________________________________________________\n", 473 | "up_sampling1d_16 (UpSampling (None, 2000, 290) 0 \n", 474 | "_________________________________________________________________\n", 475 | "conv1d_6 (Conv1D) (None, 2000, 1) 871 \n", 476 | "=================================================================\n", 477 | "Total params: 338,367\n", 478 | "Trainable params: 337,787\n", 479 | "Non-trainable params: 580\n", 480 | "_________________________________________________________________\n", 481 | "['loss']\n", 482 | "Train on 850 samples, validate on 150 samples\n", 483 | "Epoch 1/1\n", 484 | " - 13s - loss: 0.0350 - val_loss: 0.0081\n" 485 | ], 486 | "name": "stdout" 487 | }, 488 | { 489 | "output_type": "stream", 490 | "text": [ 491 | "2018-12-30 05:38:52,246 [INFO] Evaluate...\n", 492 | "2018-12-30 05:38:57,060 [INFO] Done!\n" 493 | ], 494 | "name": "stderr" 495 | }, 496 | { 497 | "output_type": "stream", 498 | "text": [ 499 | "[{'loss': 0.01618463173508644, 'status': 'ok', 'eval': {'loss': 0.01618463173508644}, 'param': {'data': {'timesteps': 2000}, 'fit': {'epochs': 1, 'patience': 3, 'batch_size': 32, 'early_stop_monitor': 'val_loss'}, 'model': {'filter_spacing': 'half', 'layers': 1, 'max_filters': 43, 'min_filters': 4}}, 'path': {'model': '/root/.kopt/data//Autoencoder/exp_1//train_models/c71a4995-ffda-442f-bc8c-a1561ba3e901.h5', 'results': '/root/.kopt/data//Autoencoder/exp_1//train_models/c71a4995-ffda-442f-bc8c-a1561ba3e901.json'}, 'name': {'data': 'create_data', 'model': 'create_autoencoder', 'optim_metric': 'loss', 'optim_metric_mode': 'loss'}, 'history': {'params': {'batch_size': 32, 'epochs': 1, 'steps': None, 'samples': 850, 'verbose': 2, 'do_validation': True, 'metrics': ['loss', 'val_loss']}, 'loss': {'epoch': [0], 'val_loss': [0.016184631971021494], 'loss': [0.04198666546274634]}}, 'time': {'start': '2018-12-30 05:37:42.798942', 'end': '2018-12-30 05:38:15.224955', 'duration': {'total': 32.426013, 'dataload': 0.25152, 'training': 32.174493}}}, {'loss': 0.008108320645987988, 'status': 'ok', 'eval': {'loss': 0.008108320645987988}, 'param': {'data': {'timesteps': 2000}, 'fit': {'epochs': 1, 'patience': 3, 'batch_size': 32, 'early_stop_monitor': 'val_loss'}, 'model': {'filter_spacing': 'half', 'layers': 1, 'max_filters': 290, 'min_filters': 25}}, 'path': {'model': '/root/.kopt/data//Autoencoder/exp_1//train_models/2f78e313-d03d-4ea2-af98-5d8818884475.h5', 'results': '/root/.kopt/data//Autoencoder/exp_1//train_models/2f78e313-d03d-4ea2-af98-5d8818884475.json'}, 'name': {'data': 'create_data', 'model': 'create_autoencoder', 'optim_metric': 'loss', 'optim_metric_mode': 'loss'}, 'history': {'params': {'batch_size': 32, 'epochs': 1, 'steps': None, 'samples': 850, 'verbose': 2, 'do_validation': True, 'metrics': ['loss', 'val_loss']}, 'loss': {'epoch': [0], 'val_loss': [0.00810831895718972], 'loss': [0.03497549022602684]}}, 'time': {'start': '2018-12-30 05:38:15.265511', 'end': '2018-12-30 05:38:57.060483', 'duration': {'total': 41.794972, 'dataload': 0.219787, 'training': 41.575185}}}]\n", 500 | " f_spacing loss max_f min_f val_loss\n", 501 | "0 half 0.041987 43 4 0.016185\n", 502 | "1 half 0.034975 290 25 0.008108\n" 503 | ], 504 | "name": "stdout" 505 | } 506 | ] 507 | } 508 | ] 509 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Signal Denoising Autoencoder 2 | A Deep Denoising Autencoder for Time Dependent Signals 3 | --------------------------------------------------------------------------------