├── AP_accel_max.pkl ├── LSTM_scaler.pkl ├── V_accel_max.pkl ├── Alcantara_ISB_World_Athletics_Manuscript.pdf ├── data └── Sub_Info_one_sub.csv ├── .gitignore ├── README.md ├── Train_LSTM.ipynb ├── pre_processing.py ├── LICENSE ├── Test_LSTM.ipynb └── LSTM_Example.ipynb /AP_accel_max.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alcantarar/Recurrent_GRF_Prediction/HEAD/AP_accel_max.pkl -------------------------------------------------------------------------------- /LSTM_scaler.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alcantarar/Recurrent_GRF_Prediction/HEAD/LSTM_scaler.pkl -------------------------------------------------------------------------------- /V_accel_max.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alcantarar/Recurrent_GRF_Prediction/HEAD/V_accel_max.pkl -------------------------------------------------------------------------------- /Alcantara_ISB_World_Athletics_Manuscript.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alcantarar/Recurrent_GRF_Prediction/HEAD/Alcantara_ISB_World_Athletics_Manuscript.pdf -------------------------------------------------------------------------------- /data/Sub_Info_one_sub.csv: -------------------------------------------------------------------------------- 1 | Sub,Condition,Sex,Age,Height,Mass,RFS,MFS,FFS,Speed,Slope,StepFreq 2 | 2,NA,m,NA,173,76.8,0,100,0,2.5,10,NA 3 | 2,NA,m,NA,173,76.8,100,0,0,4.17,5,NA 4 | 2,NA,m,NA,173,76.8,100,0,0,2.5,0,NA 5 | 2,NA,m,NA,173,76.8,100,0,0,3.33,0,NA 6 | 2,NA,m,NA,173,76.8,100,0,0,3.33,0,NA 7 | 2,NA,m,NA,173,76.8,100,0,0,3.33,0,NA 8 | 2,NA,m,NA,173,76.8,100,0,0,4.17,0,NA 9 | 2,NA,m,NA,173,76.8,100,0,0,2.5,-5,NA 10 | 2,NA,m,NA,173,76.8,100,0,0,3.33,-5,NA 11 | 2,NA,m,NA,173,76.8,100,0,0,3.33,-5,NA 12 | 2,NA,m,NA,173,76.8,100,0,0,3.33,-5,NA 13 | 2,NA,m,NA,173,76.8,0,100,0,3.33,10,NA 14 | 2,NA,m,NA,173,76.8,100,0,0,3.33,-5,NA 15 | 2,NA,m,NA,173,76.8,100,0,0,4.17,-5,NA 16 | 2,NA,m,NA,173,76.8,100,0,0,2.5,-10,NA 17 | 2,NA,m,NA,173,76.8,100,0,0,3.33,-10,NA 18 | 2,NA,m,NA,173,76.8,100,0,0,3.33,-10,NA 19 | 2,NA,m,NA,173,76.8,100,0,0,3.33,-10,NA 20 | 2,NA,m,NA,173,76.8,100,0,0,4.17,-10,NA 21 | 2,NA,m,NA,173,76.8,0,86.66666667,13.33333333,3.33,10,NA 22 | 2,NA,m,NA,173,76.8,40,60,0,3.33,10,NA 23 | 2,NA,m,NA,173,76.8,0,100,0,4.17,10,NA 24 | 2,NA,m,NA,173,76.8,100,0,0,2.5,5,NA 25 | 2,NA,m,NA,173,76.8,100,0,0,3.33,5,NA 26 | 2,NA,m,NA,173,76.8,100,0,0,3.33,5,NA 27 | 2,NA,m,NA,173,76.8,100,0,0,3.33,5,NA 28 | 2,NA,m,NA,173,76.8,0,86.66666667,13.33333333,3.33,10,NA 29 | 2,NA,m,NA,173,76.8,100,0,0,3.33,5,NA 30 | 2,NA,m,NA,173,76.8,100,0,0,3.33,0,NA 31 | 2,NA,m,NA,173,76.8,100,0,0,3.33,-5,NA 32 | 2,NA,m,NA,173,76.8,100,0,0,3.33,-10,NA 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Matlab ### 2 | # Windows default autosave extension 3 | *.asv 4 | 5 | # OSX / *nix default autosave extension 6 | *.m~ 7 | 8 | # Compiled MEX binaries (all platforms) 9 | *.mex* 10 | 11 | # Packaged app and toolbox files 12 | *.mlappinstall 13 | *.mltbx 14 | 15 | # Generated helpsearch folders 16 | helpsearch*/ 17 | 18 | # Simulink code generation folders 19 | slprj/ 20 | sccprj/ 21 | 22 | # Matlab code generation folders 23 | codegen/ 24 | 25 | # Simulink autosave extension 26 | *.autosave 27 | 28 | # Octave session info 29 | octave-workspace 30 | 31 | ### R ### 32 | # History files 33 | .Rhistory 34 | .Rapp.history 35 | 36 | # Session Data files 37 | .RData 38 | 39 | # Example code in package build process 40 | *-Ex.R 41 | 42 | # Output files from R CMD build 43 | /*.tar.gz 44 | 45 | # Output files from R CMD check 46 | /*.Rcheck/ 47 | 48 | # RStudio files 49 | .Rproj.user/ 50 | 51 | # produced vignettes 52 | vignettes/*.html 53 | vignettes/*.pdf 54 | 55 | # OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 56 | .httr-oauth 57 | 58 | # knitr and R markdown default cache directories 59 | /*_cache/ 60 | /cache/ 61 | 62 | # Temporary files created by R markdown 63 | *.utf8.md 64 | *.knit.md 65 | 66 | # Incomplete Rplots 67 | Rplots.pdf 68 | 69 | ### R.Bookdown Stack ### 70 | # R package: bookdown caching files 71 | /*_files/ 72 | 73 | ### MS Word ### 74 | 75 | # Word temporary 76 | ~$*.doc* 77 | 78 | ### Other things to ignore ### 79 | .DS_Store 80 | 81 | # End of https://www.gitignore.io/api/r,matlab 82 | 83 | # PyCharm env files 84 | *.idea 85 | 86 | # Jupyter notebook checkpoints 87 | *.ipynb_checkpoints 88 | 89 | # Python cache 90 | __pycache__ 91 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Predicting continuous ground reaction forces from accelerometers during uphill and downhill running: A recurrent neural network solution 2 | ![visitors](https://visitor-badge.laobi.icu/badge?page_id=alcantarar.Recurrent_GRF_Prediction) 3 | 4 | This repository supports [Predicting continuous ground reaction 5 | forces from accelerometers during uphill and downhill running: A recurrent neural network 6 | solution](https://peerj.com/articles/12752/). 7 | 8 | The final models and data supporting the published manuscript are archived [here](https://zenodo.org/record/5224624). 9 | 10 | ## Contents 11 | 12 | `Train_LSTM.ipynb` is a notebook that generates the model from the archived data. 13 | 14 | `Test_LSTM.ipynb` is a notebook that shows you how to use the trained LSTM to predict GRFs from your own accelerometer data. 15 | 16 | `LSTM_Example.ipynb` is a notebook that provides a tutorial of how a Long Short-Term Memory Network (LSTM) can be used to 17 | predict ground reaction force (GRF) data from accelerometer data during running. 18 | 19 | `pre_processing.py` contains helper functions used in `LSTM_Example.ipynb` and `Test_LSTM.ipynb`. 20 | 21 | `data/` Contains example accelerometer data, GRF data, condition/demographic data, and LSTM model file. Supports `Test_LSTM.ipynb` and `LSTM_Example.ipynb`. 22 | 23 | If you're going to train an LSTM model using [Google Colab](https://colab.research.google.com/) (recommended), make sure 24 | you utilize their GPU Runtime Type. You will need to adjust the path to `data/` depending on how files are uploaded in 25 | Google Colab. 26 | 27 | ## Questions? 28 | [Open an issue](https://github.com/alcantarar/Recurrent_GRF_Prediction/issues/new) if you have a question or if 29 | something is broken. You can also email me at the address listed in the associated publication. 30 | -------------------------------------------------------------------------------- /Train_LSTM.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Train_LSTM.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [] 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "accelerator": "GPU" 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "code", 19 | "execution_count": null, 20 | "outputs": [], 21 | "source": [ 22 | "# Import packages\n", 23 | "import matplotlib.pyplot as plt\n", 24 | "import numpy as np\n", 25 | "from tensorflow import keras\n", 26 | "import numpy as np" 27 | ], 28 | "metadata": { 29 | "collapsed": false, 30 | "pycharm": { 31 | "name": "#%%\n" 32 | } 33 | } 34 | }, 35 | { 36 | "cell_type": "code", 37 | "metadata": { 38 | "id": "z3TG85RZGMYv" 39 | }, 40 | "source": [ 41 | "# Load Data\n", 42 | "data_filename = '/PATH/TO/all_subs_data_w_footstrike.pkl'\n", 43 | "\n", 44 | "df = np.load(data_filename, allow_pickle=True)\n", 45 | "feats = df['train_feats'] # (trials, frames per trial, features)\n", 46 | "y = df['train_y'] # (trials, frames per trial)\n", 47 | "sub_info = df['train_Sub_Info'] # (trials, features)\n", 48 | "\n", 49 | "# Test LSTM on Representative Subject (#14 when sorted from lowest -> highest RMSE in paper). \n", 50 | "# Expect Validation MSE ~ 0.03 BW (RMSE = 0.17 BW).\n", 51 | "sub_num = 2\n", 52 | "\n", 53 | "test_X = feats[sub_info['Sub'] == sub_num,:,:]\n", 54 | "test_y = y[sub_info['Sub'] == sub_num,:]\n", 55 | "\n", 56 | "train_X = feats[sub_info['Sub'] != sub_num,:,:] \n", 57 | "train_y = y[sub_info['Sub'] != sub_num,:]" 58 | ], 59 | "execution_count": 3, 60 | "outputs": [] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "metadata": { 65 | "id": "TsAW5LbLGTBk" 66 | }, 67 | "source": [ 68 | "# Make sure GPU runtime is activated before training LSTM!\n", 69 | "\n", 70 | "# Build Model\n", 71 | "def build_model(lstm_size, lstm_act, dropout_rate, dense_act, lr=0.001, loss='mean_squared_error'):\n", 72 | "\n", 73 | " #accelerometer data lstm model\n", 74 | " model_inputs = keras.Input(shape=(None,train_X.shape[2]))\n", 75 | " model_features = keras.layers.Dropout(0.2, seed=541)(model_inputs)\n", 76 | " model_features = keras.layers.Bidirectional(keras.layers.LSTM(lstm_size, activation=lstm_act, return_sequences=True), merge_mode='ave')(model_features)\n", 77 | " model_features = keras.layers.Dropout(dropout_rate, seed=541)(model_features)\n", 78 | " model_features = keras.layers.Dense(128, activation=dense_act)(model_features)\n", 79 | " model_features = keras.layers.Dense(384, activation=dense_act)(model_features)\n", 80 | " model_features = keras.layers.Dense(320, activation=dense_act)(model_features)\n", 81 | " model_outputs = keras.layers.Dense(1, activation='linear')(model_features)\n", 82 | "\n", 83 | " model_out = keras.Model(inputs=model_inputs, outputs=model_outputs, name='LSTM')\n", 84 | " # define optimizer algorithm and learning rate\n", 85 | " opt = keras.optimizers.Adam(learning_rate =lr)\n", 86 | " # compile model and define loss function\n", 87 | " model_out.compile(optimizer=opt, loss=loss)\n", 88 | "\n", 89 | " return model_out\n", 90 | "\n", 91 | "model = build_model(\n", 92 | " lstm_size=512,\n", 93 | " lstm_act='tanh',\n", 94 | " dropout_rate=0.4,\n", 95 | " dense_act='relu',\n", 96 | " lr=0.001\n", 97 | " )\n", 98 | "\n", 99 | "# Plot Model Architecture\n", 100 | "# keras.utils.plot_model(model, show_shapes=True, show_layer_names=True)" 101 | ], 102 | "execution_count": 4, 103 | "outputs": [] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "metadata": { 108 | "id": "eqsEfcKhdde2" 109 | }, 110 | "source": [ 111 | "# Train Model\n", 112 | "\n", 113 | "# Define Early Stopping and Checkpoint Callbacks\n", 114 | "model_filename = '/PATH/TO/MODEL.h5'\n", 115 | "\n", 116 | "# Early Stopping\n", 117 | "es = keras.callbacks.EarlyStopping(monitor='val_loss', \n", 118 | " mode='min', \n", 119 | " verbose=0, \n", 120 | " patience=30, \n", 121 | " min_delta=0.001, \n", 122 | " restore_best_weights=True\n", 123 | " )\n", 124 | "# Model Checkpoint\n", 125 | "mc = keras.callbacks.ModelCheckpoint(\n", 126 | " model_filename,\n", 127 | " monitor='val_loss', \n", 128 | " mode='min', \n", 129 | " verbose=1, \n", 130 | " save_best_only=True, \n", 131 | " save_weights_only=False\n", 132 | " )\n", 133 | "\n", 134 | "# Fit Model\n", 135 | "history_accel = model.fit(\n", 136 | " train_X, \n", 137 | " train_y, \n", 138 | " epochs=1000,\n", 139 | " validation_data=(test_X, test_y), \n", 140 | " verbose=1,\n", 141 | " batch_size=32, \n", 142 | " callbacks=[es, mc]\n", 143 | " )\n", 144 | "\n", 145 | "# Plot Train/Validation Loss across epochs\n", 146 | "plt.plot(history_accel.history['loss'], label = 'mse_train')\n", 147 | "plt.plot(history_accel.history['val_loss'], label = 'mse_validation')\n", 148 | "plt.legend()\n", 149 | "plt.show()\n", 150 | "\n", 151 | "keras.backend.clear_session()" 152 | ], 153 | "execution_count": null, 154 | "outputs": [] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "metadata": { 159 | "colab": { 160 | "base_uri": "https://localhost:8080/" 161 | }, 162 | "id": "fghi2QqPXXw7", 163 | "outputId": "de9b8181-c943-4e70-8264-2e3fa4b02ab6" 164 | }, 165 | "source": [ 166 | "# Load Trained Model and Calculate RMSE for GRF Waveform\n", 167 | "saved_model = keras.models.load_model(model_filename)\n", 168 | "\n", 169 | "pred_y = saved_model.predict(test_X)\n", 170 | "test_sub_info = sub_info.loc[sub_info['Sub'] == sub_num,:]\n", 171 | "\n", 172 | "test_y = np.squeeze(test_y)\n", 173 | "pred_y = np.squeeze(pred_y)\n", 174 | "\n", 175 | "rmse = []\n", 176 | "trim = 100 # Number of frames to ignore at edge of trial due to lack of prior data for LSTM.\n", 177 | "\n", 178 | "for trial in range(test_sub_info.shape[0]):\n", 179 | " # Calculate RMSE\n", 180 | " trial_rmse = np.sqrt(np.mean((pred_y[trial, trim:-trim] - test_y[trial, trim:-trim])**2))\n", 181 | " trial_rmse = np.round(trial_rmse,3)\n", 182 | " # Calculate rRMSE\n", 183 | " trial_rrmse = trial_rmse / np.mean((\n", 184 | " np.max(pred_y[trial, trim:-trim]) - np.min(pred_y[trial, trim:-trim]),\n", 185 | " np.max(test_y[trial, trim:-trim]) - np.min(test_y[trial, trim:-trim])\n", 186 | " ))*100\n", 187 | " trial_rrmse = np.round(trial_rrmse, 2)\n", 188 | "\n", 189 | " rmse.append(trial_rmse)\n", 190 | "\n", 191 | "# Expect RMSE of approximately 0.17 ± 0.07 BW for Representative Subject (#14 in paper)\n", 192 | "print('MEAN:', np.round(np.mean(rmse),2))\n", 193 | "print('SD:', np.round(np.std(rmse),2))" 194 | ], 195 | "execution_count": 9, 196 | "outputs": [ 197 | { 198 | "output_type": "stream", 199 | "text": [ 200 | "MEAN: 0.16\n", 201 | "SD: 0.05\n" 202 | ], 203 | "name": "stdout" 204 | } 205 | ] 206 | } 207 | ] 208 | } -------------------------------------------------------------------------------- /pre_processing.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from numpy.lib.stride_tricks import as_strided as ast 3 | from scipy.signal import butter, filtfilt 4 | 5 | def buttfilt(x, fs, fc, order, axis=1): 6 | """ 7 | BUTTFILT applies a lowpass butterworth filter with a correction factor described in 8 | Research Methods in Biomechanics (2ed) and explained further here: 9 | https://github.com/alcantarar/dryft/issues/22#issuecomment-557771825 10 | :param x: signal to filter 11 | :param fs: sampling frequency (Hz) 12 | :param fc: lowpass cutoff frequency (Hz). If tuple, will do bandpass (low, high). 13 | :param order: final desired filter order. Must be even number. 14 | :param axis: axis to filter along. Default is `axis=1`. 15 | :return: 16 | """ 17 | n_pass = 2 # two passes (one forward, one backward to be zero-lag) 18 | if (order % 2) != 0: 19 | raise ValueError('order must be even integer') 20 | else: 21 | order = order / 2 22 | fn = fs / 2 23 | # Correction factor per Research Methods in Biomechanics (2e) pg 288 24 | c = (2 ** (1 / n_pass) - 1) ** (1 / (2 * order)) 25 | if type(fc) is tuple: 26 | # bandpass filter: 27 | wn_low = (np.tan(np.pi*fc[0]/fs))/c # Apply correction to adjusted cutoff freq (lower boundary) 28 | wn_up = (np.tan(np.pi*fc[1]/fs))/c # Apply correction to adjusted cutoff freq (upper boundary) 29 | fc_corrected_low = np.arctan(wn_low)*fs/np.pi # Hz 30 | fc_corrected_up = np.arctan(wn_up)*fs/np.pi # Hz 31 | b, a = butter(order, [fc_corrected_low/fn, fc_corrected_up/fn], btype='band') 32 | 33 | x_filt = filtfilt(b, a, x, axis=axis) 34 | 35 | else: 36 | # lowpass filter: 37 | wn = (np.tan(np.pi*fc/fs))/c # Apply correction to adjusted cutoff freq 38 | fc_corrected = np.arctan(wn)*fs/np.pi # Hz 39 | b, a = butter(order, fc_corrected/fn) 40 | 41 | x_filt = filtfilt(b, a, x, axis=axis) 42 | 43 | return x_filt 44 | 45 | 46 | def chunk_data(data, window_size, overlap_size=0, flatten_inside_window=True): 47 | """ 48 | CHUNK_DATA was made by Matthew Johnson (github username mattjj). Gist URL (accessed 8/2020): 49 | https://gist.github.com/mattjj/5213172. It is clever. I use this function within window_data_centered(). 50 | :param data: data to be windowed 51 | :param window_size: size of window 52 | :param overlap_size: size of overlap between windows 53 | :param flatten_inside_window: flatten ndim data inside window 54 | :return: ndarray with shape: (trials, number of windows, window size). 55 | """ 56 | assert data.ndim == 1 or data.ndim == 2 57 | if data.ndim == 1: 58 | data = data.reshape((-1, 1)) 59 | 60 | # get the number of overlapping windows that fit into the data 61 | num_windows = (data.shape[0] - window_size) // (window_size - overlap_size) + 1 62 | overhang = data.shape[0] - (num_windows * window_size - (num_windows - 1) * overlap_size) 63 | 64 | # if there's overhang, need an extra window and a zero pad on the data 65 | # (numpy 1.7 has a nice pad function I'm not using here) 66 | if overhang != 0: 67 | num_windows += 1 68 | newdata = np.zeros((num_windows * window_size - (num_windows - 1) * overlap_size, data.shape[1])) 69 | newdata[:data.shape[0]] = data 70 | data = newdata 71 | 72 | sz = data.dtype.itemsize 73 | ret = ast( 74 | data, 75 | shape=(num_windows, window_size * data.shape[1]), 76 | strides=((window_size - overlap_size) * data.shape[1] * sz, sz) 77 | ) 78 | 79 | if flatten_inside_window: 80 | return ret 81 | else: 82 | return ret.reshape((num_windows, -1, data.shape[1])) 83 | 84 | 85 | def window_data_centered(data, window_size, verbose=True): 86 | """ 87 | WINDOW_DATA_CENTERED uses chunk_data() to create windows centered about a given frame. This is accomplished 88 | by padding the trial with data at start/end. Input of 5 trials, each 1000 frames long (5, 1000) and window_size of 6 89 | would result in output shape of (5, 1000, 6) because overlap between windows is window_size-1. X at time points t-3, 90 | t-2, t-1, t, t+1, and t+2 create the 6-frame window that corresponds to Y at time t. 91 | :param data: data (shape (trials, frames)) to be windowed using chunk_data(). 92 | :param window_size: size of windows. Must be even number. 93 | :param verbose: If True, prints input/output shapes. Default True. 94 | :return: ndarray of shape (trials, number of windows, window size) 95 | """ 96 | if (window_size % 2) != 0: 97 | raise ValueError('window_size must be divisible by 2') 98 | else: 99 | pad = int(window_size/2) 100 | overlap = window_size - 1 101 | ds = data.shape 102 | # pad with nearest value at edges 103 | data = np.pad(data, [(0, 0), (pad, pad-1)], 'edge') 104 | 105 | # apply chunk_data() 106 | data = np.apply_along_axis(chunk_data, 1, data, window_size, overlap, True) 107 | if verbose: 108 | print('input shape:', ds) 109 | print('output shape:', data.shape) 110 | 111 | return data 112 | 113 | 114 | def signal_features(data, fs): 115 | """ 116 | SIGNAL_FEATURES used in generate_features() and calculates the following features for each window: 117 | - mean (np.mean) 118 | - standard deviation (np.std) 119 | - range (np.ptp) 120 | - Average 1st Derivative (np.gradient) #commented out 121 | - Average 2nd Derivative (np.gradient) #commented out 122 | - Average 1st Integral (np.cumtrapz) #commented out 123 | - Average 2nd Integral (np.cumtrapz) #commented out 124 | 125 | :param data: ndarray with shape (trials, number of windows, window size) 126 | :return: ndarray with shape (trials, number of windows, number of features) 127 | """ 128 | mean = np.mean(data, axis=2) 129 | std = np.std(data, axis=2) 130 | rg = np.ptp(data, axis=2) 131 | # diff = np.mean(np.gradient(data, axis=2), axis=2) 132 | # diffdiff = np.mean(np.gradient(np.gradient(data, axis=2), axis=2), axis=2) 133 | # integral = np.mean(cumtrapz(data, np.linspace(0, data.shape[2]/fs, data.shape[2])), axis=2) 134 | # temp_integral = cumtrapz(data, np.linspace(0, data.shape[2]/fs, data.shape[2])) 135 | # integralintegral = np.mean(cumtrapz(temp_integral, 136 | # np.linspace(0,(data.shape[2]-1)/fs, (data.shape[2]-1)) 137 | # ), 138 | # axis=2) 139 | features = np.concatenate((np.expand_dims(mean, 2), 140 | np.expand_dims(std, 2), 141 | np.expand_dims(rg, 2), 142 | # np.expand_dims(diff, 2), 143 | # np.expand_dims(diffdiff, 2), 144 | # np.expand_dims(integral, 2), 145 | # np.expand_dims(integralintegral, 2) 146 | ), axis=2) 147 | 148 | return features 149 | 150 | 151 | def subject_info_features(subinfo, test_sub_num, data_shape): 152 | """ 153 | SUBJECT_INFO_FEATURES used in generate_features() and extracts the following features from subinfo df: 154 | - Subject height 155 | - Subject mass 156 | - Running speed 157 | - Treadmill slope 158 | - % of steps Rearfoot strike (RF) 159 | - % of steps Midfoot Strike (MF) 160 | - % of steps Forefoot Strike (FF) 161 | :param subinfo: Pandas dataframe containing information about subject and trial conditions. Has the following column 162 | headers: 'Sub', 'Shoe', 'Condition', 'Sex', 'Age', 'Height', 'Mass'. 163 | :param test_sub_num: Integer of subject to be used to test model when doing Leave-One-Subject-Out Cross Validation. 164 | To ONLY calculate features for test_sub_num, make it negative. 165 | :param data_shape: shape of windowed data to match feature shapes 166 | :return: concatenated features with shape of data_shape. 167 | """ 168 | if test_sub_num >= 0: 169 | ht = np.tile(subinfo.loc[subinfo['Sub'] != test_sub_num, ['Height']].to_numpy(), data_shape) 170 | ms = np.tile(subinfo.loc[subinfo['Sub'] != test_sub_num, ['Mass']].to_numpy(), data_shape) 171 | sp = np.tile(subinfo.loc[subinfo['Sub'] != test_sub_num, ['Speed']].to_numpy(), data_shape) 172 | sl = np.tile(subinfo.loc[subinfo['Sub'] != test_sub_num, ['Slope']].to_numpy(), data_shape) 173 | rf = np.tile(subinfo.loc[subinfo['Sub'] != test_sub_num, ['RFS']].to_numpy(), data_shape) 174 | mf = np.tile(subinfo.loc[subinfo['Sub'] != test_sub_num, ['MFS']].to_numpy(), data_shape) 175 | ff = np.tile(subinfo.loc[subinfo['Sub'] != test_sub_num, ['FFS']].to_numpy(), data_shape) 176 | else: 177 | test_sub_num = np.abs(test_sub_num) 178 | ht = np.tile(subinfo.loc[subinfo['Sub'] == test_sub_num, ['Height']].to_numpy(), data_shape) 179 | ms = np.tile(subinfo.loc[subinfo['Sub'] == test_sub_num, ['Mass']].to_numpy(), data_shape) 180 | sp = np.tile(subinfo.loc[subinfo['Sub'] == test_sub_num, ['Speed']].to_numpy(), data_shape) 181 | sl = np.tile(subinfo.loc[subinfo['Sub'] == test_sub_num, ['Slope']].to_numpy(), data_shape) 182 | rf = np.tile(subinfo.loc[subinfo['Sub'] == test_sub_num, ['RFS']].to_numpy(), data_shape) 183 | mf = np.tile(subinfo.loc[subinfo['Sub'] == test_sub_num, ['MFS']].to_numpy(), data_shape) 184 | ff = np.tile(subinfo.loc[subinfo['Sub'] == test_sub_num, ['FFS']].to_numpy(), data_shape) 185 | features = np.concatenate((np.expand_dims(ht, 2), 186 | np.expand_dims(ms, 2), 187 | np.expand_dims(sp, 2), 188 | np.expand_dims(sl, 2), 189 | np.expand_dims(rf, 2), 190 | np.expand_dims(mf, 2), 191 | np.expand_dims(ff, 2)), axis=2) 192 | 193 | return features 194 | 195 | 196 | def generate_features(data, fs, subinfo, test_sub_num, include_sub_info_feats=True): 197 | """ 198 | 199 | :param data: Pandas dataframe containing windowed data (see window_data_centered()). 200 | :param fs: Sampling frequency of [data] in Hz. 201 | :param subinfo: Pandas dataframe containing information about subject and trial conditions. Has the following column 202 | headers: 'Sub', 'Shoe', 'Condition', 'Sex', 'Age', 'Height', 'Mass'. 203 | :param test_sub_num: Integer of subject to be used to test model when doing Leave-One-Subject-Out Cross Validation. 204 | :param include_sub_info_feats: Boolean to concatenate signal and subject info/condition features. Default True. If 205 | False, return only features calculated from `data`. 206 | :return: concatenated features with shape of data_shape. 207 | """ 208 | sig_feats = signal_features(data=data, fs=fs) 209 | if include_sub_info_feats: 210 | sub_cond_feats = subject_info_features(subinfo, test_sub_num, data.shape[1]) 211 | features = np.concatenate((sig_feats, sub_cond_feats), axis=2) 212 | else: 213 | features = sig_feats 214 | 215 | return features 216 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /Test_LSTM.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Test_LSTM.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [] 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "metadata": { 23 | "colab": { 24 | "base_uri": "https://localhost:8080/" 25 | }, 26 | "id": "GfTtJnxYyFvd", 27 | "outputId": "6bc828f2-84c8-474c-a0d5-fd408ab40f20" 28 | }, 29 | "outputs": [ 30 | { 31 | "output_type": "stream", 32 | "name": "stdout", 33 | "text": [ 34 | "Mounted at /content/gdrive\n" 35 | ] 36 | } 37 | ], 38 | "source": [ 39 | "# Step 0: Download repository and unzipp folder in google drive. \n", 40 | "\n", 41 | "# Mount Google Drive to access data\n", 42 | "from google.colab import drive\n", 43 | "drive.mount('/content/gdrive')" 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "source": [ 49 | "import matplotlib.pyplot as plt\n", 50 | "import numpy as np\n", 51 | "import pandas as pd\n", 52 | "from tensorflow import keras\n", 53 | "from pickle import load\n", 54 | "# Import helper functions from pre_processing.py:\n", 55 | "import sys\n", 56 | "sys.path.append('/content/gdrive/My Drive/Recurrent_GRF_Prediction-main/')\n", 57 | "from pre_processing import *" 58 | ], 59 | "metadata": { 60 | "id": "rmPC56BayHiQ" 61 | }, 62 | "execution_count": 2, 63 | "outputs": [] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "source": [ 68 | "# import data\n", 69 | "df = pd.read_csv('/content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Sample_test_data.csv')\n", 70 | "\n", 71 | "# Notes about test data:\n", 72 | "# NO FOOTSTRIKE DATA\n", 73 | "# X is vertical acceleration (including gravitation)\n", 74 | "# Z is anteroposterior (sign is flipped though)\n", 75 | "# Velocity is around 3 m/s\n", 76 | "# Height is 175 cm\n", 77 | "# Mass is 60 kg\n", 78 | "# Sampling Frequency is 512 Hz" 79 | ], 80 | "metadata": { 81 | "id": "-M_Gf98MyRxc" 82 | }, 83 | "execution_count": 3, 84 | "outputs": [] 85 | }, 86 | { 87 | "cell_type": "code", 88 | "source": [ 89 | "# reorient to match training data coordinate system\n", 90 | "Sacrum_V = df['Accel_LN_X']*-1\n", 91 | "Sacrum_AP = df['Accel_LN_Z']*-1\n", 92 | "\n", 93 | "plt.plot(Sacrum_AP)\n", 94 | "plt.plot(Sacrum_V)" 95 | ], 96 | "metadata": { 97 | "colab": { 98 | "base_uri": "https://localhost:8080/", 99 | "height": 282 100 | }, 101 | "id": "8rb4BtP4zC1w", 102 | "outputId": "129f1044-2451-46f2-9a5b-0eb1d5b01d5a" 103 | }, 104 | "execution_count": 4, 105 | "outputs": [ 106 | { 107 | "output_type": "execute_result", 108 | "data": { 109 | "text/plain": [ 110 | "[]" 111 | ] 112 | }, 113 | "metadata": {}, 114 | "execution_count": 4 115 | }, 116 | { 117 | "output_type": "display_data", 118 | "data": { 119 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOy9eZwkR33m/Y26j75neu5Lx+hCSAKNQYBgzWnAGLCFD9bLYi+8rGEx4LX9ru33XRvfwAL27poFBBjEmgUbEJYMWCAwRoAEYnRf6JxDc8/09F13VewfkVGZXVOZGZGVPT09k8/nM5/qoyY6qirziSee3xFCSkmCBAkSJDh7kVrpCSRIkCBBguVFQvQJEiRIcJYjIfoECRIkOMuREH2CBAkSnOVIiD5BggQJznJkVnoCXqxdu1bu2LFjpaeRIEGCBKsKd9111wkp5aTf788oot+xYwe7d+9e6WkkSJAgwaqCEGJf0O8T6yZBggQJznIkRJ8gQYIEZzkSok+QIEGCsxwJ0SdIkCDBWY6E6BMkSJDgLMfARC+E2CqE+I4Q4mEhxENCiHc7P3+vEOKgEOJe59+rB59uggQJEiSwRRzplS3gt6WUdwshhoG7hBC3Or/7KynlB2P4GwkSJEiQICIGVvRSysNSyrudr+eBR4DNg46bYJWjOrPSM1i9aNag01npWfRHq7HSMzgVC8ehcnKlZ3EqFo7BDz8KiydWeibxevRCiB3As4AfOT96pxDifiHE3wohxn3+z9uEELuFELuPHz8e53QSrBQe+gq8fwfsu2OlZ7L6sO8OeN82+D+/uNIzORW7/xb+bBJ+/KmVnomL+aPwwQvhw5fGswjd+kfwtd8efByAW/8Qbvk9uPld8Yw3AGIjeiHEEPBl4D1Syjngo8AFwFXAYeBD/f6flPJ6KeUuKeWuyUnfCt4Eqwn3fxGQMPXESs9k9eHgbmjXYc/3Vnomp+LQPerx8L0rOw8v5g6ox1YNKjEo5x/8Nfz4k4OPA3Byj3rUc1xBxEL0QogsiuQ/J6W8EUBKeVRK2ZZSdoBPAM+J428lWAVIpdVjq7ay81iNaDfVo2yv7Dz6Qc+tNruy8/Ci3XK/blYHG6tRGez/90J/hq16vONGQBxZNwL4FPCIlPLDnp9v9Dzt54EHB/1bCVYJUk6Mf9Ab71xEp7X08UxC27FG6vMrOw8vOk3P1wMujo0F9+t2DO+/ns8ZcB/EkXXzAuBNwANCCL2n+wPgjUKIqwAJ7AX+Ywx/K8FqQEL00dFuLv06nV25ufSiS/QLwc87nfAuiIPugrxjtaqQHh5sPD2fQRegGDAw0Uspvw+IPr/6+qBjJ1il6G5ZE6K3hlehNqtnGNE7c6vPg5Qg+t32hjjyoBpn+/MGnJOHnAfdBXkX2WYN8gMSvc6ckiufQZVUxp7r+MnXYd/t8Y6pb5hmTB595aQb2Drb4SWbMy3GoRX98UfgH/79YGN97AXw6VcOPqcl1s2ARN+r6AeFJvgzIN5yRvWjT7AC+MIb1eN7Ywyw6RsmLkX/11dAYz7eOZ6pOKOJ3jO3R25euXl44Z3ToLUHS4g+hgDqGWTdJIr+XIaUyzOuVn5xefSNmIN///gOuOG18Y4ZF7wK9QzI1liC9jIUSw0a9IxT0ffGRwaFJvgzQNEnRH8uoxlzOplG17qJ2aOPqyrz3s/Bnu/GM1bcaMdI9PV5ZbEce2SwcTS8RJ+KyQxoDBjYjdOj9y4acSxqXUWfePQJVhJxqJZ+6Fo3MVsPZ1L+9nIhTvvgkX+Ch29SC1scaLdg5yvgil8GERN1DEr0cWbdeBeNOO6NM8ijT4j+XMZyEX3c1o1GczHe8eL2Tg/fD1NPDjZGnB59dVo9xhUUbzcgW4LJi9XXUcf1vu+D5uQvVzA2DkWvlXzi0SdYUXSWi+idceNW9HEvHIOqyV58/IXwkQELwL2fyWcG7Oyt36+4bJZ2A9I5yI+o7+tz0cZpeBbsQXPy2zEWTC2XdZMo+gQrimVT9DGnV2rEEVPwBqC1mmw1BlfiGp3WYEHuOCoyNfRC1o4pqNtuKqLPDS0d3xbez3HQzCyvCh+U6JcrGJso+gQrijhvkiXjakVfHTyzxxvIiqMXiXeXodXkV98D//PZsDgVfVzv+6ctk0jjNCFTcL8fZBejF7K4dkLthirgypXV942IVppXLQ8ah2jHad14PsNYFH3i0Sc4E+C9mONU93qsqSfgj8cGVLgeIoiDsLxjaCJ86Cvq8eDu6ON6SW/+cPRx2o2lFZmD9PVfFqLPuUQf1XaJMw4Rq0e/TNYNrHjmTUL05zLaMV/Y/caF6MoPliq+OKwb73jaY9bEOkj1bWxE33I9cBgsjhA70Tu9d/T7FVnR97QaGAReFT5w1s0yWTew4qo+IfpzGXGqIb9xYbDMCu8CpAlLyuhbfq8nrElUOG2VawOoZy/pzQ1A9J0mjG6BLU5QdxCi1/83rnqJU6ybiJ/rEutmQKKPNRjrtTJjTK+EFffpE6I/l7Fsir5nrEGI3kvomqT/5U/hQxdDLULWh1dBdhXv4tLvo8BLegMpekc1v/S/OnMagOjjzH6SUpHfkmBsREXfOVOtm5jTK71Enyj6BCuGZSP6nhsuahoe9BC9M8fvfUgFPI8+FGE8D7FUTioC0wQ/SEHWEkV/KPo4nSakYgh4gvvexWHdaBJMZwcn+jirf+NU9Mti3TgdPle4g2VC9OcyOjFf2N5xNzzT/X4g66be/2uA6b3243mJfuoJRVb6JhxkQfIq79kBjo5rtyCdGTyFEeJtRaGFwJJgbBzWTZzplWeaom+r9wsS6ybBCqId84XtHWvnz8CvfU19X5+H7/9VtHbIXsXXbizNXohyFqe3iOj4T5aS1UDWjUPIO16o+uhEzZbpKvo4iN5ToXzf38Pd/3vwsdI5yOTV+3fGKfozjOg7HqJPFH2CFcNypFd22uqiTmdVUBHUYdLfeq/qGmmLJeqvsVR1zx60H08Ty7pLYebppeNF8fw1NOk98w1qzscejjaO9ujjsG70Dmj+EHzlbXDzO+GLvw5PfifavEDNTQg1v1iIflCPvqUWRhicTOO2bmRb7c4gUfQJVhDLYd14CUGnCd7+P9VjFA+81WPdeFX3XASi1wvHyGZYPO6Se7Y0mHWjlffmq9Xj13832jhdoncUfX1B/SxKLUK/z/ShG+F/vz7CWB5FD5Abjr7biLMVc6cF2aL6etBrOM48ev15dRV9QvQJVgrLYd3om8VrP+ix9Q1pg95dh5foo3jhens+sknNdXa/+n50y4DWjaNuJy9Rj0cfjEbO2rpJZ1SFbGMBrv9p+MKv2o/lfe+y5Z7fWZLiKURfjk70/VJmo6LdVIs0DJ4Sqa8NkRr8ftAKPvHoE6w44q4EhKWKPpNb+rsoqYLerX2r7pLL+HnR0hj16xzepB5PPqUeRzYPaN0sKGJOZ+Gnf1/9bGZ/hPl5DgTPlWHxhFo0Hv2a/Vje/v3FMTdmAmo3YzsvcBuk5YdiqowdVNE3PYp+0INHnP+fLblznDsE90Ro86wVvP4sV7uiF0JsFUJ8RwjxsBDiISHEu52fTwghbhVCPO48jg8+3QSxYjk8ei/RezFxvso1t1W5p1g3DhmPbVNWkG1pede6cYh+ykP0zcXoZFFfcH31HS90xn7cfhyv55wbWur126rCdgPSefV1Ogs7roVfdkhr4Zj9WNCj6Af06HPD8RRMZYuAiEGFN9U4mYI71mdfDze9Qy24VmOdfYq+Bfy2lPIy4BrgPwkhLgN+D/i2lHIn8G3n+wRnEpYjj95r3QCc9yL1uONaFSyzrdLszksstW7GtqrxbKsz9Wse3awejz6oHtecrx6jVns2Fl2ras0F6lEvIrbz0wG8XqK3jUm0G1AYVV9rwh9apx4HJvqhwZua5Yfj8ehTGTWvgYm+pRbEdM69Tk48qh5nn7YbSweG4woUD4iBiV5KeVhKebfz9TzwCLAZeB1wg/O0G4AIEaAEy4q4S77Bo+gdQnjTP8K774ONV6nvbX1wTQT5EfW1/v+jW9WjbadIPT9t3Ry5H4rjUHYIMKp901hwib68DhD29gi4Hj0o1ewlr+l9FuO0lV3QJXrn89BEv2hL9J6CKXCIPmoevfMZFEbiyaPvEv2A13C76YyVPXUs2wyvXuvmLFD0XQghdgDPAn4ErJdSahP1CLDe5/+8TQixWwix+/jxCDdGgug4HdZNKg3jO9xGWLa+blf9Damvu4p+m3q0zVfvevQb3J+NbFakAwMcpuGxblIp9XptF7VOx01NBfWavahY2Af6dXaJ3hlTL2gLR+3mFqd1o0VFbqjHmotwDeqYRnMRfvgReOBL0eYErm3m3R1kHP/fNvDfa92sdo9eQwgxBHwZeI+UcsndIqWUQF9zVkp5vZRyl5Ry1+TkZFzTSWCCZbVuek416hK9JZFqIpASHv26q+B1jr5tIzI9v2wJihPq6+GNnlOTBrBuvMScH7Z/rb3vXa4nU8ZmbqcQvSboksrAsfWce4k+H5d143j00/vgT9faE7UmZ22NfOuPo81Jj5XusYH0Z2FbnKfnczYpeiFEFkXyn5NS3uj8+KgQYqPz+42A5V4xwbIj7kpA7zjpnoybqJWeuugn6xzGsed7iqhKa9T31opek2kayo6wGNnkEn1U68YbjAU1ni3R98tVB1eF2+yG9OvUGSne4Hh5DVQsD1np3anlhlS8JQqBea2bw/fBhy6FB7+sfmZ7kLk3pgGDHfrStW4y6utOx71ebRV916N35rbaFb0QQgCfAh6RUn7Y86ubgTc7X78ZuGnQv5UgZsRdCQinerkaXUUfxaMX8Fqn6GrqcTVWYUx9b+3RO4dnCOHejOsui8m68RwYEsW6OYVMnYVjQgeKLYhe74SKTrLbukvd35XWDq7oB6ncbTdVa+jhjer7+UPwbUeJ255v641pQPS4AahFy2vd1OfoGhFJ1g0vAN4EvEQIca/z79XA+4CXCyEeB17mfJ/gTMISjz5m68aX6C0VfauuequsuVB9X5lyiD6i1aLPPQW3y+TGKwc/8Lo+38e6sfXonUVSk92QE9Ya3qBS/qJYN9ueB9d9Cl76R+7vymvt/H7vePq907bXP749+mL7zF+Cna+Adc9wf2edQto69VprRbyWOy2109OBXW8lt21g/ZQ8+gGP1BwQcWTdfF9KKaSUV0gpr3L+fV1KOSWlfKmUcqeU8mVSypNxTDhBjOi03EM3YlP02tv0I/oIdkY67xILKKLKRlSUensO8HN/DWPbYeMV7vyiWDe61XG+R9HbjtWr6Hf9B3j+u+DV/83Jcolg3WTyqv+OdxEqrbU/H7c7N+e90wvvT74K3/5Tu7F0GuOWq+FXvwhX/KL7O9siOE3OXsxYZCctGcubddNwiX5ovT3R9yr6W/8w2pxiQlIZey6j3XS34Mtt3XR7t0SwbjI59U+PUVqjMluyEcrwtZoEuOKX4D33q/dAe9lRSvJbNaXgch4yLYxEUPQ9NQjlNfCKP1UpkbaVqH5BcYDSRASPvkfRr93p/s62AlifVKXx3N+AX/0y/NRb7WsFeq0biNa+Gnry6D1Ev+ZCdXaBTTFdr6Lf9/1oc4oJCdGvVuz+NHz5rYNtCTtNZQnA8ls32aLaPUQiZqfYR6v6kvMYpd9Kp3nq3EB59tlStGP3NAEvUfQRiN5vkdRjW1k3Pp8DqIWyVYWGxWvtJfrSBFz5RvW1rQr3Lragro2dL3PaUMzaB517X2MlonnQabs5+Z2WS/QT5wMSqhbjdpua9Xn/VwAJ0a9GtBrw1ffAA1+0V2ZeaL+6t6rw3v8Dd3824pg+1o0QjiqNqOhB9WsBN+MmSr+VfsSgEZXodQAw1+PRNxftPOcgFW7bLbLr9/ssGhBtPO979/MfU/aS7Yla7Vb/eem2FPNH7OaVysLP/CU8753qZ1FPCms3HY8+e6qiBzv7pte6gcF78QyAhOhXI44/4n59ck/0cXRqWjqnCmg+ei38y5+rANvNvxktpzxISeZHohVMaUWvCVATfZSinV416UW2FM260e/TkmBshOBuVzX3e+8sF8leT33JWBEC2X5ps8OblNJtWvSs6bVuumPpLByLHYK+hp/3DnjZe9XPoh7yrheNTEFdB3ocbVPZEL3sQ/SDHCIzIBKiX404eLf7ddTAE3ha4mbhvs/D0Qfgtg+4vz/+WIQxezJHvMgNRQjGevKkdTpkl+gtA5R6vH5qEpSFEEXRawLoDcaCJZlq1dxnIbJ9rb1+vxf5CPESP6Ifcch5wUKF+xK9U61speg9n2c6q+I21RkV/LTdlep2CqU1Kp2yOgMIN73VJsWyu5MT7s8GOURmQCREvxpx4vH+X9tC2xh+CvfkkxHG9CEEUOQ3SPBU3yha+UUlej/rJhdB0Ter8HfXOfPa5P48CtEHWTe2NlXQzipK8Vpvm2INveja+OKdPimR4Fbx2ogB7atrFMfUwvuD/652pTbQRF+eVDGMuYNqTjrN1UrRO6JEJESfICpOPArrnwkTF7jdF6PAj+jXXaYeI53gFGTdRPDoO5689xc7fd71weO5ckQrKMC6sQlQgtvPHlRHTY1Iij6EnG12G4EefQRF36q7hWZe6MI1G7vE7zOIugB57anCmGpUFwW6BYKumD7xmCL6wph6H20sJW3dbLvGXQx/9LFo84oBCdGvRhy8CzY/S7XDjXK4hYbe9mpFtPW58MxfhDd8Olo/FAgPAg4SPL38OvijGZVHD4roba0WPzUJ0awbHSN581eXnqCl1alNLn2Q3WI7tyCPPheheK3dcDO0vOi+TosAqJ99pk+KslG+vemVxTF16Hv3b1kEQLWi16eEHfixGi+VUm2tbTpY6nMSMgX4JedQ9t2fMv//MSMh+tWGxqKqRJw4X2UpRDllSaNX0Y9uhes+CesuUTncUdrsBqrSKG0BetSfV1FmSxGDsUFZN5bWjVb0Gy5f+vMoBWJB6ZXZoiIi03qHIBtIL0g2LYJbNVV81QudCWXTc8jPPkulnDiO4QIk5akLt95haFjtNJyCqU1XnTre6Fa7fjda0Yu0W8UNK2bfJES/2qADVcMbYWiDIuOoxU69RO8NJpYnoyn6wMyRiB69X/A0FyEdMjTrxvJGnN6jyKDYc4Ba3B69Vrumr1cHA/12B2CXKdOqu9lPXkS2bvw+U4vaiH67x9LE0ufYBlBTGZViecWvqJ91U3on7Fo9dJuapZbeV1HuqRiQEP1qgyb6ofVulsLh+6KN5c26gT5EH+XgjBBvuD5vd/xfYN67czCHzfY8NOvGVtHvcbMyvIiUwhiwG7Kt3A2ybrQFY7NI+in6bFEtnDaK3ht36YVNgL3fa9R+uIbNASvaugF1hgK4NpdtwZpeaEXK9fxhxVIsE6JfbdBWzfBG2P4C9fXTd0Ybq5dE854tZjlCh0M9JpzafwScdgvSzjJoB5GCVrkWKjww66ZsT/TTe2DivP5jIaIRfZB/bazoQ/x+sDuvtVXv79ELYb9TC/oMbPrc90vl1deKvjdsjkzUvW7APWqy5OzUbCudvdZNrgyv+1/q+6gHqg+IhOhXG7rWzQaYvAhGt8GBiESvFYz3IAiN0lql6G1bLHjbAPei24jMMqjoS/RRxgvy6IuKZExfc7sJM0/DeB+iF8K+J71f+wg9N4ig6Pt54U6HRitFX++v6MHpOWT5GfjacRYefb/do65ifcF71KNtla1+vy55jequuest6nu9mJnuRrvWWXrpvAZpozwALJs/J1hxzB9Wx5vpbIdNV8Ghe6ONpUlZk4c3aFSeVMRTm3V9ShN0fMrboUeBG54mFkjMDtHbZqP4evRF1I6j7h50EoSZ/Uq59bNuIN7+NF1Fb0j0QRYaODaVjaL3sW5Afa7Wij7AujE95rCfdXPlL8MFL1E70kzRLlmh03aJuTQB133C/V1+GJDq2vUKIj94FT24oiRR9AmMMH9EqXmtmNddprr1ec/eNIXeQusbptejh2gnEfXzhcGTPheTAs9FTMeLa+HQVcnaz+1FIaKiDwygGs4tyKMHRYJWWTdBit4yKB5mnxkHY33er6FJdX+MbLKrBfG2sO6FbXBdK3+9cOjahSTrJoERNNFrjO8ApP1RZ+Cqb602lhC9k6tu3Yc7INiZi1uBW/rWEGwb2JKprgbV71UvrBV9SHolWCj6gEVDj2cTj2j7ePTgkLNNMVdMHn3QDggcordouBa0G7W1HaUnGAtuUDcJxiYwQm1maSrf+Hb1OB2huZlW31oZewlVK3qbYBaEpy9CfAo8ynF2/U4k6p2fKQHqIiFvENsL28NH4kyvDFo0wJ7odWVs37Es01KDrpFBPXovRjbBnK1146PobQP/vR59lGrkGJEQ/WpDbc7158G1DaIctqBvuJf/CYxtc1sLgJuPbH1MXMvfLshFVOBxK/owK8h0PG3LFHyIPmehTiHe9MqgRUOPZ0X0tQBFb9k6Isgi0emVJgHxLtH3yfACtQDbBD87Tf+x9Ptvq+j160zn1NcrpOiTYOxqQ212qYIc2qAUzSDWzY5r4T0PLP1d1MO3A60bS5+y01aFJ6FZNwOUzHthS6a1OXXz6gWn3/zi6k9jregdMu2X/QSOR28TjG0EZ93EZcfpFNxmxf18g8aB4IXb6toI2u1p29Ey9VMHY4WwX/hjRCyKXgjxt0KIY0KIBz0/e68Q4mDPgeEJBkGno1SkV0GmUqpVrE0fDo2gwGmurIjCtrd3nJ569xCTsOBuTAuH7Tm09Tm16PqRadY2G6UBiP6qMoqi91vQ9HjWBVNBit7wPZMyuGDKJmgZGoewLKjzFkz1ImeZSNAbjIVovZ5iQlzWzWeAV/b5+V95DwyP6W+du2gsAHKpdQMwsgVmn7YfL+iGE0KpepuKRwhfPMD8ZglqeQz2VktYJkoURe9n2+j5WdcMZPsvHBnbPPoAdQoqfdS2BUIcWTdhn4HN2cLdOETI9WaiwjsdJQLCRIXp6+wNxoKj6FexRy+lvA2IeFBjAmP4Bf8mL4ZjD9sVN2l1G6T6iuPxWjdZy4BW0EEcYJ8JEaoALYOx9bngnOpsWWWrmB4nGJT1oU8Cs6mM9SMtUAtHHC0QQBGqqXLuFoUFBGPBbCdkKgRMro+gA3PA3ibsDcbqMVa5ovfDO4UQ9zvWzni/Jwgh3iaE2C2E2H38eITeKucSusG/HkW//hlqETAtNIFwZQWqUCqSdeNDVpm8UjjG6XMBDdLAQ3626XgxtVRo1Vyl3Xc8S3II2g2BXQA16HPQY5l69O2WUqh+1o3NAu53prCGjXUTRvQ2dRFhRB9V0XvHG9kYLWkiBiwn0X8UuAC4CjgMfKjfk6SU10spd0kpd01OGlZLnquo+WR5dM/atDyCDYIVfWTrJsAOsimXD7uRwS6HO27rJui1gr21FOqrW1gkQbsDsFw0nGK8OJRzaABVWzcGyrffgeV952Xj98dkO/YGY0G1Op7eA09822yMGLFsRC+lPCqlbEspO8AngOcs1986Z9C1bnoUvS6giqToA4gqiqIPswxyFjnXYaQAdhkfxtaNxUKUCXj/bIO7JircZhHySxW0HUtXXfsqegvlHLqrimDdxPF5aqvF7/1PpVWb5qh59ADXvEM9Pnij2RgxYtmIXgix0fPtzwMDnHmXAPC3bobWqcfYrZsIHn0oWVkEKMOsG7DL+AgjmXROKTDT+QUVEem5gV03xlBFb5F1E/S+ZYrqOSa+urZ4gnrdgKXdElYEF4dHbzFWWE4+2AXXu2fGesYb2wrnvzh6W/EBEFd65eeBO4CLhRAHhBBvAT4ghHhACHE/8GLgt+L4W+c0tKLvtW5KTgm+TV8aU+umNmfXP77TCrdabBV40HiRMj58XrMQdmQaZt1EyX0P9ehjtG7ArN9NqKK3sUhCAuzdTBmDeYVW/0awlIJ2o1a7R63oeyh2yy449tBpz6ePpWBKSvnGPj9euQMSz1b4Zd3kSkqh2fSPN7FFimOAhPrsqSco+Y7bCLlZYlTgYOfRh/mw4JCp6fzCFL1lgVhQH57u3GzSK0NeJ6gUy7BujF2iDyNnm2BsDHESU0VvFYyNaffoF9zdvEup/UP3wo4XmI0VA5IWCKsJ9TnlE/ZroVte6zbZMoEJiXarY2M4D1TD5vg/E+vGps+KyWu2ad8bdzC2HVB9CpbBWIOCKdO5da2bMEVvopxDyLl7+pUN0cfQCyks6wbs3v/eNsUaW3apx4O7zcaJCQnRryYEFeiUJiJaNwEXto4F6J2E0bghlkFuyN6jD1VZMVk3YHczt+ohwVhLjz6oKAniTa/UhGqSYqk/h6A8ejAMxobYLUKY5/iHLdxWwVgTj95m99gnGAtKkE2cf9ozbxKiX03o7XPjRWmNHdGbkF6UtsKteowKPIQUIGLWTZBqK1jklwc0XAP7PHq/4/q6c7MJxhoEdiFmRW9i3YSkaoL5ghZ0IhdEU/RxXbv9grEaF78a9n7PrrPpgEiIfjWhPndqxo1GaQ1UbE68DwmKgb3HDM7pTEFFRBYK3ISYrbJuDPLyVzQYG+L52wRjQwO72iIxWNS0R58OyboxWjS03x9mUVlYN34LWjcl0mQs02ttQEUPsPW5aiGI0lo8IhKiX02ozQZYN2tg0UbRhwTFwC49TaNVDVGlFgrc1GoxJnoT1WZDpmHBWMsim1BFb2HdhHn0mSgefUD3SojHowfzz8Do+jAcq9OnkvWUsWx2jy1VBd6vb9HYVvUYpeNsRCREv5rQ24vei/Ja1TDJ9EhBG+vGpmNfuxFMVlqBG/UbN0gBzVn0kzHOujFQuZ2OupmDlGkqrd4L45YKIZ6/9q5N3rvQpmY6vdJC0ft9rumMeTGRkaI3XNDaTWWNBBaGGcZcTIKxVl062/1tG4CRzerR5vSrAZEQ/WqCbovbDzqX3jTFsm1CopbWjSaNoIO1syVUv/EY8qTBzoc1UZPGgUCDjCCwKxAzUfRgRs5hFco2aYxh6ZVgbmt037cQ68Ykvz8sRgL2fn9cWTfeg8Z7oVOVbYsRB0BC9KsJtdlgRQ/mPn03k8KkstPQugkL2oFlbrPhzWc6nvFWP4Ycbo1c2cJaCvPoLbprmrRTMChkKrMAACAASURBVB3L5HM1tTVMFg0bRW+y0BoRvYmiL6v3wqSAUHb8FX06q0SUbR+pAZAQ/WpBu6luJN9grOVh3u2QABuoG9um26QRIdhkaNjYS3HmStsQfcD71x3PphumgaI3XSRNPPo40ivB3NYwue6MPfqAYyFtxzLNugFzzz8wdTlCH6kBkBD9aoE+iMHPutGHeZsGZDWJBt28tsefaYIMy7qB+KoVrRS9SSCwYG4bQDjR2ORet8KapNkoetPK2BjSK/V4RmMZ7CRt7JbQHZXpwm3Y6wbMr93e9gdeFCN0hh0ACdGvFujV3y/rprxGPZpaN92UOQOisgkmQkigzSZDw6DxWpwtckGRqckhGiavFcx7+0h5ehW9twVCGMLSK8H8DNo48+jbIa8R4g3G2nQjDatjSBR9gr6o+XSu1CiMqYvUOBhraD3YeMz65gw8jMPikAojj97muDiTHYJhsy+Tdgpgnv7ZaQEy3NKAePzrVNr8xKpWTb1nQQo1kzfL+GoZBmPjtG6MRIDBYmaj6MPe/0TRJ+gL3aLYz7oRQi0Cpu0KrKwH08Oyfbpr9o4Hlse7hbRAMB3PqHeOodI1DsYaEn1YrjrYl/SHqV1TFR6WDQQWKryu4j5xnKQVVrBmM5aRpWRZLxB0nSWKPkFf+LUo9iIK0YdaDxYefdiuA+wUuGkLBIgv68a0kMjEgtDzs/KuY1T0QX6zHs9kbs1qcMosWCj6ulkA2yS7xTjrJiZF333/DXejgQ0DLe7VGJAQ/WqBCYnaXDwti/TAuuHJ9X5tlJeMZ3NgcxMQZgEyq6ybGNIOTRYNMN8RWSn6kLlJGd4JExR5G3n0IWfjgrM7MAxiB6lmMK8XMM66sVH0BtaNaTwo6N7KD6u0ZdOD4wdEQvSrBWHWDURQ9CLY/wZH0Rvm0dd9zrT1wlaBmyg24/H0aw6ppDQZzzgYuxyKMoS4TPx+MC8Oa1bDX2ecij5jutiaFEyVzCqnjYLENtduyLkM+gwAm/YiAyAh+tUCE7VsRfROcU6/Xhxe5IfNDmoGZ9chIBdwkIWtAg/zmW08f71wBL3mrGH7XuNgbNnJ4mkGP8+02ReYESCYqV0jj74Wbt2Yto5oNw12Gob2WSekzQPYv2dGit6wBiTQunHuY9Pd8oBIiH61oDan1HVQEKswZkH0BjccOERveDHqFg2B2RkFQFjcLCE7jnTWyR4xbIFg4g9DfB69KTmY9oAxmZvpbsOUnJtVA+vGtP4gpPpXz0v/3cCxQk7kshlLWzex1WwYWDeQEH2CHtQDetFrFEbNI/lhfeM18iOKRE28xKDumhpCmOeWh+WCa5imMIYd7AF2JANm1gHEQ86mpy8Zz820yKluEIwtqL8bFkA1+gxMF1tD6wbChUC7Hp5CattXKUikrEaiF0L8rRDimBDiQc/PJoQQtwohHnceDQ8dTdAXQX1uNAqjaptttIU2ULcAeaexmckFWQtouuaFKTGbePRgXn1qQjIZ0/RKg8piPTcIn5+JR59KmfnqpkSfMTxkpWWg6I0tL8NGZGCwoJlYNxaKPuyzTOdU/xrjHP8gRa+tm9Nz+Ehciv4zwCt7fvZ7wLellDuBbzvfnxuQMv5iiKBjBDX0QmBy8ZiSqI3yqBvMEcwDlCYePZj3k2nV4vOHTSuLTY/sC2sF7J2fqQ1hopyNgrEGHr3N61wRRW+w0IaNpXejpjUgZ5t1I6W8Deg9mfp1wA3O1zcAr4/jb60K/N0vwPu3wy2/b9Y73ARBLYo19GHeJj592+CGA7sLMuioQy+yhjeLiUcPatdhEjBuGxb+gIU9YrhwGBO9AXGFzs00x980vdLQo4d4Fb1JQDw2RW94P5iKirDUz9VI9D5YL6U87Hx9BFjf70lCiLcJIXYLIXYfP27YefFMxr7b4cl/UV//8H/BN///eMY1tW70c8NgUlUIdmlgjQX3+UHIGd4sph69abaRjZoMbYFgmNmi/14o0Rs0DgMzX90mfmCSY75iit4kvTLGrBuT+8Gm737QtXsWEX0XUkoJ9JW2UsrrpZS7pJS7JicnT8d0lhe3/40q8f5/nfMg7/ibeA4BtrFuTAKyLYOtKripkiZ2UGPR9aQDx7Tx1A3maFpO3qoZ5HDnARFfwNPY87cJoJpaNyYevWE/elOP3uR1hu6C9Fhh6ZWG3StNxjJW9IaJBO0Q60Yf6nOaDghfTqI/KoTYCOA8HlvGv3VmYP4IPHYLPP9dUJqAN3xa/fyxW9SjlHDyKftVXEozW6RoY90YKhgb5dFYdC/gIJjeLPWF4Jx8jTgVvRBmqtnYB9dKN4ycTRW9ga9uEtjVY7Ub4RlVRgVTNore1Fc3qE6OK72y3TRLTjDuux+y20il1b1yFij6m4E3O1+/GbhpGf/WqWi3YP5o/98dfwwWlsEmuvdz6qzIZ/979f2lPwdj2+BrvwNzh+HDl8H/eBb85Ra4/4vm47ZqSr2YWjcmgWCTUnQwJ/pOx7FuDIje9GZpzJuNZ9oJ0KQ5F5ipZpPD1cFDgCFVozYLh6l1Y7oIBb3WTltde0FnDICFR2/S68a035CFdRN2vbUNd49xdtbMD6+urBshxOeBO4CLhRAHhBBvAd4HvFwI8TjwMuf704MTT8Df7IIPXwp7bnN/fvxR+Mxr4CM/BR+8EH50vdo6/ejjcPdn4dA9weNKqcboF2DtdNQYO14Iay5QP0tn4Vc+r3LgP3wJzB9Stg7AjW+Fg3eZvZ6aQWsBsPToY1b0+uI3sW7SeZeMglBfMNshFEbVjWoUcDO9mU083Xx4ZbFp7rtJrxsw6zjZMo0fGKjdbuvpuDx6A4FhXC9g2L3SZCyT1gxgbjuazM2mGHFAGKQ0hENK+UafX700jvGtMH8UbniNo/Ak3PRO+Hc3wj/+Bhz4sXrOhmcqYv7n31X/vHjh78BP//7SbI9OB275L3Dn9er7dA5e+T74qbe4z3nsn2F6L7z0j5aOt+FyeO7b4a7PwFVvhNf8lToF6mMvgBteC++6F4ZCYhPd9gchij5TUHMzsjFM8+gNiV4rJhOiz+TN8rdNg7vebKMg5Rl2sIeGacDTZKG0yUYBsxhC2O7A2Lox6L2v/1aYojf26A0IVYhw5dxpq92zcXqlwcJtdG1YJBIYKfpVRPRnDKSEL79Fkfyvf03ZM5//Zfibq9XvL3gJvOLPYf1l6rkPfAme+JYiiItfBY/cDN/7IOz+lFLmP/th5bV/9bfg7huUGr/olXByj0qd3PlyZc1ICd//axjdBpe+9tR5vep96p9GeQ284s/UXG/7b/DqDwS/rrpB50qw60lvsrUE5SVmSwZE72TlmCjwTMFVnUGomxK93snMwfAG/+eZdHQEc+vGaHdgqnRrqhgnLJ3UpG2BaTGXSe/9lqmiNzywxaQwSc8t6DMwOX0M1DWeypgFY8PuLzDLutHdQ8PiB/mRhOitcfRhOHwf7P0evOoDsPlq9YY/9zcUCV3+Brjgxe7zhYArflH903jWm+D+v1fq/5Gb1b/8qLJerv51pcaFgNkD8D+vhi/8W/j1W+Chr8CBO+FnP2SW9w3wzDeo/3fnx+HFf6B85lZDqZRe9WTSi17DmOgNswzATHlYKfpcOPF12ko5mSwcplWGJlk3YObDmmYtmWbdmGZ9mOyGTIu5TLxwPe9Qj16nkRrsNkzet2wp+D0zzVLqjhVTeqVJIoFpjCQ/rBI4TgPODqK/53Nw0zvU11uvgZ96q/paCHjV+83HSaWUvXLlr8CB3fAvf6II7LlvV8Ss/djRLXDdp+DvfxU+eJEipO3XwtX/wW7el70OfvJV+Op74PUfg4+/EE48Bm/+JzjvRe7zukRvoDiMid6wMhaWgegLamvb6fj3FtE7BJNgrF4Aw163cTC2FD6W6fuXziilHkd+OZh59KbWjYmtZKroTbzwTkdVjBor+iDrRh9KE1MA1fT911XdUvrHZ0yrnBNFb4lnvB4e/ybMPg3XfSL8ZJ0wCAFbf0oRrh8ufQ382tfhgS8qJfmKPw9uiNQPl78Bvvdhpeyr04rkAW75A3j7993nmfSi17BJNTRRt2BJ9AbErG/Odh1SPkqxbmEFmcYRjHOli+FKy8Rr9o4XRzYKGCp6wzx6k/YAcSp604pdUCQZaN0YZj2BuRVnutuTneBGb6bdQxOP3hK5MvzSDeHPixs7XqD+RUUqBdd9UgVmn/pXeN47oTgO//KnKmBbXqOeZ2XdjMHM0+HPM62MBbN838a8+9wweJWkH4F0Fb2BR29i3eg0QeMy97DtucX7l8nHWIJfdHPf/QSNcfGVQQA1To/eNLMIwj8Da+vGwG4xibnkPIeP+BK94evU6ZVBu4OYcHYQ/WrGhsvhP35PXWhbdsG+O9TP99+hdg2giF6kzVMNTapETfOGQRHp9N7g59hm3UBwQLZuQfRd6yaA6E1VFphn3Zi+f5miQR69hUevn6+rPvvNDeLpva8XgVCizy99/iBjgfoMgnLfTQ9+MRkLzHe43rz80oTP3PSOKsy6GQakGsvEohwAST/6MwEbr1AkD7D52eqC23+H+3vd58Zk1dfWTVgzNdPgE8Rv3Zj0f7HZIeSGARGs6NuGvik4/fJN8q4N37+sQasBG48eQnz1usoQC0sMsPHow3rdCBHeUqE7VogNBOEBVNMze/XfM0lvNVL0BgVY+m+Z5NHDaSmaSoj+TEMmD5uepYLBGtUZt71BGAqj6qINurDbLeUzmnrMhRGVeRSEbnqlYTAWglVu3SIYm0qpm8ZE0ZsqwFitm4JhNoqNog/JSDF9nRBSMKVVuAE5Z0K6YdoqeiPrxvS8gpgUvW7JEdTkzzgYe/oamyVEfyZizQUws8/93qRzpYZJdazNTQJQWqPGCzr3tLGo7CUb+6EdRPQWih7Cdx2mvWRAkUynFWwtmaYJ6r9p5NEbzg3CA5VGNoTBWKaKHpQKj03Rh6hwK+vGsPjKqG23wUE8xsHY03dubEL0ZyLGtsP8YVcB1WZiJnoLvxoU0QNUpvyf06yqG8rEXkp7fGY/2ARjwUlVC3jNpr1kQOVKQ7iitFL0MTT7ArPsFuOxTIi+vvS5QQjrb2+l6MPI2ca6CSlyMq07AFd4BCl60/srsW7OcYxvV4+zB9RjbdYt8w+DyeEjNv4mQNlp0bB4wv85ph4zmNkPtoq+MBJi3dhkfJgQoEUwNmtK9AYEaJLdYmorpTOqejNorKaFog/L8e8qep8gshdZ0/RKE3IOy+AxrDsADzmbWDemRJ8o+nMTY9vU48xe9Whj3Zi0Km5ZXNgA5bXqcTGg42ckog9R9CJtts0HR9GbZN0YqkmIV9GHVsZWDYneMF/dOFAc0lKhZeHRh5FzNyff1Aaq+R82Hmd6pWndAZgdxNMNxobcD4XEujm3MeYo+pn96rEawboJattrc5MAlByiD7JuTM5j1TAhq7rT8tg0vzjsOEEbu8qkNYBp/3IIz0YBpwDH0LuG8Kwb088iLOjZrKrrxKQYMBNSmGS1aITsXNq6MtYwGNtuuP/nlLEM01HB3WEGigqb9EoSoj9nMbxBbUmn9ykV1K7bZd1AcC5920LBgKF1Y9gZEtznBQVjG4aHjmjkQnqQmKos8JxKFGQd1M2tr6xB1o3J4R5glq9u2rAOwuMHNp9rthifDRTWddJK0Ycs3Da7vUxeVeMGWjeGNmEuIfpzG6m06qcze8Cuzw24kXyjrBtDoi+Oq7zsIOvGtDOk9+8GKvo5uyKSbNkw5c2yKMYPNq/XKOvG4Lg+MMyjNxwLDGwNG6IPsaiiKHq/udlkjoVZcTaZRUIoVR9HMDadcTrDJsHYcxea6Ksn1femwdhsQd2YgR69xVYV1La9OAGVmBV9YDDW8NARjbADIaw8esNgrJVqDquMNbS+TALZJod5a4SSs82CFqeiD/kMbBIKdG2H38Jtc22AEw+KSVQUxqAybfZ3B0BC9GcqRrcqotfNtYY3mv/fsMZmtnn0oOybsKwbm94vEJynbnosoUaupFLu/Mbs3nyGrWjBIBhr09Ss6l+t3G6pvP3YPHobFR5SgWoTe4lV0YdYNx3LFghBY5meoqWRH3Irt/vBJtmhvDZYQMWEhOjPVIxuUUcPzjoNyoIO1OhFWL8b2zx6cC7IsGCsqaI3Sa80PHREQ6t/v9N/bAumwJ/oTU830sjkVSWyX8GZzdxMPHrb3VVgqqbFghYWjG1Wlb9tcmZDqKK3SK8MW7j1+2+a4RXW5M9G0Zcngy3RmJAQ/ZmKNRcqcnjiW+p7G0VfnFBtj/1gm0cPiuhjS69chmBsmK8eKb0yLBBoat2EqHAroo9b0Rtkytgo+rDulaaxg0yYR29j3YRcG11Fb9q2OyTDSx9wY5IxdpqIftm7Vwoh9gLzQBtoSSl3LfffPCugDx55+CYYP8+/U2E/lCbc1Mx+sM2jB5ViGVowZUguqQwgQoKx85bWjfZh/YghxvRKW093yQ6mT6tpq6Ikg91QUK/0XoQSvU2qZim4hXKzajcv/X/6wbYFQtBYNtW/oBT93CH/39sE6ssh91VMOF2K/sVSyqsSkrfAyEY43zn6cOtz7P5vaQIqJ/1/b5t1A+qCrM0E2A8WbY+7nQ59yEpKR9FHIXofpWWzuGmS8Vs0bLbm3vF8Fb0F0YS9d+CkalpYN3ERfViQ3TYbCGJKr4wx6wacvkohit6Y6CfVvILGiwGJdXMm4w1/q44xfOHv2P2/4oTy032Df5Z59OBWx/r59DZ2gf7bvoHTmgpORlH0QT6syeHboMg0KO3Qpp0CuO+Ln6/esrQOMvkQj95ShQd69JYnaYH/3CIp+tNh3VhYZ6CIPiwYazrW0Hr1uHDU7PkRcTqIXgLfFELcJYR4W+8vhRBvE0LsFkLsPn58+b2qVYXSBLzqfTB5kf3/a9cNcpAtiL7oHLLgt1OwubghWJV2jxG08egNUuhs5hdkaVhbN1rphoxnGgwM6ikjpdNOwVQ5h2XKRFD0QQukTewAghV9KmPmg4daN5ZEr4OxfkKqWTH/LEc2qccgKygGnA6iv1ZK+WzgVcB/EkK8yPtLKeX1UspdUspdk5OTp2E65wBCSdkyjx7C+3K0LQgB1HPbPopeqyWrrBsTordY2ILSDm2zlrSK9YtJ2Kb3BZ0b292t2fjqdeWr94NtOwXwn1uzak6AYXZLp2mWcQOe3V5IRpZxX6UhlSjhm65psaCdLUQvpTzoPB4DvgJYGs4JrFEcV49+KZZR8uiDemfrPHAbxZwOICubQ0c0wrbnttZSoHUTUdHHpSiDerV3A7umu4MwXz0C0Qe9TqsAtgiYl0X30HROVXb7xVyaVbVo+J3B24uwVsXNilmHTnCz6eZXMdELIcpCiGH9NfAK4MHl/JsJcIneL8UySh59UO/sbptXC8UcVC3aPa3Khuh1Hn2AXWXzegOtG1uP3kDpgrl/HeTRWweKw4KeFh69yes0XYCECG64ZjMvIZS1F7Rw24iAsGZkLYvK5PwQ5Edh7rD534+A5U6vXA98RSgfLQP8HynlLcv8NxOEEr0TyDLd+kIw0dsqXHDsBx+itzkYXKObR++XdVOzs6pMFL0xAYakRNqctwvBHr1N9Sm4hBQUj7DpdRM4lu2uKiROYkvOvsRsESTWY0GwoteH9ZhgZCPMHTR/fgQsK9FLKZ8CrlzOv5GgD8KIXqffmbSe1QiybmwVrn6uL9E7i4mNos/kVVZNUEqkraL3s76iplf6qXDbHUyQR2/7WZjkmJtaJGEnVjVr5opezy2OeYFD9D7Nw5oWaZ/gaVXss3DYpLeC8unnl1fRJ+mVZyNMiN7mhoPgizuyog8hPhuPXojgQ6Bjzbqx9NTDfHDb1xvk0UeeW5/X2umooKetovfNLrIkwEDrxqI1AzgH3AdYLVY2pr4X/BR9zdyjBxjetPqDsQlWANmiugl8iX7R7kIEpf5zPttfm4ZhGum8fwuEKNYNOEQfUDBlczMH9be3VfShRL+ogoU2gUrfXHWLU5y8z+u3qNnGXkLz6G0VfZh1Y6voY/DUwU37DQzGWir6haP+B6PEgIToz0YIoVR9nIoe1M3S71xWWxUJwdZNlGAshBc5xRWMjZpe6TdeY1G9VtPTtIw8eovulX5zs94dhJwKZa3owz7PmDz6pkXdAXgUfdDCYTHeyEaVrrmMRVMJ0Z+tWC6iDwzG2nj0AVk39Xl1k5umu2kEWTftRgSSibtgKuD12sYj/MaKat30JXrLCurugtZnEbJpxdwdrxTQu8jizF7wFykQwboJUPRS2qVXgrJuYFl9+oToz1YUx/3PjbW9EDXyQ/2JtB3Fo88FK3pbNQ8hHn3NjhiC/GHbboeptMpw8lO6jUW3qMd0bn5j6TnbFib1G882gydI0XfbPNhYJGExFxtyHo1Pgesq7MDEBEvrBpY18yYh+rMVy6Ho/TzwSMHYoBYIlp0rl8wvxmBsp9W/H0+zAgi77X62GLKwWRB9oO3lEL3peEEq3DoW4RQ59dsddGMHltktfj54FEXfmFcB5n5zs7k2UimnDUKfuXVrIiyEVJfoE0WfwBaBRB9R0eeG+xNp9+Btm2Bszr8Fgu0xghpBnq5NQy09FvQfr+EEs23SUzN5fyvI9pAV7dH367XSVfSmRB/wOm3VabfIKSZFnw8g+igePfgIFcvYATiLUB9Fb1v8BirnPp1bVkW/7P3oE6wQimOrV9E3Fty8fav5+VhLYNciF5YGKYs95/XaWi0QHEBtzKujI43H0gVYffrOd4uvDBfyoIygKJ9rttT/M4ik6IN2aJaVzt6Cv0LPtWXTv787XoyKXgh401dgbLvdHCyQKPqzFcUxpdL6bfEHIfp+F3ekgqmCc7xen5SyyNaND8mAk1lhWRkL/ore5iAYCK4bqM9bVgEHeOH69RtXxgYUOUX5XHM+uyrb2AGo663d6G+ftS3OKIbgtgW2WTd6PL/dAdjvEHZcC2MWi70lEqI/W9EtmuoTkI07GBtJ0Ts3aT/yizsY226pM15tc7jBx2+uREj9DGgHbEv0XkXfb27ZsrmtlM6qdr99iT7C5+q3q9IEa7NTC2oeZqvog7qv2mbd6Ln5LRoQTUgtIxKiP1sRVB0bWdEPKcXS29I2SsFUUMphfSGaos+WldLr3SVEUVlB+eWNBfuFMhOQKWOdXhmwCEXZbfilkkZR9H5xknqU1tOa6H3iQlbWjSb6nhRLKe2zbsBf0SdEn+C0wo/oOx3nwo4SjPU5ri9KSpnedverjrUlvt759fYdj+IPB51w1KhE8Oh9MmVadWVPxKrobRchn0O9o3yufvZZJKL3ud6ktOte6f27vbn0UXYtsCTH/6Z7D3LPfuc+S4g+wWmFH9G3BrgQexRWvdXmff/8E07OOjexzY3nFwRst9QcIwVjdQfLHnK2PaoPQog+QjDWLxul2+7B4vWGefTWc/M5NzZKIVxuqH+Rk1bSkaybnoVDd1+1bYEAp9otUT11p86i1mzz7i/cyzs+d3fPeAnRJzgd8CP6KFkBGj033rcePsbHvvskdz11RCl023RDODXQVptVj4XRgefXRdOy8AeCz6C1zXsHf0XfJcCYFH2U3VCodWNbUdxP0Ud4nX6KvtuDJ4p100v0+hhH2/TKMjQqPH1SXR+HZ2vc8uBhHtx3xBkvIfoEpwO+RB8h+0Ejt7Qi8PFj6rHViJCH7NejffGYehyKcKxk11fvIZruUXGWVZngk0IXxbrx8eijWBpBbQsWj8PQOsu5+aS6RlL0ftbNgqoOtur77i7cd+2b5l2fv4dqox09SAxLiP6OJ6eYnXMWIFsF7ixoJxZcofIbf3c3n//BY87vE6JPcDqQH1H92X0VfZReN0sV8+EZRQ6yadleAPxV6f471OPIZvv5+Z0ba1vKD+6Ool9vH10wZQO/rJsu0dsEYwMC2QvHoGy5SMap6P2smyiWUpecF/jbH+zh5vsO8R//7i72HJ1y5mVxzXW7r6rPc/9UhTd+4od86Ov3qd9bK/oSdFqcnF+6QyjgEH9C9AlOC4ToXzTVVfSDBGMVkR6aVeQgbdsLgPv83mDswbuU8tsS4Wjh7vx6iCZKtWJuSLUOrs5waKbKJ7/3FK12RwWzo6RX+qnmQRR97w6hWYXKlL2ij9Oj19aNU7U7U3GIT3fotIHHujkxr+Zy22PHec/f3al+bmPdQLcpX7XR5iUf+lcA2hUn/dg2JuRUHs/PLRUCXaJPPPoEpw392iAMouh78poPzaixRDtCHnLaR9EvTsHkxcZ+/+fv3M9LPvSvNFqdeLOChFCqvjbLf//W4/zZ1x7hGw8ddRdK64IpRfTH5ms8ftSjAhtRgrE+iv7AbkDCRstD3YIUfTpv3j4Z1PsiVWbXbY8d56o/uZVbHz4aLa7hERYzlSabx9Q1m5aWXTU1nMNHvvnwEVodtRBNZJ330DYm5Hz+c3OzCAH3v/cV/NbLLqIgGkiRUvUJZxCSFghnKU4uNihnR6hNH2OoI0mnnJt1IEW/lOiPzambJNVuIjN5LOjA36OvnIDyWuNh/uLrjzBfa/GdR4/xMxt9qlmbETMrCmNQm+GpE+r1/tHND/Hit11ISf/OBg7Rv/qvb+PEYpOXX7aeP3zNZWyNFIx1PXopJTfefZArt45yoe6VsvbiCHNT79HnfrSPDSMFFuotrjh6kvOss1HcXdUtD6nA5O1PnuDlkbKB3IV7vtbk+Reupd2RLDx1AOqe35vC6Un/1HG1I902USIV5f33zG1xfo6JUo6RQpaJoRx16shMEWGzOJ4GLLuiF0K8UgjxqBDiCSHE7y3330ug8OufvpPbD7bZd+Agv/bpO91fDKToy84Q81x/25PM11tMDufJ06CdslT0fh794gkomRP9znVq8Xn40Jx/1k03s8LyNTuKfmpRKcgTC3X27X9K/W54g91YjgqfX1Rzu/Xho1x/21MDWjd1Hjw4x29/ab53pQAAIABJREFU8T7ecsNutynWyEbLuanUzyeOLfD/feVB3nLDbt79hXu5/ScHI1SMurUMjx1Rr+3hQ3PRPPpUShFqY5H5WovhQoZiLk1aB9tti+qcnvT7T1bYPFbkovXDpKLsqKCr6CuLc6wZUjuLbEpQoIG0XRxPA5aV6IUQaeAjwKuAy4A3CiEuW86/mQCa7Q73HZhlhiHGWOAHT5yg3nKqWWNIrzxw5Bh/8fWfAHDpxhHyNGkJy62qH9FXpqwU/UJdVcHuOeGpCD2F6CMq+uIY1GaZXmywa7vKYqqccMh0aL3dWI5nm8fN0rj36RlF9CJl93l4ahBueUi1tt03VaEydVD1XY+Y4//Rf30SIeDyzYr0CsLysBbofgb3PHGQ3fuUbfijPSepLM5GLoLr1OeZr7cYLmQp59KkuvZZNEW/b2qRbRMlCtkUhU7EYyudz6teWWCirIg+k05REE3kGebPw/Ir+ucAT0gpn5JSNoAvAK9b5r95zuMxxwPeuGEj63M1OhLu3jejSHGQ9Mp0BjIFmjXXY37tlZvIiyZNYZt14wZj79xzkiePL6ggan3OKph40lHbe04sOmQq/PPoIyh6WZ1hptrksk2K/GrTDtHbKnpnYcujin1ymRSPHp2nU5tX2SA2W33nvZuem+Mj33mya8vNnTgUMS21iGxW+af7DvGma7Zz83+6ll3bxxnOtO0VvWNpvPfLahf5xudsA2BmZsaemAHyQ7Sqyl4ZKWQo5TJk2proIyj6+jz7T1bZNlEin0mTby2q7LSI8YN6dZ41Q+o9yqYFBep0zjVFD2wGnvZ8f8D5WQIfyH49xi3x8CF1Y1y0Yxv51jzZlOSNn/gh1/zFt5mecYKzUdO/cmXaNaWC7vmvL2f7mhI5mjSwVPROOmarUeWXPn4HL/3Qd5k77lwqw2bWQ6cjma4o4txzYhEpRP82uVEqYwHyI8jqDFLCjjVlsmmhzvUUqQgpjOr9LogGn/j3u/jAdVfQaHWYn5u2V5OpFKRz7DlyEoDPvfW5pFOC5twRKFtm3ABkioh2nWa7xWuu2EQqJbh88yhZGUXRKwIsiTpXbx/nz19/OS+4cA35ToTaA4DcEO2qEhYjhSylXJohUev+zgr5UWR9jhMLdbatKZHPpih0Kur9t/XUHUXfrC6wViv6VIoCDTrpc0/Rh0II8TYhxG4hxO7jx4+v9HRWFO+9+SFe95EfqAySAfDY0XlymRRjE+qm37VeXcQL9Rb7DzsHEEdpMQCQG0LWFxACRopZRotZ8jSpY67oj87V+PjtShkfO+mmp914213qC0NbZLbapN2R7FhTYqHe4ruPHe+2yZVS8tk79vLEsflIwdgfPTXFbDuHdHZAa4ZyjJdyZCrHVQzB9jxbZ5Ep0GS4kOHKrSqY+9CeA/ZED5ApcnJmlvPWlrnm/DVctH6YtGUgG+Bj332Sj3z/gDO3Rnfnks+myHQsO0RC17opUue9P/cMUinB1vESBVmNZt3kh+k4cYzhQoZSPkMJTfR2C8dUK4doLCDoOIo+RVFGPfvAtQm9ir5Ig7Zt2udpwHIT/UHA22R5i/OzLqSU10spd0kpd01ORth2niW46d6DfOb2vdx/YJbd+04ONNajRxfYuW6IVGkCgA+9Zju/9bKLyKVTVOZmnDa2lkSlkRtCNBYYKWRJpwQjBU305glcH/3XJ3n/t/YCcGxatTy49sK1/Pihx9UTDNWyDpL+9MVqQfvdL93f7Z74T/cf5g9veoi3ffYu98Qqw9cspeSXr/8hNz0y5/jBkvFSjolyjnx9ytqfv/HuA/z1d9VupUCDoXyG89YqkmpV5qyDinftm6aVyjEzN8+zt6nYwZVbRik2Z2hbBLI7HckHv/Eox2rqfdk5kWEorz7HfDpFjgbSkuhnW2rBL1Nj2xpFhrmUIv5oZwy4B3wMF7KUsmnKEYh+sd7i4z9UQnKIGlvGi+QzaUqd6qkHkZgg6+5ctEefTacoiAbtc1DR/xjYKYQ4TwiRA34FuHmZ/+aqwv6pCr/6yR/y7i/c280TfuKYz/Fphnj86DwXrR/utkHYlK/x7pftZPN4EVmbjaYgNXIlRLPCeElZNSPFDAXRoCbNFf1MpUGHFG2RZmp2njXlHH/x88+kJJ3XbZjTrP35l1yyjtdeuYnj83XamSLTs7O86/P3ADBXaynf3+I16wDv4UoaIdvkaTJRVoo+15w79cSpEPznf7iPHx1Ucy1RZ6Sg3rtfe/4OxtI168/juo/ezqFFEO0q1+5cA8BPXzTBKAscbZmT6YOHZml1JDVnN3bZpGu/5TIp8jSRaTvr5sPfVbuDoqgzWlTjlVJNUshI1k0rU0Y4VtxwIUM5n6YkanQyRSux8o2HjjAr1f01RJXN40XymRRluYiMcD/cc0QtNkXqrB3SwdhzVNFLKVvAO4FvAI8A/yClfGg5/+Zqw4dvfZQfPDHFZRtH+OJvPI/hfIbHj0Yn+k5Hcmy+rhaNnn43a4dyiMZ8NAWjkS2RblUZLamLu5hNU6BJRZp79PudRlBNckzPzXPl1jG2rSmxpeB0JTQk+sNOZe7G0QKvu0odsFwjz9yc2iW8cOda5qpN64M9jjtVmIuoG7ZEjfGyUvSF9rxVcU3HKcypSGcsUWO44KjmbIqirFrNTcdwFikwRI0X7VS7n4tGOqSE5ETbnEyfPqnev6qzSF8y4e7KFNE36Fi0tnjw4Cw3Paze+/FMs/vzrgK3yCx6/Og8v/X39/KlB2e6wdhhJxg7RI12xnysaqPNf/6H+5jXRC+qrC3nyWdTDIsKnZwd0d/22HGu+9T9gFq41zrWTSaVipZqfBqw7AVTUsqvA19f7r+zGvHEsQX+6f7DvPl52/nj110OwPmTZZVBEhHat14zlDuF6IfyGXLtxUiK/thcjd/50v18LJ0n3a52Fb0QgqKod8nCBHunFNHXyVCtVrhyi1LI28pNOnOClKFnemBaEdXm8SKFrFJ3C50cnYbacVy9fZzvPX4CWZ9HRCD6qkP0Q6LOuuG8UpSdBeNiqT/76sPdXcciShmXqTFUcO2RMhVkbti42EzvNhYpMpZpdP3hManIcFaYL+J6oVwzNgIVuNBL9OmUUqeZojFJ3HTvwe579h+e4waFh525yeKE8ev8g688wI/3TnNZpkC6pe6HsVKOk4sNSqJGK1MyDv/f7fSKv+bSHfAk/MIzRkilBPlMmiGqtLND2BiZTx5foEOKusxSFC7R5zKCgmjQimDdfOmuA1y5ZZSd6wfYbQdgxYOx5zL+x7cfp5hN85sv3dn92Y61gxH91KIiqTVD+VOIvpzPUIhI9N94+Ci3PXacp2Yl2U6NMWdbTqdNjhaVjtlt9/k793fJr9LJkpNNrtiqFPKGXJ0FSip7xgAHZ9SCU8pl2DxWpJhNM9vOkm5VGC/lKDrk36nZKfof71UxkkWpyHnbUIdsOkUuk2KIRSPr5vBslU9+fw833qNCUhVnrLFMg2xa3Xb5rCKajkWQcrbadMbLsz7vquZSW/VsmU2ZE/3BmSqlXJrrnnsRAFdtcJVoPpumKOq00+bK+dBsjY0ToyBSrC+4p5CNdtTcbOIHx5zFtkKBsqiTFh1Gi1nGSjnK1KinzOd1YkGN9ZIrLwDg7c9Vu6B8JsWwqNLK2t0P2lqtkFeKfthV9EXqtFJ2qcazlSb/5cv3d6+V5UBC9CuEVrvDdx49xs8+c2NXEQBsnyhxcKbKTfdG+9B129S15ZxrMWiiz2XcdDJLzDrNqaoUyMsaY6WlZ74uGhL979/4AAAvumiShsyQE82uoh9PV5jtlKgbZh0dnFZeK0AqJdi+psRsK0umrVSzVvnSwrqZqzX54DdVq9mKo8IvmlDjFERH2RAG1o3ebXThBCLHM27BVD6tAoM2RKOJvjA0xtYhNxU3U1OL00La3FY6PFNj01iRy3eomoChlFu8phR9nZaFR39wusqWifIpHSyHnEWokV9jPFbTuQYKZfV6NhU7pFOCLeNFytS6n40Jppx7YnhUJSfoDpb5TIph7In+Uafit0KeoVSdck5dH9mUoEyNhsUiBPCvjx2j3ZG8/DLLIjwLJES/Qti9b5r5Wotrdy5VOVfvUBfjDbfvjTSuvqgnhnKqwCk/skTRl2RFVU8a4psPHeFtn93dVTELMkdB1hhzrBudurhgSPQ71w2xbjjP667cRJ1sN9AJUGovMEeJWrMdMorCoZlqN4ANMDmcZ66VJdtRPrhW9NTnVFGSAX5y2C0G04r+V65Un8lIyiEvA6I/6BD91951LT/8/ZcyMaYWszEP0Q9TISUkzZy5Cp916gZ2bFrntgIA0nXljS8I893BodkqG0cLfVtH5DLKurGxIQ5MV9kyXjzl8JGhliL6ZmEidAwpJQemKxyeq/Gel+3kvM3KAlrn7F4K2TRDqRo1YT6vqcU66ZTwEL36jEuptir2y5jHNaSUPHp0nkxKUJV5yqLR7WuTkzXyokUta35/HZ2r8e4v3MtIIcNVWyz7J1kgIfoVws33HaKQTfFvLl6aSvhvLprkmvMnut31bNG1bsrOLsHTqngon1aesEWa2we+8SjffPgo/3jvIQCO19KUqDNe7CH6thnRn1xs8LLL1rNlvEidLBvLrk1TaM8zJ8tUDYl+uuIuEgDrhgvMNDPkZI3hfJZCLg1IUtUpKIWTDLi+9R+/9hlUHL9565BSl8NOVlDHYKE86HT2PG9tmQ2jBUaHy9RlhrG0S/Sb5+4FoJG2t24yheElh2gIZ2dVwzwQuPfEoloo+xyykk+1yIo2zZSZcq4125xYcJIAeg4fKbem6UhB3YAAP/KdJ7j2/d9BStV0bMQh526RFFAWdaoWRH9yscFEOUeqsPSUqbJ0jsQ0fP9ve+w4f/pV1UTvDVdvoUKeDSV395lrqgXNhuj/5KsPA/AHr76UVGr5GqEl3StXAO2O5JsPHeWll6zvptp5sXmsxO1Pnog09tRCAyHoBku9rYrLuRRD1GhmhozLm+ZrzSXfH1oUZFIdJkvORekQzEIn/FJqtjtMLTaYHMrz7O3jTI2NMD7mElOuU2GBkjpFyACL9VY37xuUop9uZiik68q6yaQYokqqVTPOfT88q17Piy6a5DOOPVBCLZ5DDtE3c6OhdHpgusJEOUcpp+Y3XspRocBo2rVHnvHE9QBUxi7CbBmCGYfos6WRpRXAztcVw6D4p76/h7laiwvXDXkOlHGJvuj05GkYWjd6YdsyUXQakbnWTbE5wyxlWjJcV/5oj1tDcunGEXIVZfc8f4v7jpepMSPsrJs15ZznIBNl3RRxkgLSZor+9298oPs6f3HXVjYeXMNwwQ3j5huK6CsZM6JvdyS3PXacX3j2Zn7FaRWxXEgU/Qrgnv3TnFio84pn9Cef8VKW6Uqj7+/CMLVYVxWcTsDPS/SjmSYpIY0v7Ga7w9G5pU3H5tqKSCZ1sM2pHJ1rhSt6HRRbN5Inm06xYWK02/sFINuuUSVvpOjbHUm12absIfp1w3kWZI48DYbzKYq5NJPCOYPWlOhnqgwXMmwZL3atG02AZacBVjMbbrU8fbLK1nFXda4p51ikwLDHB883TvLd9hXMjD/TaG7gKvp8aRg6TbcpnPM5VKWZov/RU+qUptdetemU9tMARakWvKYhoWqravNYSe0QPNZNoTnDtByibbBL9Qqfi9YPc94m9bm96dnuUlimRtXGo19sqCy07ilTjnXTUXOsGdwPjVanm40FcMmGYSYnxing7jRyDtFX02Y24WNH55mvtXjhTrtq5ihIiH4F8I2HjpBLp3jJJf37koyXc9SaHWOv2ouphcYSO0MRvboARx2PuZYyI/qFmkrle+ZmpVBKuXTXzpjMqd/p7f7JVriS1DfKpA4+ZwpLulemOzWqMm/0uhcb6u97Ff3a4XyX6CayLYrZNLtSj6pfrrkwdExQ2R7rRwpk06nua9XqtIgis7pBDvf+kxW2TrjPmyjnqci8W74vJYXaMR6R26w+56mFOrlMimzRWWy0qm8sUiNHw7B7xn0HZnjJJetYN1xQfXhEaol1U2qohaCaM9tr6ODzlvFTrZt8a44Zhmi2wyc3XWlQyqX5yjueTzolSBUUaZY8hFqk5i7CBphaqDOhrcy8e5xgQRO9wf3w2NF5Gu0O/+6abfzVL1+pBEautGTnktWK3jAgvtvJ7tq13XQ/Fx0J0Z9mSCm55aEjPP/CNQz3sW2AbqAziqo/Pu9W6gFLFP2Qc7NUDbMCNJm+6Zrt3PpbL+JtLzq/W/izJueQk3NDTzfDiV6fSLVh1LlJM/mlRN+qUUUtcmGo1NXf9yr68VK2S85j2TaFbJprUo9QL0zC5meHjglq16Hfv1t+95Xqh85rLHXUTR2WVdFodTgwXem2OQAYLWaoUCDXcbJxarOkOk1OyFGj16ux50SFHWtKbl2A9umbVaoUaLXDVfPd+6c5Old3PwchnEwZTwB1/kkAFvJmXTofcwKU60cKTmM5lwDzjRmm5bBR3OnkYoPnX7CWZzmtHbpBdL0ItRpkabFgqOhb7Q4HZ5wgMXRPmQIoOkS/QPj98MBBtTN867Xn8/PP2qJ+mC0vOeQmXVdEv2CY4rp73zTrR/Lu3JYRCdGfZvx47zRPn6zyymf430DjTuri9GLT9zl+ODBdVdtnDU30UjKEnaJf9JDpzvXDjJdybhGR9pob6qY50cyGdt58+PA8KQE71zk3bya/5ISpdLtKDTNFX3EWoVLO9UjHS7luOf9IukEhm2Y9J1ksbfbtTqizPDROLDSYHFYksmXNsNp1OJZG3iHpeir4xjwwXaHjdLzUKObSLEiPdbOo+q6ckKPGwWeAp04scP7aoVOPTWxWqIs8zU74orHXqdN48/N2uD/MDXU/S4CxA9/muBxlajj8tKpHj8zzmdv30tInmfUsGrmmOhvBZBGaqTTd+BJ44gfO3JzXa6roD8/WaLZV4zs1njp8BGDE2aGdaIWPtW+qQjYt2ObZpSlF7+6CMjVLot87za4dE6flNKqE6E8j9k9V+LVP38l4KcsrAoheK/oZS0Vfb7U5Ol9bqhCK4yDbUJ+nLBWhVYSZotdVmKV8ujsvrZiF7gjp3NALnUJo/vsTx+bZvqZMUZNzOg9t5zV22qTadSoyb6bonYBtN4USGC1mu4VJI5kmxVya9WKGxZx/k7Qv3nWAa9//Hf7pvkNIKTk8W2X9sMfnzpW7rzEvzYhet3jYvsZ9n3/uyk1sWreWDTq2UVMKcRazLKNGq8Nbb9jNU8cXOX+y7CFAr3WTp2lAproYabP3OsmVl1o3R3bz/c7lmMTF7z+gCK5LpoWRrj0CytKYlkO0QhahdkdyYqHO5JL3v+d1OrvTWWl2De+dWnTm5iyMedejLztEf7QeHl86uaialy3JjNEN1xyBk65PsyALNGR4ne1CvcXBmSqXbRygHYkFEqI/TTgyW+NF/+07VBptPvbvrl7qo/egq+grdor+4HS1m5bWhac6tuBYDyZbVXBVs/bBL9kw4gb79NbcIYcFCiw6C4Mf9jq2QxdeRe8sHMq6MVH0p1o3Y6UsVUfRD6UaFDIp1otpplP+Hui3H1Ftm3/z8/dwaLZGrdnpdl0ElhJ9p0pTpqm1gzOMDs2o1+Ql0lIuw/mb1pPSQUqHbBZlgW84Z6sG4ZHDc3zLmet5a8ueDBLXuqmnCrQMfPBjc6rIxxvfIO9R4bU5MotHeLyzxT2ZLAC6kvtLb3++M5ZD9FJCq0GmVWFGDoUuQkfmarQ6ki3jPe8/wl2EFlU22glpRpC63caOtacSfdrZJUw1wwPYJxebrs+vURhxAuLq8xbVkyoWYWBR7XMWIK+9t5xIiP404I4np7jmL78NwFVbx3ju+cEVgi7R2yn6fX2UpJfoXU/SbNuribvspAhetH6I/+elqicPPYRVodAl336QUrJ3apHtHjtDBWOd19gl+jw1A3LRi1DRY90M5TOutZRqUkw1GREVvrGv/43X6Uju9KTz/f2d+wHYuoRohrqvNdupUiFPI+RGPjxbJZ0SKtDpRa7sbvUdUl2kyNfuPxzyalXwVOOZW0ZPVbrNCg1RMAp4HpuvsW6kd25D7txmVQfK/XJdN8snCE8eX+CCybJb4V0YBdlR42mrhUJo1s0B5/pdsiPtxg800SvL61jHkOhPLFLIplindwl516OnPkeNHAutcOtEKfoe5Z9fmpcvqtPMMGz0Gew90edeXUYkRL/MuGvfSX71kz8E4I3P2coXf+N5of9n3LmgdJWrKZ52bpQlil434KpOk3eIft5w27vgePRa+QkheNWzVb+QrqJfOEIjN06LTDd42w/HF+pUGu2lCiaT8yh6J35gGozVij7nqlIhRHfHURJ1Sg21zT9B/yyIfScrTFea/NHPqWOM/8e/PAGgcss1PCdW5dpVFilQD5nfwZkqG0YK3SP+uvDsDlyiN0uH/PHeadaUc9z2uy/mkg0jp+a+Nxappwo0TKybuR57BJb0fcfxmufFEDMGu8rHji4sfc90YVJt1vM6w3cbTxxXf/8U8ssPueRcUYr+WNusyOnxYwtcMDnk+uB5j61Un6MiSt3rPAiqOK/nPdNE73j+VE4yx1C3fUMQTrGUlhlnDdFPLdRjOYYvTlQaLa776B10JNz+ey/hL3/him5DqyDkM2kmh/PdLBVT7J+qUMimlt7EHkWfc7oAznXMyGWxx6MHugcudBX93CHq5Q3O8/1vmH29W2hQir5dV1t8regN0yt1IZc3GAt0YwglGrB4DADhc5CJzv2+1OOTXrV1bElapJecM+0KFVmg0Q6e36GZKpvG+uyackNqQeu0uwT9/Eu3c37I9n2x3uI7PznGSy5Z59pKXetGB2OrNIWZdXNwpuoqXI28RzU76bidwmioffjgwVn2nFjsHoACuC0iarNL8vvDLI279k6zdii3VKjA0p2Qo+iPtsJz1eutNvfun+biDZ7n5ofVWB0Vt6qIMpUQyxFUNtaaXru1W2nr1GpUTjCXGgsUPBp7Tyyybji/xHpcTpwVlbFfvusAv/3F+3jGphG+/Pbnu82spOSOp6a4/YkpDs1W+TcXTfL+f/4Jz79wLdsmSrzgwjVcvYw5rJ/63h5AHaC9acwuhWrLeJEDM5XwJ3qw72SFbROlpVF8D9FnWwssyAKm1v+cs21fUr3bPULNmdvcQdpldcZrJeAC15keSzx63eu83XAVvchRNyD6e5+eZTifUb1aPNAefVHUYV552gda/bf5B533d/NYkfUjeY7O1fnfb3nO0iflhqCicsqzrQoLBor+yGyNyzf32UXoTJlmpbt4ZIvDzHuCoL146NAs+6cqLNRb/OwVnrN0e4ucmhWaqXDr5tBMlYMzVf7tc3sqMb32iKPoZWEsNCHgA994lNFiltc/y3MUtFfpZtTnoayb4LndvX+aq7ePn5qF4t1tLJ6glioz3woXTHc8OcVcrcVrvO+bTkttLEBtjlqq1E068EOl0WK+1mLdiI+i17uNxRMsZq8wypbbO7V42tQ8nCVEryvLHjo0xyX/9RZecsk6PvJvn82Hb32UTzhkC3Dj3aoj5JfuUh7kh29VNscfvPpSXnm5Wb5wP1QaLT57xz4eODDL7/7MxYwUs/zm5+/mB09M/d/2zjtOjqvK99/bOcxMz4xmlLMt2ZJtyZJlBQcMtjFOGDBmiQYMu8YPm7xLWJ4NC+bBwsO8x7If0q69wCPYmGCDSQ4E48UZSZYVLMmSLI0m5+k0He7749atru6uru6Z0WgC9ft85jM91T3V93ZVn3vu7/zOOSxtjvCVN5495nMuiIXMKnm14qhh6IsQLlA33tQAg9TVLOcbTGaIBLwEfJYvlW4eofXDQ8fJL1sPOHv0R/uTeATFC57u4ZpNmefLecKkatj6/uVgD1tWNhcygA0kpaVswYgKch5J23t/bcaY5sdC3H3jNl7oHC7PbbB4k96s8uid1EVSSjqGUly6xiYT15RExgt0UChKPD1Q/lrU9bzqq38GFFW9cZnFa/YFQXiLqJuMN1yVutl+VL3XtlNK4kRW1U1SG/omRyO4q22Qxw/28pYtS5V+XkPThalBc87JKoqg3pE0h3sT9qUAtBcOkOgj6Y+Rjle/R3QhvqLdhjX/ID1E2lfnGFsCRXUB5TEXfa7UkHJ8RkdI1TUzkKxOuR7uTfCK0yqrwU40ZoWhn9sQYt/tl/Phe3bwwM52HtnbxZrbfmM+/5U3rueKMxfwy53tnDavnlXz6mgfTPHAzuP88Mmj3PyDZ3ndhkVIqTzOt25dRjyd5YdPvsRQKoOU8MFLV5fzmqjt4Vu+/YT5BXrguUJg7doNi7jt1WvLudpa5lQf4tH9tde7yedVsPP8U0vSqf1h8IWVLC3Zz5CofmNr9CVGzXZwJjxeQ1seh0wKEr2ImPLmnDz64wNJM+PUhO5Hmh01qZu8L1SVumkbSHK4N8H1Vh24gS2rF8FL4MkmIRFHImjP1ZPO5gj6immeY5YxLW+JFtNKGpbsR282TpyQY/P2oWSWVCZfSEaywvQm48pw+SNEw0ESozlyWoNugTVQvLIlWryzEsLgri3UTaA6dfPo/m7Cfm+5rC9YD9mkojS0Rx+od7wWX314P/UhHzdddErxE5q6sUgs49I5mUt/fzYssangGKgzA8SkBkl560ln83QOpYoXmBIc7I7TGPEXSmqDhW4ZhvQwGd+cqlSLlqPOK/XozXMNmbGDZKC5aq2mkXSW7uF0sTBhkjErDD0oXvvf37KRT12d4re7O7n157uYEw1w3y3nm3Kt685ZbL5+RUuUWy5exd9tWsLtD+wxvXyALz/4Qtn593YM85/v2FR80wC3/fx5th8d4Kp1C9i0rIl/+YWqRreyNcoXr1tX5nHWitb6IMOpLKlMzqSinHB8MEkqky8OimnoMgjJPoZFfc1Fww52jdjLv/xh5YEPq4oy03JaAAAgAElEQVSW3kZl6OMO523rT5bTV6ahL3j0nSkvf/rLET5jdNyywwM71fteULqoAf/29vPhdtT5RjpI+RvJpnzE0+WGXnHpVSg1S/KPJ5sgQYOj5LBjSAWXbQ2QNclpNA6BOjPQHR/NlhW4++vRfvPxK06zKZehx5bPQzZJ1hOuSt30xzMstnTkKjqXHltqEIIxQsEAQ8Op8pMYeK5tkAtXtZQvatZgrNHXNUHQUUe//egAXo9gnV2p3qAlmSs1QMqnFsw7/3yIT1y5xmF8A5yx0GZBA+WFp4bI+pYRTzgb+j3tasEqUmNBMXVjyD7T/ibSaedroGnMkyWthFlk6DXmNoS4fusy3rZlaU0ZZ3MbQnz1zRu47dVrGUll6RxK8fBe1Qhg/ZJGrjxzPr/e1cEH797OeV94hB2fusz0StsHk9z99FEWNYb52ps3IKXie4N+L1tWlNMKY5qHsXvoGkoX67or4GC3unlOaa1k6JVHH/e01EzdtA2kuHSNjYHxR5UHPqiosEDTYiDlGNQ6Ppg0G4yYMKmbdJG80glSSn7wxEusXdDA6nnlc/X4fCoRK5OA4U5V/mBYBTRLcxfaBpJsWNJUdo4i6AJd+TyeTJy4DDpSN9rQ23r01nLAo3EIRE1DP5IqN/R72ofZsqKZb12/iWjQZrHX2azGIpn1hslknKmbtoFk+S6tdGzJAQjHCAe8FXd/ffFR2gdTrC01pGDh6AfNxTxRxaM/2pdgYWOoSC5bGJtVETTI0oWroAv71xpIZXLsbR/mxpettB9behhSA2QbG0j0O38f7t9xnNPm1Zfv+KyLhjb0wWZSI87n0wtHUZB4kjFrVDelGGtacUtdkOUtUbasnMM/X7mGW69eyzXrF+Lzenj1+oXc/IpTSYzm+OJv9pr/c/sDewj4PPzoxq0IIfB4BJedMZ+LVrfW5IU7Qeucuxw8KisOGnzkKa02XkK4SW3Hk/0kvLGaqJtcXtIXTxd1vzKhi1YNKc860LQEqOzRpzI5jvUny2VzZjA2bRqrq89ZWWhqYoMXOkc43JvgbVuXVb7G/rCiW0Y6yETUQlXKNefykvaBVHF2qB0sAVQxGieBM0ffqQ29rUdv0b4bhl4bq5/bdBTri48ytyFELOK3dxp0kpOOb/icPfr7trfxXNugWYq5+FwWWik1CKEYYb+XF7vjtvTN3g5lrE6fb2Po/SG12KYGTdqrmkffPZIuFLuznWchfuANNxIJeBlOVXYsfvt8B1nDWbOdZ6IXRkfIhpqIj2YrKvb+sK+LZ470qyqfpfD6VcwqPWSqgdLBOVUzxB9/sY+Q33NSg7GTZuiFEJ8WQrQJIbYbP1dO1nudDHzo0lVsWzmHbz96iE/8dCff+8thHtjZzvVblxXL8U4QTI9+OF3llQoHu0dojPjtM27DjZDog2Q/SV8DyUx1+Vd/YpS8pLhAmoY/oozLkDJOnthCVdmygkf/Qucwubws54W1R59JmR69P1hnFiyzg84OvcRup6ERMHYcw53koiooWpq12zOSJpuXLLTzvK3QwWeDbkkQcqS+Og0jWqbQ0OMyzzUCgTrTWH3xN/vKXt4XH6XZYdEzA6iGoc9XMfS/NBKzdLno4nNZasqkBiHUSMivzMPN33+27OU60Lm6UjPrUEwZQEOGmyDkWNSsezhdHuw0x1av6L1cVo0t3Eh9yFfWK8GKh/Yoae3W0uRE7dEPHAHAG5lDXmK/+AHvvOspQCnnbKF1+Yahz4bmVI0x/Wl/NxefPndcsbvxYrI9+q9IKc82fn41ye81qRBC8I3rz+Flq1v54ZNHufW+54kGvHz4lasn5f00x9tR4QYsxYvdcVa2RO293Egz9B+GfJa0P1YTR6+TtebYevRGY4mh4+oLHawjEvBV9OifP668v7Jtvl9TN0nT8wuGo4zm8hUDno/s7eKsRTHHIJzy6Ich3oU06tCXevT6c50fq+LR68DicDsCiQzUOe6yOoZSNEcDZfEAoER1MwKBqEln1ZXoqbO5PIPJDE0OpTIIGGoU47PLeUOOyhZddtp+l2YZW3oIgg1mJuvDe7vKXn60T+VslAUoNUINZsKUFF5G8TlSN93DNklcGjo5LNmv7pVQjGiw8v3WNpDkV8+1c8P5y8tpKu3R9x8GYMliFbd73KjPb4VeEBc1his7c7pIWqIHfCFEIOqY8Nc1nKJ7OD2psm47zFrqZjIQC/v57rs28+U3rGfzimbuu+X8SUt4aIr4Cfo8Zms7JyRHc+xuH7IPxALElqgvCEoVUAt1Y7YkrOjRx6HvIDQuAyAa9FZU3Tx/XGney4JZpheZUF6px0copAy43bn64qM8+1J/xTr+hfNGof8I5LN46u2TuTqcKBYrIoZHOKDKIwTC9RW9P8BZCVJK3QTrOGtxjM3Lm1mzoNgz1p2knGoimdJP7dH7I44evS5nUB+yuWeDlgQsg7pxyhfoMjzwivRZKFaQHRr1aiqNbSAxSn8iUzkwrj+3IUMwEVLUTSWH5V13PUUuL7nhvBWVz2UY+gXzFxLwetjXWS5l1lz6l65bZz8uKBRwi/dAtJVQwEc6m6tIBe08qpKrTlYxM43JNvS3CCF2CiHuFELYRr2EEDcKIZ4WQjzd3d09ycM5MXj9OYu55z3bOHXu5AVThBAsbAxzvAaP/lP372IwmeENm5bYv6CxoE1OBWsLxvbFDY++NO0bCl5M9wvQqsrYRgI+2wVESsljB3o5Y1FDeU9MU5MfV1SLP2J6tt02lNX/+tUepMReo25FZA507QHAF1PJMiPp4m2+5tLnxapkCZcY+lC0nkf399A1ZH9dOoZSzK/k5VqVLYbqBiAW8Zfxzf3G598UcTD0Wl5pGHpPIMpwKluxPk3eMD5ff9s5NmMrTiQi1OBYc8jRAwdFaaQGYXQEaVznSrVutLRy/ZIKDTv0IjRYMPRhv71j8VJvgn2dw5yxsMFexKC7TPUb1E3dHBojfrPpuhXa0K9xMsq6dk68G6IthPwe8pKKO6uf/vUY9SEfG5ZOXiNwO0zI0AshHhJC7LL5eQ3wdeAU4GygHfiy3TmklN+SUm6SUm5qbT15CQQzAQsbQ1XLINz91Evc8/QxTptXz6ZlFRQkFkM/Gp5bk0evOwbZpvJHW5VHNHTMNPTRgP0X79H9PRzqifP6jYvLnivKss0kwB82g5Ov//p/F710V9sg9z5zjIWxEGcuquINReaoAC9QN1ftOLpKWiK2D6bweQQtdgtZ6bnANPTaIP6rDacO0DGYruzR+wLg8Rv0yLBp6OuC5YukXmidPXojGGtQN8vmK7mplu9ZcXwgyd6OYT7yytX2sj5TdTOkfkIxQnb0k4HuYYfgKVg4+oQ5z0oc/YuGYsw2sAuFRchQeRGKEQ74bD36Xz6nBAL/8Y5NDmNrKOwOws00hP0M2fD9u48PsTAWcqbPQg2G6qYboq0mZffOu54se+loNs8je7t43YZFExZrjBUTMvRSykullGfa/NwnpeyUUuaklHng28DmaudzUYwFsTDtA5U9+p3HBvjYT54D4Hvv3lx5G20x9NlIK6kaDP2R3jhzogH7Llh1rarGPUCL4dEHfbaZsT959hgBr4crzlpQ9lyhbk7C9Oi1ZztU4uHqUr733LStuqIqUgjABResZU40ULYz6hxMMbc+WL7LqHQuwwO8apNqSdhSX/7lH05l6BlJO3cM0rVzDNUNqHo9pcFiXbnU0aMP1ClKTtdXr2swxlG+4Gqe/cp1NtcBCl7zcAcgIdjA+y9ZBaj6P6XoLq0bXwoLRy8CEYQoLF6l6BlJ4/MIGu1kn9axDR5Vv8ONRPz20s9nj/SzsjXKAqfYS9CyE4800xDyMZQs/8z2dY5Ul0Dq1oTxXoi0mAHs/z5YzvnvPDZAKpPnvFMmv0dsKSZTdWO9o14H7Jqs95qtWNgYpms4VZHb/MYfVbu3n733vPKys1bUFy6FCDeRyFTmEDWO9CYq6/ejFo68ike/r2OY806dUxZsBCwevSER9EfYvMI+SLW3Y5hT59YV1yqvBF3ErH4hBOtZ0BiifTBJX3zU9Hb3d42w0i7nwG6M/oip0pg7p4W6oI9Mtvzz29OuDO4ZCx16hgbqINmn6pgbhr4uWF75s8cMhlehbsAs3haOakNf7p2+1Bsn6PNULqCmF11DMksoxvKWKBetbi27V9LZHAOJTHlhNCtCMYuhr2P13Hqzbn0pdJ/jiouu3m0MFTz6SAWN//PHh1hnV2fICm3o/RHwhw3asfjzl1JypDduny1ddK6YxaNvsQ/CG/jDPkVNV7rHJxOTmTD1RSHE2YAEDgPvmcT3mpVY3BgmL5VCpDTqH09n+d3znfz9BSsK/TUrweOFV30eZI5wykcuLxnN5R1vyiO9ico3ZPPKsseRQLlHn8nlebE7zkWrK1ByPsPrMj36MKfOreONm5bw+33FSo+BxKgzVWBF03L1e8PbAJjfEOZoX4IP37OdP+zr5vqty3iubZC/v8AmWGeHyBwLdROlPjRka0x3GX1Fz3CilgJRw2vGNDiRgI9UJk82lzf18h2DKbweYa+QsZ4LYER9VpGoOp+dR398MMXCxnDl3ZDHo4y9aUzVHEJ+T5mKRC9Czhx9TEkikwNQP4+mqN9U/ZRC9el1mqf26PXYGgkHRstkjDqJy3GhhYKhD6v7O+T30FdSO+f/PryfxGiOZdWk06GGQiXXaCtBv73vLKXk7qePctHqVmc6bpIwaR69lPJ6KeVZUsp1UsprpJTVuyu4KIJWIWi+3IoHdraTzUvHloRF2PZeOO99hI367U51xvvio7QNJMsLpGm0nl547FXbbTvVzZHeOKO5PKsqaa09nkK9d4OjB72TSXPDXU+a3uRgMkNDuEa/ZM01cM3X4MKPAKpAXOdwyvSovve48s4vrLQAlSLcVCjiFogSteHUAXYdH6S1PlhZD278vzbM2lDrrNeExXDt7xpmcVPYWWutDaCh4a4zqBs7vrljMFVdYRSsK+LBAUJ+b1lQVgfKnambgiwVf4RowL5fQT4vOdqfKKtCWjwuzdHrYKy9R3/7L1X5kbOrBTr1+aKKQgmWzDGfl/yfh/YDsKjaDjJoWdSjrXgqLKQdQ0pWaZtpfhLgyiunMebHdNJUOU//u92dLGoMc+7yKt58CXSP1Wu+9mfb53/67DE2fvZBwKbCoUZdK5z3frjqDvOQnY7+kNFFp6LsE0oMvfpSnbVYfXl+v6/b5NaHkln71H07+AKw8XpTp98UDZQpUd62dWnlnUYpIpadTbCeaMBbZrQyuTw/fbatvLZKKQJRs6pmwdAb9W4sPP3+rpHqEjxtsEZUElldfWWPvns4bZ/EVTS2ugJ1YxiwkM9b5jmPydAnetRnFvTZtpo87wuP8ELniOqD6zQuULWVvEHwhwj7vSQzOfKWAO+jB3pY2RqtLErQ0Ma5bq45R6uUVPf8Bfv4RBEs8SCiLRVpVh2fcKRYJxGuoZ/GMMsglChGuofTPLSnk0vWzB1zqQctM+wcKpcvSlnwZN68eQlbnLjEyz4L577b/DMa8DKazRfd6EfMLjoOXlEgWkTdACxtLnzpdXu5oVSmrBZMrWiO+LHSzJ+/9ixuf+1ZtZ8gbPkcAlHF6ZbQVP9mdKeqKXhnNAbXapKCoVfnlFLWWHBNUzed4I/g9ao+sKWGXkpZXSWjx6ZpCMNQB/2espR+7XhUDcZaxhkN+jjcm+Aff7zDPJzN5c18hlc57Uz9YRCGqTLKbuudqfbE09kcPSNprlm/sPp3Qi9CRixH0VOF66mlt99792bnOYK5K9CPncqAQHEz+5MJ19BPY9QHfYT9XvPGA+U53vBfSrpVVU9uA6eI/4s9cV7qS3D7a8/k89euG9MiErHxSo/0JmgI+coqfhZBq1AM1Q0U9wztT2TI5PIkRnM01OrRl8Aqj/vsa8/kzXY1z52gPXqPD7wBosFyj/6h3cqrvuUVpzqfKxAtexw1JKX7O4e59I4/8vCeLlKZvDOdAQVvcvCYuUjalQb40/4ekpncmI0WGNRNBY/ekVcPWXjyQNSco7VKrO5ede2GRWxa7uBUCFGQWBrn1Z3FNH3TPpBCSmoL1mtxgrF4lM6xe6RC/Xk7FH1mrVxlUZdZS0YnR9Vjp0JskwnX0E9jCCFU5yNL8tCH79nBrrYh5jeEzIYrY8GZi2Jcv3WZbeEw3eik6nbVBrrNWq9FQtc+WINXquvmWDj6kN/Lj27cCqhUe11XpWbqpgRWiWLV2jZ20B59qBGEMALPBUOvFRrvPG+5vRzVCquhN1Qz2qN/7GAPB7pG+PQvnldjrfbZRYzrn+w3VTPK0KuxdQymkFLys2eVcXX0mqGgVvIGLdSNCsZalTfdw2maowHntphW7jpQZ5tBriWkF9fCW2uFUUh79Mpgai29jmM5Sls1FhiZrovPVaf0e4iP5njsQA8j6ay52626MELhGhiPm6MBPnGFimFZG+iYzeynyKOfdWWKZxvmNoRMj/7xF3v5xY5CQshYaRuNpmiAgUSmSOUBBW5yPJ3ptXf3/cdf4tar1yCEUFmi1QyrbuwxmijILcGsAfO5X+0xj43X0FtVDo766kpoMLy0nPJAlUdf8AAHEhnio7naitsFLPEK06NXX0PdV1cbreoefTMgAGl+dvUhlfxzoGuES+/4I7devZbjAym2rGiuLhXUO4S6ucqLRgUqgSKVVk00UJFHX0e9KDc1ZlKY047Pcg7rebVHr7O8nzzUi0dUiQdpLL8QbnoM5p2hTmnM663/8QRejyCXl866fius/YiNmJBOhkpncqasWI/zZCdKabge/TTHvIaQmW5/7zPHaIz42fvZy+17ktYIXZFSb50P98T56L07+MKv99IU8Vf3Sm2gvZ87Hztk6sk7BtPVlR5+g7rJFqgbsN/iOmYoOqCpyNCPw6PXKiOjCXQ04Cuq1KkXyEW19AUuom60R6/mWqozr+rRe7wFWsn47FrrgrzYHefSO/4IwF2PHVLyxVq8U220woUdXdBoI2mVWHZVK38AxRx9sM7W+zfLPNRyXbVHb4xNG/qBRIZcXvLYwV42LG1yppM0hID5Z5qLmdX46jINLXU1JNOBCvzPWQWxAh2ok6asHr3J0U8RdeN69NMcc+tV02pVM6aH809pmbBXoL8MPUZ248v/9x/M55yqHzpheUvBSB/sViqKqlmioDxRo/m2pm4qYeM464NYvU+nWvcVseBs9UU+6zpAxSMSmRxdwymaIwH+sK8bIRxqtVhh9egNGkLTGqUy2pqMVrRVfX6GAmf1vDp+u7vDfFqf82W1KIx0foSR7QwFI3ikN84TL/bx7gtW0D2crt4dKWAJSgfqyIyUq1G0o+GY/Ws5hxqQ+ozDfvWZ/d03/8LFp8+lYzDlLB5wQMhG+253rCJu+LXZSUv9r3qcyuToHErxpd/uMxdtl7pxYYvFTWGSmRw/395G+2CqsuRxDDD59JHylPQPjbPsctDnZc9nLmfNbb/hUE+cY/3Ky60aHPNHzH6bZnamgbdvW8ahnjht/UneunXZuHYaAAGfx+Sux0V3BSLwvmeU9wbUBb1ICZs/9zDXblxEOptnWXOkNlrIutU3zmflr1e2RHnR8OxrqlceWwLde01DP7chZCqMlAxUeZKRWjzJ066Ay26H9W82D2nD9Nlf7uapw/2cu6KZ7pG0c1YsqBwJjbq5nNdUHk/SHH1Ni2+pobfM55G9Xfg8ojpNWAFBG+M7pu5wdcWLqKa4Upkcv36unXufOWZ+51xD78IWOuD6obt3EPZ7ufzMGhOkHKBrzOtSxBr333K+fc/OGhEOeFncFOaFzmGz8NiS5hp6suaMBafEo3fqGztW/PimbY5ld6vCZ8/z//TZNtYtjtXefKa+/PpFLF/++bEQX3rD+qq9X000G9m9hqG3esc3X3yq2dCkpkXS64fz3ld0SFM0Tx1W/Wtf6BxmNJuvLVDZtAL6D0H9fNY2N3DTRadw558P0Rcf5R+++zRBn4dIwDu2HWqomLrRyObluA2931u+oP7Tq06zeWVt0NmxKoitjmmRgqbCTjZcQz/Ncercer7zrs185J4d3Hr1mtq281WgOXqdyt4U8ZPJyQkZeY3T59ezr2PYDCxW7XRvDdpVoW4mNq4TV/+7lI7aeWywdsmmjaH3eASLGsO0DSRJZnKcUy3hxwpd7sEIFFsD1suao/zyfRew89ggrz9nUe3ntKA0pnH/diUGqMnQv/Ve2PeAMviondVoLs9Th/t45kh/lX8ugVGNVMsZ7Txjx2Y0Dih1ADYvb+Zlq8ZfSVcHd9PZHDmLWins99bG+08C3GDsDMBFq1t56pOX8Jqzx/dlLUUs7MfnEfQaeuG8hNdvPDHnPn1+Awe7R9h9fIj6kM/cslZEid56JuD0+Q1lzTuq7lw0bAw9qOQcgKvXVWhZVwlG4xfdU9Vq6Juifs5cFOMtW5Y61jVywrwSQ//nA4pmq8nQt5wK53+goOAxvNn3fO+ZsQ9EGOM3gs52VFTVwH8FWEspLJsT4Z6btk0oaKr5/XQmX5SRPVWBWHAN/YzBeKWUlc41py5A97AK8o6ks+Pmv0txzrIm8hJ+/Mwx1i2OVR+3ReExmR79iUQ44OWpT16KdWpl3bMqIWS/a1rZWscz//NS3nX+8rENZuHZKvC58R1AsaG3bRozRtQHfWaykxWrxtF0p5QimVsfZPdnXlXbP2+6Qf1esB6AOpsuWeOlbqxy4qo70Bqgqag7HnyBP+4rNFOaKn4eXOrmbxYLYmHaB1M8dqCXXF4WbTEngpef1sraBQ3sbh+qLbPQavj8Y9fvTxVCfi+xsN8sDlczRy8EvOkHxYXhDNj2562G2GL4xFHTa45Fij36iUIIwbxYyGwOAspzrsmjL4F1V7F+SSP33rTNOenKitOugE8NWHYHXt778lMI+718+cEXgBpVSja4ZM08fvX+C9l+dIArz5p4DEzvXJ4zqpmax8ei5DnBcA393ygWNYXZfXyIb/5J1bRvr9LJqlYIIfjm9efwrv96ilsurlIOAEo4+plj6AH+37u38E/37mRBLMTp1WrcWHH6VSd2IJatRb1FwVOTbLEGLCgx9D++adu4zhOwBCLDfk/tRl6jZHf40cvVYvno/h76EqO1qZQqYO3ChvLm9eNEpeByTcqnSYJr6P9GsagxzIO7O7lwVQuP7u/hn69ac8LOvaQ5woMfvqi2F89A6kbjzEUxfv2BC6d6GEXweIRZwnfMhrQCSmWj4/HmAQKW8ZyosQH84B+2nFBqc6Kwo5XApW5cTAEWNYYZzeb57l+OEA14a6NZJgMzlLqZznjsYxfXLs+sAU0lOvfxJuxZqYsTaejHpHk/CagL2JvVqSp/AK6h/5uFNb1+vLK0EwKrRz9DVDfTHeMtFVEJOqFr28o5lXvO1gCrRz8RmmW6o1RC6fcKMjnJCQqDjQuuof8bhbUuS81dqiYDRdUcx67kcDH5eNO5S9lxdIDPX7tu3MoWKM5AncV2HsDMiwCl5DnQNVJW7vlkYnrteVycNFgNfVWt+8nCNOJZXRQwPxbirhs2T8jIQ7FH/9YtyyY6rGmNu9+z1SwTsdyQbJa2ZDyZmJChF0K8QQjxvBAiL4TYVPLcJ4QQB4QQ+4QQNYplXZwsWPuvTkWz4iJYm427mLUI+NRCvn5JY21F1mYwFjdFWG30Sl41T9XpmVAJjgliotTNLuBa4JvWg0KItcCbgDOAhcBDQojVUsqpW9JcFMGqUqiphO1k4sY/AlNIYLo4KdDxYf9s520MrF3YwJ8P9LB+sZIQT6VHPyFDL6XcA7ZZm68BfiSlTAOHhBAHgM3AXybyfi5OLDYsbeSvLw1UbyIx2QiduDo0LqY/ak4um+H42OWnc8WZ8835Xj6FsbDJCsYuAh63/H3MOFYGIcSNwI0AS5eOsZeniwnhS9et4yfPtlVvaO3CxQnAucub+MxrzuDajYuneignBV6PYMNSVaDu0Y++onojmUlEVUMvhHgIsFuKPimlvG+iA5BSfgv4FsCmTZvc/ftJxKlz6/nY5eWp+C5cTAaEELx92/KpHsaUYKp3MVUNvZTy0nGctw1YYvl7sXHMhQsXLlycZEyWvPJ+4E1CiKAQYgWwCnhykt7LhQsXLlw4YKLyytcJIY4B24AHhBC/BZBSPg/cA+wGfgPc7CpuXLhw4WJqMFHVzc+An1V47nPA5yZyfhcuXLhwMXG4mbEuXLhwMcvhGnoXLly4mOVwDb0LFy5czHK4ht6FCxcuZjmEnMoiySUQQnQDR8b57y1AzwkczlRjNs1nNs0FZtd83LlMX4xlPsuklBUrxU0rQz8RCCGellJuqv7KmYHZNJ/ZNBeYXfNx5zJ9cSLn41I3Lly4cDHL4Rp6Fy5cuJjlmE2G/ltTPYATjNk0n9k0F5hd83HnMn1xwuYzazh6Fy5cuHBhj9nk0btw4cKFCxu4ht6FCxcuZjlmhaEXQlxuNCE/IIT4+FSPpxYIIQ4LIZ4TQmwXQjxtHGsWQjwohNhv/G4yjgshxFeN+e0UQmyc2tGDEOJOIUSXEGKX5diYxy+EeIfx+v1CiHdMo7l8WgjRZlyf7UKIKy3P2Ta+nw73oRBiiRDi90KI3UKI54UQHzCOz7hr4zCXmXptQkKIJ4UQO4z5/ItxfIUQ4gljbHcLIQLG8aDx9wHj+eWWc9nOsyKklDP6B/ACB4GVQADYAayd6nHVMO7DQEvJsS8CHzcefxz4V+PxlcCvAQFsBZ6YBuN/GbAR2DXe8QPNwIvG7ybjcdM0mcungX+0ee1a4x4LAiuMe887Xe5DYAGw0XhcD7xgjHnGXRuHuczUayOAOuOxH3jC+MzvAd5kHP8G8D+Mx+8FvmE8fhNwt9M8nd57Nnj0m4EDUsoXpZSjwI9QzclnIl4DfMd4/B3gtZbj35UKjwONQogFUzFADUEe/LcAAALcSURBVCnln4C+ksNjHf+rgAellH1Syn7gQeDyyR99MSrMpRLMxvdSykOAbnw/Le5DKWW7lPJZ4/EwsAfVr3nGXRuHuVTCdL82Uko5YvzpN34kcDFwr3G89Nroa3YvcIkQQlB5nhUxGwz9IuCo5e+KjcinGSTwOyHEM0I1SAeYJ6VsNx53APOMxzNljmMd/3Sf1y0GnXGnpjqYQXMxtvobUJ7jjL42JXOBGXpthBBeIcR2oAu1eB4EBqSUWZuxmeM2nh8E5jCO+cwGQz9TcYGUciNwBXCzEOJl1iel2qPNWO3rTB8/8HXgFOBsoB348tQOZ2wQQtQBPwE+KKUcsj43066NzVxm7LWRUuaklGej+mhvBk4/Ge87Gwz9jGxELqVsM353obp0bQY6NSVj/O4yXj5T5jjW8U/beUkpO40vZR74NoWt8bSfixDCjzKM35dS/tQ4PCOvjd1cZvK10ZBSDgC/R7VhbRRC6G5/1rGZ4zaejwG9jGM+s8HQPwWsMiLXAVTQ4v4pHpMjhBBRIUS9fgxcBuxCjVurG94B3Gc8vh94u6GQ2AoMWrbh0wljHf9vgcuEEE3G9vsy49iUoyQG8jrU9YHKje+nxX1ocLj/CeyRUt5heWrGXZtKc5nB16ZVCNFoPA4Dr0TFHX4PXGe8rPTa6Gt2HfCIsRurNM/KONmR58n4QSkHXkDxXZ+c6vHUMN6VqKj5DuB5PWYU//YwsB94CGiWhWj9vxvzew7YNA3m8EPUtjmD4gjfPZ7xA+9CBZMOADdMo7l8zxjrTuOLtcDy+k8ac9kHXDGd7kPgAhQtsxPYbvxcOROvjcNcZuq1WQf81Rj3LuA24/hKlKE+APwYCBrHQ8bfB4znV1abZ6UftwSCCxcuXMxyzAbqxoULFy5cOMA19C5cuHAxy+EaehcuXLiY5XANvQsXLlzMcriG3oULFy5mOVxD78KFCxezHK6hd+HChYtZjv8PFoL7lGZnyjsAAAAASUVORK5CYII=\n", 120 | "text/plain": [ 121 | "
" 122 | ] 123 | }, 124 | "metadata": { 125 | "needs_background": "light" 126 | } 127 | } 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "source": [ 133 | "# pre processing for acceleration signal\n", 134 | "# filter\n", 135 | "Sacrum_V_f = buttfilt(Sacrum_V, 512, 20, 4, axis=0)\n", 136 | "Sacrum_AP_f = buttfilt(Sacrum_AP, 512, 20, 4, axis=0)\n", 137 | "\n", 138 | "# set negative sacrum vertical acceleration to 0\n", 139 | "Sacrum_V_f[Sacrum_V_f < 0] = 0\n", 140 | "\n", 141 | "# load scaler for subject info and signals\n", 142 | "sub_scaler = load(open('/content/gdrive/My Drive/Recurrent_GRF_Prediction-main/LSTM_scaler.pkl', 'rb'))\n", 143 | "V_accel_max = load(open('/content/gdrive/My Drive/Recurrent_GRF_Prediction-main/V_accel_max.pkl', 'rb'))\n", 144 | "AP_accel_max = load(open('/content/gdrive/My Drive/Recurrent_GRF_Prediction-main/AP_accel_max.pkl', 'rb'))\n", 145 | "\n", 146 | "\n", 147 | "# Split trial into 2 parts. Window_data_centered() expects 2D array\n", 148 | "X_V = np.vstack((Sacrum_V_f[1000:1500], Sacrum_V_f[1500:2000])) # each trial is a row\n", 149 | "X_AP = np.vstack((Sacrum_AP_f[1000:1500], Sacrum_AP_f[1500:2000])) # each trial is a row\n", 150 | "\n", 151 | "# Insert your subject and condition info here (2 trials in this example):\n", 152 | "sub_info = {'Height': [175, 175], 'Mass': [60,60], 'Speed': [3.0, 3.0], 'Slope': [0, 0]}\n", 153 | "sub_info = pd.DataFrame(data=sub_info)\n", 154 | "sub_info_scaled = sub_scaler.transform(sub_info)\n", 155 | "\n", 156 | "# break signal into 6-frame windows for LSTM\n", 157 | "window_size = 6\n", 158 | "X_V = window_data_centered(X_V, window_size, verbose = False)\n", 159 | "X_AP = window_data_centered(X_AP, window_size, verbose = False)\n", 160 | "\n", 161 | "# Generate features\n", 162 | "feats_V = signal_features(X_V, 512)\n", 163 | "feats_AP = signal_features(X_AP, 512)\n", 164 | "\n", 165 | "# scale input features based on model training data\n", 166 | "def max_scale_3d(feats, train_max):\n", 167 | " feats_scaled = feats / train_max\n", 168 | " print('max used to normalize: ',train_max)\n", 169 | " return feats_scaled\n", 170 | "\n", 171 | "feats_V_scaled = max_scale_3d(feats_V, V_accel_max)\n", 172 | "feats_AP_scaled = max_scale_3d(feats_AP, AP_accel_max) \n", 173 | "\n", 174 | "# join AP & V accel signal features together\n", 175 | "signal_feats = np.concatenate((feats_V_scaled, feats_AP_scaled), axis = 2)\n", 176 | "print('Shape of signal features: ', signal_feats.shape)\n", 177 | "\n", 178 | "# create 3d array of scaled subject/condition info features (height, mass, speed, slope) that matches shape of signal features\n", 179 | "sub_cond_feats = np.ones((2, 500, 4))*sub_info_scaled[0,:]\n", 180 | "print('Shape of subject/condition features: ', sub_cond_feats.shape)\n", 181 | "\n", 182 | "#concatenate subject and signal features \n", 183 | "input_features = np.concatenate((signal_feats, sub_cond_feats), axis = 2)\n", 184 | "print('Input feature shape: ', input_features.shape)" 185 | ], 186 | "metadata": { 187 | "colab": { 188 | "base_uri": "https://localhost:8080/" 189 | }, 190 | "id": "ph9MCFv44L9Y", 191 | "outputId": "f53b3390-f675-481e-9c9b-d14f95149c7f" 192 | }, 193 | "execution_count": 5, 194 | "outputs": [ 195 | { 196 | "output_type": "stream", 197 | "name": "stdout", 198 | "text": [ 199 | "max used to normalize: [22.61166667 11.90211559 27.11 ]\n", 200 | "max used to normalize: [ 5.42166667 12.39942931 31.06 ]\n", 201 | "Shape of signal features: (2, 500, 6)\n", 202 | "Shape of subject/condition features: (2, 500, 4)\n", 203 | "Input feature shape: (2, 500, 10)\n" 204 | ] 205 | } 206 | ] 207 | }, 208 | { 209 | "cell_type": "code", 210 | "source": [ 211 | "# NO FOOTSTRIKE DATA AVAILABLE, so use all_subs_model_wo_footstrike.h5\n", 212 | "#Download model file from https://zenodo.org/record/5213939 and save in /data/ folder.\n", 213 | "saved_model = keras.models.load_model('/content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/all_subs_model_wo_footstrike.h5')" 214 | ], 215 | "metadata": { 216 | "id": "zxg6uibsCCfL" 217 | }, 218 | "execution_count": 6, 219 | "outputs": [] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "source": [ 224 | "# Make prediction \n", 225 | "GRF = saved_model.predict(input_features)" 226 | ], 227 | "metadata": { 228 | "id": "bTiXd_L7EztL" 229 | }, 230 | "execution_count": 7, 231 | "outputs": [] 232 | }, 233 | { 234 | "cell_type": "code", 235 | "source": [ 236 | "# Plot prediction for 1st trial\n", 237 | "plt.plot(np.squeeze(GRF[0,:]), label='vGRF [Bodyweight]')\n", 238 | "plt.plot(Sacrum_V_f[1000:1500]/9.81, label='Vertical Sacrum Accel [g]')\n", 239 | "plt.legend(bbox_to_anchor = (0, 1.02, 1, 0.2), loc = 'lower left', mode='expand', ncol=2)\n", 240 | "plt.xlabel('Time [seconds]')\n" 241 | ], 242 | "metadata": { 243 | "colab": { 244 | "base_uri": "https://localhost:8080/", 245 | "height": 324 246 | }, 247 | "id": "_iCt4B2sfzyq", 248 | "outputId": "5ba03059-c9db-4ab8-f7d7-c3db42e63b81" 249 | }, 250 | "execution_count": 8, 251 | "outputs": [ 252 | { 253 | "output_type": "execute_result", 254 | "data": { 255 | "text/plain": [ 256 | "Text(0.5, 0, 'Time [seconds]')" 257 | ] 258 | }, 259 | "metadata": {}, 260 | "execution_count": 8 261 | }, 262 | { 263 | "output_type": "display_data", 264 | "data": { 265 | "image/png": "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R7Zs2RJ4/fXXd2VnZ1u2bNlysqSkpNjf319eL5mEsLCwkdzc3P5t27YZAeCll14yrVu3rqulpUX12GOPRezevbusuLj4xPz58y2PPPJIGHdcUFCQrbi4+MRtt93WOdnfurGxUXXHHXfEb9++vbK0tLR4x44dlQCQm5s7uG/fvpITJ04U//73v2/4zW9+Ez3VGG+++eb2v//97+F5eXnpd911V+SxY8dGHwCvvvpqdVFR0YnDhw8Xb968Oay5uVk52ecCQHl5uXb37t2l7777btVUnzkwMKA466yzeisqKor8/PxGHnzwwaivv/667M0336x45JFHTpMzAWDLli2B69ev71yzZk1fVVWVtq6uTgUAv/3tbyMMBsNIWVlZcVlZWfFPfvIT82Rj5HM/TMWTTz4ZEhAQMFJZWVn02GOPNRQXF/vxPVYIbhW2OJb7th2JKWs2O/UJlhqutzx5We6kcsGyZcsGOjo6VNXV1eqmpiaV0WgcSU5OPm0OeM455yRVV1drExISBj/55JNKAHj33XcDU1NT/auqqrSPP/54rU6nG72BbrnllpaHH364RchYH3300frrr7++q6enR7FixYrUTz/91M/f398eHR1tzcnJsQLAdddd1/H000+Hnn322ebo6GjrvHnzrABw1VVXdTz33HMhAHDrrbe2X3jhhckPPfRQ6wsvvBB83XXXtQPA0qVLzZ9//rm+qqpKc9999zU9//zzIbt37+7Lzc3tB4Bdu3YZPv7444BNmzaFA4DVaiUVFRU/kn1++OEH/x07dlQAwGWXXdZrMBhGuPeioqKsS5cuHQCA/Px8S3V19ZTenluz4/YYtBY715sKzbTg4qenlK4uv/zyzq1btwZeffXV3du3bzf961//qt61a5dfZWWltrCwMB0AhoeHyYIFC/q4YzZu3Ng13Ufv2rXLr7Cw0Jyenj4EsIcHAHR2diqvuOKKhOrqai0hhA4PD085g1q6dOlAVVXVsR07dhg+/fRTw9KlSzO++uqrkvnz5w8+8cQTYe+//34AADQ3N6uLioq0LS0tqok+FwDWrFnTzecBr1ar6WWXXdYLAFlZWQMajcau0WhoYWHhQENDw4Sy5Pbt24O2b99eoVQqsXbt2q6XX3458IEHHmjbvXu34fXXXz/J7RcSEjLy2muvGScaI5/7YSq+/fZb/7vvvrsVYLP71NRU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\n", 266 | "text/plain": [ 267 | "
" 268 | ] 269 | }, 270 | "metadata": { 271 | "needs_background": "light" 272 | } 273 | } 274 | ] 275 | } 276 | ] 277 | } -------------------------------------------------------------------------------- /LSTM_Example.ipynb: -------------------------------------------------------------------------------- 1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"LSTM_Example.ipynb","provenance":[],"collapsed_sections":[]},"kernelspec":{"name":"python3","display_name":"Python 3"},"accelerator":"GPU"},"cells":[{"cell_type":"markdown","metadata":{"id":"BZrg_p7vXcZa"},"source":["## Load packages and functions"]},{"cell_type":"code","metadata":{"id":"GBF-IYr4h7VG","executionInfo":{"status":"ok","timestamp":1641319957206,"user_tz":480,"elapsed":6493,"user":{"displayName":"Ryan Alcantara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiGvdgh0URM4PNeT3MUDpX4MovyDEXk5cA0b2z-d_Y=s64","userId":"01174355928364926683"}}},"source":["\n","import matplotlib.pyplot as plt\n","import numpy as np\n","np.random.seed(541)\n","import pandas as pd\n","from sklearn.preprocessing import MinMaxScaler\n","from tensorflow import keras, random\n","random.set_seed(541)\n","import numpy as np\n","import sys\n","import os\n"],"execution_count":1,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"12fTjeMWX80S"},"source":["## User Inputs\n","Mount Google Drive, define path to repository, and import functions\n"]},{"cell_type":"code","metadata":{"id":"371yqPsVX-uQ","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1641320013106,"user_tz":480,"elapsed":12806,"user":{"displayName":"Ryan Alcantara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiGvdgh0URM4PNeT3MUDpX4MovyDEXk5cA0b2z-d_Y=s64","userId":"01174355928364926683"}},"outputId":"db564bf1-c2cf-4643-87a7-750b9836cbe7"},"source":["# Mounting Google Drive is faster than uploading files. Move repository into Google Drive and update paths\n","from google.colab import drive\n","drive.mount('/content/gdrive')\n","sys.path.append('/content/gdrive/My Drive/Recurrent_GRF_Prediction-main/') # or '/content/gdrive/My Drive/PATH/TO/REPOSITORY/'\n","directory = '/content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/'\n","# Import functions from pre_processing.py\n","from pre_processing import *\n","# Data directory\n","directory = '/content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/' # or '/content/gdrive/My Drive/PATH/TO/REPOSITORY/'"],"execution_count":3,"outputs":[{"output_type":"stream","name":"stdout","text":["Mounted at /content/gdrive\n"]}]},{"cell_type":"markdown","metadata":{"id":"PZh5qk0CX3Ls"},"source":["## Load Data"]},{"cell_type":"code","metadata":{"id":"AKy4ut4011AK","executionInfo":{"status":"ok","timestamp":1641320018224,"user_tz":480,"elapsed":1818,"user":{"displayName":"Ryan Alcantara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiGvdgh0URM4PNeT3MUDpX4MovyDEXk5cA0b2z-d_Y=s64","userId":"01174355928364926683"}}},"source":["fs = 500 # Sampling Frequency\n","\n","# Accelerometer Data\n","X = pd.read_csv(os.path.join(directory, 'Accelerometer_one_sub.csv'), header=None).values\n","# Subject and Condition Data\n","Sub_Info = pd.read_csv(os.path.join(directory, 'Sub_Info_one_sub.csv'))\n","# Normal GRF data\n","y = pd.read_csv(os.path.join(directory, 'GRF_one_sub.csv'), header=None).values\n","\n","## Train/Test Split ----\n","train_X = X[(Sub_Info['Slope'] != -5) | (Sub_Info['Slope'] != 5),:]\n","train_y = y[(Sub_Info['Slope'] != -5) | (Sub_Info['Slope'] != 5),:]\n","train_Sub_Info = Sub_Info.loc[(Sub_Info['Slope'] != -5) | (Sub_Info['Slope'] != 5),:]\n","train_Sub_Info.reset_index(drop=True, inplace=True)\n","\n","test_X = X[(Sub_Info['Slope'] == -5) | (Sub_Info['Slope'] == 5),:]\n","test_y = y[(Sub_Info['Slope'] == -5) | (Sub_Info['Slope'] == 5),:]\n","test_Sub_Info = Sub_Info.loc[(Sub_Info['Slope'] == -5) | (Sub_Info['Slope'] == 5),:]\n","test_Sub_Info.reset_index(drop=True, inplace=True)\n"],"execution_count":4,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"PJp05JJoYjLO"},"source":["## Scale Features "]},{"cell_type":"code","metadata":{"id":"nUT285l7YnQH","executionInfo":{"status":"ok","timestamp":1641320020513,"user_tz":480,"elapsed":118,"user":{"displayName":"Ryan Alcantara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiGvdgh0URM4PNeT3MUDpX4MovyDEXk5cA0b2z-d_Y=s64","userId":"01174355928364926683"}}},"source":["l = 2480 # Accelerometer data is concatenated\n","train_X_V = train_X[:,0:l]\n","train_X_AP = train_X[:,l:l*2]\n","test_X_V = test_X[:,0:l]\n","test_X_AP = test_X[:,l:l*2]\n","\n","# Sub_Info\n","train_Sub_Feats = train_Sub_Info[['Height', 'Mass', 'Speed', 'Slope']]\n","test_Sub_Feats = test_Sub_Info[['Height', 'Mass', 'Speed', 'Slope']]\n","scaler_sub = MinMaxScaler()\n","train_Sub_Feats = pd.DataFrame(scaler_sub.fit_transform(train_Sub_Feats))\n","test_Sub_Feats = pd.DataFrame(scaler_sub.transform(test_Sub_Feats))\n","train_Sub_Feats.columns = ['Height', 'Mass', 'Speed', 'Slope']\n","test_Sub_Feats.columns = ['Height', 'Mass', 'Speed', 'Slope']\n","\n","#Don't include foot strike percentages in min/max scaler because they're \n","#already scaled to each other. min/max scaler is per feature (column).\n","train_Sub_Feats[['RFS', 'MFS', 'FFS']] = train_Sub_Info[['RFS', 'MFS', 'FFS']].copy()/100\n","test_Sub_Feats[['RFS', 'MFS', 'FFS']] = test_Sub_Info[['RFS', 'MFS', 'FFS']].copy()/100\n","\n","# Copy over Subject ID\n","train_Sub_Feats['Sub'] = train_Sub_Info['Sub']\n","test_Sub_Feats['Sub'] = train_Sub_Info['Sub'][0]\n","sub_num = 2"],"execution_count":5,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"7tgjoPOiYsHG"},"source":["## Window accelerometer data"]},{"cell_type":"code","metadata":{"id":"UfaLfETuYrVw","executionInfo":{"status":"ok","timestamp":1641320022735,"user_tz":480,"elapsed":112,"user":{"displayName":"Ryan Alcantara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiGvdgh0URM4PNeT3MUDpX4MovyDEXk5cA0b2z-d_Y=s64","userId":"01174355928364926683"}}},"source":["\n","# N-frame windows centered on prediction frame. Pad w/ nearest value\n","window_size = 6 # 6 frames @ 500 Hz == 12 ms\n","\n","train_X_V = window_data_centered(train_X_V, window_size, verbose=False)\n","train_X_AP = window_data_centered(train_X_AP, window_size, verbose=False)\n","train_y = np.reshape(train_y, (train_y.shape[0],train_y.shape[1],1))\n","\n","test_X_V = window_data_centered(test_X_V, window_size, verbose=False)\n","test_X_AP = window_data_centered(test_X_AP, window_size, verbose=False)\n","test_y = np.reshape(test_y, (test_y.shape[0],test_y.shape[1],1))"],"execution_count":6,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"TNw8taZdY0p8"},"source":["## Generate Features"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"7gC7Gw8o78hW","executionInfo":{"status":"ok","timestamp":1641320024458,"user_tz":480,"elapsed":282,"user":{"displayName":"Ryan Alcantara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiGvdgh0URM4PNeT3MUDpX4MovyDEXk5cA0b2z-d_Y=s64","userId":"01174355928364926683"}},"outputId":"68ee8039-0d02-4cef-9824-21465c92d930"},"source":["# Calculates mean, sd, range in each window of accelerometer data. generate_features() can also reshape sub_info to match dimensions.\n","train_feats_V = generate_features(train_X_V, fs, train_Sub_Feats, -sub_num, include_sub_info_feats=False) # Just signal feats\n","train_feats_AP = generate_features(train_X_AP, fs, train_Sub_Feats, -sub_num, include_sub_info_feats=True) # Signal and Sub_Info feats\n","sub_info_feats = train_feats_AP[-7:-1].copy()\n","test_feats_V = generate_features(test_X_V, fs, test_Sub_Feats, -sub_num, include_sub_info_feats=False) # Just signal feats\n","test_feats_AP = generate_features(test_X_AP, fs, test_Sub_Feats, -sub_num, include_sub_info_feats=True) # Signal and Sub_Info feats\n","\n","train_sub_info_feats = train_feats_AP[:,:,-7:].copy()\n","train_feats_AP = train_feats_AP[:,:,0:3].copy()\n","\n","test_sub_info_feats = test_feats_AP[:,:,-7:].copy()\n","test_feats_AP = test_feats_AP[:,:,0:3].copy()\n","\n","# #remove footstrike features if that's not your thing\n","# train_sub_info_feats = train_sub_info_feats[:,:,0:4]\n","# test_sub_info_feats = test_sub_info_feats[:,:,0:4]\n","\n","def max_scale_3d(feats, train_max):\n"," feats_scaled = feats / train_max\n"," return feats_scaled\n","\n","train_feats_V_scaled = max_scale_3d(train_feats_V, np.max(train_feats_V, axis=(0,1)))\n","train_feats_AP_scaled = max_scale_3d(train_feats_AP, np.max(train_feats_AP, axis=(0,1)))\n","\n","test_feats_V_scaled = max_scale_3d(test_feats_V, np.max(train_feats_V, axis=(0,1)))\n","test_feats_AP_scaled = max_scale_3d(test_feats_AP, np.max(train_feats_AP, axis=(0,1)))\n","\n","train_feats = np.concatenate((train_feats_V_scaled, train_feats_AP_scaled, train_sub_info_feats), axis = 2)\n","test_feats = np.concatenate((test_feats_V_scaled, test_feats_AP_scaled, test_sub_info_feats), axis = 2)\n","\n","print('TRAINING DATA: \\nNumber of trials: %d \\nNumber of overlapping windows: %d \\nNumber of features per window: %d' % train_feats.shape)\n","print('\\nTESTING DATA: \\nNumber of trials: %d \\nNumber of overlapping windows: %d \\nNumber of features per window: %d' % test_feats.shape)"],"execution_count":7,"outputs":[{"output_type":"stream","name":"stdout","text":["TRAINING DATA: \n","Number of trials: 31 \n","Number of overlapping windows: 2480 \n","Number of features per window: 13\n","\n","TESTING DATA: \n","Number of trials: 13 \n","Number of overlapping windows: 2480 \n","Number of features per window: 13\n"]}]},{"cell_type":"markdown","metadata":{"id":"oq__Sm7fZJz3"},"source":["## Construct Model"]},{"cell_type":"code","metadata":{"id":"_nLIjkaUr9O8","executionInfo":{"status":"ok","timestamp":1641320040825,"user_tz":480,"elapsed":3543,"user":{"displayName":"Ryan Alcantara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiGvdgh0URM4PNeT3MUDpX4MovyDEXk5cA0b2z-d_Y=s64","userId":"01174355928364926683"}}},"source":["def build_model(lr=0.001, loss='mean_squared_error'):\n","\n"," #accelerometer data lstm model\n"," accel_inputs = keras.Input(shape=(None,train_feats.shape[2])) # Shape is number of features. Undefined number of windows\n"," accel_features = keras.layers.Dropout(0.2, seed=541,)(accel_inputs)\n"," accel_features = keras.layers.Bidirectional(keras.layers.LSTM(512, activation='tanh', return_sequences=True), merge_mode='ave')(accel_features)\n"," accel_features = keras.layers.Dropout(0.4, seed=541)(accel_features)\n"," accel_features = keras.layers.Dense(128, activation='relu')(accel_features)\n"," accel_features = keras.layers.Dense(384, activation='relu')(accel_features)\n"," accel_features = keras.layers.Dense(320, activation='relu')(accel_features)\n"," accel_outputs = keras.layers.Dense(1, activation='linear')(accel_features)\n","\n"," model_out = keras.Model(inputs=accel_inputs, outputs=accel_outputs, name='Accel_subcond_LSTM')\n"," # define optimizer algorithm and learning rate\n"," opt = keras.optimizers.Adam(learning_rate =lr)\n"," # compile model and define loss function\n"," model_out.compile(optimizer=opt, loss=loss)\n","\n"," return model_out\n","\n","# Build Model\n","model = build_model()\n","\n","# Plot Model\n","# keras.utils.plot_model(model, show_shapes=True, show_layer_names=False)\n"],"execution_count":8,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"ThGBJo0ZZN_D"},"source":["## Train Model\n","Make sure you're using the GPU runtime type in Colab (Runtime > Change runtime type > GPU)"]},{"cell_type":"code","metadata":{"id":"0cn2-olBEk08","colab":{"base_uri":"https://localhost:8080/","height":1000},"executionInfo":{"status":"ok","timestamp":1641320579157,"user_tz":480,"elapsed":322539,"user":{"displayName":"Ryan Alcantara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiGvdgh0URM4PNeT3MUDpX4MovyDEXk5cA0b2z-d_Y=s64","userId":"01174355928364926683"}},"outputId":"7618a1b0-2254-4011-abe0-eb18d65d539f"},"source":["# Define Early Stopping and Checkpoint Callbacks\n","model_filename = os.path.join(directory, 'Model.h5')\n","\n","# early stopping\n","es = keras.callbacks.EarlyStopping(monitor='val_loss', \n"," mode='min', \n"," verbose=0, \n"," patience=25, # low for example \n"," min_delta=0.001, \n"," restore_best_weights=True\n"," )\n","\n","# model checkpoint\n","mc = keras.callbacks.ModelCheckpoint(\n"," model_filename,\n"," monitor='val_loss', \n"," mode='min', \n"," verbose=1, \n"," save_best_only=True, \n"," save_weights_only=False\n"," )\n","\n","# Fit Model\n","history_accel = model.fit(\n"," train_feats, \n"," train_y, \n"," epochs=100, # low for example\n"," validation_data=(test_feats, test_y), \n"," verbose=1,\n"," batch_size=32, \n"," callbacks=[es, mc]\n"," )\n","\n","# Plot Train/Validation Loss across epochs\n","plt.plot(history_accel.history['loss'], label = 'mse_train')\n","plt.plot(history_accel.history['val_loss'], label = 'mse_validation')\n","plt.legend()\n","plt.show()"],"execution_count":11,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1/100\n","1/1 [==============================] - ETA: 0s - loss: 0.8701\n","Epoch 00001: val_loss improved from inf to 0.87679, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 4s 4s/step - loss: 0.8701 - val_loss: 0.8768\n","Epoch 2/100\n","1/1 [==============================] - ETA: 0s - loss: 0.8569\n","Epoch 00002: val_loss improved from 0.87679 to 0.82845, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.8569 - val_loss: 0.8284\n","Epoch 3/100\n","1/1 [==============================] - ETA: 0s - loss: 0.8108\n","Epoch 00003: val_loss improved from 0.82845 to 0.75060, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.8108 - val_loss: 0.7506\n","Epoch 4/100\n","1/1 [==============================] - ETA: 0s - loss: 0.7371\n","Epoch 00004: val_loss improved from 0.75060 to 0.67830, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.7371 - val_loss: 0.6783\n","Epoch 5/100\n","1/1 [==============================] - ETA: 0s - loss: 0.6751\n","Epoch 00005: val_loss did not improve from 0.67830\n","1/1 [==============================] - 2s 2s/step - loss: 0.6751 - val_loss: 0.7121\n","Epoch 6/100\n","1/1 [==============================] - ETA: 0s - loss: 0.7043\n","Epoch 00006: val_loss did not improve from 0.67830\n","1/1 [==============================] - 3s 3s/step - loss: 0.7043 - val_loss: 0.7137\n","Epoch 7/100\n","1/1 [==============================] - ETA: 0s - loss: 0.7096\n","Epoch 00007: val_loss improved from 0.67830 to 0.63056, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.7096 - val_loss: 0.6306\n","Epoch 8/100\n","1/1 [==============================] - ETA: 0s - loss: 0.6294\n","Epoch 00008: val_loss improved from 0.63056 to 0.59665, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.6294 - val_loss: 0.5966\n","Epoch 9/100\n","1/1 [==============================] - ETA: 0s - loss: 0.5958\n","Epoch 00009: val_loss improved from 0.59665 to 0.59193, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.5958 - val_loss: 0.5919\n","Epoch 10/100\n","1/1 [==============================] - ETA: 0s - loss: 0.5839\n","Epoch 00010: val_loss improved from 0.59193 to 0.58144, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.5839 - val_loss: 0.5814\n","Epoch 11/100\n","1/1 [==============================] - ETA: 0s - loss: 0.5730\n","Epoch 00011: val_loss improved from 0.58144 to 0.54089, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.5730 - val_loss: 0.5409\n","Epoch 12/100\n","1/1 [==============================] - ETA: 0s - loss: 0.5340\n","Epoch 00012: val_loss improved from 0.54089 to 0.43864, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.5340 - val_loss: 0.4386\n","Epoch 13/100\n","1/1 [==============================] - ETA: 0s - loss: 0.4403\n","Epoch 00013: val_loss did not improve from 0.43864\n","1/1 [==============================] - 3s 3s/step - loss: 0.4403 - val_loss: 0.9307\n","Epoch 14/100\n","1/1 [==============================] - ETA: 0s - loss: 0.9899\n","Epoch 00014: val_loss did not improve from 0.43864\n","1/1 [==============================] - 3s 3s/step - loss: 0.9899 - val_loss: 0.4753\n","Epoch 15/100\n","1/1 [==============================] - ETA: 0s - loss: 0.4626\n","Epoch 00015: val_loss did not improve from 0.43864\n","1/1 [==============================] - 3s 3s/step - loss: 0.4626 - val_loss: 0.5768\n","Epoch 16/100\n","1/1 [==============================] - ETA: 0s - loss: 0.5532\n","Epoch 00016: val_loss did not improve from 0.43864\n","1/1 [==============================] - 2s 2s/step - loss: 0.5532 - val_loss: 0.5917\n","Epoch 17/100\n","1/1 [==============================] - ETA: 0s - loss: 0.5675\n","Epoch 00017: val_loss did not improve from 0.43864\n","1/1 [==============================] - 3s 3s/step - loss: 0.5675 - val_loss: 0.5442\n","Epoch 18/100\n","1/1 [==============================] - ETA: 0s - loss: 0.5287\n","Epoch 00018: val_loss did not improve from 0.43864\n","1/1 [==============================] - 3s 3s/step - loss: 0.5287 - val_loss: 0.4455\n","Epoch 19/100\n","1/1 [==============================] - ETA: 0s - loss: 0.4510\n","Epoch 00019: val_loss improved from 0.43864 to 0.40471, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.4510 - val_loss: 0.4047\n","Epoch 20/100\n","1/1 [==============================] - ETA: 0s - loss: 0.4468\n","Epoch 00020: val_loss improved from 0.40471 to 0.37465, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.4468 - val_loss: 0.3747\n","Epoch 21/100\n","1/1 [==============================] - ETA: 0s - loss: 0.4075\n","Epoch 00021: val_loss improved from 0.37465 to 0.32763, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.4075 - val_loss: 0.3276\n","Epoch 22/100\n","1/1 [==============================] - ETA: 0s - loss: 0.3391\n","Epoch 00022: val_loss did not improve from 0.32763\n","1/1 [==============================] - 2s 2s/step - loss: 0.3391 - val_loss: 0.3322\n","Epoch 23/100\n","1/1 [==============================] - ETA: 0s - loss: 0.3358\n","Epoch 00023: val_loss improved from 0.32763 to 0.29082, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.3358 - val_loss: 0.2908\n","Epoch 24/100\n","1/1 [==============================] - ETA: 0s - loss: 0.2999\n","Epoch 00024: val_loss improved from 0.29082 to 0.19393, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.2999 - val_loss: 0.1939\n","Epoch 25/100\n","1/1 [==============================] - ETA: 0s - loss: 0.2183\n","Epoch 00025: val_loss did not improve from 0.19393\n","1/1 [==============================] - 3s 3s/step - loss: 0.2183 - val_loss: 0.4725\n","Epoch 26/100\n","1/1 [==============================] - ETA: 0s - loss: 0.5013\n","Epoch 00026: val_loss did not improve from 0.19393\n","1/1 [==============================] - 2s 2s/step - loss: 0.5013 - val_loss: 0.3533\n","Epoch 27/100\n","1/1 [==============================] - ETA: 0s - loss: 0.3524\n","Epoch 00027: val_loss did not improve from 0.19393\n","1/1 [==============================] - 3s 3s/step - loss: 0.3524 - val_loss: 0.5258\n","Epoch 28/100\n","1/1 [==============================] - ETA: 0s - loss: 0.4990\n","Epoch 00028: val_loss did not improve from 0.19393\n","1/1 [==============================] - 3s 3s/step - loss: 0.4990 - val_loss: 0.5414\n","Epoch 29/100\n","1/1 [==============================] - ETA: 0s - loss: 0.5089\n","Epoch 00029: val_loss did not improve from 0.19393\n","1/1 [==============================] - 2s 2s/step - loss: 0.5089 - val_loss: 0.4434\n","Epoch 30/100\n","1/1 [==============================] - ETA: 0s - loss: 0.4210\n","Epoch 00030: val_loss did not improve from 0.19393\n","1/1 [==============================] - 3s 3s/step - loss: 0.4210 - val_loss: 0.2944\n","Epoch 31/100\n","1/1 [==============================] - ETA: 0s - loss: 0.3223\n","Epoch 00031: val_loss did not improve from 0.19393\n","1/1 [==============================] - 3s 3s/step - loss: 0.3223 - val_loss: 0.3272\n","Epoch 32/100\n","1/1 [==============================] - ETA: 0s - loss: 0.4339\n","Epoch 00032: val_loss did not improve from 0.19393\n","1/1 [==============================] - 2s 2s/step - loss: 0.4339 - val_loss: 0.2391\n","Epoch 33/100\n","1/1 [==============================] - ETA: 0s - loss: 0.2720\n","Epoch 00033: val_loss did not improve from 0.19393\n","1/1 [==============================] - 3s 3s/step - loss: 0.2720 - val_loss: 0.2240\n","Epoch 34/100\n","1/1 [==============================] - ETA: 0s - loss: 0.2364\n","Epoch 00034: val_loss did not improve from 0.19393\n","1/1 [==============================] - 3s 3s/step - loss: 0.2364 - val_loss: 0.2212\n","Epoch 35/100\n","1/1 [==============================] - ETA: 0s - loss: 0.2383\n","Epoch 00035: val_loss did not improve from 0.19393\n","1/1 [==============================] - 3s 3s/step - loss: 0.2383 - val_loss: 0.2093\n","Epoch 36/100\n","1/1 [==============================] - ETA: 0s - loss: 0.2323\n","Epoch 00036: val_loss improved from 0.19393 to 0.18982, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.2323 - val_loss: 0.1898\n","Epoch 37/100\n","1/1 [==============================] - ETA: 0s - loss: 0.2184\n","Epoch 00037: val_loss improved from 0.18982 to 0.16987, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.2184 - val_loss: 0.1699\n","Epoch 38/100\n","1/1 [==============================] - ETA: 0s - loss: 0.2014\n","Epoch 00038: val_loss improved from 0.16987 to 0.15399, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.2014 - val_loss: 0.1540\n","Epoch 39/100\n","1/1 [==============================] - ETA: 0s - loss: 0.1921\n","Epoch 00039: val_loss improved from 0.15399 to 0.13887, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.1921 - val_loss: 0.1389\n","Epoch 40/100\n","1/1 [==============================] - ETA: 0s - loss: 0.1746\n","Epoch 00040: val_loss improved from 0.13887 to 0.11846, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.1746 - val_loss: 0.1185\n","Epoch 41/100\n","1/1 [==============================] - ETA: 0s - loss: 0.1606\n","Epoch 00041: val_loss improved from 0.11846 to 0.10000, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.1606 - val_loss: 0.1000\n","Epoch 42/100\n","1/1 [==============================] - ETA: 0s - loss: 0.1459\n","Epoch 00042: val_loss improved from 0.10000 to 0.09653, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.1459 - val_loss: 0.0965\n","Epoch 43/100\n","1/1 [==============================] - ETA: 0s - loss: 0.1326\n","Epoch 00043: val_loss did not improve from 0.09653\n","1/1 [==============================] - 2s 2s/step - loss: 0.1326 - val_loss: 0.1054\n","Epoch 44/100\n","1/1 [==============================] - ETA: 0s - loss: 0.1384\n","Epoch 00044: val_loss did not improve from 0.09653\n","1/1 [==============================] - 3s 3s/step - loss: 0.1384 - val_loss: 0.1110\n","Epoch 45/100\n","1/1 [==============================] - ETA: 0s - loss: 0.1397\n","Epoch 00045: val_loss did not improve from 0.09653\n","1/1 [==============================] - 3s 3s/step - loss: 0.1397 - val_loss: 0.1051\n","Epoch 46/100\n","1/1 [==============================] - ETA: 0s - loss: 0.1383\n","Epoch 00046: val_loss did not improve from 0.09653\n","1/1 [==============================] - 3s 3s/step - loss: 0.1383 - val_loss: 0.0966\n","Epoch 47/100\n","1/1 [==============================] - ETA: 0s - loss: 0.1388\n","Epoch 00047: val_loss improved from 0.09653 to 0.08971, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.1388 - val_loss: 0.0897\n","Epoch 48/100\n","1/1 [==============================] - ETA: 0s - loss: 0.1364\n","Epoch 00048: val_loss improved from 0.08971 to 0.08350, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.1364 - val_loss: 0.0835\n","Epoch 49/100\n","1/1 [==============================] - ETA: 0s - loss: 0.1202\n","Epoch 00049: val_loss improved from 0.08350 to 0.07772, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.1202 - val_loss: 0.0777\n","Epoch 50/100\n","1/1 [==============================] - ETA: 0s - loss: 0.1110\n","Epoch 00050: val_loss improved from 0.07772 to 0.06849, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.1110 - val_loss: 0.0685\n","Epoch 51/100\n","1/1 [==============================] - ETA: 0s - loss: 0.1008\n","Epoch 00051: val_loss improved from 0.06849 to 0.05752, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.1008 - val_loss: 0.0575\n","Epoch 52/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0923\n","Epoch 00052: val_loss improved from 0.05752 to 0.05125, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0923 - val_loss: 0.0513\n","Epoch 53/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0822\n","Epoch 00053: val_loss did not improve from 0.05125\n","1/1 [==============================] - 2s 2s/step - loss: 0.0822 - val_loss: 0.0514\n","Epoch 54/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0798\n","Epoch 00054: val_loss did not improve from 0.05125\n","1/1 [==============================] - 3s 3s/step - loss: 0.0798 - val_loss: 0.0525\n","Epoch 55/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0795\n","Epoch 00055: val_loss did not improve from 0.05125\n","1/1 [==============================] - 3s 3s/step - loss: 0.0795 - val_loss: 0.0514\n","Epoch 56/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0748\n","Epoch 00056: val_loss improved from 0.05125 to 0.05019, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0748 - val_loss: 0.0502\n","Epoch 57/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0738\n","Epoch 00057: val_loss improved from 0.05019 to 0.04883, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0738 - val_loss: 0.0488\n","Epoch 58/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0724\n","Epoch 00058: val_loss improved from 0.04883 to 0.04612, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0724 - val_loss: 0.0461\n","Epoch 59/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0674\n","Epoch 00059: val_loss improved from 0.04612 to 0.04296, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0674 - val_loss: 0.0430\n","Epoch 60/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0617\n","Epoch 00060: val_loss improved from 0.04296 to 0.03937, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0617 - val_loss: 0.0394\n","Epoch 61/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0593\n","Epoch 00061: val_loss improved from 0.03937 to 0.03407, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0593 - val_loss: 0.0341\n","Epoch 62/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0554\n","Epoch 00062: val_loss improved from 0.03407 to 0.03168, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0554 - val_loss: 0.0317\n","Epoch 63/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0564\n","Epoch 00063: val_loss improved from 0.03168 to 0.03013, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0564 - val_loss: 0.0301\n","Epoch 64/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0554\n","Epoch 00064: val_loss improved from 0.03013 to 0.02954, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0554 - val_loss: 0.0295\n","Epoch 65/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0554\n","Epoch 00065: val_loss improved from 0.02954 to 0.02862, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0554 - val_loss: 0.0286\n","Epoch 66/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0550\n","Epoch 00066: val_loss did not improve from 0.02862\n","1/1 [==============================] - 2s 2s/step - loss: 0.0550 - val_loss: 0.0289\n","Epoch 67/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0534\n","Epoch 00067: val_loss improved from 0.02862 to 0.02757, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0534 - val_loss: 0.0276\n","Epoch 68/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0501\n","Epoch 00068: val_loss did not improve from 0.02757\n","1/1 [==============================] - 3s 3s/step - loss: 0.0501 - val_loss: 0.0284\n","Epoch 69/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0493\n","Epoch 00069: val_loss improved from 0.02757 to 0.02530, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0493 - val_loss: 0.0253\n","Epoch 70/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0479\n","Epoch 00070: val_loss did not improve from 0.02530\n","1/1 [==============================] - 3s 3s/step - loss: 0.0479 - val_loss: 0.0253\n","Epoch 71/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0479\n","Epoch 00071: val_loss did not improve from 0.02530\n","1/1 [==============================] - 3s 3s/step - loss: 0.0479 - val_loss: 0.0259\n","Epoch 72/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0477\n","Epoch 00072: val_loss did not improve from 0.02530\n","1/1 [==============================] - 2s 2s/step - loss: 0.0477 - val_loss: 0.0262\n","Epoch 73/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0470\n","Epoch 00073: val_loss improved from 0.02530 to 0.02512, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0470 - val_loss: 0.0251\n","Epoch 74/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0449\n","Epoch 00074: val_loss did not improve from 0.02512\n","1/1 [==============================] - 2s 2s/step - loss: 0.0449 - val_loss: 0.0264\n","Epoch 75/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0461\n","Epoch 00075: val_loss improved from 0.02512 to 0.02510, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0461 - val_loss: 0.0251\n","Epoch 76/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0447\n","Epoch 00076: val_loss improved from 0.02510 to 0.02374, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0447 - val_loss: 0.0237\n","Epoch 77/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0459\n","Epoch 00077: val_loss improved from 0.02374 to 0.02309, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0459 - val_loss: 0.0231\n","Epoch 78/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0429\n","Epoch 00078: val_loss did not improve from 0.02309\n","1/1 [==============================] - 3s 3s/step - loss: 0.0429 - val_loss: 0.0234\n","Epoch 79/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0435\n","Epoch 00079: val_loss improved from 0.02309 to 0.02282, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0435 - val_loss: 0.0228\n","Epoch 80/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0440\n","Epoch 00080: val_loss did not improve from 0.02282\n","1/1 [==============================] - 3s 3s/step - loss: 0.0440 - val_loss: 0.0232\n","Epoch 81/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0432\n","Epoch 00081: val_loss improved from 0.02282 to 0.02265, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0432 - val_loss: 0.0227\n","Epoch 82/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0428\n","Epoch 00082: val_loss improved from 0.02265 to 0.02173, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0428 - val_loss: 0.0217\n","Epoch 83/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0407\n","Epoch 00083: val_loss improved from 0.02173 to 0.02128, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0407 - val_loss: 0.0213\n","Epoch 84/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0415\n","Epoch 00084: val_loss improved from 0.02128 to 0.02053, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0415 - val_loss: 0.0205\n","Epoch 85/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0407\n","Epoch 00085: val_loss did not improve from 0.02053\n","1/1 [==============================] - 3s 3s/step - loss: 0.0407 - val_loss: 0.0209\n","Epoch 86/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0402\n","Epoch 00086: val_loss did not improve from 0.02053\n","1/1 [==============================] - 3s 3s/step - loss: 0.0402 - val_loss: 0.0206\n","Epoch 87/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0400\n","Epoch 00087: val_loss did not improve from 0.02053\n","1/1 [==============================] - 2s 2s/step - loss: 0.0400 - val_loss: 0.0207\n","Epoch 88/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0394\n","Epoch 00088: val_loss improved from 0.02053 to 0.02030, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0394 - val_loss: 0.0203\n","Epoch 89/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0379\n","Epoch 00089: val_loss did not improve from 0.02030\n","1/1 [==============================] - 2s 2s/step - loss: 0.0379 - val_loss: 0.0211\n","Epoch 90/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0388\n","Epoch 00090: val_loss did not improve from 0.02030\n","1/1 [==============================] - 2s 2s/step - loss: 0.0388 - val_loss: 0.0208\n","Epoch 91/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0382\n","Epoch 00091: val_loss did not improve from 0.02030\n","1/1 [==============================] - 3s 3s/step - loss: 0.0382 - val_loss: 0.0205\n","Epoch 92/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0391\n","Epoch 00092: val_loss improved from 0.02030 to 0.01967, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0391 - val_loss: 0.0197\n","Epoch 93/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0372\n","Epoch 00093: val_loss did not improve from 0.01967\n","1/1 [==============================] - 2s 2s/step - loss: 0.0372 - val_loss: 0.0197\n","Epoch 94/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0378\n","Epoch 00094: val_loss improved from 0.01967 to 0.01884, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0378 - val_loss: 0.0188\n","Epoch 95/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0373\n","Epoch 00095: val_loss improved from 0.01884 to 0.01880, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0373 - val_loss: 0.0188\n","Epoch 96/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0372\n","Epoch 00096: val_loss improved from 0.01880 to 0.01866, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0372 - val_loss: 0.0187\n","Epoch 97/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0366\n","Epoch 00097: val_loss improved from 0.01866 to 0.01860, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0366 - val_loss: 0.0186\n","Epoch 98/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0360\n","Epoch 00098: val_loss improved from 0.01860 to 0.01855, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0360 - val_loss: 0.0185\n","Epoch 99/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0361\n","Epoch 00099: val_loss improved from 0.01855 to 0.01842, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0361 - val_loss: 0.0184\n","Epoch 100/100\n","1/1 [==============================] - ETA: 0s - loss: 0.0357\n","Epoch 00100: val_loss improved from 0.01842 to 0.01822, saving model to /content/gdrive/My Drive/Recurrent_GRF_Prediction-main/data/Model.h5\n","1/1 [==============================] - 3s 3s/step - loss: 0.0357 - val_loss: 0.0182\n"]},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"F3pPYRbNZcqz"},"source":["## Load best model and evaluate\n","\n"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":371},"id":"zmNX1lxwVvvE","executionInfo":{"status":"ok","timestamp":1641320616894,"user_tz":480,"elapsed":6466,"user":{"displayName":"Ryan Alcantara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiGvdgh0URM4PNeT3MUDpX4MovyDEXk5cA0b2z-d_Y=s64","userId":"01174355928364926683"}},"outputId":"1ffa8e65-59d2-4f04-a70c-0eb263cd0bcb"},"source":["saved_model = keras.models.load_model(model_filename)\n","\n","test_scores = saved_model.evaluate(test_feats, test_y, verbose = 2)\n","pred_final = saved_model.predict(test_feats)\n","pred_final = np.squeeze(pred_final)\n","\n","# Plot Prediction vs Measured GRF ----\n","i = 0 # trial to plot\n","s = 500 # frame to start plot\n","e = 1000 # frame to end plot\n","fig, ax = plt.subplots(1,1, figsize=(10,5))\n","ax.plot(test_y[i,s:e], '-', label='true')\n","ax.plot(pred_final[i,s:e], 'r--', label='prediction')\n","ax.grid()\n","ax.set_title(' Speed: ' + str(test_Sub_Info['Speed'].iloc[i]) + \n"," ' Slope: ' + str(test_Sub_Info['Slope'].iloc[i])\n"," )\n","print()\n","plt.show()"],"execution_count":13,"outputs":[{"output_type":"stream","name":"stdout","text":["1/1 - 2s - loss: 0.0182 - 2s/epoch - 2s/step\n","\n"]},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"TdaZsexZZpUe"},"source":["## Additional Information about RNN"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"7-BqsqkRtrhf","executionInfo":{"status":"ok","timestamp":1641320619811,"user_tz":480,"elapsed":131,"user":{"displayName":"Ryan Alcantara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiGvdgh0URM4PNeT3MUDpX4MovyDEXk5cA0b2z-d_Y=s64","userId":"01174355928364926683"}},"outputId":"64f2a374-3b93-4166-ed6c-47bc179c6b03"},"source":["## Get Info about Saved Model ----\n","saved_model.summary()\n","# saved_model.get_config()"],"execution_count":14,"outputs":[{"output_type":"stream","name":"stdout","text":["Model: \"Accel_subcond_LSTM\"\n","_________________________________________________________________\n"," Layer (type) Output Shape Param # \n","=================================================================\n"," input_1 (InputLayer) [(None, None, 13)] 0 \n"," \n"," dropout (Dropout) (None, None, 13) 0 \n"," \n"," bidirectional (Bidirectiona (None, None, 512) 2154496 \n"," l) \n"," \n"," dropout_1 (Dropout) (None, None, 512) 0 \n"," \n"," dense (Dense) (None, None, 128) 65664 \n"," \n"," dense_1 (Dense) (None, None, 384) 49536 \n"," \n"," dense_2 (Dense) (None, None, 320) 123200 \n"," \n"," dense_3 (Dense) (None, None, 1) 321 \n"," \n","=================================================================\n","Total params: 2,393,217\n","Trainable params: 2,393,217\n","Non-trainable params: 0\n","_________________________________________________________________\n"]}]}]} --------------------------------------------------------------------------------