├── Image_classification _with _CNN+RF.ipynb ├── README.md ├── banana.jpg └── experiment.ipynb /Image_classification _with _CNN+RF.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "Using TensorFlow backend.\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "import numpy as np \n", 18 | "import pandas as pd \n", 19 | "import matplotlib.pyplot as plt\n", 20 | "from matplotlib.offsetbox import OffsetImage, AnnotationBbox\n", 21 | "%matplotlib inline\n", 22 | "import tensorflow as tf\n", 23 | "import keras\n", 24 | "import glob\n", 25 | "import cv2\n", 26 | "import pickle, datetime\n", 27 | "\n", 28 | "from keras.models import Model, Sequential\n", 29 | "from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D,GlobalAveragePooling2D\n", 30 | "from keras.layers import LSTM, Input, TimeDistributed,Convolution2D,Activation\n", 31 | "from keras.layers.convolutional import ZeroPadding2D\n", 32 | "from keras.optimizers import RMSprop, SGD\n", 33 | "from keras.layers.normalization import BatchNormalization\n", 34 | "from keras.utils import np_utils\n", 35 | "from keras import optimizers\n", 36 | "from keras.preprocessing import sequence\n", 37 | "from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img\n", 38 | "from keras.models import load_model\n", 39 | "\n", 40 | "from sklearn.preprocessing import LabelBinarizer\n", 41 | "from sklearn.ensemble import RandomForestClassifier\n", 42 | "from sklearn.metrics import accuracy_score\n", 43 | "# Import the backend\n", 44 | "from keras import backend as K\n", 45 | "K.tensorflow_backend._get_available_gpus()\n", 46 | "import os" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": 2, 52 | "metadata": {}, 53 | "outputs": [ 54 | { 55 | "name": "stdout", 56 | "output_type": "stream", 57 | "text": [ 58 | "['Trainexample', 'Trainexample1', 'Validation-Example', 'Validation-Example1']\n" 59 | ] 60 | } 61 | ], 62 | "source": [ 63 | "print(os.listdir(\"C://Users//Mithun//Documents//Project Dhwani CNNRF//ImageModels-master//ImageModels-master//Example\"))" 64 | ] 65 | }, 66 | { 67 | "cell_type": "markdown", 68 | "metadata": {}, 69 | "source": [ 70 | "### Read the train & test Images and preprocessing" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": 3, 76 | "metadata": { 77 | "collapsed": true 78 | }, 79 | "outputs": [], 80 | "source": [ 81 | "train_fruit_images = []\n", 82 | "train_fruit_labels = [] \n", 83 | "for directory_path in glob.glob(\"Example/Trainexample1/*\"):\n", 84 | " fruit_label = directory_path.split(\"\\\\\")[-1]\n", 85 | " for img_path in glob.glob(os.path.join(directory_path, \"*.jpg\")):\n", 86 | " img = cv2.imread(img_path, cv2.IMREAD_COLOR) \n", 87 | " img = cv2.resize(img, (227, 227))\n", 88 | " img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)\n", 89 | " train_fruit_images.append(img)\n", 90 | " train_fruit_labels.append(fruit_label)\n", 91 | "train_fruit_images = np.array(train_fruit_images)\n", 92 | "train_fruit_labels = np.array(train_fruit_labels)" 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": 4, 98 | "metadata": { 99 | "collapsed": true 100 | }, 101 | "outputs": [], 102 | "source": [ 103 | "label_to_id = {v:i for i,v in enumerate(np.unique(train_fruit_labels))}\n", 104 | "id_to_label = {v: k for k, v in label_to_id.items()}\n", 105 | "train_label_ids = np.array([label_to_id[x] for x in train_fruit_labels])\n", 106 | "\n" 107 | ] 108 | }, 109 | { 110 | "cell_type": "code", 111 | "execution_count": 5, 112 | "metadata": {}, 113 | "outputs": [ 114 | { 115 | "data": { 116 | "text/plain": [ 117 | "((2637, 227, 227, 3), (2637,), (2637,))" 118 | ] 119 | }, 120 | "execution_count": 5, 121 | "metadata": {}, 122 | "output_type": "execute_result" 123 | } 124 | ], 125 | "source": [ 126 | "train_fruit_images.shape, train_label_ids.shape, train_fruit_labels.shape" 127 | ] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "execution_count": 6, 132 | "metadata": { 133 | "collapsed": true 134 | }, 135 | "outputs": [], 136 | "source": [ 137 | "# test\n", 138 | "test_fruit_images = []\n", 139 | "test_fruit_labels = [] \n", 140 | "for directory_path in glob.glob(\"Example/Validation-Example1/*\"):\n", 141 | " fruit_label = directory_path.split(\"\\\\\")[-1]\n", 142 | " for img_path in glob.glob(os.path.join(directory_path, \"*.jpg\")):\n", 143 | " img = cv2.imread(img_path, cv2.IMREAD_COLOR)\n", 144 | " \n", 145 | " img = cv2.resize(img, (227, 227))\n", 146 | " img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)\n", 147 | " \n", 148 | " test_fruit_images.append(img)\n", 149 | " test_fruit_labels.append(fruit_label)\n", 150 | "test_fruit_images = np.array(test_fruit_images)\n", 151 | "test_fruit_labels = np.array(test_fruit_labels)" 152 | ] 153 | }, 154 | { 155 | "cell_type": "code", 156 | "execution_count": 7, 157 | "metadata": { 158 | "collapsed": true 159 | }, 160 | "outputs": [], 161 | "source": [ 162 | "test_label_ids = np.array([label_to_id[x] for x in test_fruit_labels])" 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": 8, 168 | "metadata": {}, 169 | "outputs": [ 170 | { 171 | "data": { 172 | "text/plain": [ 173 | "((885, 227, 227, 3), (885,))" 174 | ] 175 | }, 176 | "execution_count": 8, 177 | "metadata": {}, 178 | "output_type": "execute_result" 179 | } 180 | ], 181 | "source": [ 182 | "test_fruit_images.shape, test_label_ids.shape" 183 | ] 184 | }, 185 | { 186 | "cell_type": "code", 187 | "execution_count": 9, 188 | "metadata": {}, 189 | "outputs": [ 190 | { 191 | "name": "stdout", 192 | "output_type": "stream", 193 | "text": [ 194 | "(2637, 227, 227, 3) (2637,) (885, 227, 227, 3) (885,) 6\n" 195 | ] 196 | } 197 | ], 198 | "source": [ 199 | "x_train, y_train, x_test, y_test, N_CATEGORY =train_fruit_images,train_fruit_labels,test_fruit_images,test_fruit_labels,len(label_to_id)\n", 200 | "\n", 201 | "print(x_train.shape, y_train.shape, x_test.shape, y_test.shape, N_CATEGORY)" 202 | ] 203 | }, 204 | { 205 | "cell_type": "markdown", 206 | "metadata": {}, 207 | "source": [ 208 | "### Classes with its ids" 209 | ] 210 | }, 211 | { 212 | "cell_type": "code", 213 | "execution_count": 163, 214 | "metadata": {}, 215 | "outputs": [ 216 | { 217 | "data": { 218 | "text/plain": [ 219 | "{0: 'Apple Golden 1',\n", 220 | " 1: 'Avocado',\n", 221 | " 2: 'Banana',\n", 222 | " 3: 'Lemon',\n", 223 | " 4: 'Pineapple',\n", 224 | " 5: 'Strawberry'}" 225 | ] 226 | }, 227 | "execution_count": 163, 228 | "metadata": {}, 229 | "output_type": "execute_result" 230 | } 231 | ], 232 | "source": [ 233 | "id_to_label" 234 | ] 235 | }, 236 | { 237 | "cell_type": "markdown", 238 | "metadata": {}, 239 | "source": [ 240 | "### Creation of AlexNet structure of CNN" 241 | ] 242 | }, 243 | { 244 | "cell_type": "raw", 245 | "metadata": { 246 | "collapsed": true 247 | }, 248 | "source": [ 249 | "def get_alexnet(input_shape,nb_classes): \n", 250 | " model = Sequential()\n", 251 | "\n", 252 | " # Layer 1\n", 253 | " model.add(Convolution2D(96, 11, 11, input_shape = input_shape, border_mode='same'))\n", 254 | " model.add(Activation('relu'))\n", 255 | " model.add(MaxPooling2D(pool_size=(2, 2)))\n", 256 | "\n", 257 | " # Layer 2\n", 258 | " model.add(Convolution2D(128, 5, 5, border_mode='same'))\n", 259 | " model.add(Activation('relu'))\n", 260 | " model.add(MaxPooling2D(pool_size=(2, 2),strides=2))\n", 261 | "\n", 262 | " # Layer 3\n", 263 | " model.add(ZeroPadding2D((1,1)))\n", 264 | " model.add(Convolution2D(384, 3, 3, border_mode='same'))\n", 265 | " model.add(Activation('relu'))\n", 266 | "\n", 267 | " # Layer 4\n", 268 | " model.add(ZeroPadding2D((1,1)))\n", 269 | " model.add(Convolution2D(192, 3, 3, border_mode='same'))\n", 270 | " model.add(Activation('relu'))\n", 271 | "\n", 272 | " # Layer 5\n", 273 | " model.add(ZeroPadding2D((1,1)))\n", 274 | " model.add(Convolution2D(128, 3, 3, border_mode='same'))\n", 275 | " model.add(Activation('relu'))\n", 276 | " model.add(MaxPooling2D(pool_size=(2, 2)))\n", 277 | "\n", 278 | " # Layer 6\n", 279 | " model.add(GlobalAveragePooling2D())\n", 280 | " model.add(Dense(4096, init='glorot_normal'))\n", 281 | " model.add(Activation('relu'))\n", 282 | " model.add(Dropout(0.5))\n", 283 | "\n", 284 | " # Layer 7\n", 285 | " model.add(Dense(4096, init='glorot_normal'))\n", 286 | " model.add(Activation('relu'))\n", 287 | " model.add(Dropout(0.5))\n", 288 | "\n", 289 | " # Layer 8\n", 290 | " model.add(Dense(nb_classes, init='glorot_normal'))\n", 291 | " model.add(Activation('tanh'))\n", 292 | " return model" 293 | ] 294 | }, 295 | { 296 | "cell_type": "code", 297 | "execution_count": 13, 298 | "metadata": { 299 | "scrolled": true 300 | }, 301 | "outputs": [ 302 | { 303 | "name": "stderr", 304 | "output_type": "stream", 305 | "text": [ 306 | "C:\\ProgramData\\Miniconda3\\lib\\site-packages\\ipykernel_launcher.py:6: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(96, (11, 11), input_shape=(227, 227,..., padding=\"same\")`\n", 307 | " \n" 308 | ] 309 | }, 310 | { 311 | "name": "stdout", 312 | "output_type": "stream", 313 | "text": [ 314 | "_________________________________________________________________\n", 315 | "Layer (type) Output Shape Param # \n", 316 | "=================================================================\n", 317 | "conv2d_1 (Conv2D) (None, 227, 227, 96) 34944 \n", 318 | "_________________________________________________________________\n", 319 | "activation_1 (Activation) (None, 227, 227, 96) 0 \n", 320 | "_________________________________________________________________\n", 321 | "max_pooling2d_1 (MaxPooling2 (None, 113, 113, 96) 0 \n", 322 | "_________________________________________________________________\n", 323 | "conv2d_2 (Conv2D) (None, 113, 113, 128) 307328 \n", 324 | "_________________________________________________________________\n", 325 | "activation_2 (Activation) (None, 113, 113, 128) 0 \n", 326 | "_________________________________________________________________\n", 327 | "max_pooling2d_2 (MaxPooling2 (None, 56, 56, 128) 0 \n", 328 | "_________________________________________________________________\n", 329 | "zero_padding2d_1 (ZeroPaddin (None, 58, 58, 128) 0 \n", 330 | "_________________________________________________________________\n", 331 | "conv2d_3 (Conv2D) (None, 58, 58, 384) 442752 \n", 332 | "_________________________________________________________________\n", 333 | "activation_3 (Activation) (None, 58, 58, 384) 0 \n", 334 | "_________________________________________________________________\n", 335 | "zero_padding2d_2 (ZeroPaddin (None, 60, 60, 384) 0 \n", 336 | "_________________________________________________________________\n", 337 | "conv2d_4 (Conv2D) (None, 60, 60, 192) 663744 \n", 338 | "_________________________________________________________________\n", 339 | "activation_4 (Activation) (None, 60, 60, 192) 0 \n", 340 | "_________________________________________________________________\n", 341 | "zero_padding2d_3 (ZeroPaddin (None, 62, 62, 192) 0 \n", 342 | "_________________________________________________________________\n", 343 | "conv2d_5 (Conv2D) (None, 62, 62, 128) 221312 \n", 344 | "_________________________________________________________________\n", 345 | "activation_5 (Activation) (None, 62, 62, 128) 0 \n", 346 | "_________________________________________________________________\n", 347 | "max_pooling2d_3 (MaxPooling2 (None, 31, 31, 128) 0 \n", 348 | "_________________________________________________________________\n", 349 | "global_average_pooling2d_1 ( (None, 128) 0 \n", 350 | "_________________________________________________________________\n", 351 | "dense_1 (Dense) (None, 4096) 528384 \n", 352 | "_________________________________________________________________\n", 353 | "activation_6 (Activation) (None, 4096) 0 \n", 354 | "_________________________________________________________________\n", 355 | "dropout_1 (Dropout) (None, 4096) 0 \n", 356 | "_________________________________________________________________\n", 357 | "dense_2 (Dense) (None, 4096) 16781312 \n", 358 | "_________________________________________________________________\n", 359 | "activation_7 (Activation) (None, 4096) 0 \n", 360 | "_________________________________________________________________\n", 361 | "dropout_2 (Dropout) (None, 4096) 0 \n", 362 | "_________________________________________________________________\n", 363 | "dense_3 (Dense) (None, 6) 24582 \n", 364 | "_________________________________________________________________\n", 365 | "activation_8 (Activation) (None, 6) 0 \n", 366 | "=================================================================\n", 367 | "Total params: 19,004,358\n", 368 | "Trainable params: 19,004,358\n", 369 | "Non-trainable params: 0\n", 370 | "_________________________________________________________________\n" 371 | ] 372 | }, 373 | { 374 | "name": "stderr", 375 | "output_type": "stream", 376 | "text": [ 377 | "C:\\ProgramData\\Miniconda3\\lib\\site-packages\\ipykernel_launcher.py:11: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(128, (5, 5), padding=\"same\")`\n", 378 | " # This is added back by InteractiveShellApp.init_path()\n", 379 | "C:\\ProgramData\\Miniconda3\\lib\\site-packages\\ipykernel_launcher.py:17: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(384, (3, 3), padding=\"same\")`\n", 380 | "C:\\ProgramData\\Miniconda3\\lib\\site-packages\\ipykernel_launcher.py:22: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(192, (3, 3), padding=\"same\")`\n", 381 | "C:\\ProgramData\\Miniconda3\\lib\\site-packages\\ipykernel_launcher.py:27: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(128, (3, 3), padding=\"same\")`\n", 382 | "C:\\ProgramData\\Miniconda3\\lib\\site-packages\\ipykernel_launcher.py:33: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(4096, kernel_initializer=\"glorot_normal\")`\n", 383 | "C:\\ProgramData\\Miniconda3\\lib\\site-packages\\ipykernel_launcher.py:38: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(4096, kernel_initializer=\"glorot_normal\")`\n", 384 | "C:\\ProgramData\\Miniconda3\\lib\\site-packages\\ipykernel_launcher.py:43: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(6, kernel_initializer=\"glorot_normal\")`\n" 385 | ] 386 | } 387 | ], 388 | "source": [ 389 | "alexnet = get_alexnet((227,227,3),N_CATEGORY)\n", 390 | "alexnet.summary()" 391 | ] 392 | }, 393 | { 394 | "cell_type": "code", 395 | "execution_count": 16, 396 | "metadata": { 397 | "collapsed": true 398 | }, 399 | "outputs": [], 400 | "source": [ 401 | "#Normalization of the images and one-hot encoding of the labels\n", 402 | "alexnet.compile(loss='categorical_crossentropy', optimizer=RMSprop(),metrics=['accuracy'])\n", 403 | "X_normalized = np.array(x_train / 255.0 - 0.5 )\n", 404 | "X_normalized_test = np.array(x_test / 255.0 - 0.5 )\n", 405 | "\n", 406 | "label_binarizer = LabelBinarizer()\n", 407 | "y_one_hot = label_binarizer.fit_transform(y_train)\n", 408 | "y_one_hot_test = label_binarizer.fit_transform(y_test)" 409 | ] 410 | }, 411 | { 412 | "cell_type": "code", 413 | "execution_count": 17, 414 | "metadata": {}, 415 | "outputs": [ 416 | { 417 | "name": "stdout", 418 | "output_type": "stream", 419 | "text": [ 420 | "Train on 2637 samples, validate on 885 samples\n", 421 | "Epoch 1/2\n", 422 | "2637/2637 [==============================] - 734s 278ms/step - loss: 3.7883 - acc: 0.1866 - val_loss: 3.7667 - val_acc: 0.1853\n", 423 | "Epoch 2/2\n", 424 | "2637/2637 [==============================] - 714s 271ms/step - loss: 3.7718 - acc: 0.1866 - val_loss: 3.7667 - val_acc: 0.1853\n" 425 | ] 426 | }, 427 | { 428 | "data": { 429 | "text/plain": [ 430 | "" 431 | ] 432 | }, 433 | "execution_count": 17, 434 | "metadata": {}, 435 | "output_type": "execute_result" 436 | } 437 | ], 438 | "source": [ 439 | "#Training the AlexNet model with the normalized image data and labels\n", 440 | "alexnet.fit(X_normalized, y_one_hot, batch_size=5, epochs=2,verbose=1, validation_data=[X_normalized_test,y_one_hot_test])" 441 | ] 442 | }, 443 | { 444 | "cell_type": "markdown", 445 | "metadata": {}, 446 | "source": [ 447 | "#### Result of the Alexnet\n", 448 | "The accuracy of the whole AlexNet model is 0.1866 which is 18.66%.\n", 449 | "\n", 450 | "Here, the classification is performed by the other Fully-connected layer and Softmax function.\n" 451 | ] 452 | }, 453 | { 454 | "cell_type": "code", 455 | "execution_count": 21, 456 | "metadata": { 457 | "collapsed": true 458 | }, 459 | "outputs": [], 460 | "source": [ 461 | "#Save the AlexNet model for the future use(as it takes hours to be trained!)\n", 462 | "alexnet.save('alexnetfruit.h5') " 463 | ] 464 | }, 465 | { 466 | "cell_type": "markdown", 467 | "metadata": {}, 468 | "source": [ 469 | "### Feature Extraction by CNN" 470 | ] 471 | }, 472 | { 473 | "cell_type": "code", 474 | "execution_count": 67, 475 | "metadata": {}, 476 | "outputs": [ 477 | { 478 | "data": { 479 | "text/plain": [ 480 | "" 481 | ] 482 | }, 483 | "execution_count": 67, 484 | "metadata": {}, 485 | "output_type": "execute_result" 486 | } 487 | ], 488 | "source": [ 489 | "#Pick the first Fully-Connected layer as the features which will be of dimension (1 x 4096)\n", 490 | "layer_name = 'dense_1'\n", 491 | "FC_layer_model = Model(inputs=alexnet.input,\n", 492 | " outputs=alexnet.get_layer(layer_name).output)" 493 | ] 494 | }, 495 | { 496 | "cell_type": "code", 497 | "execution_count": 89, 498 | "metadata": { 499 | "collapsed": true 500 | }, 501 | "outputs": [], 502 | "source": [ 503 | "#Find the Features for n number of train images and we will get n x 4096\n", 504 | "#This means we will get 4096 features for each images.\n", 505 | "i=0\n", 506 | "features=np.zeros(shape=(x_train.shape[0],4096))\n", 507 | "for directory_path in glob.glob(\"Example/Trainexample1/*\"):\n", 508 | " for img_path in glob.glob(os.path.join(directory_path, \"*.jpg\")):\n", 509 | " img = cv2.imread(img_path, cv2.IMREAD_COLOR) \n", 510 | " img = cv2.resize(img, (227, 227))\n", 511 | " img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)\n", 512 | " img = np.expand_dims(img, axis=0)\n", 513 | " FC_output = FC_layer_model.predict(img)\n", 514 | " features[i]=FC_output\n", 515 | " i+=1\n" 516 | ] 517 | }, 518 | { 519 | "cell_type": "code", 520 | "execution_count": 92, 521 | "metadata": { 522 | "collapsed": true 523 | }, 524 | "outputs": [], 525 | "source": [ 526 | "#Save the features of the train images to use it in future.\n", 527 | "np.save('features', features)" 528 | ] 529 | }, 530 | { 531 | "cell_type": "code", 532 | "execution_count": null, 533 | "metadata": { 534 | "collapsed": true 535 | }, 536 | "outputs": [], 537 | "source": [ 538 | "#Name the feature rows as f_0, f_1, f_2...\n", 539 | "feature_col=[]\n", 540 | "for i in range(4096):\n", 541 | " feature_col.append(\"f_\"+str(i))\n", 542 | " i+=1\n", 543 | " " 544 | ] 545 | }, 546 | { 547 | "cell_type": "code", 548 | "execution_count": 147, 549 | "metadata": {}, 550 | "outputs": [ 551 | { 552 | "name": "stdout", 553 | "output_type": "stream", 554 | "text": [ 555 | "Training Features Shape: (2637, 4096)\n", 556 | "Training Labels Shape: (2637,)\n" 557 | ] 558 | }, 559 | { 560 | "data": { 561 | "text/plain": [ 562 | "[0, 1, 2, 3, 4, 5]" 563 | ] 564 | }, 565 | "execution_count": 147, 566 | "metadata": {}, 567 | "output_type": "execute_result" 568 | } 569 | ], 570 | "source": [ 571 | "#Create DataFrame with features and coloumn name\n", 572 | "train_features=pd.DataFrame(data=features,columns=feature_col)\n", 573 | "feature_col = np.array(feature_col)\n", 574 | "\n", 575 | "train_class = list(np.unique(train_label_ids))\n", 576 | "print('Training Features Shape:', train_features.shape)\n", 577 | "print('Training Labels Shape:', train_label_ids.shape)\n", 578 | "train_class" 579 | ] 580 | }, 581 | { 582 | "cell_type": "markdown", 583 | "metadata": {}, 584 | "source": [ 585 | "### Random Forest as Classifier" 586 | ] 587 | }, 588 | { 589 | "cell_type": "code", 590 | "execution_count": 152, 591 | "metadata": {}, 592 | "outputs": [ 593 | { 594 | "data": { 595 | "text/plain": [ 596 | "RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',\n", 597 | " max_depth=None, max_features=4, max_leaf_nodes=None,\n", 598 | " min_impurity_split=1e-07, min_samples_leaf=1,\n", 599 | " min_samples_split=2, min_weight_fraction_leaf=0.0,\n", 600 | " n_estimators=20, n_jobs=1, oob_score=False, random_state=42,\n", 601 | " verbose=0, warm_start=False)" 602 | ] 603 | }, 604 | "execution_count": 152, 605 | "metadata": {}, 606 | "output_type": "execute_result" 607 | } 608 | ], 609 | "source": [ 610 | "#Feed the extracted features with the labels to RANDOM FOREST \n", 611 | "rf = RandomForestClassifier(n_estimators = 20, random_state = 42,max_features=4)\n", 612 | "\n", 613 | "rf.fit(train_features, train_label_ids)" 614 | ] 615 | }, 616 | { 617 | "cell_type": "markdown", 618 | "metadata": {}, 619 | "source": [ 620 | "### Testing the Novel Algorithm" 621 | ] 622 | }, 623 | { 624 | "cell_type": "markdown", 625 | "metadata": {}, 626 | "source": [ 627 | "#### Feature Extraction by CNN (AlexNet)" 628 | ] 629 | }, 630 | { 631 | "cell_type": "code", 632 | "execution_count": 118, 633 | "metadata": { 634 | "collapsed": true 635 | }, 636 | "outputs": [], 637 | "source": [ 638 | "#Find the Features from Alexnet's FC layer for n number of test images and we will get n x 4096\n", 639 | "i=0\n", 640 | "features_test=np.zeros(shape=(y_test.shape[0],4096))\n", 641 | "for directory_path in glob.glob(\"Example/Validation-Example1//*\"):\n", 642 | " for img_path in glob.glob(os.path.join(directory_path, \"*.jpg\")):\n", 643 | " img = cv2.imread(img_path, cv2.IMREAD_COLOR) \n", 644 | " img = cv2.resize(img, (227, 227))\n", 645 | " img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)\n", 646 | " img = np.expand_dims(img, axis=0)\n", 647 | " FC_output = FC_layer_model.predict(img)\n", 648 | " features_test[i]=FC_output\n", 649 | " i+=1\n" 650 | ] 651 | }, 652 | { 653 | "cell_type": "code", 654 | "execution_count": 137, 655 | "metadata": {}, 656 | "outputs": [ 657 | { 658 | "name": "stdout", 659 | "output_type": "stream", 660 | "text": [ 661 | "Test Features Shape: (885, 4096)\n", 662 | "Test Labels Shape: (885,)\n" 663 | ] 664 | } 665 | ], 666 | "source": [ 667 | "#Create DataFrame with features and coloumn name\n", 668 | "test_features=pd.DataFrame(data=features_test,columns=feature_col)\n", 669 | "feature_col = np.array(feature_col)\n", 670 | "\n", 671 | "print('Test Features Shape:', test_features.shape)\n", 672 | "print('Test Labels Shape:', test_label_ids.shape)\n" 673 | ] 674 | }, 675 | { 676 | "cell_type": "markdown", 677 | "metadata": {}, 678 | "source": [ 679 | "#### Classification by Random Forest" 680 | ] 681 | }, 682 | { 683 | "cell_type": "code", 684 | "execution_count": 153, 685 | "metadata": { 686 | "collapsed": true 687 | }, 688 | "outputs": [], 689 | "source": [ 690 | "#Feed the features of the test images to Random Forest Classifier to predict its class\n", 691 | "predictions = rf.predict(test_features)" 692 | ] 693 | }, 694 | { 695 | "cell_type": "markdown", 696 | "metadata": {}, 697 | "source": [ 698 | "### Checking the Accuracy of the Novel Model" 699 | ] 700 | }, 701 | { 702 | "cell_type": "code", 703 | "execution_count": 161, 704 | "metadata": {}, 705 | "outputs": [ 706 | { 707 | "name": "stdout", 708 | "output_type": "stream", 709 | "text": [ 710 | "Accuracy: 85.8757062147 %.\n" 711 | ] 712 | } 713 | ], 714 | "source": [ 715 | "accuracy=accuracy_score(predictions , test_label_ids)\n", 716 | "print('Accuracy:', accuracy*100, '%.')" 717 | ] 718 | }, 719 | { 720 | "cell_type": "markdown", 721 | "metadata": {}, 722 | "source": [ 723 | "### Comparision of CNN vs CNN+RF\n", 724 | "\n", 725 | "- Accuracy of CNN: 18.66%\n", 726 | "- Accuracy of CNN+RF: 85.88%\n", 727 | "\n", 728 | "From the results above it is crystal clear that merging Random Forest with the CNN gives almost 5 times better accuracy." 729 | ] 730 | }, 731 | { 732 | "cell_type": "markdown", 733 | "metadata": {}, 734 | "source": [ 735 | "## Let's have some fun!!\n", 736 | "\n", 737 | "Give the path of any fruit image in img_path and Voila!!" 738 | ] 739 | }, 740 | { 741 | "cell_type": "code", 742 | "execution_count": 184, 743 | "metadata": {}, 744 | "outputs": [ 745 | { 746 | "name": "stdout", 747 | "output_type": "stream", 748 | "text": [ 749 | "It's Banana\n" 750 | ] 751 | }, 752 | { 753 | "data": { 754 | "image/png": "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\n", 755 | "text/plain": [ 756 | "" 757 | ] 758 | }, 759 | "metadata": {}, 760 | "output_type": "display_data" 761 | } 762 | ], 763 | "source": [ 764 | "\n", 765 | "img_path=\"C://Users//Documents//Project Dhwani CNNRF//ImageModels-master//ImageModels-master//banana.jpg\"\n", 766 | "img = cv2.imread(img_path, cv2.IMREAD_COLOR)\n", 767 | "img = cv2.resize(img, (227, 227))\n", 768 | "img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)\n", 769 | "plt.imshow(img)\n", 770 | "img = np.expand_dims(img, axis=0)\n", 771 | "FC_output = FC_layer_model.predict(img)\n", 772 | "image_features=pd.DataFrame(data=FC_output,columns=feature_col)\n", 773 | "predictions = rf.predict(image_features)\n", 774 | "print(\"It's\",id_to_label[predictions[0]])" 775 | ] 776 | }, 777 | { 778 | "cell_type": "markdown", 779 | "metadata": {}, 780 | "source": [ 781 | "## References:\n", 782 | "\n", 783 | "- http://euler.stat.yale.edu/~tba3/stat665/lectures/lec18/notebook18.html\n", 784 | "- http://cs231n.github.io/convolutional-networks/\n", 785 | "- http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html" 786 | ] 787 | }, 788 | { 789 | "cell_type": "code", 790 | "execution_count": null, 791 | "metadata": { 792 | "collapsed": true 793 | }, 794 | "outputs": [], 795 | "source": [] 796 | } 797 | ], 798 | "metadata": { 799 | "kernelspec": { 800 | "display_name": "Python 3", 801 | "language": "python", 802 | "name": "python3" 803 | }, 804 | "language_info": { 805 | "codemirror_mode": { 806 | "name": "ipython", 807 | "version": 3 808 | }, 809 | "file_extension": ".py", 810 | "mimetype": "text/x-python", 811 | "name": "python", 812 | "nbconvert_exporter": "python", 813 | "pygments_lexer": "ipython3", 814 | "version": "3.6.1" 815 | } 816 | }, 817 | "nbformat": 4, 818 | "nbformat_minor": 2 819 | } 820 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # The algorithm in Layman term: 2 | 3 | Fruit image recognition process in Machine Learning is so similar to how babies start recognizing the fruits. 4 | 5 | For example, parents try to make babies learn the colors. They show baby the color and tell the name of the color with it. And they just not do it once, they keep reminding baby and practice the color identification exercise everyday! Some chemical things happen in the brain and baby start learning the colors like red, yellow by seeing different colors so many times. Similar for the shapes, baby start recognizing the circle, rectangle, triangle, etc. 6 | 7 | Then parents keep reminding the baby that if it is red and round, it’s an “apple”. If its round and orange, it is an “orange” and so on. Maybe as human, baby will also recognize the fruit with smell and taste later. 8 | 9 | So, same as parents, we fed various images are fed in machine learning model (you can consider that baby’s brain) with some maths equations (consider it as those chemical reactions in brain) which recognize the different features (the factors that baby will consider to recognize the fruit like color, size, shape, smell, taste). And with different combinations baby will finally classify the fruits. 10 | 11 | So two tasks are taking place here to identify the fruits for image: 12 | 13 | Feature extraction --> Deciding the factors to be considered to identify the fruit 14 | 15 | Classification --> See the combinations of the features and check with which fruit it is most similar. 16 | 17 | Conventionally, only one algorithm called Convolutional Neural Network (CNN) is used for both the tasks as CNN. But what if I use the algorithms working individually best for each task! (one for Feature Extraction and one for Classification). CNN does pretty good job in identifying the features. For classification, “Random Forest” algorithm is well-known. Hence, I have used Random forest+ CNN to identify the fruit rather than only CNN. 18 | 19 | ### This novel algorithm gave me 5 times more accuracy than the conventionally using only CNN. 20 | 21 | 22 | 23 | 24 | # Image-Classification-with-CNN-RF 25 | 26 | Our goal is to implement fruit recognition using Convolutional Neural Network(CNN) (keras and OpenCV) by training the Fruits 360 dataset available on kaggle. We aim to develop a feature extraction technique with convolutional neural networks. On extracted features (with CNN), random forest classifier is used to classify the images. By applying this model to images captured using front camera, fruits can be predicted. 27 | 28 | # Reference: 29 | We are using kaggle dataset https://www.kaggle.com/moltean/fruits/data 30 | -------------------------------------------------------------------------------- /banana.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dhwanirc/Image-Classification-with-CNN-RF/045a6df0084ae863764869fef383ab4561ea7b1a/banana.jpg -------------------------------------------------------------------------------- /experiment.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Image Classification using sequential model" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 2, 13 | "metadata": {}, 14 | "outputs": [ 15 | { 16 | "name": "stderr", 17 | "output_type": "stream", 18 | "text": [ 19 | "C:\\Courses\\SEM II\\ML\\Anaconda\\lib\\site-packages\\h5py\\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", 20 | " from ._conv import register_converters as _register_converters\n", 21 | "Using TensorFlow backend.\n" 22 | ] 23 | }, 24 | { 25 | "name": "stdout", 26 | "output_type": "stream", 27 | "text": [ 28 | "['Training', 'Trainingtemp', 'Validation', 'Validationtemp']\n" 29 | ] 30 | } 31 | ], 32 | "source": [ 33 | "import numpy as np \n", 34 | "import pandas as pd \n", 35 | "import matplotlib.pyplot as plt\n", 36 | "from matplotlib.offsetbox import OffsetImage, AnnotationBbox\n", 37 | "%matplotlib inline\n", 38 | "import tensorflow as tf\n", 39 | "import keras\n", 40 | "import glob\n", 41 | "import cv2\n", 42 | "from keras.models import Sequential\n", 43 | "from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D\n", 44 | "from keras.layers import LSTM, Input, TimeDistributed\n", 45 | "from keras.models import Model\n", 46 | "from keras.optimizers import RMSprop, SGD\n", 47 | "from keras.layers.normalization import BatchNormalization\n", 48 | "\n", 49 | "# Import the backend\n", 50 | "from keras import backend as K\n", 51 | "\n", 52 | "import os\n", 53 | "print(os.listdir(\"fruitsdata\"))" 54 | ] 55 | }, 56 | { 57 | "cell_type": "markdown", 58 | "metadata": {}, 59 | "source": [ 60 | "### Training Set" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": 3, 66 | "metadata": {}, 67 | "outputs": [], 68 | "source": [ 69 | "train_fruit_images = []\n", 70 | "train_fruit_labels = [] \n", 71 | "for directory_path in glob.glob(\"fruitsdata/Training/*\"):\n", 72 | " fruit_label = directory_path.split(\"\\\\\")[-1]\n", 73 | " for img_path in glob.glob(os.path.join(directory_path, \"*.jpg\")):\n", 74 | " img = cv2.imread(img_path, cv2.IMREAD_COLOR) \n", 75 | " img = cv2.resize(img, (100, 100))\n", 76 | " img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)\n", 77 | " train_fruit_images.append(img)\n", 78 | " train_fruit_labels.append(fruit_label)\n", 79 | "train_fruit_images = np.array(train_fruit_images)\n", 80 | "train_fruit_labels = np.array(train_fruit_labels)" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 4, 86 | "metadata": {}, 87 | "outputs": [], 88 | "source": [ 89 | "label_to_id = {v:i for i,v in enumerate(np.unique(train_fruit_labels))}\n", 90 | "id_to_label = {v: k for k, v in label_to_id.items()}" 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "execution_count": 5, 96 | "metadata": {}, 97 | "outputs": [], 98 | "source": [ 99 | "train_label_ids = np.array([label_to_id[x] for x in train_fruit_labels])" 100 | ] 101 | }, 102 | { 103 | "cell_type": "code", 104 | "execution_count": 6, 105 | "metadata": {}, 106 | "outputs": [ 107 | { 108 | "data": { 109 | "text/plain": [ 110 | "((28736, 100, 100, 3), (28736,), (28736,))" 111 | ] 112 | }, 113 | "execution_count": 6, 114 | "metadata": {}, 115 | "output_type": "execute_result" 116 | } 117 | ], 118 | "source": [ 119 | "train_fruit_images.shape, train_label_ids.shape, train_fruit_labels.shape" 120 | ] 121 | }, 122 | { 123 | "cell_type": "markdown", 124 | "metadata": {}, 125 | "source": [ 126 | "### Test set images" 127 | ] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "execution_count": 7, 132 | "metadata": {}, 133 | "outputs": [], 134 | "source": [ 135 | "test_fruit_images = []\n", 136 | "test_fruit_labels = [] \n", 137 | "for directory_path in glob.glob(\"fruitsdata/Validation/*\"):\n", 138 | " fruit_label = directory_path.split(\"\\\\\")[-1]\n", 139 | " for img_path in glob.glob(os.path.join(directory_path, \"*.jpg\")):\n", 140 | " img = cv2.imread(img_path, cv2.IMREAD_COLOR)\n", 141 | " \n", 142 | " img = cv2.resize(img, (100, 100))\n", 143 | " img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)\n", 144 | " \n", 145 | " test_fruit_images.append(img)\n", 146 | " test_fruit_labels.append(fruit_label)\n", 147 | "test_fruit_images = np.array(test_fruit_images)\n", 148 | "test_fruit_labels = np.array(test_fruit_labels)" 149 | ] 150 | }, 151 | { 152 | "cell_type": "code", 153 | "execution_count": 8, 154 | "metadata": {}, 155 | "outputs": [], 156 | "source": [ 157 | "test_label_ids = np.array([label_to_id[x] for x in test_fruit_labels])" 158 | ] 159 | }, 160 | { 161 | "cell_type": "code", 162 | "execution_count": 9, 163 | "metadata": {}, 164 | "outputs": [ 165 | { 166 | "data": { 167 | "text/plain": [ 168 | "((9673, 100, 100, 3), (9673,))" 169 | ] 170 | }, 171 | "execution_count": 9, 172 | "metadata": {}, 173 | "output_type": "execute_result" 174 | } 175 | ], 176 | "source": [ 177 | "test_fruit_images.shape, test_label_ids.shape" 178 | ] 179 | }, 180 | { 181 | "cell_type": "markdown", 182 | "metadata": {}, 183 | "source": [ 184 | "### Data Splitting to train and test" 185 | ] 186 | }, 187 | { 188 | "cell_type": "code", 189 | "execution_count": 11, 190 | "metadata": {}, 191 | "outputs": [ 192 | { 193 | "name": "stdout", 194 | "output_type": "stream", 195 | "text": [ 196 | "Original Sizes: (28736, 100, 100, 3) (9673, 100, 100, 3) (28736, 60) (9673, 60)\n", 197 | "Flattened: (28736, 30000) (9673, 30000)\n" 198 | ] 199 | } 200 | ], 201 | "source": [ 202 | "Xtrain, Xtest = train_fruit_images, test_fruit_images\n", 203 | "Ytrain, Ytest = train_label_ids, test_label_ids\n", 204 | "\n", 205 | "Xtrain = Xtrain/255\n", 206 | "Xtest = Xtest/255\n", 207 | "\n", 208 | "#Make a flattened version for some of our models\n", 209 | "Xflat_train = Xtrain.reshape(Xtrain.shape[0], 100*100*3)\n", 210 | "Xflat_test = Xtest.reshape(Xtest.shape[0], 100*100*3)\n", 211 | "\n", 212 | "#One Hot Encode the Output\n", 213 | "Ytrain = keras.utils.to_categorical(Ytrain, 60)\n", 214 | "Ytest = keras.utils.to_categorical(Ytest, 60)\n", 215 | "\n", 216 | "print('Original Sizes:', Xtrain.shape, Xtest.shape, Ytrain.shape, Ytest.shape)\n", 217 | "print('Flattened:', Xflat_train.shape, Xflat_test.shape)" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": 12, 223 | "metadata": {}, 224 | "outputs": [ 225 | { 226 | "name": "stdout", 227 | "output_type": "stream", 228 | "text": [ 229 | "(100, 100, 3)\n" 230 | ] 231 | } 232 | ], 233 | "source": [ 234 | "print(Xtrain[1].shape)" 235 | ] 236 | }, 237 | { 238 | "cell_type": "code", 239 | "execution_count": 13, 240 | "metadata": {}, 241 | "outputs": [ 242 | { 243 | "data": { 244 | "text/plain": [ 245 | "" 246 | ] 247 | }, 248 | "execution_count": 13, 249 | "metadata": {}, 250 | "output_type": "execute_result" 251 | }, 252 | { 253 | "data": { 254 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP4AAAD8CAYAAABXXhlaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJztvXu0bFdZJ/qba1XV3vuck5OTkxchCXlIEhIC4XGEgA6lEUUUpVHEV0NEHLRvfNyh4PUO26t9R3Ovig672+60j8a+eLEbuALKACHIVUEiCQEEwjOJ4YSQFznPvXdVrbXm/WN+v29+c9aqvfd57XPSNb8x9qhdVWvONdeqqvm9ft/vc957FClSZLGkOt0LKFKkyPZL+eEXKbKAUn74RYosoJQffpEiCyjlh1+kyAJK+eEXKbKAUn74RYosoJzQD9859+3Ouc85577onHvdyVpUkSJFTq244wXwOOdqAJ8H8K0A9gP4KIAf9N5/5uQtr0iRIqdCBicw9lkAvui9vwsAnHNvAfASAHN/+Oedd56//PLLzCtuyyfbaHva+iybz9j36tz5ew/eZDU9Y/zxXcApkXlL8Zu8v1WZvXw/53WgOoGz+Zn/XPLcmbn1WFGCzqXHJh/QGfRZ9ck999yDhx9+eNNVnsgP/2IAXzbP9wN4dn6Qc+41AF4DAE94whPw0dtujfeuM+vz9DrkNXnKe970LICjBx3n2GC1Lj3EuWnyeifvtD1fmYEcVOmi5I02PxJANUjW7fKNYGr+l3VPlmRotuTWhxNULr7DL2wng7kmPndb+GbymL7bNZBzxnWH+Zs2HF3Xs/PTaMwvtePnYi6s811ybCPr7nq2lhX5enq+16U/TOfmbxr8HLvsh9524fqGVfzqc/52Gj6cpeEoPG/DsbUfxold9sizV/PvadfzGjDHz+bmM++7XG38+e7bt2/D9ykn8sPvW8HMcr33NwO4GQCeuW+fb+FQy9CtfEm3dFLn0/f0V2eOkbvMD6HONhrdRMy8XXLErBbxlZy3qmdWOG3Cl6iuw3v6Q6rjLNUgrGHEDWASxgzk9YGM9W386rgq/UF28uXksYnIlyh35/QH2medtOmPDDLtoArna9s4FzcBTsMfupfNo9ZvdjxPN52E9wYDOz3gBjKX0cT6m9JdNL28tufXIfdnIJslr72RH/xyPUpeBwAn35fBYDm80Mj6ZU0bRsI2+SFuNhzIvtOOG8gmG8AJyokE9/YDuNQ8vwTAV05sOUWKFNkOORGN/1EAVznnrgBwH4AfAPBDmw0SQxIAYK1G3dn4KNrDiUqIWnd2C2zpHeTml5EusxUamZgap2/frqnBMjehyxRQ640x1wWnZDRINXDnp/IYj6XCGrqgaUajYTLGT8Usrsz1ZNpb/WDRUolWVJN4zv5OrW592Fq+Ek7WWaVjnVFBTUMLJYz54N+8DwDw4b/7ewDA+toqAOCZz3ymjnnpS79XzplaXH4qztww3gP9SrS5xSLXVfVcFw2WNrV2hrLGlve0Mxqf8/Ajm+oHky41WcPsa/FqTlzU8jlFMYXj/uF77xvn3E8DeC/CLftj7/2nT9rKihQpcsrkRDQ+vPfvBvDuk7SWIkWKbJOc0A//WMUjmNw2Rr2lQYhuwTQx49Pw22z0NJ7Ja5RX5svPzTda8xqj1TKNWl9ZHK2yV0SzUUx6LwE7J2ajDcI1EgRr6DK0jHiHF4YjCeCZS+66NLrusuCS77s9tOhngnxpcA4A1pzcAFlmRRdFIncjc77BQO57tw4A+OynPw4AeNdf/DkA4JFHHgEA3HPX53XM7l07AADf9C9eEK5xeSWsTUz8toufYi1BTvpwPDMP4b2waT9eSzVIw+8cwzjpaNQTDBXxIwYaZUzP1zQNsc6+3iuy3rkZH7uGOa+fLMu/QHaLFFlA2VaNH8TsNX3b10yATvd5GW2Tav37XzxDN/NfrY91/xI2WhN3agaQuA4DMqjVRAmrcMNBMtYGJzlM090yhql+Pg7MmjrR9Dmugdds56+qVKMzfZrv9n1Ggt5vGTuU89b26OkaAOBT//hRAMDDd98FANjNNYpW/eKnP6VD/tN//H0AwDOe9fUAgD0rwQJgwHRqLIoq03t8VlXZB2KPYQqT2hVpWq9eCs/Xm2jaDSQQq8FEpn7lZvTZBnksWtfao6rzlFwMZKcYgL7huRU73045Nikav0iRBZRt1fgOYafp3a9zTa9qah7uaXa/1wSRn32/ynMyknbT3VadQ7P7qo/XH0Pg7lslWbgcIhiOasUsmLZG0wiYZEZ7y7FDR00U9cBAc4phNQcPPhrml3RYZ+bvMseWSLROtF3Xc2s7FwA2S4JsI+BmmfGAZhLX0gab5I/f8AYAwNcefBAAcPZYwEs+rH/18GEdc/ftdwAAHvziFwEAD+1/IBwrmh+DeDOHbTiXz4BIMVYhazKpU6YWK4mljFZCqvS88y8EAIyn4zC3oPMAoJVPlhak+uA1P3djReEkyhbAP6dKisYvUmQBZds1/tBiUbL30oNTdUStNxONB2KeoMs8pMR5nRMnVQyLQDsNWKbRAhLi4IPQn+N511fXdMwKNYloWcJta/H168bo9y5otAEhvxPRpqqN5B6sr8cxO4JmfOSuuwEAb3nznwEAjhw6AABYXV3VQw8dOAgAOHzwUHgUzbt29Gi4PlmLjfavyCkb0fQEuqyvhjmqaSw2cGIy7Nkd1uQkk3HWUig+GMmxu138mq3KNf3w874t3I+du8Kxu3aHA4zGHyAFCFFDct3E4+/YuVPHnHtB0OznnLsXAHD1NdcAAH72F/8XAMCSZAq6LlpGauxJjKXVbIfERFy0DnKZ+T724W5OQLGfKs1cNH6RIgso2x7Vr+Yp3i1WI9hI/gzMN69vTYwG+t5y8CAtwGgkgd+YRD41/UBOMOJY0XT3fSpUIL/tzW/RMXd9IfiudSN+tfi7S6xyG0cfuV2X/13QYNQe1MCjkWgaH9dEX57HHDl0KFlT4riLtqYO3SvP6eu7rNoNAJYlrjCdtsmaGiclhBZWzHWNw6PGRMZHAAAVC3uM9TYSUES9JAUxcl+mh49krwMu8/Hpa1fESPDAw0d1zKNfC1bOQbGw7r0jYAs+8p6/BgCsio8/WFnRMXsvugAA8MLvfDEA4Htf8a/CG1qoZH4mM7n3GNe3z463tma7vP6i8YsUWUDZXo3vEZBx3G56tp1ONC41eyzh7cm7z0t6istsA/lE39G1I1qONTP0s1fspBL9ftef/ikA4K6P3R7mOBC07ER86Ef236dDVh8OaDUnvr1G5sW199OovSvRKNNqLGtKfUs+r02RzSBDse1mBmOmjj4i2ngPGeWvsvNYH78Ttc1y4oncA9+Tc1awo4xpxBppxaybCmqR5ccAsCz+/569ZwMADq8Grb4m8YB2PWrvpTat1ef5uiz63pqcfCcWVSfXNpYPeO2h8Lm0ci8b8904eH/ILLzj4ZAh+cj7bwlr3RGsgr2XPVGP/VevfAUA4PyLH49kEfKdY1alqqNlxFgE7yH5FViw5U0mZiQxDsaGIhJ09v6fiBSNX6TIAkr54RcpsoCy/ZBd1/+/z0AU84axnhqIwSO1hOVqaH3Z2N5EzNChBH1yb+PQV+4HAHz43e/RMYfuDimzf/74xwAAD3zus+F8EojaQbaXcUy37clSZDS3B5LSqk1qS016fYVsBS55HCQAEqaY0iIdDdSZYzUdpaYxg2Opj2Q5Ao6Qzkrq2YfqDsh5TADVy41nYc2SBEynSm8lV2VO10qaEOsynwTbagFUVaYCaig3hnDe+LlK6jVjT7LH8D0WRU3FHWjJ1mSCyXTZ9q+FtOz+u+5JrmvH4+/UYx+W78mrXv2jAIAn3nCDnFDcGnEZO4vjVjCaBDLlWkn/5Qaz33l12fhZsbqoOjmg3aLxixRZQNleje8QcbuYVxwSpM53c5ajDmb3KmJKOpaSyuPU7LqE1baiVR8Sbf7AXf8MAHjwM0Gbf+Qv/lLHPHJneG2P7NC7JXC0IrhZBufWO6OzJXXlCAZRkkeB1BraIQJTllSLpru5lueaXZ7luLR2KtVcc0BMdj6fBurUKjGn3cECG/LOyY3TLKGPB9MKmIiVU3NNMi9JSi2BqWpeBCtpOE1LlXxl+AUFOMMzsjw2Qr7FGjEpTL0btKbky6HXzHRi3aPzpoQyy1pk2gP33a+HvPOLoeTYiYbf95znAgAuvzoEAJ/27GeF+Q2ZZ6OrSsuuNxJdL4OFg+FGhx+zFI1fpMgCyvb7+KZKxyesF3yb8Nh+X8bS201khx4th2MbrYwUn9NsrE5e+8yn/wkA8Ln3vh8A8OmP/CMA4MBd94a5Hj2oY85lQYdo+uWKZBQSJxDChsbmDZUoQ3x6prroWxoiDvqftdyGnCiDWqu2Gl/+50vU/BzrjMbsZqpwstTQDI88MPLicyuDLmtTJc1kKNE7+d8NxY8WZ55GyEDTiSbuII9MVxGMQ5o7yyi8rqrd2Yc4h8JuTdyBmpIQ70gpLIsOD5M2Qo9bRlmk2Ief60A+58kkQrJ3LweA0V+/610AgPe/P3yPnv7sUGb8qsm/BgDsueB8HXPFVVeHebWYiGAflhDbuJWkrRm/kvUzNlIvzYcPH4sUjV+kyALKaYnq93mhkXN1Y//HEsYOl8LuuC5+4vKQTKpBa7WrsRz06IGvAQDe/LtvBAAcuS2QR+wUH3bn0TAGhw/F+aUEdUBtLRH0cSPHitNpYcgjl2pxahhG8+vO+GoS4G7oD2aFSQR6WGqpSiyIqpP3ZE2MzNd11Ai+Sn16ag9aArMWQSxnraoAtBkTXELgi7FYyGRbj4IWHEuBUJdZLvYpwUg897Jc+1DMtcYUMTXDrAy3Y/OQ1LJILEelQE5Lj3kHGS8ZjuJ96uS1cSul02JJOumBwEwQAByVMuihQH6PSibgA+8J2aAPfehDAIAXvvi7dMxP/8LPAwAuveJKAMBAwzESYzEWnZZOy8KH4ttXg5P7Uy0av0iRBZTTQL0VxfrxPmHcny82aE3tT03vOsmlHgma/s//83/SY9/2J38CALjy8ZcAAJ64FHbsI5LDXT8UcvOWaGLXrrMAxDx6IxDUTjT+aKipAhW62MrXL+sdyh5bGyVLS+GIdtfJy0HFz7N0Yz71jas2HDOUXLAlkfSeeeM0lsJuOMwnW82vlFWibfmedr4xkFHSio2EMJNq5MiRI+m8CS9+ChMmvoEa2pvvxFAj8XKIZGl81m3GEpX4Ks0kEHqsloRMNhosmeuQzIUUG00El+Hl5zERCzKMEyizaHrGaVpZ6+RIsHre+66/0jEPC4z7l3/1VwAA1zz5+rA2sXZsXwa1uNhFidfFmAtOjhSNX6TIAkr54RcpsoByWkz9XnNFrd3+vUjhms6avfK/gCkO3R+q5N7+h38IALj9ve/VY68/J6RX3COBqaY7GIJ99TiYcYTf1svRBJwK+INNMXfuDKb/8iCwu6wdPSLHRVOQ5q0bpHBMrSW3vAOSshmIGaom/sDZtxMhAEmPFTdhIObqaKmeObYdp6Y+QTI6vXE/loZithOOq2Y100oxDdZJSmwswdWJMPsMPcdwjjg/23k1Ar1uZP0dm1wO4/qX2PByhm1XuA4cgUJRWl6buDmdBEwHCi8O92LaxM+sqtIOvgNZA79zA5PuJLCJHg+bcdoKOwBYM0HiT9weqjr//Rt/DwDwI695DQBgH8E+BqZMs9/PAfmcLE1dNH6RIgsopzW4Z2VTGKMWi5hAiAz5whdDp5a/f3cIqOwXFpzzR5HNZflwCLq0B4OW9odDcGZFABGrwpTTGY1D8AcDN60E99bXpOZ7yt3f3MaRaClqMtEmA2GusZx+nWj6IWvpRcXXEkAiiMZCXjUOyCYzpN0VFh+m8ADAg6+lQTFCa2mVJMAhKVRv5D4P6gwwMo3H8r5gEs651GXpQtWYJgWowBQWM7nkdUui5GhxaTqS+buUV6BL1BctiJRZeDBasm9j3QRxO/nsvYCuaClRu3sXU7BqsYkVyO5HhJivC2+iN+lCch7+/d/+HQBgSXgGeY+ffeNzzfzp/Vfw0knm5ikav0iRBZRt7p3nMW0bDOrZ0zL15NKNLnZyJkTVOKT7Px+KaL74wQ8CANbu+AQA4PwHHw4HHI2Ms+MjAXgxboIfyiIaIjx2Svqka4xFIephyNRKG6wE+rTK4W78djLuKPSSWqlJryv8LxqGPqVn6Whacmshuywy0dbZtBIktWaLXLivj5Z3yFiZgxqU8Qjrw9ZScMO0nidff3i/Xjb3p8sKeqi9xalnaW9ri5jkvaEiaMn/1yVrA4BJlVkFNG54XwhwMmYCodkExwwlbUewET9eG2rxkhLVrCM/Q0eLKB7Lq2fMoGLtsUBqCc3ujEVBSPCRr4W4wt+9L4B9lmTs7p079Nhrr39KmF9SfTFleXKlaPwiRRZQtplX32FYDzQSakkXMq6CCLVU8AaJJqLcLSy3n//EJwEAzcEAxlmW3ddGVp3457sEuFMJg6vLTAurkenjDxS0IoAVl2pzZzG71MAV/XTR5tWsRqMMtWNL+nFol14T3qf/HyP/AtJh+WZP51ju7/S5G4GmajGNgeGyq69y12u0eragh+ti19xYwMNrlbiJ0cj0Ydn+mIU2TglAzPUrGUX6nN8Ffj62E5Fev0bdU0Ze1+Mz5/5zfkzy7tyOw+kcCY8hSWAkzvDVr34VAPD+v34fAGDn7t167HVPvSGdJ3s8WVI0fpEiCyjb6+N7j+l0iiEhkrZIhNHMjOtdlZ34kUe+sl+HHL0v7JzVoQDRHawJW6349pWBqg5Fa0/Xg59+1iBE/HONljDaig+fMyMp3/4gLYkFoh/NWeosCtyXvdDe89S8WZfb2pB31JId4H1h3rcTP9oZTLPmhElIQguLkWiZZGUUsQuTHrZeIGrZzrzO2xs70cgaSdPVpteRzCtWUsVcP/PhPaXaOlY97H4NnbyjcQyue+600M7AAhfuNJiQZinCOuV/3tsqhSAzum8zMXxvLJiROtP8H/nIR/TYT34ixKme8tSnJdfmNMp/cnR10fhFiiygbKrxnXOXAvhTAI9D2Bpv9t7/nnNuL4A/B3A5gHsAvNx7/+gmc4UyQw1Ix31nKn6nr1mKymimaKDVkH9//1vfpmPuuS0gotqHAgrvbM4lY1cNmooFH0ssgohOX3gQdTUwOyqXlysLHlv1cJzrDp0RZWiJrblmHjv2U1jJS5TtGK6vo/ZjtxzJlFjtx6h6p8UuEsWnQst8ZyDGJthR1/P5QJB2tvUfee+7tJS004xAVlYLaNomnnO+9xrH88g0wh1JN8yYefNlxzrrg8urrT7K6yQntdxkHe9Dk43hPWbWZTauQYoy3lMvJbcf++hteuyrf+RVAIAP/H8fBAAsSUZmNDo5BBy6pi0c0wD4Re/9tQBuBPBTzrnrALwOwC3e+6sA3CLPixQp8hiQTX/43vv7vfcfk/8PA7gTwMUAXgLgTXLYmwD8y1O1yCJFipxcOabgnnPucgBPB3ArgAu99/cDYXNwzl2w5YlaQiGjOTQQE38Cmr0S9BmHYNyf/5ebAQCP/NNndMzooLRbWgv10wcefjDMIS2jV4y5tWM5mErNesq6ynQbW2glbY99GmjiMUyl0bQdGHYUvqec+ZYkECkkladalsKgLjNTnZqacX/2DIrRJZHn5GhPIK9NWo8fm0+yDl/q8k3hjbaC6gHU5DKPtddnENvaREc78s0xRkZ3yqf3Td6V9/gsDbr56ANEmVFlaUDQ65rNEXpfXDKCgbuBMbMVvq0XkLkzGtydvQ5tSyb3m5/hYCkGVw8Jw89vveH/BAD8xE/9DADgcRddlMx/orLl4J5zbheAtwH4Oe/9oc2ON+Ne45y7zTl320MPPXQ8ayxSpMhJli1pfOfcEOFH/2bv/dvl5QeccxeJtr8IwIN9Y733NwO4GQD27dvnkWTwTHCPBSWykx4+HLT23/5VKLx58O4vhQVLFxsAWBJNX02YypLXh2EHrQ20gzvwTincWe9MwAYmYGTht8LHx7QXd2wG7jSQZ/N9ZIBhYFFxoH7mmlWTD2h1pMyqOZOuPbc5YbI2y+aiqpIlsGzEWGeWi+H6U5itlNySrYfBUGdSpHkKi4FZalWy63RGTRFQ02n6NL2gznxBakJ/FZOzubrLWXZnXs8Chvbamsyi0DXZrjjgISnIh9q7r5yWr7TazWmUvDM1rdOZ8nvb/3grAODHfuzHZBGyhh64+/HIphrfhSv8IwB3eu9/x7z1TgA3yf83AXjHSVlRkSJFTrlsZfv4BgCvAPBPzrmPy2u/AuDfAfjvzrlXA7gXwPdtOpNHcKC0n1n0Lashd86wpEPCkHvPZ4JP74UTbzSJu6NbC0AdL4QYlUB1hz5NdQEAiWyZFpm2qZ8YU1s98FvZZamBqZOG4pt7W2rLtA5910HaucVqb1oh7K4zEl+PMQNqmpQNV8pNWX6qLdViElDnV02Z5u80riHnaU3asxEQFIklnLLWbpC6rFiamgJgMrxQ+F99+XSNDC40xqKIcFh5gWlgedQ0pbn/lZKA8Npl6ByorT0mv8IceBOujSnL/kF9EF5aBcr/J/e2kbLuwUr08Qkge+iB0L3nv/7xnwAAXvnKVwIALrvqKpwM2fSH773/e8wPKXzLSVlFkSJFtlVOCxEHN1/SRQFAIyTzRx4NjKSfvyMU3qw/FJ4PhLl1OI0aH1JoQwooqhanHPO2CCjsXWviZ3ViApApd0AWU2MlEMQyEXCRdryVcspWi2jMeeRfjQ8oT/2sV9XKvDt27wQArAhXO8esrYWsxfr6uhkl87EQRrTH1M1e80hIRsiGC0JG69SvnhhUjss1o2YRqM1nrQ+KdkFSFToL0skhuZX2mOPY+VkEKnYlAOmxQnIfP/f19fPtA19FZFCyFpttidefwrX1PD3dibhu35Bwhdz+EpeZmhgCS73l+/IXbw++/vOe9zwAJ0/jF8hukSILKKelk07snRd30oHsQQ/fFwgzP/a3HwYAVEKZNZLI/VgIHQEA4uM7JasUrSd+koU5cp+edlKOK8weLBhiAcj6WiTvWFlKC3k0El2TIkt25yVjuTC3z2Ials/2aKflYdD0gx3Bx1vZEeCZSvLZSLdYE6knVJTkFMxCOLl/tjff8o6w/lEX5o8FPVKUQjjxwFgAzA5kHV18RvIZDtU+tnIsknnj/TJjPP3cRq5HYgo9VTScx9FKmG38s6nEzINoaM7ZY1jESL2cLu9Nb97M8/aO5J7M85u4iRKtZiXUA437xPvPWA0zMF/+53sBAHdKz8err78OAHDhhRfOrD+cc77FZKVo/CJFFlC2V+M7AFV0zRpbREOqZKGCXvtqAPvs4iGS63Rm9yUizUmOk/smaYtszpw+3WgpaNmRS0uDR7Lrrh6JFsXKIC2MiNF25r+li80wRmU7Kbih/88c9qBK/WoAaGU8fXhSbkWySokGL0XSUDegdhVKawl5+AxlCABNk5bsUkMrHoFpfhO7VQ+2j9sbqVsdS6ez8mR2xWFyJQnriy/PUljm0ImeawxOwJGSbGMtlr6flcnSgtG1CL2ZLV+Wx06ZTxiZn0UGxiwQswdp/mCjwiF2KSIuJKIjLQ5Evo8Sl5nKW8zrn3/ppQCAl7zkJfGK55CBbCRF4xcpsoBSfvhFiiygbHtwz0PJdDC0rX+lG00tJv0KmVMOB9O7EnPYm3Semrdi4ZBpdiSQyKTen1zsAsZpJFjoxQZsOmmEmfDIh/HLwoJLHvqOLK9k6Fk2RRxtyovOYBsbM9ogH8cv74yuAhBN/6ZJC4qsOMfg5JIcK66QMdu1+IYmJmvFZQ1833aBYSNTzXa5NLhHM97OE019dpXxyWOXNO1MTXDWrXut6bcto7do4rue13QOmXejYqPMVNZipozbHphNKfIb1mZWtqVh1GPF3Wtyd6GaDd66DD58++2hZv9LXwrQdVtYtSTAr7D+rZn7ReMXKbKAss28+iHoNeB2Y8AgH/3ABwAAt77r3WFh0t2k5jF8MEEZ7QhDkIy8ziCcLZjwc4Abeankyq6d+h6DL42koAaEm7JQguAftolGTK/VWVHOQNtMx72W6caj49VkLaMdAugRvnWrxdiquxULid14VCvZIF+XakRqHPa/ayQyaFNP1RzFSKWd8iTqRSfHKkuQ8OInhVlZcUudBT3bRFXO59+zknAeZljdeVDdviBlbE9OzY/kOWCvPwXyUFiwZEE/LmNl9kyn5uXFiDDtZhweq+z7c+uttwIAnvGMZ+iY5z43dOJZXo5B4M2kaPwiRRZQtt3H7wA42clroz2WxUlqxKff2YRdsFkPWmnAri+2d56mVLhz0l8XIM8wXt6wFgitAGuWxJefrAfNOVxK/exwgrAvLq2EnVR4LZQrDSyvHEYff7QS/h/KGLuGsP74PzX+srAF0r/TdJ5AkTsD6dTCG5bAMlWn/rphhGU3ly6NZ0xbSR/yczCgn+kk9ftzIE9n7n9MH6UaX7kKe0A50X9OU1xaTmy67rCzboxbZKW2mogz+ov8/ISFM46k2pYVPvE8mlarWA6ddkOyaefcYtEwAzN/Lj3OLpufb531LGxtDETjJkzthjEj+c597rOhe9QnPv5xHfL85z8fxypF4xcpsoCyzRrfo0ODkWiruz/+SX3nrk8FSOJQdt/pWqDcIjc+CxkqA/CoCQbR8tMUSGIVDjVkzX5ooqQnwrM/lMi99Tl3CIT2cRddDAD4ykMPAADWRNPs3Bl8e78cIbuDs4J/vvu8c+WYnbLGsJiJKSumViWb62Qt1cTU+N5ccyeR/okU3HSS5aAWaU2ps5+Ilm6oWUSz8b5o15+4/zfr4mNq2W9KwZWUm2YafyYqriWshuiDDLwk/PCpT9yXwZgH4NkKYCWSmpDsJLw+MFPaIiV7Pq51g7qhudIHKqIw/jNmfwPToZmWkMtIWfi9IYvV/fffb09mzlkgu0WKFJkj2x7V70xZ5hc+e6f+f9dnQ4/7FZIUiLYbkLSSnWJMHr8Tf3SJ2pwdY+vZ/YzRURI/qgYQEoRWtKqNjNZSJgsW4YxYMhnGruzdE97ec5aO2Xnthi34AAAgAElEQVRO8Nf3XHAegJhn18IYk39lhF59YvH5PQtY5P3pJJblVo2sRXzAhvRZEoBwY7Pjd3KsVs+IZiMuwYuVYDRyDtWd0bY+vk8eNZ9ZBW0WH7BxB/XtNfrOxDhmZB6JZx6534hUQzMWWf+EpGxWrpmwAV0/4w6G7orjWFTWqJXTH4ewEuHDaW8BCy3vsnunZCmMX4l1sn9/7Cj1qU99CgBw/VOegty6mCdF4xcpsoBSfvhFiiygnAYGHod2Ihxmxuxlim9dquNqDWhJfTtBIdZsJJhlkFadkTW2MmYpq+OWpWHhRIAiA3La06w2MNGBrOn+B0Jzw6VdIdh31tnBtB/tCK7A2efu1TF7Hnd+OM+ucMxh4QNcF3PdNuWsCPUV0M2QEUfIY70ud8AAPGq6QHKN4t5MVo/KVCb1xNp9pv4ksjXwaWXieC26T8Os0o7Q4z5gD9NpauI3xx4Fi4FABv1MIDCveMtt/B6JrbXzACMrBuW6TEAvBj23rgcj2If3i0FKVh+aY7N0M69jKK7duJ1NLTIYrRDe7Pmdd0Y3+ZZbbgEAXH/99Vtef9H4RYosoGxzcM+hwQg7RPMsm113pQ1WwLQJmqtppCiHAAnJzbkmaoTRSHZbdoaRyxlUQYuTsReIkFM2IVyWnfnA4ZDOY2RneWcE43D4ytnClLNrV3hd0nj1bj7fpWN27Ana/5BwBJLel2nEymjvRsBDjO3kgbShWCdJ/wHCbcmaMyH8NszlXAxOVgzaEThSy/2eylhhedVHRJZbBmHzrkEMOIb5WGjDwiSxmjSlOFsnzkAgi1AGvjJHGoANADdIa/drmYeAl06pjHWIstvE/uoyRj7fBrPaPYfsUkO7jik1gzmmZSLnHGiEMafdjYtq5f6TVZlQ8oYddSyMXO8l06fCScB6IbEODn3tER3yqU8ImMeVdF6RIkU2kG3V+BWAJSCy6ZjNaSw+aqPAlLAbHhWe951ZCgSI2mEgfi7583Tv7QGbjCdBwx8+eEjOE3ZQpvEsTx/Tg4OM+VQRQ4SbGi34ta99LVmD9tfjTj6JHO3KTUdIrZZvpuAN1+N7KueejOH623FM/bUZl3/TpdqbENWhYTten6ZxgSUy9cpaLOMvtT8ZZsjdR4AKfX5fG5ivJ9RYLIi8zXQ9q4ljClH8dqT3x5bcRvDNbEltIl3PGHmu/Q5cCnySCcMx+l0g1VKbHGsZfnKJ5cSzRTr6X15kJMdqYZfhnnz00Q270/dK0fhFiiygbHtUvwLw3ne+CwBwzyc/oa/XLHIgR52AJpZWJBJ9NGjqzm5VxFdkXHJdm5I9ABGwQ+gjtVwlxQ/cSa32ph9XESi0nGpkZY81PiCjrksrsVQXMKXItjcci1CqcO6Usz5KYuWwZwA1jlgl7SQ8rpuCj0neriZ7HA7Szj1AvA9HJEahFot8HkNbIqwl0xL5px4hCEvuS2vGkIuQr01JuMJLNIy8kYsiLcbKufB6ee8zq0mtqZ64A7n251QZp7EXdtCV75NnlyUhx/Ps9WAvIyvz5Wxdps3taz02AICo6QkFByIRx7FI0fhFiiygbKvGdwAG3uPB/V8BABx99KC+tyxaeiQ7qObVJR7QiaYemWgpd23CG6dCTgHRoIOB8RcH1BpBqPHrTAPoHABG7JhDGKWUufpJGMuovO2EMhQfdTRIuf3pGye8E5ojF5+yTYtaqGkszRL/J7QTLSPGXKvRrtr5Nuv3hpxP3xSJCAUZr5l949o6LSUFoF13ptN03a1SblHjG+yFluGmeW+6xFbbam5f0/eZtp7J70eZYZ7VY2kRGchu1hNR//M9cSUe4VMrYd757Gsx7pCuNVl/5tszfsIhS2KhWiut75ybSdH4RYosoGyvj+893LTVoppBktMOPvwoy3lyryMxp2siyozURdpdRl4fraR964DZ3Vy1n7pZqZay//Ock3VmD6Tb73rwrYaydiBG1SfaBUbKjAW5Z5Fp7CbDXL8WtWSaLFkT/WexhGiFkI/eRt0150+CD87PS5d/bG5+fDh0KR6vcb0ZD73loxdNz7JhLdZhjKWbGTKjlGJuW+Y0MYquZdSeWQii5DhXn6ZPMxmxXJlWW/pdsf9rKazOlcVGEO8hs05cf6Nrmi3WyWM3eaQ+iQf0EIha4Vy2vPs+Kdh533vei0OSrdpMisYvUmQBpfzwixRZQNnmFloOqCs1hy1H/pBpHjaMFHORZvXkSDg25RFlEIwmctamyjDO0sRmAY+TFlp5AMeaZWSyVettINz7rfDpsfBjHK9j9UAwtZambPJJ0zMDfiAGxxpJAeWce3xug3s08RtZW8662xgATw4IggKGCH2VIp1xDGh6WTehqC1tTkKlTd18xUAiM2ieLa8Y7JQ0a5KhI09/kKnCZNN0GwA05J3TICXr5DmXFuTrmBnGXE3rzTG3zXh+j9gSnOtuesYx8NhAgq0s1iG2y7Zb5xjMmvYza9lE+F0YLEWg2YEDBwAAH/jAB3D4cDH1ixQpMke2V+N3HbC+hqEj/53ZdwiikN2wlnSYl443Cps1RTqt/K/c42I2eCkSaYwmpqYn2KPppulYBoUMjpgZM21TrfMGrTo+Il15jJXA4NoOsWbI17+0nAKF7LkVUts0ySMDODaQwyAeYb7k1W/ZfScpdZaSTp8G5vi8D8xCzsFG7keTs+jYSF02X8fPRjvFyHUa/RIZeKm25R6IsTYw8GFaF+04ZU9WDdrXLDILjFJDtm1q2VmeQU0pMtCIVJL5aRlm59MAZE+Rju/pyBPm2IKmV0tFei70AM34nXv00UcTRuCNpGj8IkUWULas8V2oD7wNwH3e+xc7564A8BYAewF8DMArvPeTjeaAc8BwgPE4pL8mxh+l764+2Zx2x9ZB4nuDARlUJc0mfqrlqqPF4ESNuColo5h0s4VDTPEpEIh95FYF7MNy10mETJKAg/7pWK2D8L6FWvKa6BfmnHXU9IkPrmAc0fgsqpHnbXJsmzxqzCIDClkfXFtFV+SWFw2iAJtZAE9LduOKrL6MD4j2tZquYpcjzitr4GdofFdMRGu3qQUU/Xj5TiTw2LRIZ8pW4QwHZNyLANBJbIJGiAKOetKGebcdtT54L+jj23uqa8Om0tOKQE7Mz6wnViRrWVtbiyChTeRYNP5rAdxpnr8BwBu991cBeBTAq49hriJFipxG2ZLGd85dAuA7AfxbAL/gwhbzfAA/JIe8CcC/AfAHm07mfezgYmCH00a65cpuO0QaiV4Xn3nF+DCE3VIzUyOQ9IIgFADw9I2EvbcVJT0asfQ2vD81Vgh9YFomgy4cMxLtxMKfehqzCX41WDOrEg9wmVY/fHRVj1XIcZ2WXNLHbyUOYa2QJuuYQ21N39+Z+zMVYBHjABzTyr1Umq6kd1uqweiHdpkmDa8JeMVRM4uWpTVCH990E3L8XxAvtJp0/SYT005Sf11jIhIX6BQ80wOPRVpIRT+7zQFJADoeQ3o3jdzLsT36caZ3gIYsstJtAHVdpcdoWTEXncw8cy57vqqmtRPfm0ipd+fbrUQNwjxbPO53AfwSotVyLoADPuZt9gO4uG+gc+41zrnbnHO3sRlAkSJFTq9sqvGdcy8G8KD3/nbn3PP4cs+hvZuN9/5mADcDwL5nPsNbeiDru67Q91ItK1qJUXESQowNGSO3nRzi2kMQ6VtCLOUCSP81SrX4wbWokUlUQT+anOwT0dpLRFcaSGfFIiPxS6cZQYMzi1KedVKISUxCocI9RBOgZmS8IScDMRqf1pP6+BNiAJj7l3tsy2anaa88+sS8b7bElkVFvDaNUlepKvOGl76qGcORsmhCkGmV2K42otm3rsfiGBa35GO1P56l3iL5BzW+fMWm3WyEPIfkdtrfj1mp+Y58TviRP8pEvZIXpFkf39KibdXH34qp/w0Avts59x0IMbjdCBbAHufcQLT+JQC+sqUzFilS5LTLpqa+9/713vtLvPeXA/gBAB/w3v8wgL8B8DI57CYA7zhlqyxSpMhJlRMB8PwygLc4534TwB0A/mizAYcOHMBfv+MdeFR46UamWWCsh5eMoJhkTkxwmrK1MYy8YjcJVOEbTMMNzbESNJSA4IQ1/OJS1NJOqjacb/yXQZ5O3QUJ2BFwY4BCOZecBmU0IBjnV9OP0NBp+rqajbYijgE/Mtew6qxlcAxRaPY3DAjKfWJVIOvlLcd8QxciBePomo31G1tnpalXQl4V1GKafk40yJaCinhXup5A4yyv/rFLZLZhIM/mbeV6srQqV+U3yMPpZ+Sy50a8Xl3anHNu6m4DiexPfb+d6Zbv0TH98L33HwTwQfn/LgDPOpbxRYoUOTNkWyG7q6ur+MTH7sD4QGDeWTGwwyoLSii4ZZrWLtsNjRsxOfcZbGKxxWAUgTUMHlXSH5n8/E0XAmrrjUAiLWRU5qEVQHaegXS86aRLTgrwIBSJBThs9ilrNDs1iW+mk9QayZtNWi2i7Dx8TwuUfHIP7DUzuEe9wwAk55iaMcqxr/z3cjXdrPbm/8T4EJqrWpuQW6PpOt4HBsMIIuIBhkFoa2GqVHLmGtvkM6wtDYraNbUCQGJtfYTUbq6aKwUmyYjkiyrzzZbqz5X5TLyzg/l9WV9f37LGL5DdIkUWULaZgQdA22EoPqD1Ldkrb6hdTMLr1B51LemfyhSh0CrwhIpS+8lYCzaR9xoZ31Kbs5ySit7PaldCdp0stxHWm0rWNF43KUBCguU9TS2yW47daknAI7v6soCI1qWL0FjOMzCpJ4JxWI6r8NUeth7l52vSFJCCXNrUegAAx/9zNiBF2Bo93KXgmBlOe5brJjUu5NWX+bM4hi1nVVjvHOnrTK1lsQryIXsPv1ei3Y0V1Wjcge8deyxhJlWXcP2nx0YLbv55IhBpc6HGX11fm8vUnEvR+EWKLKBsO+deuz7BgMUvBtgx8Knmohbknq9dQy1AJesMw75vI7Eoko6ojHpPU8hjI/DS2glc1jDCslR0OiZ8lVow7JeTJmj6qjW3kZz1y+naNDJs1Z9oo+UdoXBnRH44gWUyvGG1bKPsw+yVl2pvKwpPnaYEH9zvc1ZcIPrcXf6oEe7ZqDtBMrz/jlkPFpbYIpos28FYgt8AADPDQYjNtauGGWi5UOPLd8NZrZ5nLnhdG/Hfad++HDyWPob/kcyzGa+eFV1mNd8C4Gd0LFH9ovGLFFlA2WZefYeleoCpaK1uYnx82elZPtuo/5lCSC0NFWGxHfPUWshQzRyrmoUxA4VnplqxruItiYHVNGI+Jb++zDE0nUzOOku090royru6Fgpl1scSBzDalZmL1dXwHouMCKVVjW2snGaSvqeFNz1Qzug3y6mV7z69X9Yv1HJTea5lprz/JtbO92glEbvAJTQ8X6JffHKs5dwPS/bZkbMa32ca3xJa5Bo/viGfd6ahwzzpe9otdwsqeRaG24c5SOfJffyECEUe2/y9LNPQxwbdtm3R+EWKFJkv26rxve8wHU80yjyy3UAmqU8cI/TM9zJiHHdH1XrMBWeopsZ0uNHiHJaSErFHrnaebxTz7LWM2nPOHgDAYenoe/BQIDRktN9y2bNb7vJOIRTVKHPq09pr9aI6bRlxuA6Jc/R00qHvx+cx+m4i9M5gBpBZA+b8iV+tyX4WhdCPD2I7x0auTaLhZE2Mkrs0XgNEBONArDIvl6alyMYC8BkZS+w9l/rR3qRKcs595tftrHZsfAUGwZf5722fFt3YGkh68ynFWTo2U+a9kqM4c7q2mdc2KBKyUjR+kSILKOWHX6TIAsq2N80ceY9OOO0nTTRyqlGAunpp2ggJQA3IgMqWy4YrrZqGfWuHMOPUEuTrfDCZVw0FoJr/rTD9kOBHvAEN9o3j/GOB0j7MIh15fSgMP7W0kFpJXBYJOCIE7LphlYx1triCxUQyD5R5R65VUzjGrFM0rIwV0E9fg0021CQAiFwH5KEjZml93bD4ajpKgq0SborBT1P4RD67juArKc7JYLhuYAKa8jihSZ4ihCPnHxBTZlkajyAglxUHAYDS5ZFLgdeVGdQJZ522VZPzEHYrX5J6KXZz0AatLV0TBiuDkI0oISPW/g90iSQQqwFHc6xGlFMmH12TcgVEN3bn7vAd2Ltnr7bv3kyKxi9SZAFl+zvpDOvIgmJ23Ya8YS076ciu2HXpsT3sosrmymBVD2rRZ3keBpzIzKvNG22Ri1gdmjphs09y8McD43nINa9AHQmOKX+bERbaaNqtMyMAx2KaHghplQWK2iwoauej9lHGH6YJCcqxQUDePAb1aIz42XvbZlBdnYIsOxkICAC6aaoxZyCmJlAXm4i6ZP2V9hoXhh5zzVOfpn+9Ql/lehREE0+pgKAMYMPvU2s+tSZPP3IMg8/K/DNfYuBv61U7LrsOewHs0rS8Y3kmgDtPisYvUmQBZXs1Phz8YKi75pIlpcjIEIbCsUc/0mpVSpeNoabx4gjXMKk52QmHqlEySGrDElzjg8u/uotmSEuCjpJSVR2bWgUuK3oBoqafaBchlzyiB4ar18pzU9MwPmBKnSP0lJaRPCpwR1KBFgCTEXsQfEMt6yxRCWHWZJHNNHyrYJM4v8J7tQ9e6lenBTcpTFXnZUpWO+BEcZpCFBAXrZIsy5WQYJCnz6exHJ64l3vPpd8JWgXKX2ILk2iebQ1bwxXKY+qzuwzoBgArKysAgLPOOkuZnzeTovGLFFlA2VaNv7SyhMuvvRqff+QRAIA/GrfFoexgY4n0T1p2iAk76VJPN1uO7rijqlaSqLLZYSt1jURDkste4LaumfVHow+b+bKyXU4lgl9Z0ImsZdSmXV50XhtD0AISFo6kaikn3egTahaWOPuJOZYWUA4jpSbN2HCBWJZLzcx5ddYuahTNIPA8WfFJpQy0VuRzzHjioVZJ1K5OzUBaB5KVmBIiLEuyWlGviXGGdE0R/GOAYJnlkEOBLWjMz8yTqvE+pR6tvK2Ba/pkI/Zevrdz586kJ+BGUjR+kSILKNuq8fecdx5e+qM34U33fhkAcP8DX9X36jb1sTX3KRsdLQC7U6lPL6/S56OVYMty2ctdYaBCc1XpmNkoMzvA1Evh2KkUyEQKLok2J0Ui4f+1MfvUieZhV17jgw3Y80yLcSRyripHfH8/O398oUqORU8MgaQjLIzpZiLcZgyj7VpGLK8rfDaemlYBcQ2tkmtkxBxVvOYYbecnmWnMDa4171sX4bcWBo3kWhUyzUceZ8tmsx5/eZTfwmB5rsjXz6ALrZs0MxPmSyHNx6L32YfBZb8HG3dgXOPss89KYlQbSdH4RYosoJQffpEiCyjbnM4D4DzGYlaTly4sRIJ6YzYAFLNOTRcB9iSBHDFhmdLKKtT6UmfalkrAMRMCSsR8Hxku/pWVANXctTvU2LMKb/VQYNclGw7bdAMxdeOZ4pLXu54GlVpxyIAM02EM5vWY+s5ngTSkLbrs/GQXYnGZmuKytiW5vnFjYL5Mh1UE8Ig53TLoGo9tJMhW1SkDUp1xISZ8Am36mbVZsC0HyADza9L7JAfUMPA7w6tvzsPV6bzKC5ilGmHMdj2fT55HDsE4Jg+qRjcjBf1YmRfM04CqCeLlnAZbkaLxixRZQNl+jV8BAwHnWP659aNBm04FuksY4lCsglbZdQ1YJi9gyNJUAwNFrcm8I/XZ61L7TqhuRcZYM//Rw0GzK5iFhRGiXcntZ7vLtGQDIrx3FNY/EpDF3rP36LE7haXnC/ftD2PZzFI2cKc8hDa4lMJJ9bwKuDGpJ2Yfa71BsqZw/8/adRYA4IjwDADAeNwkY1uF1soUxuLasSOkQvfsPUfGhEHkJJhh3e0Tnwb5nNVFjHJmdLoz/HZJuExzicmx2hVnTjNNIPIXxGPczLEKiso0fT5/Z7HNmfae4cjfQrQvdmQKn93Q9H/YuTN8jrv37C0AniJFisyX7df4qLUoxKZUKkkJLQ2F7VY0J9MWtZvdfSufvqaVjCwCMpqSMF7l3OM2K+pVmqhoNxgAaNqQvhuzvxuZTugryxy1KSWtpeSYBTbURhOxMA52B/TYyeqarFPgpWx1xwIl7ctmePXJyBLvAk8cXjf3VK0PcslrGbRYSitBm4+PrMVrblJ4aqUchAQ4xfdsBxcgtj3PuQJtui322ctKYbPrC8ekfjklT+u5hIEni+9k6byoZG2xV679U1i3JeCJyyM8PF331jjvpLhIC27MW5sw6HD+5eVYKvzEJz4RAPCd3/mdeNOb3ryF8xeNX6TIQspp0PimbFO0OwBMu8NhQfRrSYwhWoPAF1tC6mpG8cOxY/GRl0mgYPxRR1CJaBjCeSfCaKulnhbYQb92JBqTICPxrzpGWM0m7ZU8I9VkrDE6fDR23VldDZqykWtjxFZJQ9hLwABghkJYsrZGLZ2WLTetBXZoiZA8iiaWbMSBhwQ6bZUMu8lkcGVaLjbaTO196MBhGSNZhDa1GmwUXoFBnl19OFlKVhHmC+MaLWmmBcTvwiyMmzimTmtosh4Cyu5rATzUwOlnp2s0saic2IOgK76uvr8t0mFRUQa9rrLipnD98v3Ukmwkx/Az3SXxGQC44PwLAQDXXnsdliWWtJkUjV+kyALK9mt8D3SiwSbm5V2yU7XCYEuufHavHQsvPZlnAQBNVmxCn1+2/cYWfNDJE4et8an25k5qoZBkhN0pkXj2pp+sCxxXtGxr1yT/q8ahDwiePmoa0iep0mPEuGVMIXw8zAyEJ0JG0QnkOOsaZHVKHg/IMQBdN+uXqqZSYolUC1p/Os+nx/eyvns21qKReZlDP5bZ/HqU1HLR0t68pBcmn5750fr6FlxwWgCd+vh9cYcMaryBa05tXWmmIc2ybFSAk8cMSH02GkYf/5xzzg3zVANsFRBcNH6RIgso207EAV/h0ssuBwAcvvsefWf6ZfqsYYcbyM7G3u0s9OgqqxHSKDXzsOywY32qGNRNNf5u8ZWGovEPicUR5guPS7tCvp2+61HpfEPE3sScx4uWGIqWJmaBYxuJfANAy759TapN6V+TbIHFQvaKBxIfcbKGluaTBRVMU5SZy7rIxFJlM0RfI8qM15ZqQWBWy0VFxkIrTtZDKMLMS9bt187ZKraCcQf65+H9qPGNFeJyRCDHpBF62y23y+IxG1kFSpbCY/V1ZK8bK0H/Sb+vOR7Bzj/PsmA03+bxj0eKxi9SZAFlSz9859we59xbnXOfdc7d6Zx7jnNur3Pufc65L8jjOad6sUWKFDk5slVT//cAvMd7/zLn3AjADgC/AuAW7/2/c869DsDrAPzy5lPVeOHLXwYAGD/ykL56h9ToL0saYzqRFlQMFEnQzDe2OEFmZNqF7Zk9wT/RTCIzLq2qJQmOMBXF90dLhjde0i33778PQCwgWRHYZEOOAHOe0SDAWM/auRsAMJRCGMJi11cjWKYjaw5JfLPWX5ENN84/kfc0CCkm865du8Jzk+7skJrYsdYl5XO36SqfNSBVoErWHBKYZZ+ZJ6lLQLYhmYP/EHxlGH6UGUfeUzNdWYKCNAaA07osfZeb+ClVv7xH6DdZh7OgpJtNt0XpBxdt5C8o4GyD2xfbkzO9l7I07d27V4/Vz/4YZFON75zbDeCbAPwRAHjvJ977AwBeAuBNctibAPzLYz57kSJFTotsReNfCeAhAH/inLsBwO0AXgvgQu/9/QDgvb/fOXfBls7oPTyDb8sRwON2Bc3oxlLqKtDRsagl7njTJhaU1KKpmKqrdPel1rCll2nwqJb5lwbDZGxrOOvcgIFFQoDDHNMuRNJYpONM8KqRVN+hRx4NY6Wx5pjtrQ0rUE3tLLs4Azaq6QmeMZjRHAZLxTJeD/fNsg7FzjNpsK1TRtgU/AO5E0HSQpKuJ5CmrQoyxp0m01YJgEfTa6JlNXAn12c/swzRSvCPanVd4SykmVaANvbUtCq/BzbFmL6njz0AoXyMRkj5+kZ5vTmSgKKq/uAePyN+RyzTzs6doWy8mU5PapvsAYBnAPgD7/3TARxFMOu3JM651zjnbnPO3fbQQw9tPqBIkSKnXLai8fcD2O+9v1WevxXhh/+Ac+4i0fYXAXiwb7D3/mYANwPAvn37PODgRsEPno7ivrNGd4rpKNm4KinLXWPPu9r0qZP/a8HDkj9P/UYD2VX+eQJGCLVUjOcsd/qwZl+6VLt2WYHJ0PbOk0tqBH7bkdiO2tVob/LaM4WmRA1dqmVtKTJ3fo1ZiLXDApkUKhquvx6k/uHYkziDHH8mnaT93SDz9/v6dn3xklKNqXDTuKQ4RkFWeYrOWE9ZTIK2TITFEtATRXkFSWqcA3h0LnMdOX8/ff6cndjKXNAN1z9f8+f9E/rmn2Esls/wrLNC+nnfvn167Pd8z/cAAAbD4YZgICubanzv/VcBfNk5d4289C0APgPgnQBuktduAvCOLZ2xSJEip122GtX/GQBvloj+XQBehbBp/Hfn3KsB3Avg+zadxYc/Um/t+8Zv1LeqrwWf+J5bPhSeNwFIc3QcovstS2INWT53QTdJ4bgsue3M7qf+sg7mmugHix9vt8KhgGOynnZcQieZBqs9fEMfM+ghln8q5VfPhqw9AHsow8Kg2ahyBLWk/rQlNyFElB16tQuOxFimzayVs5Sdp8tKn/tEjwULSVI0S5V8DnJJjMyrBZDOFa6xTq5Rx/J+0de3LLsaK0hBOXp+9d9hxsgaMgtlo8/KVBcl69bV9xTpxGvj5zxf7yrJsZSrE6K7IuQne8+NhC4XPv5xYdZ2alewoWzph++9/ziAfT1vfcuWzlKkSJEzSra5W274Ywns5Vd+nb711SdcCgC4J+sJT9jqWDCplljIZX3FlJyS0fa+trki3N1HAqnV2pRpLB0iZEB9QGqcKTUbw842ExDOPRKYLc9DH5xwYgAYsoOOhJxtRD7Mn/rbifBalbJKxHabJTRXI8Op1dFHWhlhq7sVZcQAACAASURBVNRkXAxPazIMeaGKT60OX/UsnNpVffF+nxyI103DhH0TWpfGG+yYPHujnxnnnF3R3L56/RHy7Iakl2XiBGbsMQT6I8mIlJbLd2QkdGnnnBNwcmefffbM2K12ygUKZLdIkYWU8sMvUmQBZVtNfQ9gvY4m+sCadUtSAXdWgB82B0NwrxKI6hLZacxWNRVe/cHOUMvvBG47WQvsuDZ4QjPIkXHHBdOpduktaA2OclSHeTvhAuhkLU7GdKymM2CKofzPOvmuCedzDavQTIpR7sO0zoM/mRhIcDQpU4aiKG7mv+lqWEPnBESkLL6zKbrxkKnKlBGn03RePBN5A9SslWsm02sE8sQ1NWp6y7VLMo6PnfnMxhyvbDoZC66+PwsQ0rSeBlWzdmvmc+btbTK+PuX6N9+5SJCbXlv+ydmsWs4NoJ+MfJknxsUbVAQnhWNGy+G7tnxW+C5ecfW1AICrrnuKWb8NIJ+kdF6RIkX+55Nt1/je24xT3HfOvzAgfvc+Ljw++ODDAIBOoK4RmBB3tKhoCd3lLsxdcxaY4oTVZtqkTTL7wBQMtpGdVgsmuCtnY8MY0UaE3QpIpzeQRq1a2R17di1dUs0xyw0IxKId2wmIakevQ8EskhpVTWeCY3LskrQPJwvQmkCpJxPLm6Q5p2S98dplTsMRQLDShJ10CKRymTaECbIhlZg+TJ+nIteowWKXjOkTTbluEfZ6rEKrM+96lHRi4mcmFu6OHcESJvv0jTfemDzaeY9pLcc8okiRIo952VaN7wAMXfRpKrP/XvP0rw8LOhzKVv/b578IAKinQfOQl35oAZosvSQcVnvyieZsTYmncsjFtQARHKL4F7N7jiUeMG3ZXYbpwswXNGpEtWcGxtF2x0lxSKohlbe/mvW9c1Guukwf2j5qVLR5iacW1dCCMW5hxfbhyvqT8fT1WS4sqJqyl+AoWYvlrKOPz08x753Xl3CL3Ws4B9dPbW5BP+ljvJfpXMmY/gzdxjx6c97baEz+eeY99exrLMYh486KcFLSErMMPFO971v/OReNX6TIAsq2s+x6ACvcmSzPuPjCEFKB6Y6ww02OhIj60rLwha9FXnpqn6lnsYlE+dlcxvDRe8fuN5JRGGYll92sJpiSlIIAGHmd3PXqE1oue66tS8E4LMGtTFkrAUCOMYOZbiyzkNR5hTD0s6dt9MG17qhOYwjaNVc53ON92rUnAEPG4tOvCn8/rZ60N18a1WfRlPLgK4+eKeXNiDC8ls/mmh9KvsJBXcf+gEFoXSV5jRyMowZdCkiynzPHR7AP73EPzHqOYaJxmS1AZuOxPG8cM5B7SA1Pzf6Up4Qo/kUXXQQgjbUMlSl660ihovGLFFlAOS28+jFAbysZwh70uCuvBAB836t/FADwZ7/3HwAAIzJNTU2JKrU4lfZEcrjaX96eWM0AGdNwOeGRUWWTM6emretUW8dOMbNFNTGlrFxSciR9fLMi7u5LYt3ILj5D/GA7uWSUUqr5Cce1OX8W6ehqfTJHX1bi6NFAdDKR+8yMQCQjibqCmp0anRRezAxoCbQtiKFfru+lPrjNYDjJUGj2g/e7naN2ETMWvKSpxgPS1627zbLrWNhDCq6Z6ePasnmUpasnr8/XmGFos/teGXAK/fRlwbWwE+4LXvBtAIAbbrgBQITwHq8UjV+kyALKtkf1Kxd3SWedM9ndd54buoJccs2TAAAT7SITBu0wOU+Wl0ZCCPriovmN9lDfuqPf1tinkQQjQcKlaC/tl+YzTWnLQmdy8dRoLj9UzYOBTzUxNanGEHoKV7SDLKPWcsxoeQlRpDuQRH3brAioL3tw6PDRdP1VVgiVFN6knXQZO6Cvr1z5lk6rSz8rjcyrdRLPRyKONotrdHO0rZV5WYIu08x2HvX1s5LedPpUV/qNGDMziVkhLiKNYQCxUw7z91dccQUA4Ou+LhS0kWbLCgvAjsUKKBq/SJEFlPLDL1JkAWXbg3sO3piRs+YWA0WVmDQv+O6XAABue9dfAQDaB78ax7SpzRchlzS3TTpPzGptu12lASmKbdFVa4pMGmyS9YaAITXrTboq+8dloA0buJtMaNqvJ+/lcBR7n8imw/VzbZ02zbQsuOLyaEDQJ+vOjwNiaohrmdL9aGcDgeRD1LbnXQaH5vpNPiya6wyyyhrcbEAtpgVlDQq7JcxXxpprVlhy9n2KHIIyt3E/clBSDs7pEmP/2OG8yn/A7w0ZkQQOXZl0KtN45M3/1m/9VgDA+ecHKHtf66xjAe5QisYvUmQBZfvTeeg04GW1LRUJizfOOfd8AMCLvz9Q+X3yI/8AADh06Gs6ZlkAOyNumFJ2ui7gExvcG9GSEM3fZGmXAcEinQm0EJDSphqGhStM65kN2wB40pScalmjMDSdJp1/FEhTp0VAVuFEbSHXw2UL2Gh9EptyaipOg55isWTnT8pyCaTKuu1UWi5qOOyV/z88pyXUZCWrSZtpPmbgG12LudbYDluOyYA1DKwlbbJZKp2lWvM5LLRZDcecVWfreJg4ZoP3rGYHovXEQB4A7N4dAFS7hWnnBS8IGv/iyy5Lxlq2Jmr8Pv7/uWvZ8pFFihT5n0ZOg4/vAJf6YUCElw5yn1s08bmXXQwAWP/aw/oed62VJqQx1qfUVmEMW0kDQDsmkYdYG3Lp3rOlNtNLcS9cXZeSYIJAtEVy6nu3his/ctWlj3VNEIft+sKUH1+R5212fyxLbUPCilSbKxuugQrT96a14bWXgGgGTaEZv52kEdTmvDZ+Lob0Qv3nnjbYdm1W8tJjl/cQMEMa5f/3yWPkz5tNd8Z0KslS5LNjGlGtQEPSQiizvpSmV2vzmbGMuMq/p3mcyWLTsnJfpkiXJf22Y1dM0Z0r6eznPOc5AIBdwqNvEEIA+v36wrlXpEiRDWWbNb5H6H5L+KT1p/UQAMZ/lq47r/n51wIA/uv/9ds65p5bbwMAHD16AEBk713aGQp9Vo8cjmeWnX/njrC7ro8DUMVL6S6j/tax66qG/8h7AlBREgl5nuAzUy2nXU5raiBTHMJTKhl8TkoRpLK+J8coSQdPxHsao74zxB6O3XxS/zfRzKzllXtZcy3y3CfdePNoOMFE8tzP+u25RKOG1s+sRaFl0Nl98XpdNpORQoIVqlunFoWzKi/D03C5fRpUm/tmhVUbdcflIC8WBCP3OyRzZX8HO4R67rU/9wsAgGXx/3kvq5xZ+jilaPwiRRZQTouPz6iss1DOKQtr6H8KEaH4skMhJFg679w4186wG44PBs3uV0nIER5HBt7YuRDtfnQ1EHGOSIM0s2GbNanakGKUNtX0lWigUY+/FQk4sk61Npos52zEL68IBZa1aZTfze7PTUYgEudPqk+SMXkUn1aQjQYrjqJKtaliAUyPQdXsqulTf7qP9IIR9NkePpwr/h8tldRyySG79pp5JUr7RWOtSzMBvZkGPXHykFghs3Db1LeP0ONqZgzJTUZCpjEQOPqznhNptH7jN/8PAMCyfHdbgaXX9YkV5eRSNH6RIgso26zxHYBKyRdtCelQ6Jp0q9aItGh+6Un/vG9/oY7xB4Kmv/Pgh5KxrfTbs11rGlJfSSR1Inlv7fuuOfW42ojYYs6fj0SkydyGuyonu8j70/X2WqfmygPnao0YjZytF3l0OZk3PXaWWFTGWCMBjGQHbaS97Wid2CImFuPIZzVAah1ot9wejZx3uGFco09Tmhf4j4xJPw/AkHOoQiYeoT/bYten1saciH3vmjiE8QBiMExgg5bbSDQ8i2nOOy9gVZ7whCfosY+/5BJZuFgJgo7k96mui49fpEiR45Tywy9SZAHlNHDuOQwl5dTA1IfTnBJTqSWfvnTHoen5+Muv1CHP/fbvAABM18Kxn/nwR8IbYhYNB3FfIzBoKpx9EavBoI+Y/oYuhpxvBINAOvfQA2iks443Aa9awRoMvqV8d3CzpppnYRDdBJqrAst0bY95KddTZ11avE1H6mMaqNPVksPduhIKkknTeryeLuEMlEeauTSR2TWIQb8egBMLbTgJTfw0ZZe5Wlmrcw3kGfM7b3gZYb7yOh83qLvRXqgax5t15WZq6zNeQ8utyKDeTknVMY33lKcFNp0XSCGOveRYCCYu70ky8XVNJ3W2IkWKPCbkNBTpmJMbdhdqz4GUHdYSAJkJSBmAyhWyYz741VCq+6UvBC7+dQnqTdeP6rFUSmO54uWOcFMJxjQCUElSYNwXZQ0dwT6yG4s10pkAHgNl5NNTUa1hILsadJNrZ7Bsg7JZTcmxuw/TVpgNWimrUB7MyyCprR1CbkCo6pQ50pQdYLjjGETNwDNdpjnDuXKtnY3BrMzAoPm6dskxEs2Q5Bp1LmriJGDXJUP1dYJ9EiutH56cg6Uq890mNz7Zc6697joAwIte9CIAwDd80zfPrL8WC4JQcjIMj4YluFekSJHjlNMC4GmbsGsOjA9eD9OiilzTkyN/bLj4B7Ir7nnCpQCAi550FQDgnoMBwmu77nTqr4vfLFpam9eqT24gqTkLrUu1HwE3U2/XJBBd4QacTshhz7lM6kl8+Fo788xqC1mU/qcgli5lwdXYiNFwuf+Zg3w05WXSVxVSaHFeCtsmqTnRwCTpIJ8hV00tbjUp2XqzuIP60+Zgp9DuTGvnKbmeFJvPraYeTX98krL1RqZcYWIW03IkzMkAcPaePQCAK4U371//5E8AAL7xm583s35+B6atFJUJF2Xx8YsUKXLCsiWN75z7eQA/hqB6/gnAqwBcBOAtAPYC+BiAV3jvJ3MnQdhsmyZG200TVY3mKlyV5bP0S4nrMRzkY9E4T3zy9QCAHeJUvvX+BwAAX7v7Lj129eghAEBLjnPRyCy5rTyhtVHY248aLWYCUuiuFcYohsMAy5w2IYvAGEYCwFBYrJybGz/ptHp473VoxpAbgTEGHqsVT5km5iEKDTb7f5t21o2av4drXiPYWrkSjiHbrvLJ2yIaLkksOfWf6b9b64OWFam9eB2pxm+NFTWr6dEr6T2lNZgeo5F7GwMhsIx4Hfk8a8am5Lkl1zj77ECu8Suv/1UAwA03Piu80c23Poai6UkgUs25juOVTTW+c+5iAD8LYJ/3/nqEPs0/AOANAN7ovb8KwKMAXn1yl1akSJFTJVv18QcAVpxzUwA7ANwP4PkAfkjefxOAfwPgDzacxQFu4OOubpVfzlfu4xjA+FTGn17RYopw8KVXBR/qptf9EgDg12WHBYCJaOB16QU3bEIcwMnrzTgYK63t/y7bejMNBT4D+rls8i4UXLXhsudb40mADas2Erim3eR5JQMWjih1VaoJqp48MnPvhHIqEURP1x2n5a2yfloqrIsyPvR61jMgFsjoCuJaNPIvD01aBBQ1s/lsqSoz/1+tHnPoVLIdky6lUou5+NmYSKvrE2vGZdkantfEQkg2wpgTLZRG+hBWtbXsOC716VdWQsS+XgoRfPYgBIDLrr4GADASzd9lcFy7lko7IoXXhiz/zYrXTlQ2ncV7fx+A3wJwL8IP/iCA2wEc8KSvAfYDuLhvvHPuNc6525xztz380EMnZdFFihQ5MdmKqX8OgJcAuALA4wHsBPCinkN7HRbv/c3e+33e+33nnX/+iay1SJEiJ0m2Yuq/AMDd3vuHAMA593YAzwWwxzk3EK1/CYCvbDaRgzEPYY1GI91Gb6ZQSB6sQZilAPo5R2r2/7df/zU98vd/OzD33HfPvWGe5XAsWXp2iLnu7P7FTJm8NFkPboI20RzO3r5Y8y4mmjbwZIAwXhh50xoJqMW0YTpn25euQmoyDwazACRComPpuLgSGSY1aRumAcfsunrSYDMMPGwnTvgqU18WEqy8+gwepq5LygYk86mrkLYW26gtdM45wI8hZyOSE2TXw1Zgkppbjp/zdCJB2hHTbOG9oQDOzhY+/CdcfrmO+cmf/EkAwKWXhrRzHpjtuw7l4K+quceciGzFYbgXwI3OuR0unP1bAHwGwN8AeJkccxOAd5zUlRUpUuSUyaYa33t/q3PurQgpuwbAHQBuBvBXAN7inPtNee2PtnLCeTuN7n76Sv8OZ9NtDJSxHN6p5g/a+7wrr9Bjf+iVNwEA3vH//gUA4JFPfAwAMByEMeurIRhnU1sawZB5tYtJBiixNeoakxRtrhpe2k6Pqgg5XhIW4INHD4Zj52iyhIcuaxCa16i3Rgvz/uTpLy9FR7VYCUlAk3dYp0/nTbS8T0YAmvJLU38GcwUSLcVG47weAUOZgqdWINKd0iTxs0lhucn94SPTtJIW80yRMm1sYLjKoUgLkjVHGUsTEIFgOyWYN1qRdtZn7wYAXCb89z/5sz+jY2644ekAgIFYlcoLSIumJ2A381r+ZT9B2VJU33v/awB+LXv5LgDPOimrKFKkyLbKaS3SsZJ3G9bnM76m0S9aZpoWiRCc49djV5lrnvVMAMCLZFf/ewQN/9lPfRpA9JFxZF3HtMLTTzBO14hmJFyWvd2sFiR/vvIKpowsjcnn1UzFKYNtv6bvo9HLXW5Cmi3Hf856yxbVhEdrutKCZrTQJi3siXrYwEupeBUSLMcqrx3997gmpuhaxmp0LD9LWwTEc6fFRmrjZM/D/1mR0UwRL9durqNOb2qXlRnbUuRdUlo7kLTdWbuDpr/62icDAF728pcDAJ79Dd+gY7oMqKN8/T0w3Ny3P1VSILtFiiygnBaNvzUvpV/lW/83+psZNz6PNcAaSDHLU75+HwDg4a8EOO+9DwZ478EHHgQQS20BoO5CoUW3NpYpggVAwIjTYh1bZJGCTEhowbVOze6/Ng3WRSVWgs/mcKrxZ338XFgM1BgwSITmpj4xgUcV4xAD41dLcYjLYgZ9JbYR3KNOcRijpB1yzWbJ63pNwlSsPfnEOjCfd6trkK5HjAew3oYHWoATL1mO6fQ8HJMCeYBYDh0BQRJJl89lUMeCm8Fy+P/sc88DAFx19dUAgG//jkAK88Lv/i65vji/EpUQglyn6/c9PIwULYA6yRZA0fhFiiygnJZuuSey31gcAPnoB+xeS60qWqsy/i6ZTSmXXBNglNc+GNCEn7vjEwCAow9EdGHrQmEPI/2k72rW6etLntxgj32Wj/bKRCuRdBPiVn5+JVvokjkiIjZex7w7p51xbVSfcQbfny3QpRhIrXbDVQ0v1yzlzInG55rU6WZ0nGy74fomphordq3lItrkubVYOE/LsmWkY33P/cl721dZFDzvtANEQhgt3BLfm7z3w+Xdeix7211+ZaCAe/n3fz8A4Nu+68Vh3iZliQZiBiG31fzMK7O+fV//vpMhReMXKbKAchrINr3W47oe4smZ4zN0k92phqLpcyqpYR18e8tn0bDvuzirT3xqoO266slPAQDc+/kvAAB+4/W/omN2CIFCdzhQeA2E+79tHw3zM5lggG+x20uGMmP0ehQ1Wk3f9UiwIFQLUYXy2k1cQOmusjy7IslMBHraZCW29JFJEurDPWGPASBqv0ifRY3MklgjeZ5bHhvPeAMtABuXoS+fZiw0LmCudaoaPS+1JfpPnidpD64tvYe6ZFo/JqJOBGUtn+9oJUTsWVo73BULbq667loAwI//+I8DAJ62jxlt+awUzWnwIPqYrkU7Kfdo85kc/wakI8cjReMXKbKAUn74RYosoJyWdJ4CP+yLldqWybHzgDyA3bWYhsnSPiZQxH/ZqqtjAYuANy7+uicCAH7zd96oY/7j7/wOAOCIBPwaadm1IjDQ8UGB2k6jqdzRbJYAIxl0GXBskfgFYU3DlJHIZygdb1l8eX9cMoWBPJvgZ9YgUiG0vD90AUwNfw4+JginUzALzBEpXJj3WE18PlrIq6ZCkYzpg9n47JyznAA+eeiTaCpLUE+CfUuGE29JTPuBALXYqnrPOecAAH77D/6zHnu+VJgu7QjjlUuR372s7h+IoLMIOJpfZJSzOtWa+9vgIo9DisYvUmQB5bRCdrskTbVx0KIPuNIX8JN3ZFITwMmYaz3SktjRKOzgFz4hFvb8yE/8VDhWWHtu+at3AwA+/uF/AADUgxD8Gx86pGOao+wPELSIF5hvRaiq2dBpDXRSrDMVfTcapHz9zqSGagEYjdfSoqKJFNrYQNGE+lOYZWLKT9bKe5FUOqcAJNSphh5PIgy6HgnfnBQeTdXKSYNv06kBFcla+BrhsAoQMnk2luqqhiSTMG8iueeNRUQYLAuqIlNvmGN5hxTXGI1fi6a/4HEXAgC+/tmhbfVLX/pSAMCVT7xaj41lvelzcwByqXranM8Trj+3+k62FI1fpMgCyrZqfI8UvuN6HfdNfP1kvjTVt+G58/EyhHDNyLtmOvU8+cmyFtE8opkHO4M2//g/hF59y7uWdQyhvzV97olotNVVmT/e8sm6pL3khiyJNoqcdWkKEoipvU7mYRxjImMGlrefxBgKJiL3vrzfsAgpXjPLWBVizJQgr8dYH7Fqme9JelVSp9Mm1eoAMJ222WuizdmHwMRLFIFNcpA2hTDzU2enGgBwYtktSWk2U3S8xqFAbi+59DIdc+NzQ0HNk4St+TIp5772+qeG8xn1qCEnbdF9aiTOn/0OTtL8ReMXKbKAsq0a3yGw6fZp+pngPXf5Hm5znS9WtfScaeNXOJYusRaEmBA0/WcCRi67PoA3nrcStMj5lz0BAPDoA/frmA/d8oHwz2qIC6wfCJF/0luNzPxOVFqTZTl4BEs/B0Zjrkm8gdYHsmh+0ummSiGoLPoh1FiPM1pldRx8+OUV8YGXpNy3Gcv8Fp6cgnDoa3s573or8QAD1KpHS8k1NtpDIIU4A0BNVl3NfgyTMYz679x1VlyT6DJG3S+48CIAwDf9i+fLdQVQzuMef5GOeerTngEAuFo0PjKjs8+gPFWaPpeTTblFKRq/SJEFlNPSO28jyTV/7uv0af75s6RntqIephyq9F0JL73Mpj3ogsa59OrQo+9yeTzw8IM6phET4rD4+vd85rMAgEfu3Q8AOHroiB47lO6p3VQ4/VkuK2uddOzNZ7IforEwCGOOHg1w4olPobzhYPLDC2FIm8KIvVgCExMVH+4KBSlj4ZSfTNPinMr4+BOShCohifj07I3IngVmTXpNEjuoxAJgzp++PgAMZX0s9mFJ7LLAk3edFaC0Vzzx63TMXimiISXWJUJw+dO/8AtyAfzKzxYzRZwDkuen6kdyanT51qRo/CJFFlDKD79IkQWU7QfweN8bsJitVU5lHuc8gJnUX6/kpKXTfm4zS4aSV0jRtI1+QjBFzz7vAh3zyteEqq1aJnrHm/8MAPDRv/swAGB6+LAee/RwMPvHXw0sQKvrAZSzIoG1CJqJLLi1BPoaQlBXJI0nZvDhgxFMxHXXTFlWYurzdolV3TYx2LcuqThtyTVgBSTN+Shsd8UgaDPNK/nInBs/H092G0m3KV+BXOvycmw2OZR5L5VA3E4x7Wn6X3RJaN5004+8Ssfc+M3fFP5RX1EAMQ17DJCH0ARZWVHJ65LHE9GKp9OM34oUjV+kyALK9gf3PGL+5xh6/zLl1NuJ5zh6CNdkVs2GdobXXVOK8lS52bL6/6oyKSgGp2TQS37wh8PjD78yvGC06z9/6UsAgP/75v8CALjzzjsBAGtHA9iHrEEjN6udvABdBlLZsy7pw527dsb1y31eOxICgIQAs0HoWFJ3AwPgmVQSJGQ3HDLwMBhnLKSGyBam4Pixyvst24tbLkTy/InGJ9vubgkq2u5Ej5NU3LNufDYA4Fd/438P5xXYMME53n7+CnlN1z2U9KeCo2yjStbmS4B0KGsix39dzfJGbP6Nm8+jdybo29O/giJFimy7nNYiHVt4k0MglVcNaZmi3ali6m9zJp9cHAtkyCWXFXOE/6WTS14sItpkwPfHZo3UOMIT58RnJcOMH0Xteu41oRT4J345tPVWcE7WUcdaITPxEbLIys3497//+/rWHbd9FAAwWpG02iRYCcui0c6WtR589ICOGYmP30o8g1YBe8Sdc945eizhtWT0aRWME651h2hkm46ciBWwKlbHDc8MTEg/+IpgEVG7A0Ar8GHGPMjPX6/skudiURiAE+8UuftGYs3o94qUePUsEImGFSHHox7e+/mykYafd+zmendzaNrxSdH4RYosoJxWjW/BJpHvvL84gWK71lAD11vYQfP9uB6QE5+TMbJrykIFxDKohbxD4LY1tS4zA1Yz8DLIRycvT0UrjW2nmFGA5J5z8eMBAHtVw6er3ZhgNb1PP/Rjr9b/v/vl3xuO0I69KbFH1VdCOg6ZBWrBj91xOwDg/e9/PwBg7WgEIA0kBsG+dOuSlaAlsFs4C596w9N0zEteFvqskmuf/PQE4Zx9QcyQTMSyoo/t9XW5q2JxWZuwFeuI2prvOdX0Yc7pOGZKtIQ3Bo3CQ5cFLXrlWDT91uVUQ4KLxi9SZAFl+zX+nAh8/upAXzl2/71PZmdh59v0VbsTVpmPV+edSkeb75t19rjct9fmazgBDvXrbnjmcY/tk73XhcKVC54SOr4eNqQj9JPp2zOCTouFWYlrnvQkHfOsZwVW2jxW0Sh5R7z20ZwClcFG7Mw9Efjwevp0uDTqOWgDrMj8Ex7LwVuWU40DKBq/SJEFlDOmW26RM0PyPgZXSseYyy+/HEAWDRfNTo1PkpFYrjtb18p5SRVG/7ovV17k1EnR+EWKLKCUH36RIgsoxdQvksiMmS6JpboHzKIsxwxGRpL/8HrPGG1zpik0plF7WJTP+FKXx64UjV+kyAJK0fhFEpmXSmSqzupgWgGxyCUNDDL41xnILi0JBgIZGPSSxitBvu2RovGLFFlAcX0dak7ZyZx7CMBRAA9v20lPTM7DY2etwGNrvY+ltQKPnfVe5r0/f7ODtvWHDwDOudu89/u29aTHKY+ltQKPrfU+ltYKPPbWu5kUU79IkQWU8sMvUmQBJc+L+wAAA4FJREFU5XT88G8+Dec8XnksrRV4bK33sbRW4LG33g1l2338IkWKnH4ppn6RIgso2/bDd859u3Puc865LzrnXrdd592qOOcudc79jXPuTufcp51zr5XX9zrn3uec+4I8nrPZXNslzrnaOXeHc+4v5fkVzrlbZa1/7pzrKzo/LeKc2+Oce6tz7rNyj59zpt5b59zPy3fgU865/8c5t3wm39vjkW354bvAWvkfALwIwHUAftA5d912nPsYpAHwi977awHcCOCnZI2vA3CL9/4qALfI8zNFXgvgTvP8DQDeKGt9FMCre0edHvk9AO/x3j8JwA0I6z7j7q1z7mIAPwtgn/f+egQOlR/AmX1vj12896f8D8BzALzXPH89gNdvx7lPYM3vAPCtAD4H4CJ57SIAnzvda5O1XILwY3k+gL9EQNM+DGDQd89P81p3A7gbElMyr59x9xbAxQC+DGAvAqT9LwG88Ey9t8f7t12mPm8mZb+8dkaKc+5yAE8HcCuAC7339wOAPF4wf+S2yu8C+CVEtsdzARzw3rNjx5l0j68E8BCAPxHX5A+dcztxBt5b7/19AH4LwL0A7gdwEMDtOHPv7XHJdv3w++orz8h0gnNuF4C3Afg57/2hzY4/HeKcezGAB733t9uXew49U+7xAMAzAPyB9/7pCLDt027W94nEGV4C4AoAjwewE8FFzeVMubfHJdv1w98P4FLz/BIAX9mmc29ZnHNDhB/9m733b5eXH3DOXSTvXwTgwdO1PiPfAOC7nXP3AHgLgrn/uwD2OOdYcXkm3eP9APZ772+V529F2AjOxHv7AgB3e+8f8t5PAbwdwHNx5t7b45Lt+uF/FMBVEhkdIQRL3rlN596SuFBL+kcA7vTe/455650AbpL/b0Lw/U+reO9f772/xHt/OcK9/ID3/ocB/A2Al8lhZ8RaAcB7/1UAX3bOXSMvfQuAz+AMvLcIJv6Nzrkd8p3gWs/Ie3vcso1Bk+8A8HkAXwLwv57u4EbP+r4RwXz7JICPy993IPjOtwD4gjzuPd1rzdb9PAB/Kf9fCeAfAXwRwP8AsHS612fW+TQAt8n9/QsA55yp9xbArwP4LIBPAfhvAJbO5Ht7PH8FuVekyAJKQe4VKbKAUn74RYosoJQffpEiCyjlh1+kyAJK+eEXKbKAUn74RYosoJQffpEiCyjlh1+kyALK/w9DsPSE4h1JCwAAAABJRU5ErkJggg==\n", 255 | "text/plain": [ 256 | "
" 257 | ] 258 | }, 259 | "metadata": {}, 260 | "output_type": "display_data" 261 | } 262 | ], 263 | "source": [ 264 | "plt.imshow(Xtrain[1])" 265 | ] 266 | }, 267 | { 268 | "cell_type": "markdown", 269 | "metadata": {}, 270 | "source": [ 271 | "### Executing the model" 272 | ] 273 | }, 274 | { 275 | "cell_type": "code", 276 | "execution_count": 14, 277 | "metadata": {}, 278 | "outputs": [ 279 | { 280 | "name": "stdout", 281 | "output_type": "stream", 282 | "text": [ 283 | "_________________________________________________________________\n", 284 | "Layer (type) Output Shape Param # \n", 285 | "=================================================================\n", 286 | "dense_1 (Dense) (None, 100) 3000100 \n", 287 | "_________________________________________________________________\n", 288 | "dense_2 (Dense) (None, 128) 12928 \n", 289 | "_________________________________________________________________\n", 290 | "dense_3 (Dense) (None, 128) 16512 \n", 291 | "_________________________________________________________________\n", 292 | "dense_4 (Dense) (None, 128) 16512 \n", 293 | "_________________________________________________________________\n", 294 | "dropout_1 (Dropout) (None, 128) 0 \n", 295 | "_________________________________________________________________\n", 296 | "dense_5 (Dense) (None, 128) 16512 \n", 297 | "_________________________________________________________________\n", 298 | "dropout_2 (Dropout) (None, 128) 0 \n", 299 | "_________________________________________________________________\n", 300 | "dense_6 (Dense) (None, 60) 7740 \n", 301 | "=================================================================\n", 302 | "Total params: 3,070,304\n", 303 | "Trainable params: 3,070,304\n", 304 | "Non-trainable params: 0\n", 305 | "_________________________________________________________________\n", 306 | "Train on 28736 samples, validate on 9673 samples\n", 307 | "Epoch 1/10\n", 308 | "28736/28736 [==============================] - 173s 6ms/step - loss: 3.1303 - acc: 0.2083 - val_loss: 1.6594 - val_acc: 0.4735\n", 309 | "Epoch 2/10\n", 310 | "28736/28736 [==============================] - 113s 4ms/step - loss: 1.3703 - acc: 0.5573 - val_loss: 0.8384 - val_acc: 0.7279\n", 311 | "Epoch 3/10\n", 312 | "28736/28736 [==============================] - 116s 4ms/step - loss: 0.8950 - acc: 0.7302 - val_loss: 0.7344 - val_acc: 0.7709\n", 313 | "Epoch 4/10\n", 314 | "28736/28736 [==============================] - 205s 7ms/step - loss: 0.7134 - acc: 0.7959 - val_loss: 0.5519 - val_acc: 0.8079\n", 315 | "Epoch 5/10\n", 316 | "28736/28736 [==============================] - 100s 3ms/step - loss: 0.5873 - acc: 0.8342 - val_loss: 0.3505 - val_acc: 0.8937\n", 317 | "Epoch 6/10\n", 318 | "28736/28736 [==============================] - 110s 4ms/step - loss: 0.4653 - acc: 0.8774 - val_loss: 0.3011 - val_acc: 0.9146\n", 319 | "Epoch 7/10\n", 320 | "28736/28736 [==============================] - 96s 3ms/step - loss: 0.3828 - acc: 0.8985 - val_loss: 0.7240 - val_acc: 0.7960\n", 321 | "Epoch 8/10\n", 322 | "28736/28736 [==============================] - 249s 9ms/step - loss: 0.4007 - acc: 0.9067 - val_loss: 3.2143 - val_acc: 0.4160\n", 323 | "Epoch 9/10\n", 324 | "28736/28736 [==============================] - 91s 3ms/step - loss: 0.3538 - acc: 0.9174 - val_loss: 0.3151 - val_acc: 0.9107\n", 325 | "Epoch 10/10\n", 326 | "28736/28736 [==============================] - 95s 3ms/step - loss: 0.3283 - acc: 0.9242 - val_loss: 0.2819 - val_acc: 0.9172\n", 327 | "Test loss: 0.28190886289408745\n", 328 | "Test accuracy: 0.9171921844308901\n" 329 | ] 330 | } 331 | ], 332 | "source": [ 333 | "first_model = Sequential()\n", 334 | "first_model.add(Dense(100, activation='relu', input_shape=(Xflat_train.shape[1],)))\n", 335 | "first_model.add(Dense(128, activation='relu'))\n", 336 | "first_model.add(Dense(128, activation='relu'))\n", 337 | "first_model.add(Dense(128, activation='relu'))\n", 338 | "first_model.add(Dropout(0.05))\n", 339 | "first_model.add(Dense(128, activation='relu'))\n", 340 | "first_model.add(Dropout(0.05))\n", 341 | "first_model.add(Dense(60, activation='softmax'))\n", 342 | "\n", 343 | "first_model.summary()\n", 344 | "\n", 345 | "first_model.compile(loss='categorical_crossentropy',\n", 346 | " optimizer=RMSprop(),\n", 347 | " metrics=['accuracy'])\n", 348 | "\n", 349 | "history_model = first_model.fit(Xflat_train, Ytrain,\n", 350 | " batch_size=128,\n", 351 | " epochs=10,\n", 352 | " verbose=1,\n", 353 | " validation_data=(Xflat_test, Ytest))\n", 354 | "score = first_model.evaluate(Xflat_test, Ytest, verbose=0)\n", 355 | "print('Test loss:', score[0])\n", 356 | "print('Test accuracy:', score[1])" 357 | ] 358 | }, 359 | { 360 | "cell_type": "code", 361 | "execution_count": 15, 362 | "metadata": {}, 363 | "outputs": [ 364 | { 365 | "data": { 366 | "image/png": "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\n", 367 | "text/plain": [ 368 | "
" 369 | ] 370 | }, 371 | "metadata": {}, 372 | "output_type": "display_data" 373 | }, 374 | { 375 | "data": { 376 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEWCAYAAAB8LwAVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xl4lOW5+PHvnT1kJckMS0D2QABZQkSo1qBYFVt3K1B3bamtrW21PT9re46tbU/t5rG2PXWpS21V1LrWutRWUTkCyhKQPawCCdmAkITseX5/PDNJCBMIMO+8M5P7c11zzWTmnfe9iXHueZ77WcQYg1JKKdVdjNsBKKWUCk+aIJRSSgWkCUIppVRAmiCUUkoFpAlCKaVUQJoglFJKBaQJQqmjEJHhImJEJK4Xx94gIotDEZdSoaAJQkUNEdkhIs0iktPt+WLfh/xwdyI7vkSjVLjQBKGizXZgvv8HETkVSHYvHKUilyYIFW3+AlzX5efrgSe7HiAiGSLypIhUishOEfmhiMT4XosVkV+LSJWIbAM+H+C9j4pImYjsEZGfikjsyQQsIokicr+IlPpu94tIou+1HBF5TUQOiMg+EfmgS6z/zxdDrYhsEpHZJxOHUt1pglDRZimQLiL5vg/uucBfux3zOyADGAkUYRPKjb7XvgJ8AZgKFAJXdnvvn4FWYLTvmPOAL59kzD8AZgBTgMnAdOCHvtfuAHYDHmAAcBdgRGQs8A3gNGNMGnA+sOMk41DqMJogVDTytyI+B2wE9vhf6JI0vm+MqTXG7AB+A1zrO+Qq4H5jzC5jzD7g513eOwCYA3zbGFNvjKkA/geYd5LxXg3cY4ypMMZUAj/uEk8LMAgYZoxpMcZ8YOwCam1AIjBeROKNMTuMMVtPMg6lDqMJQkWjvwBfAm6gW/cSkAMkADu7PLcTyPU9Hgzs6vaa3zAgHijzdfkcAB4CvCcZ7+AA8Qz2Pf4VsAX4p4hsE5E7AYwxW4BvAz8CKkRkoYgMRqkg0gShoo4xZie2WH0h8GK3l6uw38qHdXnuFDpbGWXA0G6v+e0CmoAcY0ym75ZujJlwkiGXBoin1PdvqTXG3GGMGQlcBNzurzUYY542xpzpe68BfnGScSh1GE0QKlrdDJxjjKnv+qQxpg14DviZiKSJyDDgdjrrFM8Bt4nIEBHpD9zZ5b1lwD+B34hIuojEiMgoESk6jrgSRSSpyy0GeAb4oYh4fEN0/8sfj4h8QURGi4gAB7FdS20iMlZEzvEVsxuBBt9rSgWNJggVlYwxW40xy3t4+ZtAPbANWAw8DTzme+0R4C1gNbCSI1sg12G7qNYD+4G/YWsEvVWH/TD3384BfgosB9YAn/iu+1Pf8WOAf/netwT4X2PMImz94V5si2gvtpvrruOIQ6ljEt0wSCmlVCDaglBKKRWQJgillFIBaYJQSikVkCYIpZRSAUXcypI5OTlm+PDhboehlFIRZcWKFVXGGM/xvCfiEsTw4cNZvryn0YtKKaUCEZGdxz7qcNrFpJRSKiBNEEoppQLSBKGUUiqgiKtBKKWiR0tLC7t376axsdHtUKJGUlISQ4YMIT4+/qTPpQlCKeWa3bt3k5aWxvDhw7HrEaqTYYyhurqa3bt3M2LEiJM+n3YxKaVc09jYSHZ2tiaHIBERsrOzg9Yi0wShlHKVJofgCubvUxOEUiq42tthxZ+hResKkU4ThFIquHZ8AH+/Dda/7HYkx1RdXc2UKVOYMmUKAwcOJDc3t+Pn5ubmXp3jxhtvZNOmTUc95g9/+ANPPfVUMEIOKS1SK6WCq3SVva9Y724cvZCdnU1xcTEAP/rRj0hNTeW73/3uYccYYzDGEBMT+Pv0448/fszr3HrrrScfrAu0BaGUCq4y+4FLxQZ34zgJW7ZsYeLEidxyyy0UFBRQVlbGggULKCwsZMKECdxzzz0dx5555pkUFxfT2tpKZmYmd955J5MnT2bmzJlUVFQA8MMf/pD777+/4/g777yT6dOnM3bsWD788EMA6uvrueKKK5g8eTLz58+nsLCwI3m5RVsQSqngKj2xBPHjv69jfenBoIYyfnA6d1804YTeu379eh5//HEefPBBAO69916ysrJobW3l7LPP5sorr2T8+PGHvaempoaioiLuvfdebr/9dh577DHuvPPOI85tjOGjjz7i1Vdf5Z577uHNN9/kd7/7HQMHDuSFF15g9erVFBQUnFDcwaQtCKVU8DQcgP3bIbk/1OyCxuB+4IfSqFGjOO200zp+fuaZZygoKKCgoIANGzawfv2RXWjJycnMmTMHgGnTprFjx46A57788suPOGbx4sXMmzcPgMmTJzNhwokltmCKuBZESUUdxhgdGqdUOCpbbe8nXgkfPwKVG2Ho9F699US/6TslJSWl43FJSQm//e1v+eijj8jMzOSaa64JONcgISGh43FsbCytra0Bz52YmHjEMcaYYIYfFBHXgmhsaWNH9SG3w1BKBeKvP0yeb+8juA7R1cGDB0lLSyM9PZ2ysjLeeuutoF/jzDPP5LnnngPgk08+CdhCCbWIa0EALNpUwYick59GrpQKstJiyBgKg6dCfL+oSRAFBQWMHz+eiRMnMnLkSM4444ygX+Ob3/wm1113HZMmTaKgoICJEyeSkZER9OscDwnHZs3RpA8day6/5y88cWPvmq1KqRB6YCp4x8O8p+DhsyExDa5/tcfDN2zYQH5+fggDDF+tra20traSlJRESUkJ5513HiUlJcTFHf/3+EC/VxFZYYwpPJ7zRFwLIjUxjqXbqmlsaSMpPtbtcJRSfo01sG8bTPmS/dk7Hkr+6W5MEaSuro7Zs2fT2tqKMYaHHnrohJJDMEVcgkhLiqexpZ2Ptu/jrLzj2l5VKeUkf4F68FR7782H4r9CfRWk5LgXV4TIzMxkxYoVbodxmIgrUqckxpEQF8OiTZVuh6KU6so//2FQlwQBUVOH6IscSxAikiQiH4nIahFZJyI/DnBMoog8KyJbRGSZiAw/1nljBGaMzOa9zRVOhK2UOlFlvgJ1Srb9WRNExHOyBdEEnGOMmQxMAS4QkRndjrkZ2G+MGQ38D/CL3py4KM/D1sp6du3T4a5KhY3SYhg0ufPntEGQlAGVmiAilWMJwlh1vh/jfbfuQ6YuAf7se/w3YLb0YgZcka/28H6JdjMpFRYaa2DfVhg8pfM5EVuo1hZExHK0BiEisSJSDFQAbxtjlnU7JBfYBWCMaQVqgOwA51kgIstFZHllZSWjPCnkZiZrHUKpcFG2xt776w9+3ny7qmuYDqefNWvWEZPe7r//fr7+9a/3+J7U1FQASktLufLKK3s87/Lly4967fvvv59Dhzp7QS688EIOHDjQ29BDwtEEYYxpM8ZMAYYA00VkYrdDArUWjvhLMsY8bIwpNMYUejweRIRZYz18uKWK5tZ2J0JXSh0P/wzqri0IsC2IxhqoLQt9TL0wf/58Fi5ceNhzCxcuZP78+cd87+DBg/nb3/52wtfuniBef/11MjMzT/h8TgjJKCZjzAFgEXBBt5d2A0MBRCQOyAD29eacRXke6pvbWLFzfxAjVUqdkNJiSB9y5HDWjkK1+8tGBHLllVfy2muv0dTUBMCOHTsoLS1lypQpzJ49m4KCAk499VReeeWVI967Y8cOJk6033kbGhqYN28ekyZNYu7cuTQ0NHQc97Wvfa1jmfC7774bgAceeIDS0lLOPvtszj77bACGDx9OVVUVAPfddx8TJ05k4sSJHcuE79ixg/z8fL7yla8wYcIEzjvvvMOu4wTH5kGIiAdoMcYcEJFk4FyOLEK/ClwPLAGuBN4xvZza/ZnROcTFCO9trmTmqCN6pZRSoVS66sjWA4Cny0im0ece/Rxv3Al7PwluXANPhTn39vhydnY206dP58033+SSSy5h4cKFzJ07l+TkZF566SXS09OpqqpixowZXHzxxT0uEvrHP/6Rfv36sWbNGtasWXPYUt0/+9nPyMrKoq2tjdmzZ7NmzRpuu+027rvvPt59911ycg5PqitWrODxxx9n2bJlGGM4/fTTKSoqon///pSUlPDMM8/wyCOPcNVVV/HCCy9wzTXXBOd3FYCTLYhBwLsisgb4GFuDeE1E7hGRi33HPApki8gW4HbgyIXTe5CaGEfh8P4s2qTDXZVylb9APShAgkjJhhRvWBequ3Yz+buXjDHcddddTJo0iXPPPZc9e/ZQXl7e4znef//9jg/qSZMmMWnSpI7XnnvuOQoKCpg6dSrr1q075iJ8ixcv5rLLLiMlJYXU1FQuv/xyPvjgAwBGjBjBlCn293y05cSDxbEWhDFmDTA1wPP/1eVxI/DFE71GUZ6XX7y5kfKDjQxITzrR0yilToa/QB2oBQG+QnUvEsRRvuk76dJLL+X2229n5cqVNDQ0UFBQwBNPPEFlZSUrVqwgPj6e4cOHB1zeu6tArYvt27fz61//mo8//pj+/ftzww03HPM8R+tE8S8TDnapcKe7mCJuJnVXs8ba4a7vbdbRTEq5xl+gDtSCAFuortwI7eE5oCQ1NZVZs2Zx0003dRSna2pq8Hq9xMfH8+6777Jz586jnuOss87iqaeeAmDt2rWsWWOT5sGDB0lJSSEjI4Py8nLeeOONjvekpaVRW1sb8Fwvv/wyhw4dor6+npdeeonPfvazwfrnHpeIThDjBqbhTUvUBKGUm0qLIT0XUntYG82bDy2H4MDRP2TdNH/+fFavXt2xo9vVV1/N8uXLKSws5KmnnmLcuHFHff/XvvY16urqmDRpEr/85S+ZPt2uNj158mSmTp3KhAkTuOmmmw5bJnzBggXMmTOno0jtV1BQwA033MD06dM5/fTT+fKXv8zUqUd0xoRExC33XVhYaLqOL/7e86t5a91eVv7n54iLjeh8p1Rk+t00yBkL858O/Pquj+HRc2HeMzDuwsNe0uW+nRGs5b4j/hO1aKyHg42trN4dXhNMlOoTGg9C9Zae6w8AnrH2PkyHuqqeRXyC+OxoDzEC7+msaqVCb69/BvVREkRSOmScEtYjmVRgEZ8gMvrFM/WU/lqHUMoNpT3MoO7OO67HBBFp3dzhLpi/z4hPEGBnVa/ZU0N1XZPboSjVt5QVQ9pgSPUe/ThvPlSXQFvLYU8nJSVRXV2tSSJIjDFUV1eTlBScYf8Rt6NcIEV5Hu57ezMflFRx6dRct8NRqu8oLe7cQe5ovOOhrdluSeqvSQBDhgxh9+7dVFZqD0CwJCUlMWTIkKCcKyoSxKm5GWSlJPDe5kpNEEqFSlOtLVBPuurYx3Zdk6lLgoiPj2fEiBEOBahOVlR0McXECGeNyeH9zZW0t2tTVamQKFsDmKMXqP1y8kBitFAdYaIiQYAd7lpd38za0hq3Q1Gqb+hpie9A4pMha6QOdY0wUZMgPjvGt+yGDndVKjRKe1mg9uvtmkwqbERNgshJTWTSkAwd7qpUqJQV96714OfJt0XqlqMvVqfCR9QkCLCjmVZ+up+aQy3HPlgpdeKaaqGqpHf1Bz9vPph2qNrsXFwqqKIuQbQbWLylyu1QlIpu/gL18bQgvOPtvXYzRYyoShBThmaSnhTHe5t1EyGlHHWsJb4DyR4FMfFaqI4gUZUg4mJj+OwYD+9trtSZmUo5qbQY0gZB2oDevyc23g531RZExIiqBAG2m6n8YBObyo/ciEMpFSRlxcfXevDTkUwRJeoSxFl5OtxVKUf5C9THU3/w8+ZDzad2mXAV9qIuQQzMSGLcwDQWaYJQyhl7P6HXM6i78y+5UbkpqCEpZ0RdggDbzbR85z7qmlrdDkWp6NPbJb4D6UgQ2s0UCaIzQYz10NJmWLK12u1QlIo+ZcWQOhDSBh7/ezOHQ1yy1iEiRFQmiMJhWfRLiNXhrko5ofQ4Z1B3FRPj2zxIh7pGgqhMEAlxMXxmVA6LNulwV6WCqqnOzoQ+kfqDn3e8tiAihGMJQkSGisi7IrJBRNaJyLcCHDNLRGpEpNh3+69gXb9orIfd+xvYVlUfrFMqpfwF6hNtQYCtQ9SVQ712AYc7JzcMagXuMMasFJE0YIWIvG2M6d62/MAY84VgX3xWl+GuozypwT69Un3Ticyg7q5roTrlzJOPSTnGsRaEMabMGLPS97gW2ACEbLu3oVn9GOlJ0dVdlQqmUl+BOn3QiZ/D499dTruZwl1IahAiMhyYCiwL8PJMEVktIm+IyIQe3r9ARJaLyPLj2bu2KM/D0m3VNLa0nUjYSqnujneJ70DSB0NihiaICOB4ghCRVOAF4NvGmO7TJ1cCw4wxk4HfAS8HOocx5mFjTKExptDj8fT62kV5Hppa21m6Tfs6lTppzfUnX6AGENElNyKEowlCROKxyeEpY8yL3V83xhw0xtT5Hr8OxItITrCuP2NkNolxMdrNpFQw7P3E7udwsi0I8CWI9aCjDMOak6OYBHgU2GCMua+HYwb6jkNEpvviCdrX/aT4WGaMzNYEoVQwlAahQO3nHQ+NB6B278mfSznGyRbEGcC1wDldhrFeKCK3iMgtvmOuBNaKyGrgAWCeCfLEhaI8D9sq69m171AwT6tU31NWDKkDTq5A7ecfyaQT5sKaY8NcjTGLATnGMb8Hfu9UDGDnQ/AaLNpcybUzhjl5KaWiW+mq4LQeoEuC2ACjZwfnnCroonImdVcjc1IYmpWsy38rdTL8Bepg1B8AUnIgxaOL9oW5qE8QIkJRnocPt1bR3NrudjhKRSZ/gTpYLQjQkUwRIOoTBEBRnpdDzW0s37HP7VCUikwns8R3T7zjoWIjtOsXt3DVJxLEzFHZxMeKjmZS6kSVFUOK1+5DHSzefGiptzvMqbDUJxJEamIcpw3P0gSh1InyL/EtRx13cny84+29djOFrT6RIMAOd924t5a9NY1uh6JUZGmuh6pNwa0/AHjG2Xsd6hq2+k6CGOtb3VU3EVLq+OxdG7wZ1F0lpUPGUG1BhLE+kyDGDkhjYHqSdjMpdbyCscR3TzzjbKFahaU+kyD8w10/KKmitU1HTSjVa6XFds5C+uDgn9ubb7uv2lqDf2510vpMggDbzVTb2ErxrgNuh6JU5Cgrtq2HYBao/bzjoa0Z9m0L/rnVSetTCeKM0TnExgiLdFa1Ur3TfAgqNwa//uCnazKFtT6VIDKS45k6NFPrEEr1Vrm/QD3VmfN7xgKiheow1acSBNjhrp/sqaGqrsntUJQKf8Fc4juQ+GTIGqktiDDV5xLErLFeAD4o0VaEUsdU5mCB2k/XZApbfS5BTBicTnZKgtYhlOqNUgcL1H7efFukbtFJrOGmzyWImBjhrDwP72+upK1dtztUqkctDc4WqP28+WDaoLrE2euo49bnEgTYOsT+Qy2s3VPjdihKha+9a+0Ht1P1Bz9dkyls9ckE8dkxOYigo5mUOprSVfbe6RZE1iiIiddCdRjqkwkiOzWRSbkZLNqk6zIp1aOyYuiXA+m5zl4nLgFyxmgLIgz1yQQBtpupeNcBDhxqdjsUpcKTE0t898Sbry2IMNR3E8RYD+0GFm+pcjsUpcKPv0DtdP3Bz5sPBz6FprrQXE/1Sp9NEJOHZJKRHM97OtxVqSP5C9RO1x/8PL4lNyo3heZ6qlf6bIKIi43hzDE5vLe5EmN0uKtSh3Fyie9AdE2msNRnEwTYOkRFbRMbymrdDkWp8FJaDP2yIWNIaK7XfzjEJWuhOsz0+QQBOtxVqSM4ucR3IDGxduE+bUGEFccShIgMFZF3RWSDiKwTkW8FOEZE5AER2SIia0SkwKl4AhmQnkT+oHTdhlSprloa7Df5UNUf/LzjtQURZpxsQbQCdxhj8oEZwK0iMr7bMXOAMb7bAuCPDsYTUFGeh+U79lPb2BLqSysVnsrXhWYGdXfefKjbC4f2hfa6qkeOJQhjTJkxZqXvcS2wAeg+4+YS4EljLQUyRWSQUzEFUpTnobXd8OHW6lBeVqnwFaoZ1N11FKq1FREuQlKDEJHhwFRgWbeXcoFdXX7ezZFJBBFZICLLRWR5ZWVw6wXThvUnJSFW6xBK+ZUVQ3IWZAwN7XX9CaJSE0S4cDxBiEgq8ALwbWPMwe4vB3jLEWNOjTEPG2MKjTGFHo8nqPElxMVwxugc3tukw12VAqB0td1BLlQFar/0XEhM1xZEGHE0QYhIPDY5PGWMeTHAIbuBrl9ThgClTsYUSNFYD3sONLC1Umdxqj6updF+gw919xLYhKSbB4UVJ0cxCfAosMEYc18Ph70KXOcbzTQDqDHGlDkVU0/OGmNbJbqJkOrzytdBe2voC9R+/jWZtDUfFpxsQZwBXAucIyLFvtuFInKLiNziO+Z1YBuwBXgE+LqD8fRoaFY/RnlStA6hVJlLBWo/73ho2A915e5cXx0mzqkTG2MWE7jG0PUYA9zqVAzHoyjPy1+X7aShuY3khFi3w1HKHaUuFaj9ui65kTbQnRhUhz49k7qrWWM9NLe2s3S7DndVfVgol/gOxKNDXcOJJgif6SOySIqP0dVdVd/lL1C7VX8ASPXYTYo0QYQFTRA+SfGxzBiZrXUI1Xf5C9Ru1R/8dCRT2OhVghCRUSKS6Hs8S0RuE5FMZ0MLvaI8D9ur6tlZXe92KEqFnr9A7WYLAmyhunIjtLe7G4fqdQviBaBNREZjh66OAJ52LCqXzBrrBeB9bUWovqi0GJL7Q+Yp7sbhzYfmOqjZdexjlaN6myDajTGtwGXA/caY7wAhXTMpFIZn9+OUrH46H0L1TaFe4rsnXt+antrN5LreJogWEZkPXA+85nsu3pmQ3CMiFOV5+HBrNU2tbW6Ho1TotDS6s8R3IN5x9l73hnBdbxPEjcBM4GfGmO0iMgL4q3Nhuacoz0NDSxvLd+x3OxSlQqfC5RnUXSVl2HWZKje6HUmf16sEYYxZb4y5zRjzjIj0B9KMMfc6HJsrZo7KJiE2Rkczqb6l1LcHdTi0IKBzyQ3lqt6OYlokIukikgWsBh4XkZ7WV4poKYlxnDaiP4s26S5zqg8pK4akTMgc5nYkljcfKjdDW6vbkfRpve1iyvAt1X058LgxZhpwrnNhuasoz8Pm8jpKDzS4HYpSoeH2DOruvOOhrQn2b3c7kj6ttwkizrfT21V0FqmjVlGeDndVfUhrky1Qh0P9wa/rmkzKNb1NEPcAbwFbjTEfi8hIoMS5sNyVNyCVQRlJWodQfUP5OmhvCZ/6A0DOWEB0qKvLerWaqzHmeeD5Lj9vA65wKii3+Ye7/mNNGS1t7cTH6ookKoqV+QvUU92No6uEfpA1QlsQLuttkXqIiLwkIhUiUi4iL4jIEKeDc1NRnofaplZWfXrA7VCUclZpmBWo/Tz5UKFDXd3U26/Gj2N3fxsM5AJ/9z0XtT4zOofYGOG9zTqaSUW5sjArUPt586F6i62RKFf0NkF4jDGPG2NafbcnAI+DcfVs/46QbEeYkRzPtFP6ax1CRbfWJihfH14Faj9vPpg2qIracmfY622CqBKRa0Qk1ne7BnBnZ52G/bD2hZBcqmish7V7DlJR2xiS6ykVchXrw69A7adrMrmutwniJuwQ171AGXAldvmN0IvvB2/9ABoPOn6pojzbSPpgc5Xj11LKFaVhssR3INmjISZOC9Uu6u1SG58aYy42xniMMV5jzKXYSXOhlzHUbmi+yPmVPsYPSicnNUG7mVT08heo+w93O5IjxSVA9hhtQbjoZMZv3h60KI5HQj+Ydj0se9CO33ZQTIxw1hgPH5RU0tbufN1DqZArK4ZBk8OvQO2nazK56mQShHt/UbPvtis+/uMOxwvWRWM97D/UwprdOtxVRRl/gToc6w9+3nw4sBOadZdHN5xMgnDvK3W/LPjcj+HTJbB6oaOX+uwYDyJoN5OKPv4CdTjWH/z8S27o0t+uOGqCEJFaETkY4FaLnRPhninXwJDp8PZ/QoNz3+6zUhKYNCRTE4SKPuG2xHcgOpLJVUdNEMaYNGNMeoBbmjGmV8t0OCYmBj7/azhUDe/81NFLFeV5WL3rAPvrmx29jlIhVVZsu2r7j3A7kp71Hw5xSZogXOLYIkMi8phvaY61Pbw+S0RqRKTYd/uv477IoMlw2pdh+aOd34YcMGush3YDH2zR4a4qipSGeYEaICYWPGO1UO0SJ1ehewK44BjHfGCMmeK73XNCVzn7B9Avxxas29tP6BTHMnlIJhnJ8by3SbuZVJRobbYfuuFcf/DzjtcWhEscSxDGmPeBfU6dv0NyJpz3E9izHFY96cglYmOEz47J4b3NlbTrcFcVDSrWQ1tzeNcf/Lz5UFtmV1FQIeX2OtYzRWS1iLwhIhN6OkhEFojIchFZXlkZ4Fv8pLkw7Az414/gkDM5qSjPQ1VdExv2Oj+DWynH+Zf4joQWhMe/eZCOZAo1NxPESmCYMWYy8Dvg5Z4ONMY8bIwpNMYUejwB1ggUgQt/bZff+NePHAnWv+zGIu1mUtGgtBgSMyBrpNuRHJvuLuca1xKEMeagMabO9/h1IF5Eck74hAPGw4yvwconYffyYIXZwZuexPhB6TrcVUWHsmIYNCm8C9R+GUMgIU3rEC5wLUGIyEAR+9cpItN9sZzcCrGz7oS0gfCP26G9LQhRHq5orIeVO/dzsLEl6OdWKmRam+0yNeG0g9zRiPiW3NAEEWpODnN9BlgCjBWR3SJys4jcIiK3+A65ElgrIquBB4B5xpzkuhmJaXD+z6BsNSx/7KROFUhRnofWdsOHW9xZ6VypoKjcEDkFaj//mkwh2AtGdXJsspsxZv4xXv898PugX3jC5bab6d8/gfGXQKo3aKeeNqw/qYlxvLe5ggsmDgzaeZUKqdIIKlD7ecfDyj9DXQWkDXA7mj7D7VFMwecvWLccgrePf+7d0cTHxnDG6Gze21TJyTZ2lHJNWQQVqP20UO2K6EsQADlj4DPfhNXPwM4Pg3rqojwvpTWNbKmoC+p5lQqZ0lWRU6D200X7XBGdCQLgrO/azYX+cQe0Ba+oXDTWru567xsbaWwJfiFcKUd1FKgjqHsJIMUD/bK1BRFi0ZsgElLggnvtH9RHDwfttLmZyfz44gn8e2MFX3lyOQ3NmiRUBPEXqCOp/gC+kUy65EaoRW+CABj3eRhzHry2JC7aAAAeqklEQVT7czhYFrTTXjdzOL+8YhKLt1Rx/WMfUavDXlWk6FjiO0KGuHblH+qq9b+Qie4EIQJzfmG/Mf3zB0E99VWnDeW386ay4tP9XPPoRxw4pEuBqwhQVgyJ6eG9xHdPvPnQXAc1u9yOpM+I7gQBdqTGmd+BtS/AtkVBPfXFkwfzx6sL2FB6kHkPL6Wqrimo51cq6PxLfMdE4P/6unlQyEXgX8kJOPPbduOR179ni3RBdN6Egfzp+kJ2VNcz96El7K1pDOr5lQqathZboB402e1IToxnnL3XQnXI9I0EEZ8Mc34FVZthSfDn5p2V5+HPN05nb00jVz20hF37DgX9GkqdtIoN0NYUmfUHsEv7pw3WVV1DqG8kCIC882DcF+D9X8GB4Pdhnj4ym6e+MoMDh5q56qElbKvUeRIqzETSEt898S+5oUKi7yQIgAt+bkdAvPV9R04/ZWgmCxfMpLm1naseWsqmvbWOXEepE1JabFdFjaQZ1N1586FykyOLcaoj9a0EkXkKFH0PNvwdSv7lyCXGD07n2a/OIDYG5j68hE921zhyHaWOW1kEF6j9vONtN9m+7W5H0idE8F/KCZr5TcgeA69/F1qcKSiP9qbx3FdnkpIQx5ceWcryHc7vvKrUUbW1wN61kTeDujtdkymk+l6CiEuAC38F+7fD//3WscsMy07h+VtmkpOWyLWPfsT/baly7FpKHVPlRvvNO5LrDwCesYDoUNcQ6XsJAmDU2TDhMlh8n6NN1cGZyTz71RmcktWPG5/4mHc2ljt2LaWOqmMGdYQniIQUO2S9UhNEKPTNBAFw/n9DTBy88f8cnbrvTUti4YIZ5A1I5at/WcHrnwRvyQ+leq3MX6Ae5XYkJ093lwuZvpsg0gfbLUpL3oJNbzh6qf4pCTz9lRlMGpLJN55eyYsrdzt6PaWOEMkzqLvz5kP1FmjVlQucFgV/LSfh9FvAk29bEc3OTm5LT4rnyZumM2NkNnc8v5qnlu109HpKdWhrhfIoKFD7ecdDe6tNEspRfTtBxMbD538DNZ/CB79x/HIpiXE8dsNpzMrz8IOX1vKnD7Y5fk2lqNwIrY2RX6D26xjJpN1MTuvbCQJg+BkwaR58+ABUOf+NJCk+loeuLWTOxIH89B8b+P07JY5fU/VxpavsfbS0ILLH2PqhDnV1nCYIgPN+AnFJdm5ECNaaT4iL4Xfzp3LZ1Fx+/c/N/PLNjbrHtXJONBWowQ5Vzx6tLYgQ0AQBkOqFc34I296F9S+H5JJxsTH85ouTmT/9FP530VZ+/Pf1tLdrklAOKC22e1BHQ4HaT0cyhUQU/cWcpMKbYeCp8OZd0BSaNZRiYoT/vmwiN50xgic+3MFdL31CmyYJFUz+AnW01B/8PPmwfwc017sdSVTTBOEXGwefvw9qS+G9X4TssiLCf34hn2+eM5qFH+/i9ueKaWlrD9n1VZTzF6ijpf7g580HjF24TznGsQQhIo+JSIWIrO3hdRGRB0Rki4isEZECp2LptaHTYeq1sPSPIW2+igh3nDeW750/lleKS/nG0ytpatXVKlUQRMMS34Ho7nIh4WQL4gnggqO8PgcY47stAP7oYCy9d+6PITEN/hGagnVXt549mrsvGs9b68pZ8OQKGpo1SaiTVFoMCam2qBtNskZAbKKOZHKYYwnCGPM+cLRlTC8BnjTWUiBTRAY5FU+vpWTD7Lth52L45PmQX/7GM0Zw7+Wn8n5JJTc+8RF1Ta0hj0FFkbJiGBhlBWqAmFi7cJ+2IBzl5l9NLtB1a7fdvufcV3A95E6Dt34AjaHfz2He9FO4f+4UPt6xn2sfXUZNQ0vIY1BRoK01Opb47ol3vCYIh7mZICTAcwH7dERkgYgsF5HllZWVDoeF/bb1+d9AfSW8+9/OXy+AS6bk8ocvFbB2Tw3zH15KdZ2uO6OOU9UmaG2IvvqDnzffDippOOB2JFHLzQSxGxja5echQGmgA40xDxtjCo0xhR6PJyTBMXgqFN4EHz0MZWtCc81uLpg4kEeuK2RrZR3zHl5KxUFnNjhSUSpalvjuiX/JjcqN7sYRxdxMEK8C1/lGM80Aaowx4bUW9uz/hOQs+Mcd0O7O0NNZY708ceN09hxo4IsPLWH3fmcXFVRRpKwY4lOir0Dtp7vLOc7JYa7PAEuAsSKyW0RuFpFbROQW3yGvA9uALcAjwNediuWEJfeHz90Duz+C1U+7FsbMUdn89cuns6++maseXMKOKp0cpHqhYwZ1rNuROCNjqB2hpXUIxzg5imm+MWaQMSbeGDPEGPOoMeZBY8yDvteNMeZWY8woY8ypxpjlTsVyUibPh6Ez4O3/gkPu7S1dcEp/nvnKDBpb2/niQ0vYXB6a2d4qQrW1wt5Porf+ACCiS244LMrGvjnAX7BuOADv/MTVUCbmZvDsghkAzH1oCWv3hH6ElYoQVZttgTpa6w9+3nwoXxfyOUt9hSaI3hg4EU7/Kix/HPascDWUMQPSeP6rM+mXEMfFv1/MtY8u4+VVezjUrPMlVBf+GdSDp7obh9O846Fhnx1xqIJOE0Rvzfo+pA7wFazdneE8PCeFl77+GW49ezTbq+r59rPFnPbTf3HHc6v5vy1VuuCfsvWHaC5Q++nmQY7SBNFbSelw/s/s5isrnnA7GrzpSdxx3lje/97ZPLtgBhdNHsw/1+3l6j8t48xfvMMv3txIidYp+q6yKC9Q+3k0QTgpzu0AIsrEK2xy+Pc9tvg3aJLdttRFMTHC6SOzOX1kNj+6eAJvry/npVV7ePj9bfxx0VZOzc3gsqm5XDxlMDmpia7GqkKkrdXO3Zl2g9uROC/Va4ei61BXR2iCOB4itmD9UBH86Ry7C93AU+2yHLnTYHABZI10bd2bpPhYLpo8mIsmD6aytolXV5fy0qrd3PPaen72+gaK8jxcXpDLufkDSIqP8m+WfVlfKVCDbySTLrnhFE0Qx8szFm5bBZ9+CHtW2tvKJ2HZg/b1pAxbGOyaNNJDvwahJy2Rm88cwc1njmBzeS0vrtzDy6v28M7GCtKS4vj8qYO4vGAIhcP6ExMTaNUTFbGidYnvnnjzYfVCO5JJ9G85mDRBnIj0Qba7aeIV9ue2VrvuzZ4VvttKWHw/GF8xO20w5Bb4btNsAknKCFm4eQPSuHPOOL53/liWbK3mxVW7eXV1KQs/3sXQrGQum5LLZQVDGJGTErKYlIP8BeqcMW5HEhrefGiuhZrdkDn02MerXhMTYeOHCwsLzfLl4Tmn7jAtDXaiUteksW9r5+vZY3ytDF/SGDAR4pNCFl59UytvrdvLS6v2sHhLFcbA1FMyubxgCBdNGkRmv4SQxaKC7NHzAIGb33I7ktDYuQQevwC+9Dzkned2NGFLRFYYYwqP6z2aIEKoYb8dBeVPGHtWQF25fS0mHgZMODxp5OSFZBTK3ppGXinewwsrd7O5vI74WOGccV4uLxjC2WO9JMTpYLeI0d4GPx8CBdfBnNBtneuqhv3wi+F2WZwzvuV2NGHrRBKEdjGFUnJ/GHWOvYHtMz1YahNFqS9hfPI8LH/Uvp6QavuRu3ZPZQwNej/rwIwkvlo0igVnjWRd6UFeWrWHV4r38Na6cjL7xXPRpMFcXpDLlKGZiPbxhreqzdByqO/UH8D+f5U2SAvVDtAE4SYRyMi1t/EX2+fa26F6y+FJY9mD0NZsX0/x2MJ37jQY9hl7C1IrQ0SYmJvBxNwMvj9nHB+UVPHiqj08t3wXf1m6k5E5KVw2NZdLp+YyNKtfUK6pgizal/juiTdfh7o6QBNEuImJAU+evU2Zb59rbYbytb6k4euiKvknYCA9FyZdZRcV9IwNWhhxsTGcPc7L2eO8HGxs4c1P9vLCyt385u3N/ObtzUwfkcUVBbnMOXUQ6UnuzgVRXXz6IcT3s92TfYl3PHz8J9vFFu2TA0NIaxCRqvEgbPmXHd635V92xNTgqTD5S3Z0VUq2I5fdte8QrxTv4cWVe9hWVU9iXAynDc9i5qhsZozMZtKQDOJjtWYRcu3t8M49sPh/YNJcuPxhtyMKrVV/hVduhW+uhOxRbkcTlrRI3VfVVcAnf4PVz8DeNRATB2POh8nzIO98iAv+DGpjDKt31/BK8R4+3FLNJt+yHikJsRT6EsbMkdlMzM0gVudZOKv5ELz0VdjwKky7ES78lesz/ENuzwp45ByY+1fIv8jtaMKSJghllz5evRDWPAd1eyEp07YoJs+HIYWOTSSqrmti6bZ9LNlWxZKt1WyttJsapSXGMX1EZwtj/KB0nZgXTLXl8Mw82/V43k9h5q19c7JYcz3892A4+wdQ9B9uRxOWNEGoTu1tsO1dmyw2vGaXXsgaZRPFpKug/zBHL19xsJEl26pZuq2aJVur2VFtt0rNSI7ndF/CmDkqmzxvmiaME1W+Dp6eC4eq4Yo/wbjPux2Ru3472Q7g+OLjbkcSljRBqMAaD9ruh9ULYccH9rlhZ9ouqPGX2JVqHVZW08CSrTZZLN1eza59DQBkpSQwY2QWM0fahDHKk6pDaXuj5G14/kZITIX5C/veqKVAnp4H+3fArUvdjiQsaYJQx3bgU1jzrE0W1VvsgoPjvmBbFiNnQWxoBrbt2nfIti62VbN0azWlNY2AXUNqxsjsjoQxPLufJozuPnoE3vgPO/v+S89C+mC3IwoP//oxfPgA3FUGcboSQHeaIFTvGWMLe6ufsQXuxgN2Q6RTvwhTvmRndYcsFMOn+w7ZFoavS6qitgmAgelJHQXvmaOy+/b8i/Y2eOsuOy8mb47tVkpMdTuq8LHmeXjxy/C1JTBgvNvRhB1NEOrEtDbZeRWrF8Lmt6C9xS5jPnk+TLwS0gaENBxjDNuq6jsSxrJt1VTV2YmCuZnJhyWMwZnJIY3NNU218LeboeQtmHErnPcTHe/f3d618OAZcMWjcOqVbkcTdjRBqJNXXw3rXrQtiz0rQGJh9Gxbrxh7IcSH/gPZGENJRd1hNYwDh1oAGJbdryNZTB+RxaCMKEwYNbttMbpigx3CetrNbkcUnlqb4GeD4MzvwOz/dDuasKMJQgVX5WZYsxBWPwsHd0NiOky41LYshs5wbWOk9nbDxr21Hd1Ry7ZXU9vYCsApWf04fUSW3WVvRFbkd0ntWWmHsbY0wBefsMla9ez30+0+3POfdjuSsKMJQjmjvd2Oflq9ENa/Ai31kDnMtiomzXV95mpbu2FD2UGWbd/Hsm3VfLRjX0cLIzcz2Zcwsjh9RDbDIqnoveHv8MJX7PpbVz9n1xtSR/fc9Xay6G2r3I4k7GiCUM5rrrfzKlY/A9sWAQaGfxYKb4RxF4XF6JH2dsPmilqWbdvHsu3VLNu2j+p6W8MYkJ7I6SOyfQkjKzyH1RpjR+O8fbed3Djvabv3sjq2Rffa212lkBDhrccgC7sEISIXAL8FYoE/GWPu7fb6DcCvgD2+p35vjPnT0c6pCSKMHCy1rYoVT8CBndAvB6ZeA9NugKwRbkfXwRjD1so6lm7b19HK8I+SyklNYPqIrI6k4frEvbYW+MftdhvbCZfBpX90pe4Tsda/As9dBwsW2bXJVIewShAiEgtsBj4H7AY+BuYbY9Z3OeYGoNAY843enlcTRBhqb4dt78Dyx2HTG3bhwFGzofAmyLsgZHMressYw47qQyzbVt2RMPzzMPr3i+e04Z01jPxB6aFbS6phv/1w2/4+nPU9mHWXa3WeiFVVAr8vtIl1ypfcjiashNuGQdOBLcaYbQAishC4BNBF26NNTAyMPtfeDpbCyr/Ayj/Ds1fbjVwKrrc7nGXkuh0pYPe9GJGTwoicFOZNPwWwE/f8yWLZ9n38c73d6S8tKc4mDF/he+LgdOKcWK123zY7Umnfdrj0wc6l3tXx6T8CYhN1b4ggcbIFcSVwgTHmy76frwVO79pa8LUgfg5UYlsb3zHG7ApwrgXAAoBTTjll2s6dOx2JWQVRW6udW7H8MbscuYhtTRTeZHfUC/Mx/KUHGvhoe2cNY1uVXXwwJSGWab6EMWNkFqfmZp78lqyfLoWFXwLTDnOfguFnBOFf0Ic9eKad9HnNC25HElbCrYvpi8D53RLEdGPMN7sckw3UGWOaROQW4CpjzDlHO692MUWg/Ttti2Llk1BfCZmn2DrF1GsjpvhacbDRtjB8CaOkog6ApPgYpg3rz/ThtoYxfnD68W2gtOZ5eOXrdivZq593fURYVHhxAez4P7h9nduRhJVwSxAzgR8ZY873/fx9AGPMz3s4PhbYZ4zJONp5NUFEsNZm2PQP26rY/r7dt2LcF2yrYsRZEbVMdXVdk6+FsY+l2+x+GP7/lQamJzFmQCpjvGmMGZBK3oBURnvTyEjukjiMgfd+AYt+bhdOnPsX6Jflzj8m2iz+H/jXj+DOTyHpqB8nfUq41SA+BsaIyAjsKKV5wGFVIxEZZIwp8/14MaC7jkezuAQ7MmfCZbaYuOIJKH4K1r9sJzdNu9EWFiPggzI7NZE5pw5izqmDADhwqJmVn+5n0946SsprKamo4+mPdtLY0t7xngHpiYzxpjHOE881e3/F8LLXaZ44j4RLfxcWw4Ojhsc3X6RiI5xyuruxRDinh7leCNyPHeb6mDHmZyJyD7DcGPOqiPwcmxhagX3A14wxG492Tm1BRJmWRjs0cfljsGupLTBOuMzOqxh6ekS1KrprbzfsOdDAZl/C2FxeS8XePXyn+sdMk038smUu/9t2Md607i2ONMZ4U8nsp0njhOzfCb+dBF+43/4dKSDMupicogkiipWvs0Nl1zwLTQftRvSFN9kNjqKhq6ByMzz9RUztXqo/9wBrMmZRUl7H5vI6tlTYJHKoua3jcE9aImO8NmGM9nYmjv4pmjiOqr0d7h0KU66GC3/pdjRhQxOEig7N9bD2BduqKF0F8f3s6pzTboTcArejOzHbFsGz19mupPkL7QzpbtrbDaU1DZSU11FSUcvm8jpKKurYUl5LfZfEkZOaSN6AVMZ4UxnjSxp5A9KOO3G0trXT2NpOY0sbDc1tNLW20dji+7ml83HnzfdzaxsNze00ttrnm1rafcd3Htfc1k7/fvF405LwpCXaW2oinnR7701LJCslwZkhwwCPzLYTDG94zZnzRyBNECr67FkJKx63e1a0HIJBU2yr4tQrISHF7eh6Z8Wf7ezo7DF2g5/j3O61vd1QdrCRzeW1bCmv6+iy2lJRR11Ta8dxOakJjPGmkZ2aQGNLu+8D335gN3T58G7yJYDW9hP7fz82RkiOjyUpPobEuFiSE+zjpLhYkuLtLT5W2H+omcraJiprmzjY2HrEeUQgOyUBjz+JpCZ2JBNvWudjT1oiaYlxx7ckyivfsJM2/2PrCf0bo5EmCBW9GmtgzXO2VVGx3q4sO2mu7WMO4eZGx6W9Hf51t11XadRsu1dyELvKjDGU1fgSh6/Gsbm8joMNLSTGd35od/0AT4yP7fhwT/LdJ8fH+o6PJSkuxnd8rO8DP6bjQ9//OP4EvvU3trTZZFHX1JE0Kmo7H1fWNVF5sJHKuiZa2o78TEqKjzkiiXhSk/CmH/5cTmqinZey5H/hre/Dd7dAqicYv+6IpwlCRT9jYNdHNlGsewnammwxe/yldqZ26kBI893iEt2Ls/kQvPgV2PgaFN4Mc34ZdkuOhCNjDDUNLUcmkcMSSyOVtU3s963Y213/fvGcn7Seew/dzf1D7mNv/9NISYwjJTGO1MRY330cKQlxpCb5HifGkZIYS2piHMnxseG3gGMQhNswV6WCT8QOXTzldLjg51D8tO2Ceuv7Rx6b3P/whJE2MPDP8UnBjbF2r93DobQYLrgXTr8lokdjhZKIkNkvgcx+CYwZkHbUY5tb26mub6Li4JFJpHG/gZ0QW7GBd8qHUd/Uelgd52hihM4k0jWxJNjnUpPiuiSZzoRz2POJcaQm2KTjWJ0lBLQFoSKfMVBfBXV7obYcast8j7vc6srtfXuAb51JGXbNqNQB9j5twJE/pw7s3fLRez+xayo1HIArH4Wxc4L/71XHZgz8cgTkXwQXPQAitLcbDrW0Ud/USm1jq00aTa3UNbVS39xKXZN9ra7R91y35zve12wfB+oKCyQxLoZHrz+NM8fkOPyPPjptQai+ScT2M6d67F7aPWlvtyumBkwgvuSy80P7uK35yPcnZvhaHj0kkLq98Opttj5y05swaJJz/2Z1dCIwYKJd3qX4aUjKJCY5k9Tk/qQmZTIgOROSMqHrfYbvPrl/53Px/Xps/TW1tlHvTypdbp2JpzOxDOkfmUu2a4JQfUdMDKRk2xsTez7OGF8i2etLJr5WSUfrpBw+XWJ/bms6/L2DJsP8ZyF9kKP/FNULc35pF4xsPGBbdP77Q1VQvcX+N26sAY7SEoiJPzyJJPkSSHImiUmZJCZnktX1tUx/gsmxw2wjvGtRE4RS3YnY5T76ZcGA8T0f508k/gTSVGuXPI+U4bfRbsD4o//3A9uqbDp4ZBJpPGD/23Z/rr4Sqkt8Px8jucQmdCaWix6AYTOD+s8LBU0QSp2orolE94uOTDExvm6lTOh/nO9tb4emmgCJpct9w377OEJXAtAEoZRSJyImxtfddLyZJXJE7vgrpZRSjtIEoZRSKiBNEEoppQLSBKGUUiogTRBKKaUC0gShlFIqIE0QSimlAtIEoZRSKqCIW81VRGqBTW7HESZygCq3gwgT+rvopL+LTvq76DTWGHP0NdS7icSZ1JuOd8naaCUiy/V3YenvopP+Ljrp76KTiBz3PgnaxaSUUiogTRBKKaUCisQE8bDbAYQR/V100t9FJ/1ddNLfRafj/l1EXJFaKaVUaERiC0IppVQIaIJQSikVUEQlCBG5QEQ2icgWEbnT7XjcIiJDReRdEdkgIutE5Ftux+QmEYkVkVUi8prbsbhNRDJF5G8istH39xF5+1wGiYh8x/f/x1oReUZEktyOKVRE5DERqRCRtV2eyxKRt0WkxHd/zJ2OIiZBiEgs8AdgDjAemC8ix9hwNmq1AncYY/KBGcCtffh3AfAtYIPbQYSJ3wJvGmPGAZPpo78XEckFbgMKjTETgVhgnrtRhdQTwAXdnrsT+LcxZgzwb9/PRxUxCQKYDmwxxmwzxjQDC4FLXI7JFcaYMmPMSt/jWuyHQK67UblDRIYAnwf+5HYsbhORdOAs4FEAY0yzMeaAu1G5Kg5IFpE4oB9Q6nI8IWOMeR/Y1+3pS4A/+x7/Gbj0WOeJpASRC+zq8vNu+uiHYlciMhyYCixzNxLX3A/8B9DudiBhYCRQCTzu63L7k4ikuB2UG4wxe4BfA58CZUCNMeaf7kblugHGmDKwXzIB77HeEEkJQgI816fH6IpIKvAC8G1jzEG34wk1EfkCUGGMWeF2LGEiDigA/miMmQrU04tuhGjk61+/BBgBDAZSROQad6OKPJGUIHYDQ7v8PIQ+1GTsTkTiscnhKWPMi27H45IzgItFZAe2y/EcEfmruyG5ajew2xjjb03+DZsw+qJzge3GmEpjTAvwIvAZl2NyW7mIDALw3Vcc6w2RlCA+BsaIyAgRScAWnF51OSZXiIhg+5k3GGPuczsetxhjvm+MGWKMGY79e3jHGNNnvyUaY/YCu0RkrO+p2cB6F0Ny06fADBHp5/v/ZTZ9tGDfxavA9b7H1wOvHOsNEbOaqzGmVUS+AbyFHZHwmDFmncthueUM4FrgExEp9j13lzHmdRdjUuHhm8BTvi9R24AbXY7HFcaYZSLyN2AldtTfKvrQshsi8gwwC8gRkd3A3cC9wHMicjM2gX7xmOfRpTaUUkoFEkldTEoppUJIE4RSSqmANEEopZQKSBOEUkqpgDRBKKWUCkgThFI+ItImIsVdbkGbhSwiw7uurKlUJIiYeRBKhUCDMWaK20EoFS60BaHUMYjIDhH5hYh85LuN9j0/TET+LSJrfPen+J4fICIvichq382/xEOsiDzi26PgnyKS7Dv+NhFZ7zvPQpf+mUodQROEUp2Su3Uxze3y2kFjzHTg99gVZPE9ftIYMwl4CnjA9/wDwHvGmMnYtZD8M/7HAH8wxkwADgBX+J6/E5jqO88tTv3jlDpeOpNaKR8RqTPGpAZ4fgdwjjFmm2+RxL3GmGwRqQIGGWNafM+XGWNyRKQSGGKMaepyjuHA277NWhCR/wfEG2N+KiJvAnXAy8DLxpg6h/+pSvWKtiCU6h3Tw+OejgmkqcvjNjprgJ/H7pY4DVjh2+BGKddpglCqd+Z2uV/ie/whndtYXg0s9j3+N/A16NgvO72nk4pIDDDUGPMuduOjTOCIVoxSbtBvKkp1Su6yOi7YvZ39Q10TRWQZ9kvVfN9ztwGPicj3sDu5+VdO/RbwsG/VzDZssijr4ZqxwF9FJAO7Kdb/9PFtQlUY0RqEUsfgq0EUGmOq3I5FqVDSLiallFIBaQtCKaVUQNqCUEopFZAmCKWUUgFpglBKKRWQJgillFIBaYJQSikV0P8H5MKYxO+KMmAAAAAASUVORK5CYII=\n", 377 | "text/plain": [ 378 | "
" 379 | ] 380 | }, 381 | "metadata": {}, 382 | "output_type": "display_data" 383 | } 384 | ], 385 | "source": [ 386 | "plt.plot(history_model.history['acc'])\n", 387 | "plt.plot(history_model.history['val_acc'])\n", 388 | "plt.title('Model Accuracy')\n", 389 | "plt.xlabel('Epochs')\n", 390 | "plt.ylabel('Accuracy')\n", 391 | "plt.xlim((0, 10))\n", 392 | "plt.legend(['Training', 'Validation'])\n", 393 | "plt.show()\n", 394 | "\n", 395 | "# Loss\n", 396 | "plt.plot(history_model.history['loss'])\n", 397 | "plt.plot(history_model.history['val_loss'])\n", 398 | "plt.title('Model Loss')\n", 399 | "plt.xlabel('Epochs')\n", 400 | "plt.ylabel('Loss')\n", 401 | "plt.xlim((0, 10))\n", 402 | "plt.legend(['Training', 'Validation'])\n", 403 | "plt.show()" 404 | ] 405 | } 406 | ], 407 | "metadata": { 408 | "kernelspec": { 409 | "display_name": "Python 3", 410 | "language": "python", 411 | "name": "python3" 412 | }, 413 | "language_info": { 414 | "codemirror_mode": { 415 | "name": "ipython", 416 | "version": 3 417 | }, 418 | "file_extension": ".py", 419 | "mimetype": "text/x-python", 420 | "name": "python", 421 | "nbconvert_exporter": "python", 422 | "pygments_lexer": "ipython3", 423 | "version": "3.6.4" 424 | } 425 | }, 426 | "nbformat": 4, 427 | "nbformat_minor": 2 428 | } 429 | --------------------------------------------------------------------------------