├── 6mm ├── r.gif ├── left.gif └── top.gif ├── ABIDE ├── ABIDE_LEGEND_V1.02.pdf └── ABIDEII_Composite_Phenotypic.csv ├── README.md ├── nilearn_ill.py └── Autism_diagnosis.ipynb /6mm/r.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basharbme/Autism_diagnosis/master/6mm/r.gif -------------------------------------------------------------------------------- /6mm/left.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basharbme/Autism_diagnosis/master/6mm/left.gif -------------------------------------------------------------------------------- /6mm/top.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basharbme/Autism_diagnosis/master/6mm/top.gif -------------------------------------------------------------------------------- /ABIDE/ABIDE_LEGEND_V1.02.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basharbme/Autism_diagnosis/master/ABIDE/ABIDE_LEGEND_V1.02.pdf -------------------------------------------------------------------------------- /ABIDE/ABIDEII_Composite_Phenotypic.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basharbme/Autism_diagnosis/master/ABIDE/ABIDEII_Composite_Phenotypic.csv -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Autism diagnosis with Neural Networks 2 | 3 | On this project, we try to diagnose autism patients from from MRI's raw input data. 4 | 5 | To do this job, we get data from Abide and Abide II: 6 | 7 | * [ABIDE Data](http://fcon_1000.projects.nitrc.org/indi/abide/ABIDE_LEGEND_V1.02.pdf) 8 | * [ABIDE II Phenotypic Data](http://fcon_1000.projects.nitrc.org/indi/abide/ABIDEII_Data_Legend.pdf) 9 | 10 | *This is only a quick view of how Neural Network can help on these kind of problems, so we decided to take a small images (6mm) just to simplify the network, and not to spend long time on the training process the net. 11 | 12 | All software and data is free, so every one can use it! 13 | 14 | ## Let's do it! 15 | 16 | We will do it in Python3, so first we will need next librarys: 17 | 18 | * [Nibabel](http://nipy.org/nibabel/manual.html#manua l): Read MRI images (*.nii.gz) 19 | * [Numpy](http://www.numpy.org/): Work with images data 20 | * [Keras](https://keras.io/): For Neural Networks (NN) implementation. We will use [TensorFlow](https://www.tensorflow.org/) as backend. 21 | * [MatPlotLib](http://matplotlib.org/): Plot different data results. 22 | 23 | ### Explaining oue data structure 24 | 25 | Next to this notebook we have a folder (named ABIDE) with all ABIDE data aviable, with all this data: 26 | 27 | * Autism⚊diagnosis.ipynb 28 | * ABIDE/ 29 | * Phenotypic⚊V1⚊0⚊b.csv 30 | * ABIDEII⚊CompositeP⚊henotypic.csv 31 | * weighted⚊degree/ 32 | * (SITE⚊ID)⚊(SUB⚊ID).nii.gz 33 | * weighted⚊degree⚊II/ 34 | * (SITE⚊ID)⚊(SUB⚊ID).nii.gz 35 | * 6mm/ 36 | * avg152T1⚊(mask⚊type)⚊bin.nii.gz 37 | 38 | #### Reading FMR images names for each location 39 | 40 | We will read both images directories and save each image name in a `` variable. -------------------------------------------------------------------------------- /nilearn_ill.py: -------------------------------------------------------------------------------- 1 | import os 2 | import csv 3 | import numpy as np 4 | import nibabel as nib 5 | 6 | 7 | from keras.models import Sequential 8 | from keras.layers import Dense, Activation, Flatten 9 | from keras.layers import Convolution3D, MaxPooling3D 10 | 11 | #from keras.utils.np_utils import to_categorical 12 | 13 | from keras.optimizers import SGD 14 | 15 | #from keras.utils import np_utils 16 | #from keras import backend as K 17 | import tensorflow as tf 18 | 19 | 20 | directory = "./ABIDE/weighted_degree" 21 | nombres = [] 22 | images = [] 23 | for filename in os.listdir(directory): 24 | if filename.endswith(".nii.gz"): 25 | images.append(nib.load(os.path.join(directory, filename))) 26 | nombres.append(filename) 27 | 28 | 29 | 30 | x_data = [] 31 | for image in images: 32 | x_data.append(image.get_data()) 33 | 34 | x_data = np.asarray(x_data) 35 | 36 | print("Shape of input:") 37 | print(x_data.shape) 38 | 39 | x_data = x_data[:,:10,:10,:10] 40 | print(x_data.shape) 41 | 42 | 43 | y_data = np.full((x_data.shape[0],1), 10, dtype = np.dtype('int16')) 44 | 45 | with open('./ABIDE/Phenotypic_V1_0b.csv') as csvfile: 46 | d = csv.reader(csvfile)#, delimiter=' ', quotechar='|') 47 | for row in d: 48 | name = row[0].title()+"_00"+row[1]+".nii.gz" 49 | try: 50 | i = nombres.index(name) 51 | y_data[i] = row[3] 52 | except Exception as e: 53 | pass 54 | print("Shape of output:") 55 | print(y_data.shape) 56 | 57 | 58 | 59 | 60 | to_select = y_data != 10 61 | to_select = to_select.reshape(to_select.shape[0]) 62 | print(to_select.shape) 63 | print(x_data.shape) 64 | x_data = x_data[to_select,:,:,:] 65 | y_data = y_data[to_select.T,:] 66 | y_data = y_data > 0 67 | 68 | x_data = x_data.reshape(x_data.shape[0],x_data.shape[1],x_data.shape[2],x_data.shape[3],1) 69 | #create output for the net 70 | y_data = np.concatenate((y_data, 1-y_data), axis=1) 71 | 72 | print("New shapes:") 73 | print(x_data.shape) 74 | print(y_data.shape) 75 | print("brains with no lesion:", np.sum(y_data[:,0] == 0)) 76 | 77 | 78 | 79 | 80 | 81 | 82 | model = Sequential() 83 | input_shape=x_data.shape[1:] 84 | 85 | # number of convolutional filters to use 86 | nb_filters = 8 87 | # size of pooling area for max pooling 88 | pool_size = (2, 2, 2) 89 | # convolution kernel size 90 | kernel_size = (3, 3, 3) 91 | 92 | nb_classes = 2 93 | print("Input shape to the network:", input_shape) 94 | model.add(Convolution3D(nb_filters, kernel_size[0], kernel_size[1], kernel_size[2], 95 | border_mode='valid', 96 | input_shape=input_shape)) 97 | model.add(Activation('relu')) 98 | print("Output shape of 1st convolution:", model.output_shape) 99 | 100 | model.add(MaxPooling3D(pool_size=pool_size)) 101 | print("Output shape after a max pooling:", model.output_shape) 102 | 103 | model.add(Convolution3D(nb_filters, kernel_size[0], kernel_size[1], kernel_size[2])) 104 | model.add(Activation('relu')) 105 | print("Output shape of 2nd convolution:", model.output_shape) 106 | 107 | #model.add(MaxPooling3D(pool_size=pool_size)) 108 | #print("Output shape after a max pooling:", model.output_shape) 109 | 110 | #model.add(Convolution3D(nb_filters, kernel_size[0], kernel_size[1], kernel_size[2])) 111 | #model.add(Activation('relu')) 112 | #print("Output shape of 3rd convolution:", model.output_shape) 113 | 114 | #model.add(MaxPooling3D(pool_size=pool_size)) 115 | #print("Output shape after a max pooling:", model.output_shape) 116 | 117 | model.add(Flatten()) 118 | print("Output shape after flatten:", model.output_shape) 119 | 120 | model.add(Dense(128)) 121 | print("Output shape after (dense 128):", model.output_shape) 122 | model.add(Activation('relu')) 123 | print("Output shape after activation(relu):", model.output_shape) 124 | 125 | model.add(Dense(nb_classes)) 126 | model.add(Activation('softmax')) 127 | print("Output shape after softmax (2 classes):", model.output_shape) 128 | 129 | 130 | 131 | 132 | batch_size = 128 133 | nb_epoch = 100 134 | 135 | init_ler = 0.05 136 | final_ler = 0.005 137 | dec = (final_ler/init_ler)**(1/nb_epoch) 138 | 139 | sgd = SGD(lr=init_ler,decay=dec,momentum=0.9,nesterov = False) 140 | model.compile(loss='binary_crossentropy', 141 | optimizer=sgd, 142 | metrics=['accuracy']) 143 | tr_h = model.fit(x_data, y_data, batch_size=batch_size, nb_epoch=nb_epoch,verbose=1) 144 | -------------------------------------------------------------------------------- /Autism_diagnosis.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Autism diagnosis with Neural Networks\n", 8 | "\n", 9 | "On this project, we try to diagnose autism patients from from MRI's raw input data.\n", 10 | "\n", 11 | "To do this job, we get data from Abide and Abide II:\n", 12 | "\n", 13 | "* [ABIDE Data](http://fcon_1000.projects.nitrc.org/indi/abide/ABIDE_LEGEND_V1.02.pdf)\n", 14 | "* [ABIDE II Phenotypic Data](http://fcon_1000.projects.nitrc.org/indi/abide/ABIDEII_Data_Legend.pdf)\n", 15 | "\n", 16 | "*This is only a quick view of how Neural Network can help on these kind of problems, so we decided to take a small images (6mm) just to simplify the network, and not to spend long time on the training process the net.\n", 17 | "\n", 18 | "All software and data is free, so every one can use it!\n", 19 | "\n", 20 | "## Let's do it!\n", 21 | "\n", 22 | "We will do it in Python3, so first we will need next librarys:\n", 23 | "\n", 24 | "* [Nibabel](http://nipy.org/nibabel/manual.html#manua l): Read MRI images (*.nii.gz)\n", 25 | "* [Numpy](http://www.numpy.org/): Work with images data\n", 26 | "* [Keras](https://keras.io/): For Neural Networks (NN) implementation. We will use [TensorFlow](https://www.tensorflow.org/) as backend.\n", 27 | "* [MatPlotLib](http://matplotlib.org/): Plot different data results." 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 1, 33 | "metadata": { 34 | "collapsed": false 35 | }, 36 | "outputs": [ 37 | { 38 | "name": "stderr", 39 | "output_type": "stream", 40 | "text": [ 41 | "Using TensorFlow backend.\n" 42 | ] 43 | } 44 | ], 45 | "source": [ 46 | "%matplotlib inline\n", 47 | "import os\n", 48 | "import csv\n", 49 | "import numpy as np\n", 50 | "import nibabel as nib\n", 51 | "\n", 52 | "from keras.models import Sequential\n", 53 | "from keras.layers import Dense, Activation, Flatten\n", 54 | "from keras.layers import Convolution3D, MaxPooling3D\n", 55 | "\n", 56 | "from keras.models import load_model\n", 57 | "\n", 58 | "from keras.optimizers import SGD\n", 59 | "\n", 60 | "import tensorflow as tf\n", 61 | "\n", 62 | "import matplotlib.pyplot as plt" 63 | ] 64 | }, 65 | { 66 | "cell_type": "markdown", 67 | "metadata": {}, 68 | "source": [ 69 | "### Explaining oue data structure\n", 70 | "\n", 71 | "Next to this notebook we have a folder (named ABIDE) with all ABIDE data aviable, with all this data:\n", 72 | "\n", 73 | "* Autism⚊diagnosis.ipynb\n", 74 | "* ABIDE/\n", 75 | " * Phenotypic⚊V1⚊0⚊b.csv\n", 76 | " * ABIDEII⚊CompositeP⚊henotypic.csv\n", 77 | " * weighted⚊degree/\n", 78 | " * (SITE⚊ID)⚊(SUB⚊ID).nii.gz\n", 79 | " * weighted⚊degree⚊II/\n", 80 | " * (SITE⚊ID)⚊(SUB⚊ID).nii.gz\n", 81 | "* 6mm/\n", 82 | " * avg152T1⚊(mask⚊type)⚊bin.nii.gz\n", 83 | " \n", 84 | "#### Reading FMR images names for each location\n", 85 | "\n", 86 | "We will read both images directories and save each image name in a `` variable." 87 | ] 88 | }, 89 | { 90 | "cell_type": "code", 91 | "execution_count": 2, 92 | "metadata": { 93 | "collapsed": false 94 | }, 95 | "outputs": [ 96 | { 97 | "name": "stdout", 98 | "output_type": "stream", 99 | "text": [ 100 | "Number of images found:\n", 101 | "2152\n" 102 | ] 103 | } 104 | ], 105 | "source": [ 106 | "directory = \"./ABIDE/weighted_degree\"\n", 107 | "names = []\n", 108 | "for filename in os.listdir(directory):\n", 109 | " if filename.endswith(\".nii.gz\"): \n", 110 | " names.append(os.path.join(directory, filename))\n", 111 | " \n", 112 | "directory = \"./ABIDE/weighted_degree_II\"\n", 113 | "for filename in os.listdir(directory):\n", 114 | " if filename.endswith(\".nii.gz\"): \n", 115 | " names.append(os.path.join(directory, filename))\n", 116 | "\n", 117 | "print(\"Number of images found:\")\n", 118 | "print(len(names))" 119 | ] 120 | }, 121 | { 122 | "cell_type": "markdown", 123 | "metadata": {}, 124 | "source": [ 125 | "#### Read csv files\n", 126 | "\n", 127 | "After reading existing images, we need to read .csv files to know if a patient has autism or not:\n", 128 | "\n", 129 | "* ABIDE/\n", 130 | " * Phenotypic⚊V1⚊0⚊b.csv [Explanation](http://fcon_1000.projects.nitrc.org/indi/abide/ABIDE_LEGEND_V1.02.pdf)\n", 131 | " * ABIDEII⚊CompositeP⚊henotypic.csv [Explanation](http://fcon_1000.projects.nitrc.org/indi/abide/ABIDEII_Data_Legend.pdf)" 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": 3, 137 | "metadata": { 138 | "collapsed": false 139 | }, 140 | "outputs": [ 141 | { 142 | "name": "stdout", 143 | "output_type": "stream", 144 | "text": [ 145 | "Shape of output:\n", 146 | "(2152, 1)\n" 147 | ] 148 | } 149 | ], 150 | "source": [ 151 | "y_data = np.full((len(names),1), 10, dtype = np.dtype('int16'))\n", 152 | "with open('./ABIDE/Phenotypic_V1_0b.csv') as csvfile:\n", 153 | " d = csv.reader(csvfile)#, delimiter=' ', quotechar='|')\n", 154 | " for row in d:\n", 155 | " name = [str(x) for x in names if row[1] in str(x)]\n", 156 | " if len(name)>0:\n", 157 | " name = name[0]\n", 158 | " else:\n", 159 | " continue\n", 160 | " try:\n", 161 | " i = names.index(name)\n", 162 | " y_data[i] = row[3]\n", 163 | " except Exception as e:\n", 164 | " pass\n", 165 | "\n", 166 | "with open('./ABIDE/ABIDEII_Composite_Phenotypic.csv','r', encoding='latin-1') as csvfile:\n", 167 | " d = csv.reader(csvfile)#, delimiter=' ', quotechar='|')\n", 168 | " for row in d:\n", 169 | " name = [str(x) for x in names if row[1] in str(x)]\n", 170 | " if len(name)>0:\n", 171 | " name = name[0]\n", 172 | " else:\n", 173 | " continue\n", 174 | " try:\n", 175 | " i = names.index(name)\n", 176 | " y_data[i] = row[3]\n", 177 | " except Exception as e:\n", 178 | " pass\n", 179 | "\n", 180 | "print(\"Shape of output:\") \n", 181 | "print(y_data.shape)" 182 | ] 183 | }, 184 | { 185 | "cell_type": "markdown", 186 | "metadata": {}, 187 | "source": [ 188 | "We can not match all brains with their raw data and their lesion, so we have to select thouse that we match" 189 | ] 190 | }, 191 | { 192 | "cell_type": "code", 193 | "execution_count": 4, 194 | "metadata": { 195 | "collapsed": false 196 | }, 197 | "outputs": [ 198 | { 199 | "name": "stdout", 200 | "output_type": "stream", 201 | "text": [ 202 | "To select: 2114\n", 203 | "New shapes:\n", 204 | "x: (2114,)\n", 205 | "y: (2114, 2)\n", 206 | "brains with no lesion: 590\n" 207 | ] 208 | } 209 | ], 210 | "source": [ 211 | "# Convert names Array into Numpy array\n", 212 | "names = np.asarray(names)\n", 213 | "\n", 214 | "# Select thouse values that match img_name and autims value\n", 215 | "to_select = y_data != 10\n", 216 | "to_select = to_select.reshape(to_select.shape[0])\n", 217 | "print(\"To select:\",np.sum(to_select))\n", 218 | "\n", 219 | "names = names[to_select]\n", 220 | "y_data = y_data[to_select,:]\n", 221 | "y_data = y_data > 0\n", 222 | "\n", 223 | "#create autism other values\n", 224 | "y_data = np.concatenate((y_data, 1-y_data), axis=1)\n", 225 | "\n", 226 | "print(\"New shapes:\")\n", 227 | "print(\"x:\",names.shape)\n", 228 | "print(\"y:\",y_data.shape)\n", 229 | "print(\"brains with no lesion:\", np.sum(y_data[:,0] == 0))" 230 | ] 231 | }, 232 | { 233 | "cell_type": "markdown", 234 | "metadata": {}, 235 | "source": [ 236 | "#### Filtering data\n", 237 | "\n", 238 | "Since data has been taken from different sites and machines, it could be difficult to find different from each images. So we dicede to have the opportunity of select one of the different locations:" 239 | ] 240 | }, 241 | { 242 | "cell_type": "code", 243 | "execution_count": 5, 244 | "metadata": { 245 | "collapsed": false 246 | }, 247 | "outputs": [ 248 | { 249 | "name": "stdout", 250 | "output_type": "stream", 251 | "text": [ 252 | "Different locations:\n", 253 | " 0 Caltech \t 38 examples\n", 254 | " 1 CMU \t 27 examples\n", 255 | " 2 KKI \t 266 examples\n", 256 | " 3 Leuven \t 64 examples\n", 257 | " 4 MaxMun \t 57 examples\n", 258 | " 5 NYU \t 289 examples\n", 259 | " 6 OHSU \t 121 examples\n", 260 | " 7 Olin \t 36 examples\n", 261 | " 8 Pitt \t 57 examples\n", 262 | " 9 SBL \t 30 examples\n", 263 | " 10 SDSU \t 94 examples\n", 264 | " 11 Trinity \t 49 examples\n", 265 | " 12 UCLA \t 141 examples\n", 266 | " 13 UM \t 145 examples\n", 267 | " 14 USM \t 134 examples\n", 268 | " 15 Yale \t 56 examples\n", 269 | " 16 BNI \t 58 examples\n", 270 | " 17 EMC \t 54 examples\n", 271 | " 18 ETH \t 37 examples\n", 272 | " 19 GU \t 106 examples\n", 273 | " 20 IP \t 55 examples\n", 274 | " 21 IU \t 39 examples\n", 275 | " 22 KUL \t 28 examples\n", 276 | " 23 ONRC \t 59 examples\n", 277 | " 24 TCD \t 42 examples\n", 278 | " 25 UCD \t 32 examples\n" 279 | ] 280 | } 281 | ], 282 | "source": [ 283 | "locations = []\n", 284 | "number = []\n", 285 | "for n in names:\n", 286 | " a = n.split(\"/\")[-1].split(\"_\")[0].split(\"-\")[-1]\n", 287 | " if a not in locations:\n", 288 | " locations.append(a)\n", 289 | " number.append(1)\n", 290 | " else:\n", 291 | " i = locations.index(a)\n", 292 | " number[i] += 1\n", 293 | "print(\"Different locations:\")\n", 294 | "for i in range(len(locations)):\n", 295 | " print(\" \",i,locations[i], \"\\t\", number[i], \"examples\")\n" 296 | ] 297 | }, 298 | { 299 | "cell_type": "markdown", 300 | "metadata": {}, 301 | "source": [ 302 | "Now select the index of the examples brains: (-1 for all)" 303 | ] 304 | }, 305 | { 306 | "cell_type": "code", 307 | "execution_count": 6, 308 | "metadata": { 309 | "collapsed": false 310 | }, 311 | "outputs": [ 312 | { 313 | "name": "stdout", 314 | "output_type": "stream", 315 | "text": [ 316 | "Names: (2114,)\n", 317 | "y_data: (2114, 2)\n" 318 | ] 319 | } 320 | ], 321 | "source": [ 322 | "site_index = -1\n", 323 | "\n", 324 | "if site_index != -1:\n", 325 | " select_site = np.zeros(y_data.shape[0])\n", 326 | " selected_site_name = locations[site_index]\n", 327 | " i = 0 \n", 328 | " for n in names:\n", 329 | " a = n.split(\"/\")[-1].split(\"_\")[0].split(\"-\")[-1]\n", 330 | " if a == selected_site_name:\n", 331 | " select_site[i] = 1\n", 332 | " i += 1\n", 333 | " print(\"Selected:\")\n", 334 | " print(\"\\tName:\", selected_site_name) \n", 335 | " print(\"\\tNumber:\", int(np.sum(select_site))) \n", 336 | "\n", 337 | " select_site = select_site > 0\n", 338 | " names = names[select_site]\n", 339 | " y_data = y_data[select_site,:]\n", 340 | "print(\"Names:\", names.shape)\n", 341 | "print(\"y_data:\", y_data.shape)" 342 | ] 343 | }, 344 | { 345 | "cell_type": "markdown", 346 | "metadata": {}, 347 | "source": [ 348 | "#### Mask\n", 349 | "\n", 350 | "Now we have to select which mask use to reduce raw input:\n", 351 | "\n", 352 | "* white: brain mask\n", 353 | "* blue: gray mask\n", 354 | "* yellow: white mask\n", 355 | "* green: csf mask\n", 356 | "\n", 357 | "
\n", 358 | "\n", 359 | "\n", 360 | "\n", 361 | "\n", 362 | "
\n", 363 | "\n" 364 | ] 365 | }, 366 | { 367 | "cell_type": "code", 368 | "execution_count": 7, 369 | "metadata": { 370 | "collapsed": false 371 | }, 372 | "outputs": [ 373 | { 374 | "name": "stdout", 375 | "output_type": "stream", 376 | "text": [ 377 | "(32400,)\n", 378 | "10643\n" 379 | ] 380 | } 381 | ], 382 | "source": [ 383 | "mask_types = ['brain','csf', 'gray', 'white']\n", 384 | "mask_index = 0\n", 385 | "mask = nib.load(\"./6mm/avg152T1_\"+mask_types[mask_index]+\"_bin.nii.gz\").get_data()\n", 386 | "num = mask.shape[0]*mask.shape[1]*mask.shape[2]\n", 387 | "mask = mask.reshape(num) > 0\n", 388 | "print(mask.shape)\n", 389 | "print(np.sum(mask))" 390 | ] 391 | }, 392 | { 393 | "cell_type": "markdown", 394 | "metadata": {}, 395 | "source": [ 396 | "### Read raw imput\n", 397 | "\n", 398 | "Read only needed raw imput" 399 | ] 400 | }, 401 | { 402 | "cell_type": "code", 403 | "execution_count": 8, 404 | "metadata": { 405 | "collapsed": false 406 | }, 407 | "outputs": [ 408 | { 409 | "name": "stdout", 410 | "output_type": "stream", 411 | "text": [ 412 | "Shape of input:\n", 413 | "(2114, 10643)\n" 414 | ] 415 | } 416 | ], 417 | "source": [ 418 | "x_data = []\n", 419 | "for image in names:\n", 420 | " im = nib.load(image).get_data()\n", 421 | " im = im.reshape(num)\n", 422 | " im = im[mask]\n", 423 | " x_data.append(im)\n", 424 | "\n", 425 | "x_data = np.asarray(x_data)\n", 426 | "\n", 427 | "print(\"Shape of input:\")\n", 428 | "print(x_data.shape)" 429 | ] 430 | }, 431 | { 432 | "cell_type": "markdown", 433 | "metadata": {}, 434 | "source": [ 435 | "### Split to train/test" 436 | ] 437 | }, 438 | { 439 | "cell_type": "code", 440 | "execution_count": 9, 441 | "metadata": { 442 | "collapsed": false 443 | }, 444 | "outputs": [ 445 | { 446 | "name": "stdout", 447 | "output_type": "stream", 448 | "text": [ 449 | "New train and test data:\n", 450 | "Train: (1479, 10643) (1479, 2)\n", 451 | "Test: (635, 10643) (635, 2)\n" 452 | ] 453 | } 454 | ], 455 | "source": [ 456 | "#shuffle the data\n", 457 | "r = np.random.permutation(x_data.shape[0])\n", 458 | "x_data = x_data[r,:]\n", 459 | "y_data = y_data[r,:]\n", 460 | "\n", 461 | "train = 0.70\n", 462 | "bb = int(y_data.shape[0]*train)\n", 463 | "\n", 464 | "x_data_tr = x_data[:bb,:]\n", 465 | "y_data_tr = y_data[:bb,:]\n", 466 | "\n", 467 | "x_data_ts = x_data[bb:,:]\n", 468 | "y_data_ts = y_data[bb:,:]\n", 469 | "\n", 470 | "print(\"New train and test data:\")\n", 471 | "print(\"Train:\", x_data_tr.shape, y_data_tr.shape)\n", 472 | "print(\"Test:\", x_data_ts.shape, y_data_ts.shape)" 473 | ] 474 | }, 475 | { 476 | "cell_type": "markdown", 477 | "metadata": {}, 478 | "source": [ 479 | "### Building the net" 480 | ] 481 | }, 482 | { 483 | "cell_type": "code", 484 | "execution_count": 10, 485 | "metadata": { 486 | "collapsed": false 487 | }, 488 | "outputs": [ 489 | { 490 | "name": "stdout", 491 | "output_type": "stream", 492 | "text": [ 493 | "409\n", 494 | "1070\n" 495 | ] 496 | } 497 | ], 498 | "source": [ 499 | "print(np.sum(y_data_tr[:,1]))\n", 500 | "print(np.sum(y_data_tr[:,0]))" 501 | ] 502 | }, 503 | { 504 | "cell_type": "code", 505 | "execution_count": 30, 506 | "metadata": { 507 | "collapsed": false 508 | }, 509 | "outputs": [ 510 | { 511 | "name": "stdout", 512 | "output_type": "stream", 513 | "text": [ 514 | "Input shape to the network: (10643,)\n", 515 | "Output shape after: (None, 4096)\n", 516 | "Output shape after: (None, 512)\n", 517 | "Output shape after: (None, 128)\n", 518 | "Output shape after softmax (2 classes): (None, 2)\n" 519 | ] 520 | } 521 | ], 522 | "source": [ 523 | "model = Sequential()\n", 524 | "input_shape=x_data.shape[1:]\n", 525 | "\n", 526 | "# number of convolutional filters to use\n", 527 | "nb_filters = 8\n", 528 | "# size of pooling area for max pooling\n", 529 | "pool_size = (2, 2, 2)\n", 530 | "# convolution kernel size\n", 531 | "kernel_size = (3, 3, 3)\n", 532 | "\n", 533 | "nb_classes = 2\n", 534 | "print(\"Input shape to the network:\", input_shape)\n", 535 | "\n", 536 | "model.add(Dense(4096,activation='tanh',input_shape=input_shape))\n", 537 | "print(\"Output shape after:\", model.output_shape)\n", 538 | "\n", 539 | "model.add(Dense(512,activation='tanh'))\n", 540 | "print(\"Output shape after:\", model.output_shape)\n", 541 | "\n", 542 | "model.add(Dense(128,activation='tanh'))\n", 543 | "print(\"Output shape after:\", model.output_shape)\n", 544 | "\n", 545 | "model.add(Dense(nb_classes,activation='softmax'))\n", 546 | "print(\"Output shape after softmax (2 classes):\", model.output_shape)" 547 | ] 548 | }, 549 | { 550 | "cell_type": "markdown", 551 | "metadata": {}, 552 | "source": [ 553 | "### Train the net" 554 | ] 555 | }, 556 | { 557 | "cell_type": "code", 558 | "execution_count": 12, 559 | "metadata": { 560 | "collapsed": false 561 | }, 562 | "outputs": [], 563 | "source": [ 564 | "#balance the data\n", 565 | "def balance(balance_rate, x_data_tr, y_data_tr):\n", 566 | "\n", 567 | " r = np.random.permutation(x_data_tr.shape[0])\n", 568 | " x_data_tr = x_data_tr[r,:]\n", 569 | " y_data_tr = y_data_tr[r,:]\n", 570 | "\n", 571 | " a = np.where(y_data_tr[:,0] == 1)[0]\n", 572 | " b = np.where(y_data_tr[:,0] == 0)[0]\n", 573 | " print(\"Unbalance:\", a.shape, b.shape)\n", 574 | " if a.shape[0] > b.shape[0]:\n", 575 | " num = int(b.shape[0]*balance_rate)\n", 576 | " else:\n", 577 | " num = int(a.shape[0]*balance_rate)\n", 578 | " a = a[:num]\n", 579 | " b = b[:num]\n", 580 | " print(\"Balance:\", a.shape, b.shape)\n", 581 | " a = np.append(a,b)\n", 582 | " print(a.shape)\n", 583 | " x_data_tr_t = x_data_tr[a]\n", 584 | " y_data_tr_t = y_data_tr[a]\n", 585 | " print(x_data_tr_t.shape)\n", 586 | " return((x_data_tr_t, y_data_tr_t))" 587 | ] 588 | }, 589 | { 590 | "cell_type": "code", 591 | "execution_count": 31, 592 | "metadata": { 593 | "collapsed": false 594 | }, 595 | "outputs": [ 596 | { 597 | "name": "stdout", 598 | "output_type": "stream", 599 | "text": [ 600 | "Epoca: 1 / 100\n", 601 | "Unbalance: (1070,) (409,)\n", 602 | "Balance: (409,) (409,)\n", 603 | "(818,)\n", 604 | "(818, 10643)\n", 605 | "Epoch 1/1\n", 606 | "9s - loss: -3.0606e-01 - acc: 0.4768\n", 607 | "Epoca: 2 / 100\n", 608 | "Unbalance: (1070,) (409,)\n", 609 | "Balance: (410,) (409,)\n", 610 | "(819,)\n", 611 | "(819, 10643)\n", 612 | "Epoch 1/1\n", 613 | "10s - loss: -3.5452e-01 - acc: 0.5421\n", 614 | "Epoca: 3 / 100\n", 615 | "Unbalance: (1070,) (409,)\n", 616 | "Balance: (412,) (409,)\n", 617 | "(821,)\n", 618 | "(821, 10643)\n", 619 | "Epoch 1/1\n", 620 | "9s - loss: -3.5340e-01 - acc: 0.5079\n", 621 | "Epoca: 4 / 100\n", 622 | "Unbalance: (1070,) (409,)\n", 623 | "Balance: (414,) (409,)\n", 624 | "(823,)\n", 625 | "(823, 10643)\n", 626 | "Epoch 1/1\n", 627 | "8s - loss: -3.5512e-01 - acc: 0.5310\n", 628 | "Epoca: 5 / 100\n", 629 | "Unbalance: (1070,) (409,)\n", 630 | "Balance: (415,) (409,)\n", 631 | "(824,)\n", 632 | "(824, 10643)\n", 633 | "Epoch 1/1\n", 634 | "11s - loss: -3.5271e-01 - acc: 0.5061\n", 635 | "Epoca: 6 / 100\n", 636 | "Unbalance: (1070,) (409,)\n", 637 | "Balance: (417,) (409,)\n", 638 | "(826,)\n", 639 | "(826, 10643)\n", 640 | "Epoch 1/1\n", 641 | "11s - loss: -3.4893e-01 - acc: 0.5036\n", 642 | "Epoca: 7 / 100\n", 643 | "Unbalance: (1070,) (409,)\n", 644 | "Balance: (419,) (409,)\n", 645 | "(828,)\n", 646 | "(828, 10643)\n", 647 | "Epoch 1/1\n", 648 | "11s - loss: -3.5569e-01 - acc: 0.5423\n", 649 | "Epoca: 8 / 100\n", 650 | "Unbalance: (1070,) (409,)\n", 651 | "Balance: (420,) (409,)\n", 652 | "(829,)\n", 653 | "(829, 10643)\n", 654 | "Epoch 1/1\n", 655 | "10s - loss: -3.5460e-01 - acc: 0.5452\n", 656 | "Epoca: 9 / 100\n", 657 | "Unbalance: (1070,) (409,)\n", 658 | "Balance: (422,) (409,)\n", 659 | "(831,)\n", 660 | "(831, 10643)\n", 661 | "Epoch 1/1\n", 662 | "10s - loss: -3.5081e-01 - acc: 0.4982\n", 663 | "Epoca: 10 / 100\n", 664 | "Unbalance: (1070,) (409,)\n", 665 | "Balance: (424,) (409,)\n", 666 | "(833,)\n", 667 | "(833, 10643)\n", 668 | "Epoch 1/1\n", 669 | "10s - loss: -3.5476e-01 - acc: 0.5102\n", 670 | "Epoca: 11 / 100\n", 671 | "Unbalance: (1070,) (409,)\n", 672 | "Balance: (425,) (409,)\n", 673 | "(834,)\n", 674 | "(834, 10643)\n", 675 | "Epoch 1/1\n", 676 | "9s - loss: -3.5571e-01 - acc: 0.5528\n", 677 | "Epoca: 12 / 100\n", 678 | "Unbalance: (1070,) (409,)\n", 679 | "Balance: (427,) (409,)\n", 680 | "(836,)\n", 681 | "(836, 10643)\n", 682 | "Epoch 1/1\n", 683 | "10s - loss: -3.5293e-01 - acc: 0.5203\n", 684 | "Epoca: 13 / 100\n", 685 | "Unbalance: (1070,) (409,)\n", 686 | "Balance: (429,) (409,)\n", 687 | "(838,)\n", 688 | "(838, 10643)\n", 689 | "Epoch 1/1\n", 690 | "9s - loss: -3.5446e-01 - acc: 0.5251\n", 691 | "Epoca: 14 / 100\n", 692 | "Unbalance: (1070,) (409,)\n", 693 | "Balance: (431,) (409,)\n", 694 | "(840,)\n", 695 | "(840, 10643)\n", 696 | "Epoch 1/1\n", 697 | "9s - loss: -3.5561e-01 - acc: 0.5393\n", 698 | "Epoca: 15 / 100\n", 699 | "Unbalance: (1070,) (409,)\n", 700 | "Balance: (432,) (409,)\n", 701 | "(841,)\n", 702 | "(841, 10643)\n", 703 | "Epoch 1/1\n", 704 | "10s - loss: -3.5632e-01 - acc: 0.5493\n", 705 | "Epoca: 16 / 100\n", 706 | "Unbalance: (1070,) (409,)\n", 707 | "Balance: (434,) (409,)\n", 708 | "(843,)\n", 709 | "(843, 10643)\n", 710 | "Epoch 1/1\n", 711 | "9s - loss: -3.5598e-01 - acc: 0.5611\n", 712 | "Epoca: 17 / 100\n", 713 | "Unbalance: (1070,) (409,)\n", 714 | "Balance: (436,) (409,)\n", 715 | "(845,)\n", 716 | "(845, 10643)\n", 717 | "Epoch 1/1\n", 718 | "9s - loss: -3.5583e-01 - acc: 0.5846\n", 719 | "Epoca: 18 / 100\n", 720 | "Unbalance: (1070,) (409,)\n", 721 | "Balance: (438,) (409,)\n", 722 | "(847,)\n", 723 | "(847, 10643)\n", 724 | "Epoch 1/1\n", 725 | "9s - loss: -3.5568e-01 - acc: 0.5431\n", 726 | "Epoca: 19 / 100\n", 727 | "Unbalance: (1070,) (409,)\n", 728 | "Balance: (439,) (409,)\n", 729 | "(848,)\n", 730 | "(848, 10643)\n", 731 | "Epoch 1/1\n", 732 | "9s - loss: -3.5600e-01 - acc: 0.5578\n", 733 | "Epoca: 20 / 100\n", 734 | "Unbalance: (1070,) (409,)\n", 735 | "Balance: (441,) (409,)\n", 736 | "(850,)\n", 737 | "(850, 10643)\n", 738 | "Epoch 1/1\n", 739 | "9s - loss: -3.5499e-01 - acc: 0.5235\n", 740 | "Epoca: 21 / 100\n", 741 | "Unbalance: (1070,) (409,)\n", 742 | "Balance: (443,) (409,)\n", 743 | "(852,)\n", 744 | "(852, 10643)\n", 745 | "Epoch 1/1\n", 746 | "9s - loss: -3.5590e-01 - acc: 0.5575\n", 747 | "Epoca: 22 / 100\n", 748 | "Unbalance: (1070,) (409,)\n", 749 | "Balance: (445,) (409,)\n", 750 | "(854,)\n", 751 | "(854, 10643)\n", 752 | "Epoch 1/1\n", 753 | "9s - loss: -3.5657e-01 - acc: 0.5457\n", 754 | "Epoca: 23 / 100\n", 755 | "Unbalance: (1070,) (409,)\n", 756 | "Balance: (447,) (409,)\n", 757 | "(856,)\n", 758 | "(856, 10643)\n", 759 | "Epoch 1/1\n", 760 | "9s - loss: -3.5650e-01 - acc: 0.5958\n", 761 | "Epoca: 24 / 100\n", 762 | "Unbalance: (1070,) (409,)\n", 763 | "Balance: (448,) (409,)\n", 764 | "(857,)\n", 765 | "(857, 10643)\n", 766 | "Epoch 1/1\n", 767 | "9s - loss: -3.5583e-01 - acc: 0.5729\n", 768 | "Epoca: 25 / 100\n", 769 | "Unbalance: (1070,) (409,)\n", 770 | "Balance: (450,) (409,)\n", 771 | "(859,)\n", 772 | "(859, 10643)\n", 773 | "Epoch 1/1\n", 774 | "9s - loss: -3.5601e-01 - acc: 0.5367\n", 775 | "Epoca: 26 / 100\n", 776 | "Unbalance: (1070,) (409,)\n", 777 | "Balance: (452,) (409,)\n", 778 | "(861,)\n", 779 | "(861, 10643)\n", 780 | "Epoch 1/1\n", 781 | "9s - loss: -3.5601e-01 - acc: 0.5494\n", 782 | "Epoca: 27 / 100\n", 783 | "Unbalance: (1070,) (409,)\n", 784 | "Balance: (454,) (409,)\n", 785 | "(863,)\n", 786 | "(863, 10643)\n", 787 | "Epoch 1/1\n", 788 | "10s - loss: -3.5591e-01 - acc: 0.5550\n", 789 | "Epoca: 28 / 100\n", 790 | "Unbalance: (1070,) (409,)\n", 791 | "Balance: (456,) (409,)\n", 792 | "(865,)\n", 793 | "(865, 10643)\n", 794 | "Epoch 1/1\n", 795 | "9s - loss: -3.5675e-01 - acc: 0.5503\n", 796 | "Epoca: 29 / 100\n", 797 | "Unbalance: (1070,) (409,)\n", 798 | "Balance: (458,) (409,)\n", 799 | "(867,)\n", 800 | "(867, 10643)\n", 801 | "Epoch 1/1\n", 802 | "9s - loss: -3.5667e-01 - acc: 0.5444\n", 803 | "Epoca: 30 / 100\n", 804 | "Unbalance: (1070,) (409,)\n", 805 | "Balance: (460,) (409,)\n", 806 | "(869,)\n", 807 | "(869, 10643)\n", 808 | "Epoch 1/1\n", 809 | "9s - loss: -3.5651e-01 - acc: 0.5581\n", 810 | "Epoca: 31 / 100\n", 811 | "Unbalance: (1070,) (409,)\n", 812 | "Balance: (461,) (409,)\n", 813 | "(870,)\n", 814 | "(870, 10643)\n", 815 | "Epoch 1/1\n", 816 | "9s - loss: -3.5628e-01 - acc: 0.5598\n", 817 | "Epoca: 32 / 100\n", 818 | "Unbalance: (1070,) (409,)\n", 819 | "Balance: (463,) (409,)\n", 820 | "(872,)\n", 821 | "(872, 10643)\n", 822 | "Epoch 1/1\n", 823 | "9s - loss: -3.5723e-01 - acc: 0.5539\n", 824 | "Epoca: 33 / 100\n", 825 | "Unbalance: (1070,) (409,)\n", 826 | "Balance: (465,) (409,)\n", 827 | "(874,)\n", 828 | "(874, 10643)\n", 829 | "Epoch 1/1\n", 830 | "9s - loss: -3.5656e-01 - acc: 0.5492\n", 831 | "Epoca: 34 / 100\n", 832 | "Unbalance: (1070,) (409,)\n", 833 | "Balance: (467,) (409,)\n", 834 | "(876,)\n", 835 | "(876, 10643)\n", 836 | "Epoch 1/1\n", 837 | "9s - loss: -3.5732e-01 - acc: 0.5685\n", 838 | "Epoca: 35 / 100\n", 839 | "Unbalance: (1070,) (409,)\n", 840 | "Balance: (469,) (409,)\n", 841 | "(878,)\n", 842 | "(878, 10643)\n", 843 | "Epoch 1/1\n", 844 | "9s - loss: -3.5629e-01 - acc: 0.5421\n", 845 | "Epoca: 36 / 100\n", 846 | "Unbalance: (1070,) (409,)\n", 847 | "Balance: (471,) (409,)\n", 848 | "(880,)\n", 849 | "(880, 10643)\n", 850 | "Epoch 1/1\n", 851 | "9s - loss: -3.5691e-01 - acc: 0.5455\n", 852 | "Epoca: 37 / 100\n", 853 | "Unbalance: (1070,) (409,)\n", 854 | "Balance: (473,) (409,)\n", 855 | "(882,)\n", 856 | "(882, 10643)\n", 857 | "Epoch 1/1\n", 858 | "9s - loss: -3.5681e-01 - acc: 0.5680\n", 859 | "Epoca: 38 / 100\n", 860 | "Unbalance: (1070,) (409,)\n", 861 | "Balance: (475,) (409,)\n", 862 | "(884,)\n", 863 | "(884, 10643)\n", 864 | "Epoch 1/1\n", 865 | "9s - loss: -3.5644e-01 - acc: 0.5464\n", 866 | "Epoca: 39 / 100\n", 867 | "Unbalance: (1070,) (409,)\n", 868 | "Balance: (477,) (409,)\n", 869 | "(886,)\n", 870 | "(886, 10643)\n", 871 | "Epoch 1/1\n", 872 | "9s - loss: -3.5712e-01 - acc: 0.5429\n", 873 | "Epoca: 40 / 100\n", 874 | "Unbalance: (1070,) (409,)\n", 875 | "Balance: (479,) (409,)\n", 876 | "(888,)\n", 877 | "(888, 10643)\n", 878 | "Epoch 1/1\n", 879 | "9s - loss: -3.5738e-01 - acc: 0.5574\n", 880 | "Epoca: 41 / 100\n", 881 | "Unbalance: (1070,) (409,)\n", 882 | "Balance: (481,) (409,)\n", 883 | "(890,)\n", 884 | "(890, 10643)\n", 885 | "Epoch 1/1\n", 886 | "9s - loss: -3.5739e-01 - acc: 0.5596\n", 887 | "Epoca: 42 / 100\n", 888 | "Unbalance: (1070,) (409,)\n", 889 | "Balance: (482,) (409,)\n", 890 | "(891,)\n", 891 | "(891, 10643)\n", 892 | "Epoch 1/1\n", 893 | "10s - loss: -3.5670e-01 - acc: 0.5499\n", 894 | "Epoca: 43 / 100\n", 895 | "Unbalance: (1070,) (409,)\n", 896 | "Balance: (484,) (409,)\n", 897 | "(893,)\n", 898 | "(893, 10643)\n", 899 | "Epoch 1/1\n", 900 | "9s - loss: -3.5737e-01 - acc: 0.5510\n", 901 | "Epoca: 44 / 100\n", 902 | "Unbalance: (1070,) (409,)\n", 903 | "Balance: (486,) (409,)\n", 904 | "(895,)\n", 905 | "(895, 10643)\n", 906 | "Epoch 1/1\n", 907 | "9s - loss: -3.5737e-01 - acc: 0.5520\n", 908 | "Epoca: 45 / 100\n", 909 | "Unbalance: (1070,) (409,)\n", 910 | "Balance: (488,) (409,)\n", 911 | "(897,)\n", 912 | "(897, 10643)\n", 913 | "Epoch 1/1\n", 914 | "10s - loss: -3.5710e-01 - acc: 0.5596\n", 915 | "Epoca: 46 / 100\n", 916 | "Unbalance: (1070,) (409,)\n", 917 | "Balance: (490,) (409,)\n", 918 | "(899,)\n", 919 | "(899, 10643)\n", 920 | "Epoch 1/1\n", 921 | "10s - loss: -3.5605e-01 - acc: 0.5473\n", 922 | "Epoca: 47 / 100\n", 923 | "Unbalance: (1070,) (409,)\n", 924 | "Balance: (492,) (409,)\n", 925 | "(901,)\n", 926 | "(901, 10643)\n", 927 | "Epoch 1/1\n", 928 | "10s - loss: -3.5589e-01 - acc: 0.5472\n", 929 | "Epoca: 48 / 100\n", 930 | "Unbalance: (1070,) (409,)\n", 931 | "Balance: (494,) (409,)\n", 932 | "(903,)\n", 933 | "(903, 10643)\n", 934 | "Epoch 1/1\n", 935 | "11s - loss: -3.5798e-01 - acc: 0.5615\n", 936 | "Epoca: 49 / 100\n", 937 | "Unbalance: (1070,) (409,)\n", 938 | "Balance: (496,) (409,)\n", 939 | "(905,)\n", 940 | "(905, 10643)\n", 941 | "Epoch 1/1\n", 942 | "10s - loss: -3.5589e-01 - acc: 0.5591\n", 943 | "Epoca: 50 / 100\n", 944 | "Unbalance: (1070,) (409,)\n", 945 | "Balance: (498,) (409,)\n", 946 | "(907,)\n", 947 | "(907, 10643)\n", 948 | "Epoch 1/1\n", 949 | "10s - loss: -3.5794e-01 - acc: 0.5843\n", 950 | "Epoca: 51 / 100\n", 951 | "Unbalance: (1070,) (409,)\n", 952 | "Balance: (500,) (409,)\n", 953 | "(909,)\n", 954 | "(909, 10643)\n", 955 | "Epoch 1/1\n", 956 | "10s - loss: -3.5724e-01 - acc: 0.5512\n", 957 | "Epoca: 52 / 100\n", 958 | "Unbalance: (1070,) (409,)\n", 959 | "Balance: (502,) (409,)\n", 960 | "(911,)\n", 961 | "(911, 10643)\n", 962 | "Epoch 1/1\n", 963 | "9s - loss: -3.5760e-01 - acc: 0.5510\n", 964 | "Epoca: 53 / 100\n", 965 | "Unbalance: (1070,) (409,)\n", 966 | "Balance: (504,) (409,)\n", 967 | "(913,)\n", 968 | "(913, 10643)\n", 969 | "Epoch 1/1\n", 970 | "9s - loss: -3.5811e-01 - acc: 0.5542\n", 971 | "Epoca: 54 / 100\n", 972 | "Unbalance: (1070,) (409,)\n", 973 | "Balance: (507,) (409,)\n", 974 | "(916,)\n", 975 | "(916, 10643)\n", 976 | "Epoch 1/1\n", 977 | "15s - loss: -3.5785e-01 - acc: 0.5677\n", 978 | "Epoca: 55 / 100\n", 979 | "Unbalance: (1070,) (409,)\n", 980 | "Balance: (509,) (409,)\n", 981 | "(918,)\n", 982 | "(918, 10643)\n", 983 | "Epoch 1/1\n", 984 | "16s - loss: -3.5763e-01 - acc: 0.5937\n", 985 | "Epoca: 56 / 100\n", 986 | "Unbalance: (1070,) (409,)\n", 987 | "Balance: (511,) (409,)\n", 988 | "(920,)\n", 989 | "(920, 10643)\n", 990 | "Epoch 1/1\n", 991 | "16s - loss: -3.5873e-01 - acc: 0.5707\n", 992 | "Epoca: 57 / 100\n", 993 | "Unbalance: (1070,) (409,)\n", 994 | "Balance: (513,) (409,)\n", 995 | "(922,)\n", 996 | "(922, 10643)\n", 997 | "Epoch 1/1\n", 998 | "11s - loss: -3.5893e-01 - acc: 0.5597\n", 999 | "Epoca: 58 / 100\n", 1000 | "Unbalance: (1070,) (409,)\n", 1001 | "Balance: (515,) (409,)\n", 1002 | "(924,)\n", 1003 | "(924, 10643)\n", 1004 | "Epoch 1/1\n", 1005 | "13s - loss: -3.5826e-01 - acc: 0.5584\n", 1006 | "Epoca: 59 / 100\n", 1007 | "Unbalance: (1070,) (409,)\n", 1008 | "Balance: (517,) (409,)\n", 1009 | "(926,)\n", 1010 | "(926, 10643)\n", 1011 | "Epoch 1/1\n", 1012 | "11s - loss: -3.5891e-01 - acc: 0.5616\n", 1013 | "Epoca: 60 / 100\n", 1014 | "Unbalance: (1070,) (409,)\n", 1015 | "Balance: (519,) (409,)\n", 1016 | "(928,)\n", 1017 | "(928, 10643)\n", 1018 | "Epoch 1/1\n", 1019 | "10s - loss: -3.5879e-01 - acc: 0.5636\n", 1020 | "Epoca: 61 / 100\n", 1021 | "Unbalance: (1070,) (409,)\n", 1022 | "Balance: (521,) (409,)\n", 1023 | "(930,)\n", 1024 | "(930, 10643)\n", 1025 | "Epoch 1/1\n", 1026 | "10s - loss: -3.5882e-01 - acc: 0.5634\n", 1027 | "Epoca: 62 / 100\n", 1028 | "Unbalance: (1070,) (409,)\n", 1029 | "Balance: (523,) (409,)\n", 1030 | "(932,)\n", 1031 | "(932, 10643)\n", 1032 | "Epoch 1/1\n", 1033 | "10s - loss: -3.5891e-01 - acc: 0.5676\n", 1034 | "Epoca: 63 / 100\n", 1035 | "Unbalance: (1070,) (409,)\n", 1036 | "Balance: (525,) (409,)\n", 1037 | "(934,)\n", 1038 | "(934, 10643)\n", 1039 | "Epoch 1/1\n", 1040 | "10s - loss: -3.5906e-01 - acc: 0.5664\n", 1041 | "Epoca: 64 / 100\n", 1042 | "Unbalance: (1070,) (409,)\n", 1043 | "Balance: (528,) (409,)\n", 1044 | "(937,)\n", 1045 | "(937, 10643)\n", 1046 | "Epoch 1/1\n", 1047 | "10s - loss: -3.5886e-01 - acc: 0.5656\n", 1048 | "Epoca: 65 / 100\n", 1049 | "Unbalance: (1070,) (409,)\n", 1050 | "Balance: (530,) (409,)\n", 1051 | "(939,)\n", 1052 | "(939, 10643)\n", 1053 | "Epoch 1/1\n", 1054 | "10s - loss: -3.5938e-01 - acc: 0.5676\n", 1055 | "Epoca: 66 / 100\n", 1056 | "Unbalance: (1070,) (409,)\n", 1057 | "Balance: (532,) (409,)\n", 1058 | "(941,)\n", 1059 | "(941, 10643)\n", 1060 | "Epoch 1/1\n", 1061 | "10s - loss: -3.5955e-01 - acc: 0.5728\n", 1062 | "Epoca: 67 / 100\n", 1063 | "Unbalance: (1070,) (409,)\n", 1064 | "Balance: (534,) (409,)\n", 1065 | "(943,)\n", 1066 | "(943, 10643)\n", 1067 | "Epoch 1/1\n", 1068 | "10s - loss: -3.5899e-01 - acc: 0.5695\n", 1069 | "Epoca: 68 / 100\n", 1070 | "Unbalance: (1070,) (409,)\n", 1071 | "Balance: (536,) (409,)\n", 1072 | "(945,)\n", 1073 | "(945, 10643)\n", 1074 | "Epoch 1/1\n", 1075 | "10s - loss: -3.5994e-01 - acc: 0.5704\n", 1076 | "Epoca: 69 / 100\n", 1077 | "Unbalance: (1070,) (409,)\n", 1078 | "Balance: (538,) (409,)\n", 1079 | "(947,)\n", 1080 | "(947, 10643)\n", 1081 | "Epoch 1/1\n", 1082 | "10s - loss: -3.5940e-01 - acc: 0.5723\n", 1083 | "Epoca: 70 / 100\n", 1084 | "Unbalance: (1070,) (409,)\n", 1085 | "Balance: (541,) (409,)\n", 1086 | "(950,)\n", 1087 | "(950, 10643)\n", 1088 | "Epoch 1/1\n", 1089 | "10s - loss: -3.5998e-01 - acc: 0.5737\n", 1090 | "Epoca: 71 / 100\n", 1091 | "Unbalance: (1070,) (409,)\n", 1092 | "Balance: (543,) (409,)\n", 1093 | "(952,)\n", 1094 | "(952, 10643)\n", 1095 | "Epoch 1/1\n", 1096 | "8s - loss: -3.5999e-01 - acc: 0.5735\n", 1097 | "Epoca: 72 / 100\n", 1098 | "Unbalance: (1070,) (409,)\n", 1099 | "Balance: (545,) (409,)\n", 1100 | "(954,)\n", 1101 | "(954, 10643)\n", 1102 | "Epoch 1/1\n", 1103 | "8s - loss: -3.5983e-01 - acc: 0.5744\n", 1104 | "Epoca: 73 / 100\n", 1105 | "Unbalance: (1070,) (409,)\n", 1106 | "Balance: (547,) (409,)\n", 1107 | "(956,)\n", 1108 | "(956, 10643)\n", 1109 | "Epoch 1/1\n", 1110 | "8s - loss: -3.6007e-01 - acc: 0.5753\n", 1111 | "Epoca: 74 / 100\n", 1112 | "Unbalance: (1070,) (409,)\n", 1113 | "Balance: (549,) (409,)\n", 1114 | "(958,)\n", 1115 | "(958, 10643)\n", 1116 | "Epoch 1/1\n", 1117 | "8s - loss: -3.5997e-01 - acc: 0.5772\n", 1118 | "Epoca: 75 / 100\n", 1119 | "Unbalance: (1070,) (409,)\n", 1120 | "Balance: (552,) (409,)\n", 1121 | "(961,)\n", 1122 | "(961, 10643)\n", 1123 | "Epoch 1/1\n", 1124 | "8s - loss: -3.6065e-01 - acc: 0.5765\n", 1125 | "Epoca: 76 / 100\n", 1126 | "Unbalance: (1070,) (409,)\n", 1127 | "Balance: (554,) (409,)\n", 1128 | "(963,)\n", 1129 | "(963, 10643)\n", 1130 | "Epoch 1/1\n", 1131 | "8s - loss: -3.6060e-01 - acc: 0.5784\n", 1132 | "Epoca: 77 / 100\n", 1133 | "Unbalance: (1070,) (409,)\n", 1134 | "Balance: (556,) (409,)\n", 1135 | "(965,)\n", 1136 | "(965, 10643)\n", 1137 | "Epoch 1/1\n", 1138 | "8s - loss: -3.6054e-01 - acc: 0.5793\n", 1139 | "Epoca: 78 / 100\n", 1140 | "Unbalance: (1070,) (409,)\n", 1141 | "Balance: (558,) (409,)\n", 1142 | "(967,)\n", 1143 | "(967, 10643)\n", 1144 | "Epoch 1/1\n", 1145 | "8s - loss: -3.6090e-01 - acc: 0.5801\n", 1146 | "Epoca: 79 / 100\n", 1147 | "Unbalance: (1070,) (409,)\n", 1148 | "Balance: (561,) (409,)\n", 1149 | "(970,)\n", 1150 | "(970, 10643)\n", 1151 | "Epoch 1/1\n", 1152 | "8s - loss: -3.6083e-01 - acc: 0.5814\n", 1153 | "Epoca: 80 / 100\n", 1154 | "Unbalance: (1070,) (409,)\n", 1155 | "Balance: (563,) (409,)\n", 1156 | "(972,)\n", 1157 | "(972, 10643)\n", 1158 | "Epoch 1/1\n", 1159 | "9s - loss: -3.6064e-01 - acc: 0.5802\n", 1160 | "Epoca: 81 / 100\n", 1161 | "Unbalance: (1070,) (409,)\n", 1162 | "Balance: (565,) (409,)\n", 1163 | "(974,)\n", 1164 | "(974, 10643)\n", 1165 | "Epoch 1/1\n", 1166 | "8s - loss: -3.6093e-01 - acc: 0.5811\n", 1167 | "Epoca: 82 / 100\n", 1168 | "Unbalance: (1070,) (409,)\n", 1169 | "Balance: (568,) (409,)\n", 1170 | "(977,)\n", 1171 | "(977, 10643)\n", 1172 | "Epoch 1/1\n", 1173 | "8s - loss: -3.6114e-01 - acc: 0.5834\n", 1174 | "Epoca: 83 / 100\n", 1175 | "Unbalance: (1070,) (409,)\n", 1176 | "Balance: (570,) (409,)\n", 1177 | "(979,)\n", 1178 | "(979, 10643)\n", 1179 | "Epoch 1/1\n", 1180 | "9s - loss: -3.6101e-01 - acc: 0.5863\n", 1181 | "Epoca: 84 / 100\n", 1182 | "Unbalance: (1070,) (409,)\n", 1183 | "Balance: (572,) (409,)\n", 1184 | "(981,)\n", 1185 | "(981, 10643)\n", 1186 | "Epoch 1/1\n", 1187 | "8s - loss: -3.6160e-01 - acc: 0.5851\n", 1188 | "Epoca: 85 / 100\n", 1189 | "Unbalance: (1070,) (409,)\n", 1190 | "Balance: (574,) (409,)\n", 1191 | "(983,)\n", 1192 | "(983, 10643)\n", 1193 | "Epoch 1/1\n", 1194 | "8s - loss: -3.6135e-01 - acc: 0.5849\n", 1195 | "Epoca: 86 / 100\n", 1196 | "Unbalance: (1070,) (409,)\n", 1197 | "Balance: (577,) (409,)\n", 1198 | "(986,)\n", 1199 | "(986, 10643)\n", 1200 | "Epoch 1/1\n", 1201 | "8s - loss: -3.6137e-01 - acc: 0.5862\n", 1202 | "Epoca: 87 / 100\n", 1203 | "Unbalance: (1070,) (409,)\n", 1204 | "Balance: (579,) (409,)\n", 1205 | "(988,)\n", 1206 | "(988, 10643)\n", 1207 | "Epoch 1/1\n", 1208 | "8s - loss: -3.6170e-01 - acc: 0.5870\n", 1209 | "Epoca: 88 / 100\n", 1210 | "Unbalance: (1070,) (409,)\n", 1211 | "Balance: (581,) (409,)\n", 1212 | "(990,)\n", 1213 | "(990, 10643)\n", 1214 | "Epoch 1/1\n", 1215 | "9s - loss: -3.6166e-01 - acc: 0.5879\n", 1216 | "Epoca: 89 / 100\n", 1217 | "Unbalance: (1070,) (409,)\n", 1218 | "Balance: (584,) (409,)\n", 1219 | "(993,)\n", 1220 | "(993, 10643)\n", 1221 | "Epoch 1/1\n", 1222 | "9s - loss: -3.6202e-01 - acc: 0.5911\n", 1223 | "Epoca: 90 / 100\n", 1224 | "Unbalance: (1070,) (409,)\n", 1225 | "Balance: (586,) (409,)\n", 1226 | "(995,)\n", 1227 | "(995, 10643)\n", 1228 | "Epoch 1/1\n", 1229 | "10s - loss: -3.6211e-01 - acc: 0.5899\n", 1230 | "Epoca: 91 / 100\n", 1231 | "Unbalance: (1070,) (409,)\n", 1232 | "Balance: (589,) (409,)\n", 1233 | "(998,)\n", 1234 | "(998, 10643)\n", 1235 | "Epoch 1/1\n", 1236 | "10s - loss: -3.6232e-01 - acc: 0.5912\n", 1237 | "Epoca: 92 / 100\n", 1238 | "Unbalance: (1070,) (409,)\n", 1239 | "Balance: (591,) (409,)\n", 1240 | "(1000,)\n", 1241 | "(1000, 10643)\n", 1242 | "Epoch 1/1\n", 1243 | "12s - loss: -3.6221e-01 - acc: 0.5920\n", 1244 | "Epoca: 93 / 100\n", 1245 | "Unbalance: (1070,) (409,)\n", 1246 | "Balance: (593,) (409,)\n", 1247 | "(1002,)\n", 1248 | "(1002, 10643)\n", 1249 | "Epoch 1/1\n", 1250 | "9s - loss: -3.6244e-01 - acc: 0.5928\n", 1251 | "Epoca: 94 / 100\n", 1252 | "Unbalance: (1070,) (409,)\n", 1253 | "Balance: (596,) (409,)\n", 1254 | "(1005,)\n", 1255 | "(1005, 10643)\n", 1256 | "Epoch 1/1\n", 1257 | "9s - loss: -3.6266e-01 - acc: 0.5940\n", 1258 | "Epoca: 95 / 100\n", 1259 | "Unbalance: (1070,) (409,)\n", 1260 | "Balance: (598,) (409,)\n", 1261 | "(1007,)\n", 1262 | "(1007, 10643)\n", 1263 | "Epoch 1/1\n", 1264 | "10s - loss: -3.6256e-01 - acc: 0.5948\n", 1265 | "Epoca: 96 / 100\n", 1266 | "Unbalance: (1070,) (409,)\n", 1267 | "Balance: (601,) (409,)\n", 1268 | "(1010,)\n", 1269 | "(1010, 10643)\n", 1270 | "Epoch 1/1\n", 1271 | "9s - loss: -3.6264e-01 - acc: 0.5960\n", 1272 | "Epoca: 97 / 100\n", 1273 | "Unbalance: (1070,) (409,)\n", 1274 | "Balance: (603,) (409,)\n", 1275 | "(1012,)\n", 1276 | "(1012, 10643)\n", 1277 | "Epoch 1/1\n", 1278 | "8s - loss: -3.6283e-01 - acc: 0.5968\n", 1279 | "Epoca: 98 / 100\n", 1280 | "Unbalance: (1070,) (409,)\n", 1281 | "Balance: (606,) (409,)\n", 1282 | "(1015,)\n", 1283 | "(1015, 10643)\n", 1284 | "Epoch 1/1\n", 1285 | "10s - loss: -3.6294e-01 - acc: 0.5980\n", 1286 | "Epoca: 99 / 100\n", 1287 | "Unbalance: (1070,) (409,)\n", 1288 | "Balance: (608,) (409,)\n", 1289 | "(1017,)\n", 1290 | "(1017, 10643)\n", 1291 | "Epoch 1/1\n", 1292 | "12s - loss: -3.6295e-01 - acc: 0.5988\n", 1293 | "Epoca: 100 / 100\n", 1294 | "Unbalance: (1070,) (409,)\n", 1295 | "Balance: (611,) (409,)\n", 1296 | "(1020,)\n", 1297 | "(1020, 10643)\n", 1298 | "Epoch 1/1\n", 1299 | "12s - loss: -3.6337e-01 - acc: 0.6000\n" 1300 | ] 1301 | } 1302 | ], 1303 | "source": [ 1304 | "batch_size = 128\n", 1305 | "nb_epoch = 100\n", 1306 | "\n", 1307 | "init_bal = 1\n", 1308 | "final_bal = 1.5\n", 1309 | "dec_bal = (final_bal/init_bal)**(1/nb_epoch)\n", 1310 | "\n", 1311 | "init_ler = 0.05\n", 1312 | "final_ler = 0.005\n", 1313 | "dec = (final_ler/init_ler)**(1/nb_epoch)\n", 1314 | "\n", 1315 | "tr_h = {}\n", 1316 | "tr_h[\"bal\"] = []\n", 1317 | "tr_h[\"ler\"] = []\n", 1318 | "tr_h[\"loss\"] = []\n", 1319 | "tr_h[\"acc\"] = []\n", 1320 | "\n", 1321 | "model_name = \"model_data_\"+str(site_index)+\\\n", 1322 | " \"_mask_\"+mask_types[mask_index]+\\\n", 1323 | " \"_train_\"+str(train)+\\\n", 1324 | " \"_epoch_\"+str(nb_epoch)+\\\n", 1325 | " \"_bal_\"+str(init_bal)+\"_\"+str(final_bal)+\\\n", 1326 | " \"_ler_\"+str(init_ler)+\"_\"+str(final_ler)+\\\n", 1327 | " \".mdl\"\n", 1328 | "\n", 1329 | "sgd = SGD(lr=init_ler,decay=dec,momentum=0.9,nesterov = False)\n", 1330 | "model.compile(loss='cosine_proximity',#['binary_crossentropy',cosine_proximity','categorical_crossentropy']\n", 1331 | " optimizer=sgd,\n", 1332 | " metrics=['accuracy'])\n", 1333 | "\n", 1334 | "for ep in range(nb_epoch):\n", 1335 | " print(\"Epoca:\", ep+1, \"/\",nb_epoch)\n", 1336 | " t = balance(init_bal, x_data_tr, y_data_tr)\n", 1337 | " tr_h[\"bal\"].append(init_bal)\n", 1338 | " tr_h[\"ler\"].append(init_ler)\n", 1339 | " z = model.fit(t[0],t[1], batch_size=batch_size, nb_epoch=1,verbose=2)\n", 1340 | " tr_h[\"loss\"].append(z.history[\"loss\"][0])\n", 1341 | " tr_h[\"acc\"].append(z.history[\"acc\"][0])\n", 1342 | " init_bal *= dec_bal\n", 1343 | " init_ler *= dec\n", 1344 | " " 1345 | ] 1346 | }, 1347 | { 1348 | "cell_type": "markdown", 1349 | "metadata": { 1350 | "collapsed": true 1351 | }, 1352 | "source": [ 1353 | "### Saving the model" 1354 | ] 1355 | }, 1356 | { 1357 | "cell_type": "code", 1358 | "execution_count": 17, 1359 | "metadata": { 1360 | "collapsed": false 1361 | }, 1362 | "outputs": [], 1363 | "source": [ 1364 | "model.save(model_name)" 1365 | ] 1366 | }, 1367 | { 1368 | "cell_type": "markdown", 1369 | "metadata": {}, 1370 | "source": [ 1371 | "### Ploting trainning process" 1372 | ] 1373 | }, 1374 | { 1375 | "cell_type": "code", 1376 | "execution_count": 26, 1377 | "metadata": { 1378 | "collapsed": false 1379 | }, 1380 | "outputs": [ 1381 | { 1382 | "data": { 1383 | "text/plain": [ 1384 | "[]" 1385 | ] 1386 | }, 1387 | "execution_count": 26, 1388 | "metadata": {}, 1389 | "output_type": "execute_result" 1390 | }, 1391 | { 1392 | "data": { 1393 | "image/png": "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\nAAAASUVORK5CYII=\n", 1394 | "text/plain": [ 1395 | "" 1396 | ] 1397 | }, 1398 | "metadata": {}, 1399 | "output_type": "display_data" 1400 | } 1401 | ], 1402 | "source": [ 1403 | "fig, ax = plt.subplots(1)\n", 1404 | "ax.plot(tr_h[\"loss\"])" 1405 | ] 1406 | }, 1407 | { 1408 | "cell_type": "code", 1409 | "execution_count": 27, 1410 | "metadata": { 1411 | "collapsed": false 1412 | }, 1413 | "outputs": [ 1414 | { 1415 | "data": { 1416 | "text/plain": [ 1417 | "[]" 1418 | ] 1419 | }, 1420 | "execution_count": 27, 1421 | "metadata": {}, 1422 | "output_type": "execute_result" 1423 | }, 1424 | { 1425 | "data": { 1426 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAFkCAYAAAB8RXKEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3XmcnePdx/HPLxGCVBC7WJtYGoSEqtJSqqhSpUqspWpv\n+0RL1VNLVTdKgghKLbFELa2lhFirtUUTEkoktZSIbJZQQSRzPX9cZ55MJjOTmcmZuc+Z+bxfr/Oa\nzH3uc59r7iQz37mW3xUpJSRJksqhS9ENkCRJHYfBQpIklY3BQpIklY3BQpIklY3BQpIklY3BQpIk\nlY3BQpIklY3BQpIklY3BQpIklY3BQpIklY3BQpIklY3BQpIklY3BQpIklY3BQpIklc1SRTegNSKi\nF7Ab8BrwcbGtkSSpqnQH1gfuSym9Xe6LV2WwIIeKG4puhCRJVexg4MZyX7Rag8VrANdffz2bbrpp\nwU3pPAYPHsyQIUOKbkan4j1vf97z9uc9b18vvvgihxxyCJR+lpZbtQaLjwE23XRTBgwYUHRbOo2e\nPXt6v9uZ97z9ec/bn/e8MG0ylcDJm5IkqWwMFpIkqWwMFpIkqWwMFmq2QYMGFd2ETsd73v685+3P\ne96xREqp6Da0WEQMAMaOHTvWCT+SJLXAuHHjGDhwIMDAlNK4cl/fHgtJklQ2BgtJklQ2BgtJklQ2\nBgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJ\nklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2\nBgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJklQ2BgtJ\nklQ2BgtJklQ2BgtJklQ2BgtJkjqw+fMhpfZ7P4OFJEkd0OzZcMEF0KcPjB7dfu+7VPu9lSRJamuv\nvAIXXQRXXQUffwwHHADrrtt+72+wkCSpyn3yCdx1F1x7Ldx9N6y8Mvzwh3D88bDWWu3bFoOFJElV\nKCV4+mm45hq46SZ49134/OfhssvgkENgueWKaZfBQpKkKvLpp3DrrXD++TB2LKy9NhxzDBx2GGy6\nadGtM1hIklQVZs+GK6+ECy+EN96AXXeFe+6Br30NunYtunULGCwkSapQKcE//gFXXw233JLnUgwa\nBCedBP37F926hhksJEmqMG++mcPENdfAyy/DBhvAT34CRx2Vhz4qmcFCkqQK8fzz8Pvfw403Qrdu\nsP/+8Mc/wpe+BF2qpPKUwUKSpAKlBI88AuedB6NGQe/e8Nvf5t6JFVYounUtZ7CQJKkA06fDiBG5\nkNXEibD55vnzAw/MvRXVymAhSVI7qanJvRJXXAF//SsstRR861swbBjsvDNEFN3CJWewkCSpjc2d\nCyNHwrnnwgsvwJZbwtChcNBBuUpmR2KwkCSpjXzwQa49ccEFMGUKfOMbcPnlsMMORbes7bRqjmlE\nnBARr0bERxHxZERss5jze0bEJRExtfSaiRGxe53nz4yImnqPF1rTNkmSipQSPPUUfP/7eZ+OU07J\nwxzPPZf38+jIoQJa0WMREQcA5wNHA2OAwcB9EbFRSmlWA+d3Ax4ApgH7AlOB9YD36p36PLALUDvC\nNK+lbZMkqSjvvAPXX597KJ57DtZZJ9eeOPLI/OfOojVDIYOBy1NKIwAi4lhgT+BI4NwGzv8esCLw\nhZTS/NKx1xs4b15KaWYr2iNJUiFSgkcfzZMxb70V5s+Hb34zz6XYddfKKrXdXlo0FFLqfRgIPFh7\nLKWUyD0S2zXysr2AJ4DhETEtIp6LiJ9FRP337hsRb0bEyxFxfUR0onwnSaom//0vDBmSN/3aaac8\n9HH22Xkexa23wu67d85QAS3vsVgF6ApMr3d8OrBxI6/ZENgZuB7YA+gLDC9d55zSOU8C3wVeAtYE\nzgIejYjNUkoftrCNkiS1iXfegYsvhosuyhMzv/3tvE35jjt2jKWi5VCuVSEBpEae60IOHkeXejee\niYi1gZ9QChYppfvqnP98RIwB/gN8B7i6sTcdPHgwPXv2XOjYoEGDGDRoUGu/DkmSFjF1al4eeuml\nMG9enph58smVP3di5MiRjBw5cqFjs2fPbtP3bGmwmAXMB1avd3w1Fu3FqPUWMLcUKmq9CKwREUul\nlBaZpJlSmh0Rk4A+TTVmyJAhDBgwoNmNlySpuWpqYPTovDz0rrtgueXgxBNh8GBYbbWiW9c8Df2y\nPW7cOAYOHNhm79miORYppU+BseTVGwBERJQ+f7yRlz3GogFhY+CthkJF6Zo9gM+SQ4kkSe1m+nT4\nzW+gTx/YYw945ZU89PHGG/l4tYSKorRmKOQC4NqIGMuC5abLAdcARMQIYEpK6bTS+ZcCJ0bEhcAw\nYCPgZ8DQ2gtGxHnAXeThj7WBX5CXmy7cfyNJUhtICR5+OM+X+MtfcqntAw/Mu4xuu63zJ1qixcEi\npXRzRKwCnE0eEnkW2K3OUtHe1KlBkVKaEhFfA4YA44E3S3+uuzS1N3Aj0AuYCfyDvDz17RZ/RZIk\nNdM778A11+ThjkmT8iqP88+HQw+FlVYqunXVqVWTN1NKw8krOxp6bucGjj0FfLGJ6znbUpLULlKC\nMWPyRMw//SnXnthvv1yL4ktfsndiSblXiCSpU/jww7wR2PDh8MwzsP76cOaZuTKm8ybKx2AhSerQ\nJk7MvRPXXgvvvw977gnnnAO77dZ5i1i1JYOFJKnDmTcP7rgj90489BCsuiocfzwcfXTuqVDbMVhI\nkjqMadPyXInLL4c334Ttt88rO/bdF5ZZpujWdQ4GC0lSVUsJHnsMLrkEbrsNunWDQw7JPRT9+xfd\nus7HYCFJqkpz5uTeiGHDYPx46NsXzjsPDj8cVlyx6NZ1XgYLSVJVeeWVPHfij3+E2bPhG9/I25R/\n9avQpUX1pNUWDBaSpIpXUwP33597J+6+O/dIfP/7cNxxsMEGRbdOdRksJEkV6/338zLRYcNyZcz+\n/fPkzEGD8qZgqjwGC0lSxZk8OYeJq6/Ocyn23TcPfWy/vZUxK53BQpJUEWqHOy68EEaNglVWgR/8\nIA939O5ddOvUXAYLSVKh/vtfGDECLr44V8nccku46qo83NG9e9GtU0sZLCRJhXjttTzcceWV8MEH\n8K1vwR/+ADvs4HBHNTNYSJLaTUrwj3/A0KFw++3QsycccwyccAKsu27RrVM5GCwkSW1u7ty8RfnQ\noTBuHGy6aa5FccghsPzyRbdO5WSwkCS1mVmz4LLLcrntadNg993hvvtg110d7uioDBaSpLJ74YXc\nO3HddTlAHHYY/OhHuadCHZvBQpJUFinl5aJDhsC998Kaa8Lpp+c5FL16Fd06tReDhSRpiXz8cd4M\nbMgQeP552Gqr3FPxne/A0ksX3Tq1N4OFJKlVZs2CSy/NS0ZnzsybgV18Mey4o/MnOjODhSSpRSZN\nggsuyHt4AHz3uzB4MGy0UaHNUoUwWEiSFisleOwx+P3v4c47YdVV4bTTcrntVVYpunWqJAYLSVKj\nPvwQ/vKXPNzx1FN5VccVV8DBB1tuWw0zWEiSFjJ/Pjz8cJ6AedttOVzsvDPcfXeuQ9GlS9EtVCUz\nWEiSAHj33QXFrN58E/r2hVNPzb0TG2xQdOtULQwWktTJvf56Lmb1hz/AvHm5mNX3vgef/7yrO9Ry\nBgtJ6qQmTIDzzoObboLPfAb+53/gBz+A1VcvumWqZgYLSepEUoJHH4Xf/Q5Gjco7ip53Hhx1FPTo\nUXTr1BEYLCSpE5gzJ29TfuGFMGYMbL55npx5wAHQrVvRrVNHYrCQpA4qJXjiCbjmmrxl+fvvw047\nwT335NUdzp9QWzBYSFIH89FHOUwMHZqrZK67bt5Z9LDDoE+folunjs5gIUkdxOzZee+OoUPz3h37\n75+Xj+64o7Un1H4MFpJU5aZPz2Fi+PC80+gRR8DJJ8NnP1t0y9QZGSwkqUr95z95744rr4Sllsr7\ndgweDGuuWXTL1JkZLCSpykyYAEOGwPXXQ8+eeTOwE0+ElVYqumWSwUKSqsK778LIkXDVVTB2LKy1\nFpx7Lnz/+9afUGUxWEhSBXvmmTzc8ec/w6efwp57wumnw9e/bv0JVSaDhSRVoCeegHPOyTUnNtwQ\nfvELOPRQ50+o8hksJKlC1NTAgw/Cb38LDz0Em26a51EccECenClVA/+pSlLB3nwzF7T64x/h1Vdh\nq63gtttgn32sP6HqY7CQpAKklHsnLrwwD3d07w7f+U7ev+OLX7TctqqXwUKS2lFKcN99cPbZeR7F\nVlvlwlYHHpiXjkrVzk42SWoHNTXw17/CF74Ae+yRA8aoUXnp6DHHGCrUcdhjIUltaOpUuPrqBfMn\ndtgB7r8fdtnF4Q51TAYLSSqz2vkTl1wCd90FSy+dhzpuuCH3WBgo1JEZLCSpTFLKvRFnnZXnT/Tv\nDxddBAcf7FCHOg/nWEjSEkoJRo+G7beH3XbL8ynuvTdXzTz+eEOFOheDhSS10vvv5xUdW265cKB4\n4on8uUMe6owcCpGkFho7Fi67LG8K9vHHsNdeeT+Pr37VMCEZLCSpGT78EG66KQeKf/4TeveGU06B\n730P1l676NZJlcNgIUlNmDgxr+4YMQI++CDXoLjjjry7qPt3SItq1RyLiDghIl6NiI8i4smI2GYx\n5/eMiEsiYmrpNRMjYvcluaYktaV//zvvJtqvH9x8M5xwArzyCtx9N+y9t6FCakyL/2tExAHA+cDR\nwBhgMHBfRGyUUprVwPndgAeAacC+wFRgPeC91l5TktrKf/4Dv/xl3hRstdXyctGjjoJllim6ZVJ1\naE2PxWDg8pTSiJTSROBYYA5wZCPnfw9YEdgnpfRkSun1lNLfU0rPLcE1JalsUoKnnoLDD4e+feHO\nO+G88+Dll3NPhaFCar4WBYtS78NA4MHaYymlRO6R2K6Rl+0FPAEMj4hpEfFcRPwsIroswTUlaYnN\nmZNLbW+9da6I+fe/w69+lYc8Bg+GZZctuoVS9WnpUMgqQFdger3j04GNG3nNhsDOwPXAHkBfYHjp\nOue08pqS1GqTJ8Oll+Y9PGbPzhMx7747157o2rXo1knVrVzTjwJIjTzXhRwSji71RDwTEWsDPyEH\ni9ZcE4DBgwfTs15Ju0GDBjFo0KDmtltSJzF/fg4Pw4fnbct79YKjj4Zjj4UNNii6dVLbGDlyJCNH\njlzo2OzZs9v0PVsaLGYB84HV6x1fjUV7HGq9BcwthYpaLwJrRMRSrbwmAEOGDGHAgAHNbLqkzujt\nt/Nwx/DheWLmNtvkiZkHHADduxfdOqltNfTL9rhx4xg4cGCbvWeL5liklD4FxgK71B6LiCh9/ngj\nL3sM6FPv2MbAWymlea28piQ1aexYOOKIXLzqjDNgp51gzJj8OPxwQ4XUVlqzKuQC4OiIOCwiNgEu\nA5YDrgGIiBER8es6518K9IqICyOib0TsCfwMGNbca0pScz3zTC5itfXW8NBD8ItfwJQpuZdiG6vj\nSG2uxXMsUko3R8QqwNnk4Ytngd1SSjNLp/QG5tU5f0pEfA0YAowH3iz9+dwWXFOSmvTvf8Ppp+ey\n2xtvDH/6E+y3n5MxpfbWqsmbKaXh5JUdDT23cwPHngK+2NprSlJjXnwRhgzJKzzWWAOuvDIPdVgZ\nUyqG//UkVZ3582HUqFwV8/77YfXV4Te/ycWsrD0hFctgIalqzJ4NV10Fw4blIlbbbAPXXw/f/rbV\nMaVKYbCQVPFeegkuvjhPwPzkE9h/f7jxRth226JbJqk+g4WkilRTA6NHw4UXwr33wqqrwkkn5YJW\na61VdOskNcZgIamifPghjBiR509MnAhbbmlBK6maGCwkVYTXX4dLLoE//AHefx/22Qcuvxy+9CWI\nKLp1kprLYCGpUE88AUOHwm23QY8ecNRRcOKJsP76RbdMUmsYLCQV4v77c0Grp56CPn1yuDj8cPjM\nZ4pumaQl0ZqS3pLUah9/DIMHw9e+lotY3XlnXvVx4omGCqkjsMdCUrt5/nk46KAcJIYOhR/8ALr4\n643UofhfWlKbmzUrLxvdeuu8jPTpp+FHPzJUSB2RPRaSyu6ee/LOos89BxMmwLRp+fgPfwi//a1l\nt6WOzGAhqWzefz/Plbjuuryqo3//vMpj881hwIA8SVNSx2awkFQWTz2V50/MmJGDxSGHFN0iSUVw\nhFPSEpk/P+8susMOsMoq8OyzhgqpM7PHQlKzpZQnXo4bB+PH58dzz+Uy3D/7GZx1FnTrVnQrJRXJ\nYCFpsebOhZtugt//PgeJrl1hk03yHIp99oFddoGBA4tupaRKYLCQ1Kj33oMrr8w1J958E77+dRgy\nJA97LLNM0a2TVIkMFpKAPJzxt7/lORLjx+ePkyfn6piHHAI//jH061d0KyVVOoOF1MnNnAnDhuXH\nO+9Az555iGP33eGnP80f11qr6FZKqhYGC6mTevVVOP98uOqqvC35UUfB8cfDRhu5Tbmk1jNYSJ3M\n+PHwu9/BzTfDSivBqafCCSdAr15Ft0xSR2CwkDqBlODRR3OgGDUqV8UcOhSOPBKWW67o1knqSAwW\nUgf34otw3HF5Yubmm8MNN8B3vpMnZUpSuVl5U+qgPv4YzjwzT8ScOhXuuisPgxx0kKFCUtvx24vU\nAT3yCBxzTJ6geeqpcNpp0L170a2S1BnYYyF1IP/8J+y3H3zlK7DqqrkWxdlnGyoktR+DhVTlUso9\nFF/7GmyzDUyYkJeQPvoofO5zRbdOUmdjsJCqVErw17/C9tvnHooZM/J+HhMnwhFHQBf/d0sqgN96\npCozfz786U+w5Zaw1165mNXdd8Mzz8ABB+QNwiSpKE7elKrABx/k4DBmDFxxBUyalIc+LroIvvxl\nK2VKqhwGC6lCTZoE55wDTz8NL72Uhz6WXTbv3XH99Xk+hSRVGoOFVIFeeSXPm+jWDfbcE045Bbbe\nGjbd1BoUkiqb36IKNnUqHHggHHxwLq/crVvRLVLRpkyBr341l9r++99hjTWKbpEkNZ+TNws2dmz+\n4XHssdCvX94Yqqam6FapKDNm5FAxfz48+KChQlL1MVgUbMaM/PGf/4Q+ffKs/s9/Hp56qth2qf29\n+26ekDl7NjzwAKy7btEtkqSWcyikYDNmwMorw8CBcM89eaOoE0/MdQheeKHo1qkcXnoJhgzJEy97\n9cqPVVbJkzFnzFjw+PvfYdq0/G+gb9+iWy1JrWOwKNiMGbDaags+33FH+NGP8j4Pc+a4pXW1e+01\n2GWXPLy14orw9tv5MX9+fn7ppWH11fO/gQ03hOuug802K7TJkrREDBYFqx8sIO9GWVMD//qXSwqr\n2Vtv5fkS3bvn3og118zHU4L3389/XmEFa1BI6licY1GwmTMXDRb9+uVyzOPHF9Mm5S3Hv/3tXC+i\nNd55J8+X+OijPF+iNlRADhI9e+aHoUJSR2OwKFhDPRbLLZfH2CdMKKZNgpNPhttug8MPh1tuadlr\n//tf+PrXc4/F/ffD+uu3SRMlqSIZLAo2Y0be3rq+LbYwWBTlrrtg2LBcLru2xsi99y7+dfPn5yCx\n++554u2997q7qKTOx2BRoJqahodCIM+zGD8+j8er/bz5Zl6Rs/feeXXONdfAHnvAvvvmeRIN+fe/\n4fTTYYMN8vDHrFl5U7Ctt27XpktSRXDyZoHeew/mzWs4WGyxRX5+yhRYZ532b1tnNH8+HHponmx5\n1VV5/kO3bnkn0T33zI+HHoLll4cnn1zwmDAhT8I88MAcSrbd1rkTkjovg0WBZs7MHxsLFpB7LQwW\n5TV3Ljz8cC5AtdFGC7YZ/93v4JFHcnjo1WvB+d27wx135BUetat0IvIwxxe+AKeeCvvsk+tUSFJn\nZ7AoUG3VzYaCxbrr5lUDEybAN77Rvu3qyKZPh/33XzCssfzysOWWOSRcdRX87//CTjst+roePWDU\nqNx70adPDhg9e7Zr0yWpKhgsCtRUsIjIvRaNLTl980341a/gggvyb9RavLFjc8/Cp5/C6NG5p2Lc\nuPz4299yj8SZZzb++pVWynu6SJIaZ7Ao0IwZ+Yfbiis2/Hz//rkGQkOuvhouvTTvK/Ld77ZZEzuM\nG26Ao46CzTeHv/wF1l47H99552LbJUkdjatCCjRzZl5q2qWRv4UttoBJk3KRpfruuCN/HDbMlSOL\nc/rpcMgheYO3Rx9dECokSeVnsChQQ8Wx6qpb2ruuN97Iu6EedFDu3h8zpm3bWc2efhrOOQfOPjv3\n8jhsJElty2BRoMUFi3798lyL+oWy7rwTlloKLr44b1w1bFjbtrNapZRXbPTrB6ed5hJQSWoPrQoW\nEXFCRLwaER9FxJMR0ehWWRFxeETURMT80seaiJhT75yr6zxX+7inNW2rJosLFssvn1cg1J/Aeccd\neeXCyivD8cfDzTfn1Q71vfNOnkPwyCPlbHX1uP/+vHT0N79ZsKRUktS2WhwsIuIA4HzgTGArYDxw\nX0Ss0sTLZgNr1Hms18A5o4DV65wzqKVtqzaNlfOuq3//hXss3nsv12DYZ5/8+RFH5DkaV1658OtS\nypM6H34Yhgwpa7OrQk0N/PSnsP32LteVpPbUmh6LwcDlKaURKaWJwLHAHODIJl6TUkozU0ozSo+Z\nDZzzSb1zZreibVWlsXLeddUuOa2doDlqVK7Wuffe+fOVV857WVx2WT5ea+jQvOfFXnvl17zzTtt8\nDZXqppvg2Wdz0SuHQCSp/bQoWEREN2Ag8GDtsZRSAh4AtmvipT0i4rWIeD0ibo+IhrZm2ikipkfE\nxIgYHhErt6Rt1WbePHj77cUHi/794d13c90KgNtvh4EDF67GecIJufT3nXfmz8eMyb+tn3QSXHFF\nLlV9661t83VUok8+yYWuvvnN3GMhSWo/Le2xWAXoCtQf0Z9OHr5oyEvk3oy9gYNL7/l4RNRd9DcK\nOAzYGTgF2BG4J6Lj/q759tu5F6I5PRaQh0M++ST3PtQOg9Taaqv8A3TYsDxUcsAB+dhvfgOrr54L\nP91wQ9t8HZXo8svh9dfh178uuiWS1PmUq0BWAA1WU0gpPQk8+f8nRjwBvAgcTZ6nQUrp5jov+VdE\nPAe8DOwEPNzYmw4ePJie9eoqDxo0iEGDKn96RlNVN+tab728wdX48XkuxQcf5N/E6zvxRBg0KG+U\nVTsPY+ml83MHHwyHH55/2K67bnm/jkrz/vvwy1/muSduWS6psxs5ciQjR45c6Njs2W0706ClwWIW\nMJ88ybKu1Vi0F6NBKaV5EfEM0KeJc16NiFmlcxoNFkOGDGHAgAHNeduKU7sB2eImb9aW9p4wIQeD\nDTeEzTZb9Lx99829E48/Dn/+M6y//oLn9tkn12+46SY45ZSyfQkVZ8KEPPzz3//CWWcV3RpJKl5D\nv2yPGzeOgQMHttl7tmgoJKX0KTAW2KX2WGm4Yhfg8eZcIyK6AJsBbzVxTm+gV1PnVLvm9lhADhbP\nPpuXmX7zmw1PRlx6abjkErjoIvjWtxZ+boUV8mTPjjoc8sorebvzLbeE116DW26B3r2LbpUkdU6t\nWRVyAXB0RBwWEZsAlwHLAdcARMSIiPj/0e2IOD0ido2IDSJiK+AG8nLTK0vPLx8R50bEthGxXkTs\nAtwOTALuW5IvrpLNmJF7EXr0WPy5/fvDxInw1luLzq+oa7/94Ac/aPi5gw7Kv9E///yizz3wQC51\nXQlSyitYnnsuB4amzJ6dv95NNslfw/Dh8OKLLi+VpCK1OFiU5kP8GDgbeAbYAtitzhLS3iw8kXMl\n4A/AC8DdQA9gu9JSVchDK1sAd5Anel4BPA18udRD0iHVFsdqzvTU2gmcvXrBF7/YuvfbY4+8O+eN\nNy58/JZbYLfd8m/8NTWtu/aSevZZ+PrXoW/fXBSsV6/8NfftCyefDHPmLPqav/0tn3Pttblc98sv\n551Hu3Vr//ZLkhZo1eTNlNJwYHgjz+1c7/OTgJOauNbHwO6taUc1W1zVzbo22ywHkL32yqW8W2Pp\npeHb387B4le/yte7887ck7HddvDYY7lK5Ve/2rrrt0ZNDZx/fl4auvHGuTemd++8SVjv3rli6Fln\n5d1Ir7gCvvKVvDLm5z/Pr/vyl3NPy3oNlVuTJBXCbdMLUruzaXP06AG//z3svoTx6+CD8w/oxx/P\nq0v23z/P2Rg5Mm8nfvXV7Rcs3ngjr1R55BH4yU/ySo5llln4nC98IU9K/f73c2ny7343b7r20ktw\n7rkweLCluiWp0hgsCjJjRu7qb66TGu3zab4vfSn3BJx6at4ddbfdcg9Gt255eeZZZ+WlqiuuuOTv\n1ZCU8pDFqFFwxhk5MD34YO6JaMxGG+Wls3/4Q17Rst56ecfS2uEhSVJlcXfTgrRkKKRcunTJtS7+\n8Q/Yccc8v6K21sWhh8LcufCnP5XnvebOzSs0/v73XLDqoINyqOnbF/7nf/KcjwkTmg4Vddt97LG5\nl2PcOEOFJFUyeywKUkSwgDx80KNHnhRZd+hhrbXyUMtVV8Exx7T8uh9+mIdURoyAyZPzbqu1+5t0\n7ZrLkB98cA40O+wA9eqaNUtrXiNJal8GiwJ88kmuEFlEsFhzzTwM0ZAjjsjzLl54oeGqle++m8PI\nsssuWM3y0ktw6aVwzTX5a9pjjxxM1lkn91Css04evlh++Tb7kiRJFcRgUYDaqptFBIum7LVXXup5\n9dVw3nkLjqeU53gMHZo/79o193osvzxMnQqrrALHHZcDRd2Kn5KkzsdgUYDaqpvNXRXSXpZZJg9X\nXHdd3sCrW7ccKn760xwqfvEL+Oxn84qS2scmm+TCXPVXdEiSOieDRQFaUs67vR1xRC4Lfu+9uQfj\njDNy78WFF8IPf1h06yRJlc5gUYBK7bGAvN/GVlvlSZzjx8M55+SaEYYKSVJzGCwKMHNm3hise/ei\nW9KwI46AH/0Ibr89F646+eSiWyRJqhbWsShAUUtNm+ugg3Jvyhln5PLZkiQ1lz0WBZgxozKHQWr1\n6pVXe1igmefcAAARPElEQVQuW5LUUvZYFKDSeyzAUCFJah2DRQGqIVhIktQaBosCzJxpsJAkdUwG\ni3aWkj0WkqSOy2DRzj78ED76qLInb0qS1FoGi3ZWyVU3JUlaUgaLdmawkCR1ZAaLdlapO5tKklQO\nBot2NmMGROQiVJIkdTQGi3Y2Y0YOFUtZ81SS1AEZLNrQxRfDRhvBM88sOFbp5bwlSVoSBos29Le/\nweTJsP32cNNN+ZjFsSRJHZkd8m1o0qS8BfncuTBoEIwfD2+9ZbCQJHVc9li0kZqa3FuxxRZw3XVw\n3nlw7rnw0EMGC0lSx2WPRTN88gk89hi8/PKCx2uvwU9+Agcc0PBrpkyBjz/Ocywi8rmbbZZ7Lj73\nuXZtviRJ7cZg0Qy//jWcfTZ06QLrrAOf/Wwe0rj11saDxeTJ+eNGGy04tvvueY5FF/uJJEkdlD/i\nmuGee2C//fIeH6+9Bg8+CPvuC88/3/hrJk3KS0rXX3/h40stZbCQJHVc/ohbjFmzYOxY+MY3YOml\nFxzfbLPcK/HJJw2/btIk2HBD61VIkjoXg8ViPPhg3up8110XPt6vH8yfDy+91PDrJk9eeBhEkqTO\nwGCxGKNH5xCx9toLH+/XL3/8178aft2kSQYLSVLnY7BoQko5WHzta4s+t+KKOWw0NM/i00/hlVeg\nb9+2b6MkSZXEYNGEl17Ky0YbChaQey0a6rF47bU8TGKPhSSpszFYNGH06Dxh88tfbvj5zTZrOFhM\nmpQ/GiwkSZ2NwaIJo0fDDjvAcss1/Hy/frlY1pw5Cx+fNAmWXRbWWqvt2yhJUiUxWDTik0/g4Ycb\nHwaB3GOREkycuPDxyZPz/ArrVUiSOht/9DXiiSdyT0RTwaK2NHf9CZyuCJEkdVYGi0aMHg2rrgr9\n+zd+To8eubJm/XkWkya5IkSS1DkZLBoxenQuirW44Yx+/RbusZgzB954wx4LSVLnZLBowKxZMG5c\n08MgteqvDHn55fzRYCFJ6owMFg1orIx3Q/r1g//8Bz74IH/uUlNJUmdmsGjA6NG5J6I5y0VrS3u/\n8EL+OGlSrsrZq1fbtU+SpEplsKintox3c3orADbdFCIWzLOo3Xwsou3aKElSpTJY1DNqVC7jvfvu\nzTt/2WXhs59dMM/CpaaSpM7MYFHH22/D974Hu+3W/B4LyMMmtT0WLjWVJHVmBouSlOCYY2DuXLjq\nqpYNZdRuRvbeezBzpj0WkqTOa6miG1Aprr8ebrsNbrml5Xt8bLYZTJ0KY8bkzw0WkqTOyh4L8nLR\nE0+EQw+Fb3+75a+vXRnyl7/kjw6FSJI6q04fLGpq4PDD8xLRiy9u3TU23hiWWgpuvx3WWAM+85ny\ntlGSpGrR6YPF0KHw6KNw7bXQs2frrrH00rmXYto0h0EkSZ1bq4JFRJwQEa9GxEcR8WREbNPEuYdH\nRE1EzC99rImIOQ2cd3ZETI2IORFxf0T0aU3bWmLOHDjnHDj+eNhppyW7Vu1wiMFCktSZtThYRMQB\nwPnAmcBWwHjgvohYpYmXzQbWqPNYr941fwqcCBwDfB74sHTNpVvavpb405/ySo6TTlrya222Wf7o\n/ApJUmfWmh6LwcDlKaURKaWJwLHAHODIJl6TUkozU0ozSo+Z9Z7/EfDLlNJdKaXngcOAtYB9WtG+\nZhs+HPbYAzbccMmvZY+FJEktDBYR0Q0YCDxYeyyllIAHgO2aeGmPiHgtIl6PiNsj4nN1rrkBuRej\n7jXfB55azDWXyNNPwz//mYdBymH77WGrrWDbbctzPUmSqlFLeyxWAboC0+sdn04OBw15idybsTdw\ncOk9H4+ItUvPrwGkFl5ziQ0fDuut1/zS3Yuz5pp5q/U11yzP9SRJqkblKpAV5HCwiJTSk8CT/39i\nxBPAi8DR5HkaLb5mrcGDB9Oz3lKOQYMGMWjQoCYb+/bbcNNNcOaZ0LVrk6dKklS1Ro4cyciRIxc6\nNnv27DZ9z5YGi1nAfGD1esdXY9EehwallOZFxDNA7aqPaeQQsXq9a6wGPNPUtYYMGcKAAQMAuPLK\nvLNoc1Z3XHNNrl9xZFOzQiRJqnIN/bI9btw4Bg4c2Gbv2aKhkJTSp8BYYJfaYxERpc8fb841IqIL\nsBnwVumar5LDRd1rrgBs29xrQh7aOPdc2GADOOGEXE2zITU1cOmlsP/+sNpqzb26JElqjtasCrkA\nODoiDouITYDLgOWAawAiYkRE/Lr25Ig4PSJ2jYgNImIr4AbyctMr61xzKPDziNgrIjYHRgBTgDua\n26gpU+AnP4EzzsjLSPv0yTuVTp688Hn33w8vv1y+SZuSJGmBFgeLlNLNwI+Bs8lDFVsAu9VZQtqb\nhSddrgT8AXgBuBvoAWxXWqpae81zgYuBy8mrQZYF9kgpzW1Omz7+OO8q2q8fnHZa7q343e/gnntg\nk03goIMWbGs+fDj07w/btdl6E0mSOq9WTd5MKQ0Hhjfy3M71Pj8JWGwJqpTSWcBZrWnP1Kn5Y+/e\n+ePyy+eiV8cfD1dfDb/9LWy+Oey5J4walYdCWrItuiRJap4OsVfIlCn5Y22wqNW9Oxx3HPz73zlg\nTJ4MK6+cezAkSVL5dahgsfbaDT/frRt897vwwgvwyivQo0e7NU2SpE6lwwSLnj0Xv115165uaS5J\nUlvqMMGi/jCIJElqfwYLSZJUNgYLSZJUNgYLSZJUNlUfLD79FKZNg3XWKbolkiSp6oPFW29BSvZY\nSJJUCao+WDRWHEuSJLW/qg8Wb7yRPxosJEkqXtUHiylTciXNFVYouiWSJKlDBIvevd1UTJKkStBh\ngoUkSSqewUKSJJWNwUKSJJVNVQeLefNyHQuDhSRJlaGqg8U778D8+QYLSZIqRVUHi+nT80eDhSRJ\nlaGqg8WMGfmjwUKSpMpQ1cFi+nTo3h1WXrnolkiSJKjyYDFjhsWxJEmqJFUdLKZPdxhEkqRKUtXB\norbHQpIkVYaqDhb2WEiSVFmqOljMnGmwkCSpklR1sJg3z2AhSVIlqepgAQYLSZIqicFCkiSVTVUH\ni6WWglVXLboVkiSpVlUHi1VXhS5V/RVIktSxVPWP5dVXL7oFkiSprqoOFqutVnQLJElSXVUdLOyx\nkCSpshgsJElS2RgsJElS2VR1sHCOhSRJlaWqg4U9FpIkVZaqDhYrr1x0CyRJUl1VHSy6di26BZIk\nqa6qDhaSJKmyGCwkSVLZGCwkSVLZGCwkSVLZGCwkSVLZGCwkSVLZGCwkSVLZGCwkSVLZGCwkSVLZ\nGCwkSVLZGCzUbCNHjiy6CZ2O97z9ec/bn/e8Y2lVsIiIEyLi1Yj4KCKejIhtmvm6AyOiJiL+XO/4\n1aXjdR/3tKZtajv+529/3vP25z1vf97zjqXFwSIiDgDOB84EtgLGA/dFxCqLed16wHnAo42cMgpY\nHVij9BjU0rZJkqRitabHYjBweUppREppInAsMAc4srEXREQX4HrgDODVRk77JKU0M6U0o/SY3Yq2\nSZKkArUoWEREN2Ag8GDtsZRSAh4AtmvipWcCM1JKVzdxzk4RMT0iJkbE8IhYuSVtkyRJxVuqheev\nAnQFptc7Ph3YuKEXRMT2wBFA/yauOwq4jdyb8VngN8A9EbFdKbjU1x3gxRdfbFHjtWRmz57NuHHj\nim5Gp+I9b3/e8/bnPW9fdX52dm+L60fDP7cbOTliTeBNYLuU0lN1jp8L7JBS+mK983sAE4DjUkr3\nlY5dDfRMKe3bxPtsALwM7JJSeriB5w8Cbmh2wyVJUn0Hp5RuLPdFW9pjMQuYT55kWddqLNqLAbn3\nYT3groiI0rEuABExF9g4pbTInIuU0qsRMQvoAywSLID7gIOB14CPW/g1SJLUmXUH1if/LC27FgWL\nlNKnETEW2AW4E6AUGHYBLmrgJS8Cm9c79iugB/BD4I2G3iciegO9gLcaacfbQNlTliRJncTjbXXh\nlvZYAFwAXFsKGGPIq0SWA64BiIgRwJSU0mkppbnAC3VfHBHvked8vlj6fHny5M7bgGnkXorfAZNo\nozQlSZLaRouDRUrp5lLNirPJQyLPArullGaWTukNzGvBJecDWwCHASsCU8mB4oyU0qctbZ8kSSpO\niyZvSpIkNcW9QiRJUtkYLCRJUtlUZbBo7SZoWryI+FlEjImI90uVUP8SERvVO2eZiLgkImZFxAcR\ncWtErFZUmzuS0v2viYgL6hzzfpdZRKwVEdeV7umciBgfEQPqnXN2REwtPX9/RPQpqr3VLiK6RMQv\nI+KV0v38d0T8vIHzvOdLICK+FBF3RsSbpe8jezdwTpP3OCJWiogbImJ2RLwbEVeWFlk0W9UFi9Zu\ngqZm+xJwMbAt8FWgGzA6Ipatc85QYE9gP+DLwFrkVT1aAqWA/H3yv+m6vN9lFBErAo8BnwC7AZsC\nPwberXPOT4ETgWOAzwMfkr/PLN3uDe4YTiXfy+OBTYBTgFMi4sTaE7znZbE8eUHFCcAiEyibeY9v\nJP+f2IX8fefLwOUtakVKqaoewJPAhXU+D2AKcErRbeuID3IZ9xpyZVWAFcjfkL9V55yNS+d8vuj2\nVuuDXNvlJWBnclG4C7zfbXavfwv8bTHnTAUG1/l8BeAj4DtFt78aH8BdwBX1jt0KjPCet9k9rwH2\nrnesyXtcChQ1wFZ1ztmNvNJzjea+d1X1WCzBJmhqvRXJyfed0ucDycuU6/4dvAS8jn8HS+IS4K6U\n0kP1jm+N97vc9gL+GRE3l4b7xkXEUbVPlrYUWIOF7/n7wFN4z1vrcWCXiOgLEBH9ge2Be0qfe8/b\nWDPv8ReAd1NKz9R56QPknwHbNve9WlMgq0gt3gRNrVeqqjoU+EdKqbbQ2RrA3NI/yLqml55TC0XE\ngcCW5BBR3+p4v8ttQ+A48pDqr8jfMC+KiI9TSteT72ui4e8z3vPW+S35t+OJETGfPAz/vymlm0rP\ne8/bXnPu8RrAjLpPppTmR8Q7tODvodqCRWOCBsaTtMSGA58DdmjGuf4dtEKpfP1QYNfUsoJw3u/W\n6wKMSSmdXvp8fET0I4eN65t4nfe89Q4ADgIOJFdj3hK4MCKmppSua+J13vO215x73KK/h6oaCqHl\nm6CplSJiGPB1YKeU0tQ6T00Dlo6IFeq9xL+D1hkIrAqMjYhPI+JTYEfgR6WN+qYDy3i/y+ot8j5G\ndb0IrFv68zTyN1K/z5TPucBvUkq3pJT+lVK6ARgC/Kz0vPe87TXnHk8rff7/IqIrsBIt+HuoqmBR\n+o2udhM0YKFN0NpsQ5XOphQqvgl8JaX0er2nx5In8tT9O9iI/E35iXZrZMfxAHmjvi2B/qXHP8m/\nOdf++VO83+X0GIsOnW4M/Afy7srkb7B17/kK5CETv8+0znIs+htvDaWfQd7zttfMe/wEsGJEbFXn\npbuQA8lTzX2vahwKaXITNC2ZiBgODAL2Bj6MiNp0Ozul9HFK6f2I+CNwQUS8C3xA3tn2sZTSmGJa\nXb1SSh+y6EZ9HwJvpwUb9Xm/y2sI8FhE/Ay4mfyN9SjyUt9aQ4GfR8S/gdeAX5JXn93Rvk3tMO4C\n/jci3gD+BQwgf+++ss453vMlVKo30YccBAA2LE2UfSel9AaLuccppYkRcR9wRUQcByxNLj8wMqU0\nrdkNKXpJTCuX0RxfuikfkRPW1kW3qaM8yL9FzG/gcVidc5Yp/WObRf5BdwuwWtFt7ygP4CFKy029\n3212j78OTADmkH/QHdnAOWeRl+fNIW+M2Kfodlfrg1xf4QLgVXLthMnAL4ClvOdlvc87NvI9/Krm\n3mPySsDrgdnk2i5XAMu1pB1uQiZJksqmquZYSJKkymawkCRJZWOwkCRJZWOwkCRJZWOwkCRJZWOw\nkCRJZWOwkCRJZWOwkCRJZWOwkCRJZWOwkCRJZWOwkCRJZfN/dRUw4LJQwFIAAAAASUVORK5CYII=\n", 1427 | "text/plain": [ 1428 | "" 1429 | ] 1430 | }, 1431 | "metadata": {}, 1432 | "output_type": "display_data" 1433 | } 1434 | ], 1435 | "source": [ 1436 | "fig, ax = plt.subplots(1)\n", 1437 | "ax.plot(tr_h[\"acc\"])" 1438 | ] 1439 | }, 1440 | { 1441 | "cell_type": "markdown", 1442 | "metadata": {}, 1443 | "source": [ 1444 | "### Load saved model" 1445 | ] 1446 | }, 1447 | { 1448 | "cell_type": "code", 1449 | "execution_count": 17, 1450 | "metadata": { 1451 | "collapsed": false 1452 | }, 1453 | "outputs": [], 1454 | "source": [ 1455 | "model = load_model(\"model_data_-1_mask_brain_train_0.7_epoch_100_bal_1_3_ler_0.05_0.005.mdl\")" 1456 | ] 1457 | }, 1458 | { 1459 | "cell_type": "markdown", 1460 | "metadata": {}, 1461 | "source": [ 1462 | "### Testing model" 1463 | ] 1464 | }, 1465 | { 1466 | "cell_type": "code", 1467 | "execution_count": 28, 1468 | "metadata": { 1469 | "collapsed": false 1470 | }, 1471 | "outputs": [ 1472 | { 1473 | "name": "stdout", 1474 | "output_type": "stream", 1475 | "text": [ 1476 | "Matrix\n", 1477 | "Pred \t T F\n", 1478 | "Real T\t [454, 0]\n", 1479 | "Real F\t [181, 0]\n", 1480 | "\n", 1481 | "Accuracy: 0.7149606299212599\n" 1482 | ] 1483 | } 1484 | ], 1485 | "source": [ 1486 | "predicted = model.predict(x_data_ts)\n", 1487 | "\n", 1488 | "#creating matrix\n", 1489 | "# [TP, FN]\n", 1490 | "# [FP, TN]\n", 1491 | "th = 0.5\n", 1492 | "\n", 1493 | "m = [[0,0],[0,0]]\n", 1494 | "for i in range(predicted.shape[0]):\n", 1495 | " a = predicted[i,0] > th\n", 1496 | " b = y_data_ts[i,0] > th\n", 1497 | " if a:\n", 1498 | " if b:\n", 1499 | " m[0][0] += 1\n", 1500 | " else:\n", 1501 | " m[1][0] += 1\n", 1502 | " else:\n", 1503 | " if b:\n", 1504 | " m[0][1] += 1\n", 1505 | " else:\n", 1506 | " m[1][1] += 1\n", 1507 | " \n", 1508 | "print(\"Matrix\")\n", 1509 | "print(\"Pred \\t T F\")\n", 1510 | "print(\"Real T\\t\",m[0])\n", 1511 | "print(\"Real F\\t\",m[1])\n", 1512 | "print(\"\\nAccuracy:\", (m[0][0]+m[1][1])/(m[0][0]+m[0][1]+m[1][0]+m[1][1]))" 1513 | ] 1514 | }, 1515 | { 1516 | "cell_type": "code", 1517 | "execution_count": 29, 1518 | "metadata": { 1519 | "collapsed": false 1520 | }, 1521 | "outputs": [ 1522 | { 1523 | "name": "stdout", 1524 | "output_type": "stream", 1525 | "text": [ 1526 | "[[ 0.65933722 0.34066269]\n", 1527 | " [ 0.66013479 0.33986521]\n", 1528 | " [ 0.65841192 0.34158808]]\n" 1529 | ] 1530 | }, 1531 | { 1532 | "data": { 1533 | "text/plain": [ 1534 | "0.66502866595617383" 1535 | ] 1536 | }, 1537 | "execution_count": 29, 1538 | "metadata": {}, 1539 | "output_type": "execute_result" 1540 | } 1541 | ], 1542 | "source": [ 1543 | "# print(np.sum(predicted[:,1] == 0.5))\n", 1544 | "print(predicted[1:4,:])\n", 1545 | "np.sum(y_data[:,1])/np.sum(y_data)\n", 1546 | "tr_h[\"acc\"][-1]" 1547 | ] 1548 | }, 1549 | { 1550 | "cell_type": "code", 1551 | "execution_count": null, 1552 | "metadata": { 1553 | "collapsed": true 1554 | }, 1555 | "outputs": [], 1556 | "source": [] 1557 | }, 1558 | { 1559 | "cell_type": "code", 1560 | "execution_count": null, 1561 | "metadata": { 1562 | "collapsed": true 1563 | }, 1564 | "outputs": [], 1565 | "source": [] 1566 | } 1567 | ], 1568 | "metadata": { 1569 | "kernelspec": { 1570 | "display_name": "Python 3", 1571 | "language": "python", 1572 | "name": "python3" 1573 | }, 1574 | "language_info": { 1575 | "codemirror_mode": { 1576 | "name": "ipython", 1577 | "version": 3 1578 | }, 1579 | "file_extension": ".py", 1580 | "mimetype": "text/x-python", 1581 | "name": "python", 1582 | "nbconvert_exporter": "python", 1583 | "pygments_lexer": "ipython3", 1584 | "version": "3.5.2" 1585 | } 1586 | }, 1587 | "nbformat": 4, 1588 | "nbformat_minor": 1 1589 | } 1590 | --------------------------------------------------------------------------------