DETECTION OF TUBERS WITH CONVOLUTIONAL NEURAL NETWORKS

Import packages and functions

In [1]:
# Import packages
%matplotlib inline
from PIL import Image
import numpy as np
import os
from skimage.color import gray2rgb
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import matplotlib as mpl
from sklearn.utils import shuffle
import tensorflow as tf
from keras import activations
from keras.preprocessing import image
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten, GaussianNoise, BatchNormalization, GlobalAveragePooling2D, Conv2D, MaxPooling2D
from keras.optimizers import Adam
from keras.backend.tensorflow_backend import set_session
from keras.applications.inception_v3 import InceptionV3
from keras.applications.resnet50 import ResNet50
from keras.models import Model
from keras import backend as K
from sklearn.metrics import confusion_matrix
from sklearn.metrics import roc_auc_score
!pip install keras-vis
from vis.visualization import visualize_cam, visualize_saliency, overlay
!pip install hp5y
from keras.models import model_from_json
mpl.rcParams['figure.figsize'] = (14,16)
Using TensorFlow backend.
Requirement already satisfied: keras-vis in /usr/local/lib/python3.6/dist-packages (0.4.1)
Requirement already satisfied: h5py in /usr/local/lib/python3.6/dist-packages (from keras-vis) (2.8.0)
Requirement already satisfied: keras in /usr/local/lib/python3.6/dist-packages (from keras-vis) (2.2.4)
Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from keras-vis) (1.11.0)
Requirement already satisfied: scikit-image in /usr/local/lib/python3.6/dist-packages (from keras-vis) (0.13.1)
Requirement already satisfied: matplotlib in /usr/local/lib/python3.6/dist-packages (from keras-vis) (3.0.3)
Requirement already satisfied: numpy>=1.7 in /usr/local/lib/python3.6/dist-packages (from h5py->keras-vis) (1.14.6)
Requirement already satisfied: scipy>=0.14 in /usr/local/lib/python3.6/dist-packages (from keras->keras-vis) (1.1.0)
Requirement already satisfied: keras-applications>=1.0.6 in /usr/local/lib/python3.6/dist-packages (from keras->keras-vis) (1.0.7)
Requirement already satisfied: keras-preprocessing>=1.0.5 in /usr/local/lib/python3.6/dist-packages (from keras->keras-vis) (1.0.9)
Requirement already satisfied: pyyaml in /usr/local/lib/python3.6/dist-packages (from keras->keras-vis) (3.13)
Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image->keras-vis) (1.0.2)
Requirement already satisfied: networkx>=1.8 in /usr/local/lib/python3.6/dist-packages (from scikit-image->keras-vis) (2.2)
Requirement already satisfied: pillow>=2.1.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image->keras-vis) (4.1.1)
Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->keras-vis) (2.5.3)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib->keras-vis) (0.10.0)
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->keras-vis) (1.0.1)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->keras-vis) (2.3.1)
Requirement already satisfied: decorator>=4.3.0 in /usr/local/lib/python3.6/dist-packages (from networkx>=1.8->scikit-image->keras-vis) (4.4.0)
Requirement already satisfied: olefile in /usr/local/lib/python3.6/dist-packages (from pillow>=2.1.0->scikit-image->keras-vis) (0.46)
Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from kiwisolver>=1.0.1->matplotlib->keras-vis) (40.8.0)
Collecting hp5y
  Could not find a version that satisfies the requirement hp5y (from versions: )
No matching distribution found for hp5y

FIRST PART: DATA INGESTION AND DATA AUGMENTATION

Import original images from local computer

We used Magnetic Resonance Imaging (MRI) scans from 114 patients with tuberous sclerosis complex (TSC) and from 114 patients with structurally normal MRI (controls).

For each MRI, we manually selected representative axial T2 and T2 FLAIR slices with tubers (in patients with TSC) and with normal findings (in controls). These axial slices were converted to deidentified .jpg images.

We created three folders per TSC and three folders for controls: TSCtrain (69 patients, 566 images), TSCval (20 patients, 130 images), and TSCtest (25 patients, 210 images) and Controltrain (69 patients, 561 images), Controlval (20 patients, 118 images), and Controltest (25 patients, 226 images). Individual patients belonged to only one of the categories (none of the patients had images in different folders).

The model development part was done in a cloud computer environment and we only used the train and validation subsets. Once the developed models were ready, we selected the one with lowest validation error (binary cross-entropy loss) to test in the local computer on the test set.

In [2]:
# Import zipped files from local computer
from google.colab import files
uploaded = files.upload()
Upload widget is only available when the cell has been executed in the current browser session. Please rerun this cell to enable.
Saving Controltrain.zip to Controltrain.zip
Saving Controlval.zip to Controlval.zip
Saving TSCtrain.zip to TSCtrain.zip
Saving TSCval.zip to TSCval.zip
In [3]:
# Unzip files
!unzip Controltrain.zip
!unzip Controlval.zip
!unzip TSCtrain.zip
!unzip TSCval.zip
Archive:  Controltrain.zip
  inflating: Controltrain/100.1T2.jpg  
  inflating: Controltrain/100.2T2.jpg  
  inflating: Controltrain/100.3T2.jpg  
  inflating: Controltrain/100.4T2.jpg  
  inflating: Controltrain/100.5FLAIR.jpg  
  inflating: Controltrain/100.6FLAIR.jpg  
  inflating: Controltrain/100.7FLAIR.jpg  
  inflating: Controltrain/100.8FLAIR.jpg  
  inflating: Controltrain/101.1T2.jpg  
  inflating: Controltrain/101.2T2.jpg  
  inflating: Controltrain/101.3T2.jpg  
  inflating: Controltrain/101.4T2.jpg  
  inflating: Controltrain/101.5FLAIR.jpg  
  inflating: Controltrain/101.6FLAIR.jpg  
  inflating: Controltrain/101.7FLAIR.jpg  
  inflating: Controltrain/101.8FLAIR.jpg  
  inflating: Controltrain/102.10FLAIR.jpg  
  inflating: Controltrain/102.11FLAIR.jpg  
  inflating: Controltrain/102.1T2.jpg  
  inflating: Controltrain/102.2T2.jpg  
  inflating: Controltrain/102.3T2.jpg  
  inflating: Controltrain/102.4T2.jpg  
  inflating: Controltrain/102.5T2.jpg  
  inflating: Controltrain/102.6T2.jpg  
  inflating: Controltrain/102.7FLAIR.jpg  
  inflating: Controltrain/102.8FLAIR.jpg  
  inflating: Controltrain/102.9FLAIR.jpg  
  inflating: Controltrain/103.10FLAIR.jpg  
  inflating: Controltrain/103.11FLAIR.jpg  
  inflating: Controltrain/103.1T2.jpg  
  inflating: Controltrain/103.2T2.jpg  
  inflating: Controltrain/103.3T2.jpg  
  inflating: Controltrain/103.4T2.jpg  
  inflating: Controltrain/103.5T2.jpg  
  inflating: Controltrain/103.6T2.jpg  
  inflating: Controltrain/103.7FLAIR.jpg  
  inflating: Controltrain/103.8FLAIR.jpg  
  inflating: Controltrain/103.9FLAIR.jpg  
  inflating: Controltrain/104.10FLAIR.jpg  
  inflating: Controltrain/104.11FLAIR.jpg  
  inflating: Controltrain/104.1T2.jpg  
  inflating: Controltrain/104.2T2.jpg  
  inflating: Controltrain/104.3T2.jpg  
  inflating: Controltrain/104.4T2.jpg  
  inflating: Controltrain/104.5T2.jpg  
  inflating: Controltrain/104.6T2.jpg  
  inflating: Controltrain/104.7FLAIR.jpg  
  inflating: Controltrain/104.8FLAIR.jpg  
  inflating: Controltrain/104.9FLAIR.jpg  
  inflating: Controltrain/105.10FLAIR.jpg  
  inflating: Controltrain/105.1T2.jpg  
  inflating: Controltrain/105.2T2.jpg  
  inflating: Controltrain/105.3T2.jpg  
  inflating: Controltrain/105.4T2.jpg  
  inflating: Controltrain/105.5T2.jpg  
  inflating: Controltrain/105.6T2.jpg  
  inflating: Controltrain/105.7FLAIR.jpg  
  inflating: Controltrain/105.8FLAIR.jpg  
  inflating: Controltrain/105.9FLAIR.jpg  
  inflating: Controltrain/106.10FLAIR.jpg  
  inflating: Controltrain/106.11FLAIR.jpg  
  inflating: Controltrain/106.12FLAIR.jpg  
  inflating: Controltrain/106.1T2.jpg  
  inflating: Controltrain/106.2T2.jpg  
  inflating: Controltrain/106.3T2.jpg  
  inflating: Controltrain/106.4T2.jpg  
  inflating: Controltrain/106.5T2.jpg  
  inflating: Controltrain/106.6T2.jpg  
  inflating: Controltrain/106.7T2.jpg  
  inflating: Controltrain/106.8FLAIR.jpg  
  inflating: Controltrain/106.9FLAIR.jpg  
  inflating: Controltrain/107.10FLAIR.jpg  
  inflating: Controltrain/107.11FLAIR.jpg  
  inflating: Controltrain/107.12FLAIR.jpg  
  inflating: Controltrain/107.13FLAIR.jpg  
  inflating: Controltrain/107.14FLAIR.jpg  
  inflating: Controltrain/107.1T2.jpg  
  inflating: Controltrain/107.2T2.jpg  
  inflating: Controltrain/107.3T2.jpg  
  inflating: Controltrain/107.4T2.jpg  
  inflating: Controltrain/107.5T2.jpg  
  inflating: Controltrain/107.6T2.jpg  
  inflating: Controltrain/107.7T2.jpg  
  inflating: Controltrain/107.8T2.jpg  
  inflating: Controltrain/107.9FLAIR.jpg  
  inflating: Controltrain/108.10FLAIR.jpg  
  inflating: Controltrain/108.11FLAIR.jpg  
  inflating: Controltrain/108.1T2.jpg  
  inflating: Controltrain/108.2T2.jpg  
  inflating: Controltrain/108.3T2.jpg  
  inflating: Controltrain/108.4T2.jpg  
  inflating: Controltrain/108.5T2.jpg  
  inflating: Controltrain/108.6T2.jpg  
  inflating: Controltrain/108.7FLAIR.jpg  
  inflating: Controltrain/108.8FLAIR.jpg  
  inflating: Controltrain/108.9FLAIR.jpg  
  inflating: Controltrain/109.10FLAIR.jpg  
  inflating: Controltrain/109.1T2.jpg  
  inflating: Controltrain/109.2T2.jpg  
  inflating: Controltrain/109.3T2.jpg  
  inflating: Controltrain/109.4T2.jpg  
  inflating: Controltrain/109.5T2.jpg  
  inflating: Controltrain/109.6FLAIR.jpg  
  inflating: Controltrain/109.7FLAIR.jpg  
  inflating: Controltrain/109.8FLAIR.jpg  
  inflating: Controltrain/109.9FLAIR.jpg  
  inflating: Controltrain/110.10FLAIR.jpg  
  inflating: Controltrain/110.1T2.jpg  
  inflating: Controltrain/110.2T2.jpg  
  inflating: Controltrain/110.3T2.jpg  
  inflating: Controltrain/110.4T2.jpg  
  inflating: Controltrain/110.5T2.jpg  
  inflating: Controltrain/110.6FLAIR.jpg  
  inflating: Controltrain/110.7FLAIR.jpg  
  inflating: Controltrain/110.8FLAIR.jpg  
  inflating: Controltrain/110.9FLAIR.jpg  
  inflating: Controltrain/111.10FLAIR.jpg  
  inflating: Controltrain/111.1T2.jpg  
  inflating: Controltrain/111.2T2.jpg  
  inflating: Controltrain/111.3T2.jpg  
  inflating: Controltrain/111.4T2.jpg  
  inflating: Controltrain/111.5T2.jpg  
  inflating: Controltrain/111.6FLAIR.jpg  
  inflating: Controltrain/111.7FLAIR.jpg  
  inflating: Controltrain/111.8FLAIR.jpg  
  inflating: Controltrain/111.9FLAIR.jpg  
  inflating: Controltrain/112.10FLAIR.jpg  
  inflating: Controltrain/112.1T2.jpg  
  inflating: Controltrain/112.2T2.jpg  
  inflating: Controltrain/112.3T2.jpg  
  inflating: Controltrain/112.4T2.jpg  
  inflating: Controltrain/112.5T2.jpg  
  inflating: Controltrain/112.6FLAIR.jpg  
  inflating: Controltrain/112.7FLAIR.jpg  
  inflating: Controltrain/112.8FLAIR.jpg  
  inflating: Controltrain/112.9FLAIR.jpg  
  inflating: Controltrain/113.10FLAIR.jpg  
  inflating: Controltrain/113.1T2.jpg  
  inflating: Controltrain/113.2T2.jpg  
  inflating: Controltrain/113.3T2.jpg  
  inflating: Controltrain/113.4T2.jpg  
  inflating: Controltrain/113.5T2.jpg  
  inflating: Controltrain/113.6FLAIR.jpg  
  inflating: Controltrain/113.7FLAIR.jpg  
  inflating: Controltrain/113.8FLAIR.jpg  
  inflating: Controltrain/113.9FLAIR.jpg  
  inflating: Controltrain/114.1T2.jpg  
  inflating: Controltrain/114.2T2.jpg  
  inflating: Controltrain/114.3T2.jpg  
  inflating: Controltrain/114.4T2.jpg  
  inflating: Controltrain/114.5T2.jpg  
  inflating: Controltrain/114.6FLAIR.jpg  
  inflating: Controltrain/114.7FLAIR.jpg  
  inflating: Controltrain/114.8FLAIR.jpg  
  inflating: Controltrain/46.1T2.jpg  
  inflating: Controltrain/46.2T2.jpg  
  inflating: Controltrain/46.3T2.jpg  
  inflating: Controltrain/46.4T2.jpg  
  inflating: Controltrain/46.5FLAIR.jpg  
  inflating: Controltrain/46.6FLAIR.jpg  
  inflating: Controltrain/46.7FLAIR.jpg  
  inflating: Controltrain/47.1T2.jpg  
  inflating: Controltrain/47.2T2.jpg  
  inflating: Controltrain/47.3T2.jpg  
  inflating: Controltrain/47.4FLAIR.jpg  
  inflating: Controltrain/47.5FLAIR.jpg  
  inflating: Controltrain/47.6FLAIR.jpg  
  inflating: Controltrain/47.7FLAIR.jpg  
  inflating: Controltrain/48.1T2.jpg  
  inflating: Controltrain/48.2T2.jpg  
  inflating: Controltrain/48.3T2.jpg  
  inflating: Controltrain/48.4T2.jpg  
  inflating: Controltrain/48.5FLAIR.jpg  
  inflating: Controltrain/48.6FLAIR.jpg  
  inflating: Controltrain/48.7FLAIR.jpg  
  inflating: Controltrain/49.1T2.jpg  
  inflating: Controltrain/49.2T2.jpg  
  inflating: Controltrain/49.3T2.jpg  
  inflating: Controltrain/49.4FLAIR.jpg  
  inflating: Controltrain/49.5FLAIR.jpg  
  inflating: Controltrain/49.6FLAIR.jpg  
  inflating: Controltrain/50.1T2.jpg  
  inflating: Controltrain/50.2T2.jpg  
  inflating: Controltrain/50.3T2.jpg  
  inflating: Controltrain/50.4FLAIR.jpg  
  inflating: Controltrain/50.5FLAIR.jpg  
  inflating: Controltrain/50.6FLAIR.jpg  
  inflating: Controltrain/50.7FLAIR.jpg  
  inflating: Controltrain/51.1T2.jpg  
  inflating: Controltrain/51.2T2.jpg  
  inflating: Controltrain/51.3T2.jpg  
  inflating: Controltrain/51.4T2.jpg  
  inflating: Controltrain/51.5FLAIR.jpg  
  inflating: Controltrain/51.6FLAIR.jpg  
  inflating: Controltrain/51.7FLAIR.jpg  
  inflating: Controltrain/52.1T2.jpg  
  inflating: Controltrain/52.2T2.jpg  
  inflating: Controltrain/52.3T2.jpg  
  inflating: Controltrain/52.4FLAIR.jpg  
  inflating: Controltrain/52.5FLAIR.jpg  
  inflating: Controltrain/52.6FLAIR.jpg  
  inflating: Controltrain/52.7FLAIR.jpg  
  inflating: Controltrain/53.1T2.jpg  
  inflating: Controltrain/53.2T2.jpg  
  inflating: Controltrain/53.3T2.jpg  
  inflating: Controltrain/53.4T2.jpg  
  inflating: Controltrain/53.5FLAIR.jpg  
  inflating: Controltrain/53.6FLAIR.jpg  
  inflating: Controltrain/53.7FLAIR.jpg  
  inflating: Controltrain/54.1T2.jpg  
  inflating: Controltrain/54.2T2.jpg  
  inflating: Controltrain/54.3T2.jpg  
  inflating: Controltrain/54.4FLAIR.jpg  
  inflating: Controltrain/54.5FLAIR.jpg  
  inflating: Controltrain/54.6FLAIR.jpg  
  inflating: Controltrain/54.7FLAIR.jpg  
  inflating: Controltrain/55.1T2.jpg  
  inflating: Controltrain/55.2T2.jpg  
  inflating: Controltrain/55.3T2.jpg  
  inflating: Controltrain/55.4T2.jpg  
  inflating: Controltrain/55.5FLAIR.jpg  
  inflating: Controltrain/55.6FLAIR.jpg  
  inflating: Controltrain/55.7FLAIR.jpg  
  inflating: Controltrain/56.1T2.jpg  
  inflating: Controltrain/56.2T2.jpg  
  inflating: Controltrain/56.3T2.jpg  
  inflating: Controltrain/56.4FLAIR.jpg  
  inflating: Controltrain/56.5FLAIR.jpg  
  inflating: Controltrain/56.6FLAIR.jpg  
  inflating: Controltrain/56.7FLAIR.jpg  
  inflating: Controltrain/57.1T2.jpg  
  inflating: Controltrain/57.2T2.jpg  
  inflating: Controltrain/57.3T2.jpg  
  inflating: Controltrain/57.4T2.jpg  
  inflating: Controltrain/57.5FLAIR.jpg  
  inflating: Controltrain/57.6FLAIR.jpg  
  inflating: Controltrain/57.7FLAIR.jpg  
  inflating: Controltrain/58.1T2.jpg  
  inflating: Controltrain/58.2T2.jpg  
  inflating: Controltrain/58.3T2.jpg  
  inflating: Controltrain/58.4FLAIR.jpg  
  inflating: Controltrain/58.5FLAIR.jpg  
  inflating: Controltrain/58.6FLAIR.jpg  
  inflating: Controltrain/58.7FLAIR.jpg  
  inflating: Controltrain/59.1T2.jpg  
  inflating: Controltrain/59.2T2.jpg  
  inflating: Controltrain/59.3T2.jpg  
  inflating: Controltrain/59.4T2.jpg  
  inflating: Controltrain/59.5FLAIR.jpg  
  inflating: Controltrain/59.6FLAIR.jpg  
  inflating: Controltrain/59.7FLAIR.jpg  
  inflating: Controltrain/60.1T2.jpg  
  inflating: Controltrain/60.2T2.jpg  
  inflating: Controltrain/60.3T2.jpg  
  inflating: Controltrain/60.4FLAIR.jpg  
  inflating: Controltrain/60.5FLAIR.jpg  
  inflating: Controltrain/60.6FLAIR.jpg  
  inflating: Controltrain/60.7FLAIR.jpg  
  inflating: Controltrain/61.1T2.jpg  
  inflating: Controltrain/61.2T2.jpg  
  inflating: Controltrain/61.3T2.jpg  
  inflating: Controltrain/61.4T2.jpg  
  inflating: Controltrain/61.5FLAIR.jpg  
  inflating: Controltrain/61.6FLAIR.jpg  
  inflating: Controltrain/61.7FLAIR.jpg  
  inflating: Controltrain/62.1T2.jpg  
  inflating: Controltrain/62.2T2.jpg  
  inflating: Controltrain/62.3T2.jpg  
  inflating: Controltrain/62.4FLAIR.jpg  
  inflating: Controltrain/62.5FLAIR.jpg  
  inflating: Controltrain/62.6FLAIR.jpg  
  inflating: Controltrain/62.7FLAIR.jpg  
  inflating: Controltrain/63.1T2.jpg  
  inflating: Controltrain/63.2T2.jpg  
  inflating: Controltrain/63.3T2.jpg  
  inflating: Controltrain/63.4T2.jpg  
  inflating: Controltrain/63.5FLAIR.jpg  
  inflating: Controltrain/63.6FLAIR.jpg  
  inflating: Controltrain/63.7FLAIR.jpg  
  inflating: Controltrain/64.1T2.jpg  
  inflating: Controltrain/64.2T2.jpg  
  inflating: Controltrain/64.3T2.jpg  
  inflating: Controltrain/64.4FLAIR.jpg  
  inflating: Controltrain/64.5FLAIR.jpg  
  inflating: Controltrain/64.6FLAIR.jpg  
  inflating: Controltrain/64.7FLAIR.jpg  
  inflating: Controltrain/65.1T2.jpg  
  inflating: Controltrain/65.2T2.jpg  
  inflating: Controltrain/65.3T2.jpg  
  inflating: Controltrain/65.4T2.jpg  
  inflating: Controltrain/65.5FLAIR.jpg  
  inflating: Controltrain/65.6FLAIR.jpg  
  inflating: Controltrain/65.7FLAIR.jpg  
  inflating: Controltrain/66.1T2.jpg  
  inflating: Controltrain/66.2T2.jpg  
  inflating: Controltrain/66.3T2.jpg  
  inflating: Controltrain/66.4FLAIR.jpg  
  inflating: Controltrain/66.5FLAIR.jpg  
  inflating: Controltrain/66.6FLAIR.jpg  
  inflating: Controltrain/66.7FLAIR.jpg  
  inflating: Controltrain/67.1T2.jpg  
  inflating: Controltrain/67.2T2.jpg  
  inflating: Controltrain/67.3T2.jpg  
  inflating: Controltrain/67.4T2.jpg  
  inflating: Controltrain/67.5FLAIR.jpg  
  inflating: Controltrain/67.6FLAIR.jpg  
  inflating: Controltrain/67.7FLAIR.jpg  
  inflating: Controltrain/68.1T2.jpg  
  inflating: Controltrain/68.2T2.jpg  
  inflating: Controltrain/68.3T2.jpg  
  inflating: Controltrain/68.4FLAIR.jpg  
  inflating: Controltrain/68.5FLAIR.jpg  
  inflating: Controltrain/68.6FLAIR.jpg  
  inflating: Controltrain/68.7FLAIR.jpg  
  inflating: Controltrain/69.1T2.jpg  
  inflating: Controltrain/69.2T2.jpg  
  inflating: Controltrain/69.3T2.jpg  
  inflating: Controltrain/69.4T2.jpg  
  inflating: Controltrain/69.5FLAIR.jpg  
  inflating: Controltrain/69.6FLAIR.jpg  
  inflating: Controltrain/69.7FLAIR.jpg  
  inflating: Controltrain/70.1T2.jpg  
  inflating: Controltrain/70.2T2.jpg  
  inflating: Controltrain/70.3T2.jpg  
  inflating: Controltrain/70.4FLAIR.jpg  
  inflating: Controltrain/70.5FLAIR.jpg  
  inflating: Controltrain/70.6FLAIR.jpg  
  inflating: Controltrain/70.7FLAIR.jpg  
  inflating: Controltrain/71.1T2.jpg  
  inflating: Controltrain/71.2T2.jpg  
  inflating: Controltrain/71.3T2.jpg  
  inflating: Controltrain/71.4T2.jpg  
  inflating: Controltrain/71.5FLAIR.jpg  
  inflating: Controltrain/71.6FLAIR.jpg  
  inflating: Controltrain/71.7FLAIR.jpg  
  inflating: Controltrain/72.1T2.jpg  
  inflating: Controltrain/72.2T2.jpg  
  inflating: Controltrain/72.3T2.jpg  
  inflating: Controltrain/72.4FLAIR.jpg  
  inflating: Controltrain/72.5FLAIR.jpg  
  inflating: Controltrain/72.6FLAIR.jpg  
  inflating: Controltrain/72.7FLAIR.jpg  
  inflating: Controltrain/73.1T2.jpg  
  inflating: Controltrain/73.2T2.jpg  
  inflating: Controltrain/73.3T2.jpg  
  inflating: Controltrain/73.4T2.jpg  
  inflating: Controltrain/73.5FLAIR.jpg  
  inflating: Controltrain/73.6FLAIR.jpg  
  inflating: Controltrain/73.7FLAIR.jpg  
  inflating: Controltrain/73.8FLAIR.jpg  
  inflating: Controltrain/74.1T2.jpg  
  inflating: Controltrain/74.2T2.jpg  
  inflating: Controltrain/74.3T2.jpg  
  inflating: Controltrain/74.4T2.jpg  
  inflating: Controltrain/74.5FLAIR.jpg  
  inflating: Controltrain/74.6FLAIR.jpg  
  inflating: Controltrain/74.7FLAIR.jpg  
  inflating: Controltrain/74.8FLAIR.jpg  
  inflating: Controltrain/75.1T2.jpg  
  inflating: Controltrain/75.2T2.jpg  
  inflating: Controltrain/75.3T2.jpg  
  inflating: Controltrain/75.4T2.jpg  
  inflating: Controltrain/75.5T2.jpg  
  inflating: Controltrain/75.6FLAIR.jpg  
  inflating: Controltrain/75.7FLAIR.jpg  
  inflating: Controltrain/75.8FLAIR.jpg  
  inflating: Controltrain/75.9FLAIR.jpg  
  inflating: Controltrain/76.1T2.jpg  
  inflating: Controltrain/76.2T2.jpg  
  inflating: Controltrain/76.3T2.jpg  
  inflating: Controltrain/76.4T2.jpg  
  inflating: Controltrain/76.5FLAIR.jpg  
  inflating: Controltrain/76.6FLAIR.jpg  
  inflating: Controltrain/76.7FLAIR.jpg  
  inflating: Controltrain/76.8FLAIR.jpg  
  inflating: Controltrain/77.1T2.jpg  
  inflating: Controltrain/77.2T2.jpg  
  inflating: Controltrain/77.3T2.jpg  
  inflating: Controltrain/77.4T2.jpg  
  inflating: Controltrain/77.5FLAIR.jpg  
  inflating: Controltrain/77.6FLAIR.jpg  
  inflating: Controltrain/77.7FLAIR.jpg  
  inflating: Controltrain/77.8FLAIR.jpg  
  inflating: Controltrain/78.1T2.jpg  
  inflating: Controltrain/78.2T2.jpg  
  inflating: Controltrain/78.3T2.jpg  
  inflating: Controltrain/78.4T2.jpg  
  inflating: Controltrain/78.5FLAIR.jpg  
  inflating: Controltrain/78.6FLAIR.jpg  
  inflating: Controltrain/78.7FLAIR.jpg  
  inflating: Controltrain/78.8FLAIR.jpg  
  inflating: Controltrain/78.9FLAIR.jpg  
  inflating: Controltrain/79.1T2.jpg  
  inflating: Controltrain/79.2T2.jpg  
  inflating: Controltrain/79.3T2.jpg  
  inflating: Controltrain/79.4T2.jpg  
  inflating: Controltrain/79.5FLAIR.jpg  
  inflating: Controltrain/79.6FLAIR.jpg  
  inflating: Controltrain/79.7FLAIR.jpg  
  inflating: Controltrain/79.8FLAIR.jpg  
  inflating: Controltrain/80.1T2.jpg  
  inflating: Controltrain/80.2T2.jpg  
  inflating: Controltrain/80.3T2.jpg  
  inflating: Controltrain/80.4T2.jpg  
  inflating: Controltrain/80.5FLAIR.jpg  
  inflating: Controltrain/80.6FLAIR.jpg  
  inflating: Controltrain/80.7FLAIR.jpg  
  inflating: Controltrain/80.8FLAIR.jpg  
  inflating: Controltrain/81.1T2.jpg  
  inflating: Controltrain/81.2T2.jpg  
  inflating: Controltrain/81.3T2.jpg  
  inflating: Controltrain/81.4T2.jpg  
  inflating: Controltrain/81.5FLAIR.jpg  
  inflating: Controltrain/81.6FLAIR.jpg  
  inflating: Controltrain/81.7FLAIR.jpg  
  inflating: Controltrain/81.8FLAIR.jpg  
  inflating: Controltrain/82.1T2.jpg  
  inflating: Controltrain/82.2T2.jpg  
  inflating: Controltrain/82.3T2.jpg  
  inflating: Controltrain/82.4T2.jpg  
  inflating: Controltrain/82.5FLAIR.jpg  
  inflating: Controltrain/82.6FLAIR.jpg  
  inflating: Controltrain/82.7FLAIR.jpg  
  inflating: Controltrain/82.8FLAIR.jpg  
  inflating: Controltrain/83.1T2.jpg  
  inflating: Controltrain/83.2T2.jpg  
  inflating: Controltrain/83.3T2.jpg  
  inflating: Controltrain/83.4T2.jpg  
  inflating: Controltrain/83.5FLAIR.jpg  
  inflating: Controltrain/83.6FLAIR.jpg  
  inflating: Controltrain/83.7FLAIR.jpg  
  inflating: Controltrain/83.8FLAIR.jpg  
  inflating: Controltrain/84.1T2.jpg  
  inflating: Controltrain/84.2T2.jpg  
  inflating: Controltrain/84.3T2.jpg  
  inflating: Controltrain/84.4FLAIR.jpg  
  inflating: Controltrain/84.5FLAIR.jpg  
  inflating: Controltrain/84.6FLAIR.jpg  
  inflating: Controltrain/84.7FLAIR.jpg  
  inflating: Controltrain/85.1T2.jpg  
  inflating: Controltrain/85.2T2.jpg  
  inflating: Controltrain/85.3T2.jpg  
  inflating: Controltrain/85.4T2.jpg  
  inflating: Controltrain/85.5FLAIR.jpg  
  inflating: Controltrain/85.6FLAIR.jpg  
  inflating: Controltrain/85.7FLAIR.jpg  
  inflating: Controltrain/85.8FLAIR.jpg  
  inflating: Controltrain/86.10FLAIR.jpg  
  inflating: Controltrain/86.1T2.jpg  
  inflating: Controltrain/86.2T2.jpg  
  inflating: Controltrain/86.3T2.jpg  
  inflating: Controltrain/86.4T2.jpg  
  inflating: Controltrain/86.5T2.jpg  
  inflating: Controltrain/86.6T2.jpg  
  inflating: Controltrain/86.7FLAIR.jpg  
  inflating: Controltrain/86.8FLAIR.jpg  
  inflating: Controltrain/86.9FLAIR.jpg  
  inflating: Controltrain/87.1T2.jpg  
  inflating: Controltrain/87.2T2.jpg  
  inflating: Controltrain/87.3T2.jpg  
  inflating: Controltrain/87.4T2.jpg  
  inflating: Controltrain/87.5FLAIR.jpg  
  inflating: Controltrain/87.6FLAIR.jpg  
  inflating: Controltrain/87.7FLAIR.jpg  
  inflating: Controltrain/87.8FLAIR.jpg  
  inflating: Controltrain/88.1T2.jpg  
  inflating: Controltrain/88.2T2.jpg  
  inflating: Controltrain/88.3T2.jpg  
  inflating: Controltrain/88.4T2.jpg  
  inflating: Controltrain/88.5FLAIR.jpg  
  inflating: Controltrain/88.6FLAIR.jpg  
  inflating: Controltrain/88.7FLAIR.jpg  
  inflating: Controltrain/88.8FLAIR.jpg  
  inflating: Controltrain/89.1T2.jpg  
  inflating: Controltrain/89.2T2.jpg  
  inflating: Controltrain/89.3T2.jpg  
  inflating: Controltrain/89.4T2.jpg  
  inflating: Controltrain/89.5FLAIR.jpg  
  inflating: Controltrain/89.6FLAIR.jpg  
  inflating: Controltrain/89.7FLAIR.jpg  
  inflating: Controltrain/89.8FLAIR.jpg  
  inflating: Controltrain/90.1T2.jpg  
  inflating: Controltrain/90.2T2.jpg  
  inflating: Controltrain/90.3T2.jpg  
  inflating: Controltrain/90.4T2.jpg  
  inflating: Controltrain/90.5FLAIR.jpg  
  inflating: Controltrain/90.6FLAIR.jpg  
  inflating: Controltrain/90.7FLAIR.jpg  
  inflating: Controltrain/90.8FLAIR.jpg  
  inflating: Controltrain/91.1T2.jpg  
  inflating: Controltrain/91.2T2.jpg  
  inflating: Controltrain/91.3T2.jpg  
  inflating: Controltrain/91.4T2.jpg  
  inflating: Controltrain/91.5FLAIR.jpg  
  inflating: Controltrain/91.6FLAIR.jpg  
  inflating: Controltrain/91.7FLAIR.jpg  
  inflating: Controltrain/91.8FLAIR.jpg  
  inflating: Controltrain/92.1T2.jpg  
  inflating: Controltrain/92.2T2.jpg  
  inflating: Controltrain/92.3T2.jpg  
  inflating: Controltrain/92.4T2.jpg  
  inflating: Controltrain/92.5FLAIR.jpg  
  inflating: Controltrain/92.6FLAIR.jpg  
  inflating: Controltrain/92.7FLAIR.jpg  
  inflating: Controltrain/92.8FLAIR.jpg  
  inflating: Controltrain/93.1T2.jpg  
  inflating: Controltrain/93.2T2.jpg  
  inflating: Controltrain/93.3T2.jpg  
  inflating: Controltrain/93.4T2.jpg  
  inflating: Controltrain/93.5FLAIR.jpg  
  inflating: Controltrain/93.6FLAIR.jpg  
  inflating: Controltrain/93.7FLAIR.jpg  
  inflating: Controltrain/93.8FLAIR.jpg  
  inflating: Controltrain/94.1T2.jpg  
  inflating: Controltrain/94.2T2.jpg  
  inflating: Controltrain/94.3T2.jpg  
  inflating: Controltrain/94.4T2.jpg  
  inflating: Controltrain/94.5FLAIR.jpg  
  inflating: Controltrain/94.6FLAIR.jpg  
  inflating: Controltrain/94.7FLAIR.jpg  
  inflating: Controltrain/94.8FLAIR.jpg  
  inflating: Controltrain/95.1T2.jpg  
  inflating: Controltrain/95.2T2.jpg  
  inflating: Controltrain/95.3T2.jpg  
  inflating: Controltrain/95.4T2.jpg  
  inflating: Controltrain/95.5FLAIR.jpg  
  inflating: Controltrain/95.6FLAIR.jpg  
  inflating: Controltrain/95.7FLAIR.jpg  
  inflating: Controltrain/95.8FLAIR.jpg  
  inflating: Controltrain/96.1T2.jpg  
  inflating: Controltrain/96.2T2.jpg  
  inflating: Controltrain/96.3T2.jpg  
  inflating: Controltrain/96.4T2.jpg  
  inflating: Controltrain/96.5FLAIR.jpg  
  inflating: Controltrain/96.6FLAIR.jpg  
  inflating: Controltrain/96.7FLAIR.jpg  
  inflating: Controltrain/96.8FLAIR.jpg  
  inflating: Controltrain/97.1T2.jpg  
  inflating: Controltrain/97.2T2.jpg  
  inflating: Controltrain/97.3T2.jpg  
  inflating: Controltrain/97.4T2.jpg  
  inflating: Controltrain/97.5FLAIR.jpg  
  inflating: Controltrain/97.6FLAIR.jpg  
  inflating: Controltrain/97.7FLAIR.jpg  
  inflating: Controltrain/97.8FLAIR.jpg  
  inflating: Controltrain/98.1T2.jpg  
  inflating: Controltrain/98.2T2.jpg  
  inflating: Controltrain/98.3T2.jpg  
  inflating: Controltrain/98.4T2.jpg  
  inflating: Controltrain/98.5FLAIR.jpg  
  inflating: Controltrain/98.6FLAIR.jpg  
  inflating: Controltrain/98.7FLAIR.jpg  
  inflating: Controltrain/98.8FLAIR.jpg  
  inflating: Controltrain/99.1T2.jpg  
  inflating: Controltrain/99.2T2.jpg  
  inflating: Controltrain/99.3T2.jpg  
  inflating: Controltrain/99.4T2.jpg  
  inflating: Controltrain/99.5FLAIR.jpg  
  inflating: Controltrain/99.6FLAIR.jpg  
  inflating: Controltrain/99.7FLAIR.jpg  
  inflating: Controltrain/99.8FLAIR.jpg  
Archive:  Controlval.zip
  inflating: Controlval/26.1T2.jpg   
  inflating: Controlval/26.2T2.jpg   
  inflating: Controlval/26.3T2.jpg   
  inflating: Controlval/26.4FLAIR.jpg  
  inflating: Controlval/26.5FLAIR.jpg  
  inflating: Controlval/26.6FLAIR.jpg  
  inflating: Controlval/27.1T2.jpg   
  inflating: Controlval/27.2T2.jpg   
  inflating: Controlval/27.3T2.jpg   
  inflating: Controlval/27.4FLAIR.jpg  
  inflating: Controlval/27.5FLAIR.jpg  
  inflating: Controlval/27.6FLAIR.jpg  
  inflating: Controlval/28.1T2.jpg   
  inflating: Controlval/28.2T2.jpg   
  inflating: Controlval/28.3T2.jpg   
  inflating: Controlval/28.4FLAIR.jpg  
  inflating: Controlval/28.5FLAIR.jpg  
  inflating: Controlval/28.6FLAIR.jpg  
  inflating: Controlval/29.1T2.jpg   
  inflating: Controlval/29.2T2.jpg   
  inflating: Controlval/29.3T2.jpg   
  inflating: Controlval/29.4FLAIR.jpg  
  inflating: Controlval/29.5FLAIR.jpg  
  inflating: Controlval/29.6FLAIR.jpg  
  inflating: Controlval/30.1T2.jpg   
  inflating: Controlval/30.2FLAIR.jpg  
  inflating: Controlval/30.3FLAIR.jpg  
  inflating: Controlval/30.4FLAIR.jpg  
  inflating: Controlval/30.5FLAIR.jpg  
  inflating: Controlval/31.1T2.jpg   
  inflating: Controlval/31.2FLAIR.jpg  
  inflating: Controlval/31.3FLAIR.jpg  
  inflating: Controlval/31.4FLAIR.jpg  
  inflating: Controlval/31.5FLAIR.jpg  
  inflating: Controlval/32.1T2.jpg   
  inflating: Controlval/32.2FLAIR.jpg  
  inflating: Controlval/32.3FLAIR.jpg  
  inflating: Controlval/32.4FLAIR.jpg  
  inflating: Controlval/32.5FLAIR.jpg  
  inflating: Controlval/33.1T2.jpg   
  inflating: Controlval/33.2FLAIR.jpg  
  inflating: Controlval/33.3FLAIR.jpg  
  inflating: Controlval/33.4FLAIR.jpg  
  inflating: Controlval/33.5FLAIR.jpg  
  inflating: Controlval/34.1T2.jpg   
  inflating: Controlval/34.2FLAIR.jpg  
  inflating: Controlval/34.3FLAIR.jpg  
  inflating: Controlval/34.4FLAIR.jpg  
  inflating: Controlval/34.5FLAIR.jpg  
  inflating: Controlval/35.1T2.jpg   
  inflating: Controlval/35.2FLAIR.jpg  
  inflating: Controlval/35.3FLAIR.jpg  
  inflating: Controlval/35.4FLAIR.jpg  
  inflating: Controlval/35.5FLAIR.jpg  
  inflating: Controlval/36.1T2.jpg   
  inflating: Controlval/36.2FLAIR.jpg  
  inflating: Controlval/37.1T2.jpg   
  inflating: Controlval/37.2T2.jpg   
  inflating: Controlval/37.3T2.jpg   
  inflating: Controlval/37.4FLAIR.jpg  
  inflating: Controlval/37.5FLAIR.jpg  
  inflating: Controlval/37.6FLAIR.jpg  
  inflating: Controlval/37.7FLAIR.jpg  
  inflating: Controlval/38.1T2.jpg   
  inflating: Controlval/38.2T2.jpg   
  inflating: Controlval/38.3T2.jpg   
  inflating: Controlval/38.4T2.jpg   
  inflating: Controlval/38.5FLAIR.jpg  
  inflating: Controlval/38.6FLAIR.jpg  
  inflating: Controlval/38.7FLAIR.jpg  
  inflating: Controlval/39.1T2.jpg   
  inflating: Controlval/39.2T2.jpg   
  inflating: Controlval/39.3T2.jpg   
  inflating: Controlval/39.4FLAIR.jpg  
  inflating: Controlval/39.5FLAIR.jpg  
  inflating: Controlval/39.6FLAIR.jpg  
  inflating: Controlval/39.7FLAIR.jpg  
  inflating: Controlval/40.1T2.jpg   
  inflating: Controlval/40.2T2.jpg   
  inflating: Controlval/40.3T2.jpg   
  inflating: Controlval/40.4T2.jpg   
  inflating: Controlval/40.5FLAIR.jpg  
  inflating: Controlval/40.6FLAIR.jpg  
  inflating: Controlval/40.7FLAIR.jpg  
  inflating: Controlval/41.1T2.jpg   
  inflating: Controlval/41.2T2.jpg   
  inflating: Controlval/41.3T2.jpg   
  inflating: Controlval/41.4FLAIR.jpg  
  inflating: Controlval/41.5FLAIR.jpg  
  inflating: Controlval/41.6FLAIR.jpg  
  inflating: Controlval/41.7FLAIR.jpg  
  inflating: Controlval/42.1T2.jpg   
  inflating: Controlval/42.2T2.jpg   
  inflating: Controlval/42.3T2.jpg   
  inflating: Controlval/42.4T2.jpg   
  inflating: Controlval/42.5FLAIR.jpg  
  inflating: Controlval/42.6FLAIR.jpg  
  inflating: Controlval/42.7FLAIR.jpg  
  inflating: Controlval/43.1T2.jpg   
  inflating: Controlval/43.2T2.jpg   
  inflating: Controlval/43.3T2.jpg   
  inflating: Controlval/43.4FLAIR.jpg  
  inflating: Controlval/43.5FLAIR.jpg  
  inflating: Controlval/43.6FLAIR.jpg  
  inflating: Controlval/43.7FLAIR.jpg  
  inflating: Controlval/44.1T2.jpg   
  inflating: Controlval/44.2T2.jpg   
  inflating: Controlval/44.3T2.jpg   
  inflating: Controlval/44.4T2.jpg   
  inflating: Controlval/44.5FLAIR.jpg  
  inflating: Controlval/44.6FLAIR.jpg  
  inflating: Controlval/44.7FLAIR.jpg  
  inflating: Controlval/45.1T2.jpg   
  inflating: Controlval/45.2T2.jpg   
  inflating: Controlval/45.3T2.jpg   
  inflating: Controlval/45.4FLAIR.jpg  
  inflating: Controlval/45.5FLAIR.jpg  
  inflating: Controlval/45.6FLAIR.jpg  
Archive:  TSCtrain.zip
  inflating: TSCtrain/100.10FLAIR.jpg  
  inflating: TSCtrain/100.11FLAIR.jpg  
  inflating: TSCtrain/100.12FLAIR.jpg  
  inflating: TSCtrain/100.1T2.jpg    
  inflating: TSCtrain/100.2T2.jpg    
  inflating: TSCtrain/100.3T2.jpg    
  inflating: TSCtrain/100.4T2.jpg    
  inflating: TSCtrain/100.5T2.jpg    
  inflating: TSCtrain/100.6T2.jpg    
  inflating: TSCtrain/100.7FLAIR.jpg  
  inflating: TSCtrain/100.8FLAIR.jpg  
  inflating: TSCtrain/100.9FLAIR.jpg  
  inflating: TSCtrain/101.10FLAIR.jpg  
  inflating: TSCtrain/101.1T2.jpg    
  inflating: TSCtrain/101.2T2.jpg    
  inflating: TSCtrain/101.3T2.jpg    
  inflating: TSCtrain/101.4T2.jpg    
  inflating: TSCtrain/101.5T2.jpg    
  inflating: TSCtrain/101.6FLAIR.jpg  
  inflating: TSCtrain/101.7FLAIR.jpg  
  inflating: TSCtrain/101.8FLAIR.jpg  
  inflating: TSCtrain/101.9FLAIR.jpg  
  inflating: TSCtrain/102.10FLAIR.jpg  
  inflating: TSCtrain/102.1T2.jpg    
  inflating: TSCtrain/102.2T2.jpg    
  inflating: TSCtrain/102.3T2.jpg    
  inflating: TSCtrain/102.4T2.jpg    
  inflating: TSCtrain/102.5T2.jpg    
  inflating: TSCtrain/102.6FLAIR.jpg  
  inflating: TSCtrain/102.7FLAIR.jpg  
  inflating: TSCtrain/102.8FLAIR.jpg  
  inflating: TSCtrain/102.9FLAIR.jpg  
  inflating: TSCtrain/103.1T2.jpg    
  inflating: TSCtrain/103.2T2.jpg    
  inflating: TSCtrain/103.3FLAIR.jpg  
  inflating: TSCtrain/104.10FLAIR.jpg  
  inflating: TSCtrain/104.1T2.jpg    
  inflating: TSCtrain/104.2T2.jpg    
  inflating: TSCtrain/104.3T2.jpg    
  inflating: TSCtrain/104.4T2.jpg    
  inflating: TSCtrain/104.5T2.jpg    
  inflating: TSCtrain/104.6T2.jpg    
  inflating: TSCtrain/104.7FLAIR.jpg  
  inflating: TSCtrain/104.8FLAIR.jpg  
  inflating: TSCtrain/104.9FLAIR.jpg  
  inflating: TSCtrain/105.10FLAIR.jpg  
  inflating: TSCtrain/105.11FLAIR.jpg  
  inflating: TSCtrain/105.12FLAIR.jpg  
  inflating: TSCtrain/105.1T2.jpg    
  inflating: TSCtrain/105.2T2.jpg    
  inflating: TSCtrain/105.3T2.jpg    
  inflating: TSCtrain/105.4T2.jpg    
  inflating: TSCtrain/105.5T2.jpg    
  inflating: TSCtrain/105.6T2.jpg    
  inflating: TSCtrain/105.7FLAIR.jpg  
  inflating: TSCtrain/105.8FLAIR.jpg  
  inflating: TSCtrain/105.9FLAIR.jpg  
  inflating: TSCtrain/106.10FLAIR.jpg  
  inflating: TSCtrain/106.1T2.jpg    
  inflating: TSCtrain/106.2T2.jpg    
  inflating: TSCtrain/106.3T2.jpg    
  inflating: TSCtrain/106.4T2.jpg    
  inflating: TSCtrain/106.5T2.jpg    
  inflating: TSCtrain/106.6FLAIR.jpg  
  inflating: TSCtrain/106.7FLAIR.jpg  
  inflating: TSCtrain/106.8FLAIR.jpg  
  inflating: TSCtrain/106.9FLAIR.jpg  
  inflating: TSCtrain/107.10FLAIR.jpg  
  inflating: TSCtrain/107.1T2.jpg    
  inflating: TSCtrain/107.2T2.jpg    
  inflating: TSCtrain/107.3T2.jpg    
  inflating: TSCtrain/107.4T2.jpg    
  inflating: TSCtrain/107.5T2.jpg    
  inflating: TSCtrain/107.6FLAIR.jpg  
  inflating: TSCtrain/107.7FLAIR.jpg  
  inflating: TSCtrain/107.8FLAIR.jpg  
  inflating: TSCtrain/107.9FLAIR.jpg  
  inflating: TSCtrain/108.1T2.jpg    
  inflating: TSCtrain/108.2T2.jpg    
  inflating: TSCtrain/108.3FLAIR.jpg  
  inflating: TSCtrain/108.4FLAIR.jpg  
  inflating: TSCtrain/109.10FLAIR.jpg  
  inflating: TSCtrain/109.1T2.jpg    
  inflating: TSCtrain/109.2T2.jpg    
  inflating: TSCtrain/109.3T2.jpg    
  inflating: TSCtrain/109.4T2.jpg    
  inflating: TSCtrain/109.5T2.jpg    
  inflating: TSCtrain/109.6FLAIR.jpg  
  inflating: TSCtrain/109.7FLAIR.jpg  
  inflating: TSCtrain/109.8FLAIR.jpg  
  inflating: TSCtrain/109.9FLAIR.jpg  
  inflating: TSCtrain/110.10FLAIR.jpg  
  inflating: TSCtrain/110.1T2.jpg    
  inflating: TSCtrain/110.2T2.jpg    
  inflating: TSCtrain/110.3T2.jpg    
  inflating: TSCtrain/110.4T2.jpg    
  inflating: TSCtrain/110.5T2.jpg    
  inflating: TSCtrain/110.6FLAIR.jpg  
  inflating: TSCtrain/110.7FLAIR.jpg  
  inflating: TSCtrain/110.8FLAIR.jpg  
  inflating: TSCtrain/110.9FLAIR.jpg  
  inflating: TSCtrain/111.1T2.jpg    
  inflating: TSCtrain/111.2T2.jpg    
  inflating: TSCtrain/111.3T2.jpg    
  inflating: TSCtrain/111.4T2.jpg    
  inflating: TSCtrain/111.5FLAIR.jpg  
  inflating: TSCtrain/111.6FLAIR.jpg  
  inflating: TSCtrain/111.7FLAIR.jpg  
  inflating: TSCtrain/112.1T2.jpg    
  inflating: TSCtrain/112.2FLAIR.jpg  
  inflating: TSCtrain/113.1T2.jpg    
  inflating: TSCtrain/113.2FLAIR.jpg  
  inflating: TSCtrain/114.10FLAIR.jpg  
  inflating: TSCtrain/114.11FLAIR.jpg  
  inflating: TSCtrain/114.12FLAIR.jpg  
  inflating: TSCtrain/114.1T2.jpg    
  inflating: TSCtrain/114.2T2.jpg    
  inflating: TSCtrain/114.3T2.jpg    
  inflating: TSCtrain/114.4T2.jpg    
  inflating: TSCtrain/114.5T2.jpg    
  inflating: TSCtrain/114.6T2.jpg    
  inflating: TSCtrain/114.7FLAIR.jpg  
  inflating: TSCtrain/114.8FLAIR.jpg  
  inflating: TSCtrain/114.9FLAIR.jpg  
  inflating: TSCtrain/46.1T2.jpg     
  inflating: TSCtrain/46.2T2.jpg     
  inflating: TSCtrain/46.3T2.jpg     
  inflating: TSCtrain/46.4T2.jpg     
  inflating: TSCtrain/46.5T2.jpg     
  inflating: TSCtrain/46.6FLAIR.jpg  
  inflating: TSCtrain/46.7FLAIR.jpg  
  inflating: TSCtrain/46.8FLAIR.jpg  
  inflating: TSCtrain/46.9FLAIR.jpg  
  inflating: TSCtrain/47.1T2.jpg     
  inflating: TSCtrain/47.2T2.jpg     
  inflating: TSCtrain/47.3FLAIR.jpg  
  inflating: TSCtrain/47.4FLAIR.jpg  
  inflating: TSCtrain/47.5FLAIR.jpg  
  inflating: TSCtrain/47.6FLAIR.jpg  
  inflating: TSCtrain/47.7FLAIR.jpg  
  inflating: TSCtrain/47.8FLAIR.jpg  
  inflating: TSCtrain/48.1T2.jpg     
  inflating: TSCtrain/48.2T2.jpg     
  inflating: TSCtrain/48.3T2.jpg     
  inflating: TSCtrain/48.4T2.jpg     
  inflating: TSCtrain/48.5FLAIR.jpg  
  inflating: TSCtrain/48.6FLAIR.jpg  
  inflating: TSCtrain/48.7FLAIR.jpg  
  inflating: TSCtrain/48.8FLAIR.jpg  
  inflating: TSCtrain/48.9FLAIR.jpg  
  inflating: TSCtrain/49.1T2.jpg     
  inflating: TSCtrain/49.2T2.jpg     
  inflating: TSCtrain/49.3FLAIR.jpg  
  inflating: TSCtrain/49.4FLAIR.jpg  
  inflating: TSCtrain/50.1T2.jpg     
  inflating: TSCtrain/50.2T2.jpg     
  inflating: TSCtrain/50.3T2.jpg     
  inflating: TSCtrain/50.4FLAIR.jpg  
  inflating: TSCtrain/50.5FLAIR.jpg  
  inflating: TSCtrain/50.6FLAIR.jpg  
  inflating: TSCtrain/51.10FLAIR.jpg  
  inflating: TSCtrain/51.1T2.jpg     
  inflating: TSCtrain/51.2T2.jpg     
  inflating: TSCtrain/51.3T2.jpg     
  inflating: TSCtrain/51.4T2.jpg     
  inflating: TSCtrain/51.5T2.jpg     
  inflating: TSCtrain/51.6FLAIR.jpg  
  inflating: TSCtrain/51.7FLAIR.jpg  
  inflating: TSCtrain/51.8FLAIR.jpg  
  inflating: TSCtrain/51.9FLAIR.jpg  
  inflating: TSCtrain/52.1T2.jpg     
  inflating: TSCtrain/52.2T2.jpg     
  inflating: TSCtrain/52.3T2.jpg     
  inflating: TSCtrain/52.4T2.jpg     
  inflating: TSCtrain/52.5FLAIR.jpg  
  inflating: TSCtrain/52.6FLAIR.jpg  
  inflating: TSCtrain/52.7FLAIR.jpg  
  inflating: TSCtrain/52.8FLAIR.jpg  
  inflating: TSCtrain/52.9FLAIR.jpg  
  inflating: TSCtrain/53.1T2.jpg     
  inflating: TSCtrain/53.2T2.jpg     
  inflating: TSCtrain/53.3FLAIR.jpg  
  inflating: TSCtrain/53.4FLAIR.jpg  
  inflating: TSCtrain/54.1T2.jpg     
  inflating: TSCtrain/54.2FLAIR.jpg  
  inflating: TSCtrain/55.1T2.jpg     
  inflating: TSCtrain/55.2T2.jpg     
  inflating: TSCtrain/55.3T2.jpg     
  inflating: TSCtrain/55.4T2.jpg     
  inflating: TSCtrain/55.5T2.jpg     
  inflating: TSCtrain/55.6FLAIR.jpg  
  inflating: TSCtrain/55.7FLAIR.jpg  
  inflating: TSCtrain/55.8FLAIR.jpg  
  inflating: TSCtrain/56.1T2.jpg     
  inflating: TSCtrain/56.2T2.jpg     
  inflating: TSCtrain/56.3FLAIR.jpg  
  inflating: TSCtrain/56.4FLAIR.jpg  
  inflating: TSCtrain/56.5FLAIR.jpg  
  inflating: TSCtrain/57.10FLAIR.jpg  
  inflating: TSCtrain/57.11FLAIR.jpg  
  inflating: TSCtrain/57.12FLAIR.jpg  
  inflating: TSCtrain/57.1T2.jpg     
  inflating: TSCtrain/57.2T2.jpg     
  inflating: TSCtrain/57.3T2.jpg     
  inflating: TSCtrain/57.4T2.jpg     
  inflating: TSCtrain/57.5T2.jpg     
  inflating: TSCtrain/57.6T2.jpg     
  inflating: TSCtrain/57.7FLAIR.jpg  
  inflating: TSCtrain/57.8FLAIR.jpg  
  inflating: TSCtrain/57.9FLAIR.jpg  
  inflating: TSCtrain/58.10FLAIR.jpg  
  inflating: TSCtrain/58.1T2.jpg     
  inflating: TSCtrain/58.2T2.jpg     
  inflating: TSCtrain/58.3T2.jpg     
  inflating: TSCtrain/58.4T2.jpg     
  inflating: TSCtrain/58.5T2.jpg     
  inflating: TSCtrain/58.6FLAIR.jpg  
  inflating: TSCtrain/58.7FLAIR.jpg  
  inflating: TSCtrain/58.8FLAIR.jpg  
  inflating: TSCtrain/58.9FLAIR.jpg  
  inflating: TSCtrain/59.10FLAIR.jpg  
  inflating: TSCtrain/59.1T2.jpg     
  inflating: TSCtrain/59.2T2.jpg     
  inflating: TSCtrain/59.3T2.jpg     
  inflating: TSCtrain/59.4T2.jpg     
  inflating: TSCtrain/59.5T2.jpg     
  inflating: TSCtrain/59.6FLAIR.jpg  
  inflating: TSCtrain/59.7FLAIR.jpg  
  inflating: TSCtrain/59.8FLAIR.jpg  
  inflating: TSCtrain/59.9FLAIR.jpg  
  inflating: TSCtrain/60.1T2.jpg     
  inflating: TSCtrain/60.2T2.jpg     
  inflating: TSCtrain/60.3FLAIR.jpg  
  inflating: TSCtrain/60.4FLAIR.jpg  
  inflating: TSCtrain/60.5FLAIR.jpg  
  inflating: TSCtrain/60.6FLAIR.jpg  
  inflating: TSCtrain/61.1T2.jpg     
  inflating: TSCtrain/61.2T2.jpg     
  inflating: TSCtrain/61.3FLAIR.jpg  
  inflating: TSCtrain/61.4FLAIR.jpg  
  inflating: TSCtrain/62.1T2.jpg     
  inflating: TSCtrain/62.2T2.jpg     
  inflating: TSCtrain/62.3T2.jpg     
  inflating: TSCtrain/62.4T2.jpg     
  inflating: TSCtrain/62.5T2.jpg     
  inflating: TSCtrain/62.6FLAIR.jpg  
  inflating: TSCtrain/62.7FLAIR.jpg  
  inflating: TSCtrain/62.8FLAIR.jpg  
  inflating: TSCtrain/62.9FLAIR.jpg  
  inflating: TSCtrain/63.1T2.jpg     
  inflating: TSCtrain/63.2T2.jpg     
  inflating: TSCtrain/63.3FLAIR.jpg  
  inflating: TSCtrain/63.4FLAIR.jpg  
  inflating: TSCtrain/64.10FLAIR.jpg  
  inflating: TSCtrain/64.11FLAIR.jpg  
  inflating: TSCtrain/64.1T2.jpg     
  inflating: TSCtrain/64.2T2.jpg     
  inflating: TSCtrain/64.3T2.jpg     
  inflating: TSCtrain/64.4T2.jpg     
  inflating: TSCtrain/64.5T2.jpg     
  inflating: TSCtrain/64.6T2.jpg     
  inflating: TSCtrain/64.7T2.jpg     
  inflating: TSCtrain/64.8FLAIR.jpg  
  inflating: TSCtrain/64.9FLAIR.jpg  
  inflating: TSCtrain/65.1T2.jpg     
  inflating: TSCtrain/65.2T2.jpg     
  inflating: TSCtrain/65.3T2.jpg     
  inflating: TSCtrain/65.4FLAIR.jpg  
  inflating: TSCtrain/66.1T2.jpg     
  inflating: TSCtrain/66.2T2.jpg     
  inflating: TSCtrain/66.3T2.jpg     
  inflating: TSCtrain/66.4T2.jpg     
  inflating: TSCtrain/66.5T2.jpg     
  inflating: TSCtrain/66.6FLAIR.jpg  
  inflating: TSCtrain/66.7FLAIR.jpg  
  inflating: TSCtrain/66.8FLAIR.jpg  
  inflating: TSCtrain/66.9FLAIR.jpg  
  inflating: TSCtrain/67.1T2.jpg     
  inflating: TSCtrain/67.2T2.jpg     
  inflating: TSCtrain/67.3T2.jpg     
  inflating: TSCtrain/67.4T2.jpg     
  inflating: TSCtrain/67.5T2.jpg     
  inflating: TSCtrain/67.6FLAIR.jpg  
  inflating: TSCtrain/67.7FLAIR.jpg  
  inflating: TSCtrain/67.8FLAIR.jpg  
  inflating: TSCtrain/67.9FLAIR.jpg  
  inflating: TSCtrain/68.10FLAIR.jpg  
  inflating: TSCtrain/68.11FLAIR.jpg  
  inflating: TSCtrain/68.12FLAIR.jpg  
  inflating: TSCtrain/68.1T2.jpg     
  inflating: TSCtrain/68.2T2.jpg     
  inflating: TSCtrain/68.3T2.jpg     
  inflating: TSCtrain/68.4T2.jpg     
  inflating: TSCtrain/68.5T2.jpg     
  inflating: TSCtrain/68.6T2.jpg     
  inflating: TSCtrain/68.7T2.jpg     
  inflating: TSCtrain/68.8FLAIR.jpg  
  inflating: TSCtrain/68.9FLAIR.jpg  
  inflating: TSCtrain/69.1T2.jpg     
  inflating: TSCtrain/69.2T2.jpg     
  inflating: TSCtrain/69.3T2.jpg     
  inflating: TSCtrain/69.4FLAIR.jpg  
  inflating: TSCtrain/69.5FLAIR.jpg  
  inflating: TSCtrain/69.6FLAIR.jpg  
  inflating: TSCtrain/69.7FLAIR.jpg  
  inflating: TSCtrain/70.1T2.jpg     
  inflating: TSCtrain/70.2T2.jpg     
  inflating: TSCtrain/70.3FLAIR.jpg  
  inflating: TSCtrain/70.4FLAIR.jpg  
  inflating: TSCtrain/70.5FLAIR.jpg  
  inflating: TSCtrain/71.1T2.jpg     
  inflating: TSCtrain/71.2T2.jpg     
  inflating: TSCtrain/71.3FLAIR.jpg  
  inflating: TSCtrain/72.1T2.jpg     
  inflating: TSCtrain/72.2T2.jpg     
  inflating: TSCtrain/72.3FLAIR.jpg  
  inflating: TSCtrain/72.4FLAIR.jpg  
  inflating: TSCtrain/73.10FLAIR.jpg  
  inflating: TSCtrain/73.11FLAIR.jpg  
  inflating: TSCtrain/73.12FLAIR.jpg  
  inflating: TSCtrain/73.13FLAIR.jpg  
  inflating: TSCtrain/73.14FLAIR.jpg  
  inflating: TSCtrain/73.15FLAIR.jpg  
  inflating: TSCtrain/73.16FLAIR.jpg  
  inflating: TSCtrain/73.1T2.jpg     
  inflating: TSCtrain/73.2T2.jpg     
  inflating: TSCtrain/73.3T2.jpg     
  inflating: TSCtrain/73.4T2.jpg     
  inflating: TSCtrain/73.5T2.jpg     
  inflating: TSCtrain/73.6T2.jpg     
  inflating: TSCtrain/73.7T2.jpg     
  inflating: TSCtrain/73.8T2.jpg     
  inflating: TSCtrain/73.9FLAIR.jpg  
  inflating: TSCtrain/74.1T2.jpg     
  inflating: TSCtrain/74.2T2.jpg     
  inflating: TSCtrain/74.3T2.jpg     
  inflating: TSCtrain/74.4FLAIR.jpg  
  inflating: TSCtrain/74.5FLAIR.jpg  
  inflating: TSCtrain/74.6FLAIR.jpg  
  inflating: TSCtrain/75.1T2.jpg     
  inflating: TSCtrain/75.2T2.jpg     
  inflating: TSCtrain/75.3FLAIR.jpg  
  inflating: TSCtrain/75.4FLAIR.jpg  
  inflating: TSCtrain/75.5FLAIR.jpg  
  inflating: TSCtrain/75.6FLAIR.jpg  
  inflating: TSCtrain/76.10FLAIR.jpg  
  inflating: TSCtrain/76.11FLAIR.jpg  
  inflating: TSCtrain/76.12FLAIR.jpg  
  inflating: TSCtrain/76.1T2.jpg     
  inflating: TSCtrain/76.2T2.jpg     
  inflating: TSCtrain/76.3T2.jpg     
  inflating: TSCtrain/76.4T2.jpg     
  inflating: TSCtrain/76.5T2.jpg     
  inflating: TSCtrain/76.6T2.jpg     
  inflating: TSCtrain/76.7FLAIR.jpg  
  inflating: TSCtrain/76.8FLAIR.jpg  
  inflating: TSCtrain/76.9FLAIR.jpg  
  inflating: TSCtrain/77.10FLAIR.jpg  
  inflating: TSCtrain/77.1T2.jpg     
  inflating: TSCtrain/77.2T2.jpg     
  inflating: TSCtrain/77.3T2.jpg     
  inflating: TSCtrain/77.4T2.jpg     
  inflating: TSCtrain/77.5T2.jpg     
  inflating: TSCtrain/77.6FLAIR.jpg  
  inflating: TSCtrain/77.7FLAIR.jpg  
  inflating: TSCtrain/77.8FLAIR.jpg  
  inflating: TSCtrain/77.9FLAIR.jpg  
  inflating: TSCtrain/78.1T2.jpg     
  inflating: TSCtrain/78.2T2.jpg     
  inflating: TSCtrain/78.3T2.jpg     
  inflating: TSCtrain/78.4FLAIR.jpg  
  inflating: TSCtrain/78.5FLAIR.jpg  
  inflating: TSCtrain/78.6FLAIR.jpg  
  inflating: TSCtrain/79.1T2.jpg     
  inflating: TSCtrain/79.2T2.jpg     
  inflating: TSCtrain/79.3T2.jpg     
  inflating: TSCtrain/79.4FLAIR.jpg  
  inflating: TSCtrain/79.5FLAIR.jpg  
  inflating: TSCtrain/79.6FLAIR.jpg  
  inflating: TSCtrain/79.7FLAIR.jpg  
  inflating: TSCtrain/80.1T2.jpg     
  inflating: TSCtrain/80.2T2.jpg     
  inflating: TSCtrain/80.3T2.jpg     
  inflating: TSCtrain/80.4T2.jpg     
  inflating: TSCtrain/80.5T2.jpg     
  inflating: TSCtrain/80.6FLAIR.jpg  
  inflating: TSCtrain/80.7FLAIR.jpg  
  inflating: TSCtrain/80.8FLAIR.jpg  
  inflating: TSCtrain/80.9FLAIR.jpg  
  inflating: TSCtrain/81.10FLAIR.jpg  
  inflating: TSCtrain/81.1T2.jpg     
  inflating: TSCtrain/81.2T2.jpg     
  inflating: TSCtrain/81.3T2.jpg     
  inflating: TSCtrain/81.4T2.jpg     
  inflating: TSCtrain/81.5T2.jpg     
  inflating: TSCtrain/81.6FLAIR.jpg  
  inflating: TSCtrain/81.7FLAIR.jpg  
  inflating: TSCtrain/81.8FLAIR.jpg  
  inflating: TSCtrain/81.9FLAIR.jpg  
  inflating: TSCtrain/82.1T2.jpg     
  inflating: TSCtrain/82.2T2.jpg     
  inflating: TSCtrain/82.3FLAIR.jpg  
  inflating: TSCtrain/82.4FLAIR.jpg  
  inflating: TSCtrain/83.10FLAIR.jpg  
  inflating: TSCtrain/83.1T2.jpg     
  inflating: TSCtrain/83.2T2.jpg     
  inflating: TSCtrain/83.3T2.jpg     
  inflating: TSCtrain/83.4T2.jpg     
  inflating: TSCtrain/83.5T2.jpg     
  inflating: TSCtrain/83.6FLAIR.jpg  
  inflating: TSCtrain/83.7FLAIR.jpg  
  inflating: TSCtrain/83.8FLAIR.jpg  
  inflating: TSCtrain/83.9FLAIR.jpg  
  inflating: TSCtrain/84.1T2.jpg     
  inflating: TSCtrain/84.2T2.jpg     
  inflating: TSCtrain/84.3FLAIR.jpg  
  inflating: TSCtrain/84.4FLAIR.jpg  
  inflating: TSCtrain/85.10FLAIR.jpg  
  inflating: TSCtrain/85.11FLAIR.jpg  
  inflating: TSCtrain/85.12FLAIR.jpg  
  inflating: TSCtrain/85.1T2.jpg     
  inflating: TSCtrain/85.2T2.jpg     
  inflating: TSCtrain/85.3T2.jpg     
  inflating: TSCtrain/85.4T2.jpg     
  inflating: TSCtrain/85.5T2.jpg     
  inflating: TSCtrain/85.6T2.jpg     
  inflating: TSCtrain/85.7T2.jpg     
  inflating: TSCtrain/85.8FLAIR.jpg  
  inflating: TSCtrain/85.9FLAIR.jpg  
  inflating: TSCtrain/86.1T2.jpg     
  inflating: TSCtrain/86.2T2.jpg     
  inflating: TSCtrain/86.3FLAIR.jpg  
  inflating: TSCtrain/86.4FLAIR.jpg  
  inflating: TSCtrain/87.10FLAIR.jpg  
  inflating: TSCtrain/87.11FLAIR.jpg  
  inflating: TSCtrain/87.12FLAIR.jpg  
  inflating: TSCtrain/87.13FLAIR.jpg  
  inflating: TSCtrain/87.14FLAIR.jpg  
  inflating: TSCtrain/87.1T2.jpg     
  inflating: TSCtrain/87.2T2.jpg     
  inflating: TSCtrain/87.3T2.jpg     
  inflating: TSCtrain/87.4T2.jpg     
  inflating: TSCtrain/87.5T2.jpg     
  inflating: TSCtrain/87.6T2.jpg     
  inflating: TSCtrain/87.7T2.jpg     
  inflating: TSCtrain/87.8T2.jpg     
  inflating: TSCtrain/87.9FLAIR.jpg  
  inflating: TSCtrain/88.1T2.jpg     
  inflating: TSCtrain/88.2T2.jpg     
  inflating: TSCtrain/88.3T2.jpg     
  inflating: TSCtrain/88.4T2.jpg     
  inflating: TSCtrain/88.5T2.jpg     
  inflating: TSCtrain/88.6T2.jpg     
  inflating: TSCtrain/88.7FLAIR.jpg  
  inflating: TSCtrain/88.8FLAIR.jpg  
  inflating: TSCtrain/88.9FLAIR.jpg  
  inflating: TSCtrain/89.1T2.jpg     
  inflating: TSCtrain/89.2T2.jpg     
  inflating: TSCtrain/89.3T2.jpg     
  inflating: TSCtrain/89.4FLAIR.jpg  
  inflating: TSCtrain/89.5FLAIR.jpg  
  inflating: TSCtrain/89.6FLAIR.jpg  
  inflating: TSCtrain/90.1T2.jpg     
  inflating: TSCtrain/90.2T2.jpg     
  inflating: TSCtrain/90.3FLAIR.jpg  
  inflating: TSCtrain/90.4FLAIR.jpg  
  inflating: TSCtrain/90.5FLAIR.jpg  
  inflating: TSCtrain/91.10T2.jpg    
  inflating: TSCtrain/91.11FLAIR.jpg  
  inflating: TSCtrain/91.12FLAIR.jpg  
  inflating: TSCtrain/91.13FLAIR.jpg  
  inflating: TSCtrain/91.14FLAIR.jpg  
  inflating: TSCtrain/91.15FLAIR.jpg  
  inflating: TSCtrain/91.16FLAIR.jpg  
  inflating: TSCtrain/91.17FLAIR.jpg  
  inflating: TSCtrain/91.1T2.jpg     
  inflating: TSCtrain/91.2T2.jpg     
  inflating: TSCtrain/91.3T2.jpg     
  inflating: TSCtrain/91.4T2.jpg     
  inflating: TSCtrain/91.5T2.jpg     
  inflating: TSCtrain/91.6T2.jpg     
  inflating: TSCtrain/91.7T2.jpg     
  inflating: TSCtrain/91.8T2.jpg     
  inflating: TSCtrain/91.9T2.jpg     
  inflating: TSCtrain/92.10FLAIR.jpg  
  inflating: TSCtrain/92.1T2.jpg     
  inflating: TSCtrain/92.2T2.jpg     
  inflating: TSCtrain/92.3T2.jpg     
  inflating: TSCtrain/92.4T2.jpg     
  inflating: TSCtrain/92.5T2.jpg     
  inflating: TSCtrain/92.6FLAIR.jpg  
  inflating: TSCtrain/92.7FLAIR.jpg  
  inflating: TSCtrain/92.8FLAIR.jpg  
  inflating: TSCtrain/92.9FLAIR.jpg  
  inflating: TSCtrain/93.1T2.jpg     
  inflating: TSCtrain/93.2T2.jpg     
  inflating: TSCtrain/93.3T2.jpg     
  inflating: TSCtrain/93.4FLAIR.jpg  
  inflating: TSCtrain/93.5FLAIR.jpg  
  inflating: TSCtrain/93.6FLAIR.jpg  
  inflating: TSCtrain/94.10FLAIR.jpg  
  inflating: TSCtrain/94.11FLAIR.jpg  
  inflating: TSCtrain/94.12FLAIR.jpg  
  inflating: TSCtrain/94.13FLAIR.jpg  
  inflating: TSCtrain/94.14FLAIR.jpg  
  inflating: TSCtrain/94.1T2.jpg     
  inflating: TSCtrain/94.2T2.jpg     
  inflating: TSCtrain/94.3T2.jpg     
  inflating: TSCtrain/94.4T2.jpg     
  inflating: TSCtrain/94.5T2.jpg     
  inflating: TSCtrain/94.6T2.jpg     
  inflating: TSCtrain/94.7T2.jpg     
  inflating: TSCtrain/94.8T2.jpg     
  inflating: TSCtrain/94.9FLAIR.jpg  
  inflating: TSCtrain/95.10FLAIR.jpg  
  inflating: TSCtrain/95.11FLAIR.jpg  
  inflating: TSCtrain/95.12FLAIR.jpg  
  inflating: TSCtrain/95.13FLAIR.jpg  
  inflating: TSCtrain/95.14FLAIR.jpg  
  inflating: TSCtrain/95.1T2.jpg     
  inflating: TSCtrain/95.2T2.jpg     
  inflating: TSCtrain/95.3T2.jpg     
  inflating: TSCtrain/95.4T2.jpg     
  inflating: TSCtrain/95.5T2.jpg     
  inflating: TSCtrain/95.6T2.jpg     
  inflating: TSCtrain/95.7T2.jpg     
  inflating: TSCtrain/95.8FLAIR.jpg  
  inflating: TSCtrain/95.9FLAIR.jpg  
  inflating: TSCtrain/96.10FLAIR.jpg  
  inflating: TSCtrain/96.1T2.jpg     
  inflating: TSCtrain/96.2T2.jpg     
  inflating: TSCtrain/96.3T2.jpg     
  inflating: TSCtrain/96.4T2.jpg     
  inflating: TSCtrain/96.5T2.jpg     
  inflating: TSCtrain/96.6FLAIR.jpg  
  inflating: TSCtrain/96.7FLAIR.jpg  
  inflating: TSCtrain/96.8FLAIR.jpg  
  inflating: TSCtrain/96.9FLAIR.jpg  
  inflating: TSCtrain/97.10FLAIR.jpg  
  inflating: TSCtrain/97.1T2.jpg     
  inflating: TSCtrain/97.2T2.jpg     
  inflating: TSCtrain/97.3T2.jpg     
  inflating: TSCtrain/97.4T2.jpg     
  inflating: TSCtrain/97.5T2.jpg     
  inflating: TSCtrain/97.6FLAIR.jpg  
  inflating: TSCtrain/97.7FLAIR.jpg  
  inflating: TSCtrain/97.8FLAIR.jpg  
  inflating: TSCtrain/97.9FLAIR.jpg  
  inflating: TSCtrain/98.10FLAIR.jpg  
  inflating: TSCtrain/98.11FLAIR.jpg  
  inflating: TSCtrain/98.12FLAIR.jpg  
  inflating: TSCtrain/98.1T2.jpg     
  inflating: TSCtrain/98.2T2.jpg     
  inflating: TSCtrain/98.3T2.jpg     
  inflating: TSCtrain/98.4T2.jpg     
  inflating: TSCtrain/98.5T2.jpg     
  inflating: TSCtrain/98.6T2.jpg     
  inflating: TSCtrain/98.7T2.jpg     
  inflating: TSCtrain/98.8FLAIR.jpg  
  inflating: TSCtrain/98.9FLAIR.jpg  
  inflating: TSCtrain/99.1T2.jpg     
  inflating: TSCtrain/99.2T2.jpg     
  inflating: TSCtrain/99.3T2.jpg     
  inflating: TSCtrain/99.4FLAIR.jpg  
  inflating: TSCtrain/99.5FLAIR.jpg  
  inflating: TSCtrain/99.6FLAIR.jpg  
Archive:  TSCval.zip
  inflating: TSCval/26.1T2.jpg       
  inflating: TSCval/26.2T2.jpg       
  inflating: TSCval/26.3T2.jpg       
  inflating: TSCval/26.4T2.jpg       
  inflating: TSCval/26.5T2.jpg       
  inflating: TSCval/26.6FLAIR.jpg    
  inflating: TSCval/26.7FLAIR.jpg    
  inflating: TSCval/26.8FLAIR.jpg    
  inflating: TSCval/26.9FLAIR.jpg    
  inflating: TSCval/27.1T2.jpg       
  inflating: TSCval/27.2FLAIR.jpg    
  inflating: TSCval/27.3FLAIR.jpg    
  inflating: TSCval/28.1T2.jpg       
  inflating: TSCval/28.2FLAIR.jpg    
  inflating: TSCval/28.3FLAIR.jpg    
  inflating: TSCval/29.1T2.jpg       
  inflating: TSCval/29.2T2.jpg       
  inflating: TSCval/29.3T2.jpg       
  inflating: TSCval/29.4T2.jpg       
  inflating: TSCval/29.5FLAIR.jpg    
  inflating: TSCval/29.6FLAIR.jpg    
  inflating: TSCval/29.7FLAIR.jpg    
  inflating: TSCval/29.8FLAIR.jpg    
  inflating: TSCval/30.1T2.jpg       
  inflating: TSCval/30.2T2.jpg       
  inflating: TSCval/30.3T2.jpg       
  inflating: TSCval/30.4T2.jpg       
  inflating: TSCval/30.5FLAIR.jpg    
  inflating: TSCval/30.6FLAIR.jpg    
  inflating: TSCval/30.7FLAIR.jpg    
  inflating: TSCval/30.8FLAIR.jpg    
  inflating: TSCval/31.1T2.jpg       
  inflating: TSCval/31.2FLAIR.jpg    
  inflating: TSCval/32.1T2.jpg       
  inflating: TSCval/32.2T2.jpg       
  inflating: TSCval/32.3T2.jpg       
  inflating: TSCval/32.4T2.jpg       
  inflating: TSCval/32.5T2.jpg       
  inflating: TSCval/32.6FLAIR.jpg    
  inflating: TSCval/32.7FLAIR.jpg    
  inflating: TSCval/32.8FLAIR.jpg    
  inflating: TSCval/32.9FLAIR.jpg    
  inflating: TSCval/33.1T2.jpg       
  inflating: TSCval/33.2T2.jpg       
  inflating: TSCval/33.3FLAIR.jpg    
  inflating: TSCval/33.4FLAIR.jpg    
  inflating: TSCval/33.5FLAIR.jpg    
  inflating: TSCval/33.6FLAIR.jpg    
  inflating: TSCval/34.1T2.jpg       
  inflating: TSCval/34.2T2.jpg       
  inflating: TSCval/34.3T2.jpg       
  inflating: TSCval/34.4T2.jpg       
  inflating: TSCval/34.5FLAIR.jpg    
  inflating: TSCval/34.6FLAIR.jpg    
  inflating: TSCval/34.7FLAIR.jpg    
  inflating: TSCval/34.8FLAIR.jpg    
  inflating: TSCval/35.1T2.jpg       
  inflating: TSCval/35.2T2.jpg       
  inflating: TSCval/35.3FLAIR.jpg    
  inflating: TSCval/35.4FLAIR.jpg    
  inflating: TSCval/36.10FLAIR.jpg   
  inflating: TSCval/36.1T2.jpg       
  inflating: TSCval/36.2T2.jpg       
  inflating: TSCval/36.3T2.jpg       
  inflating: TSCval/36.4T2.jpg       
  inflating: TSCval/36.5FLAIR.jpg    
  inflating: TSCval/36.6FLAIR.jpg    
  inflating: TSCval/36.7FLAIR.jpg    
  inflating: TSCval/36.8FLAIR.jpg    
  inflating: TSCval/36.9FLAIR.jpg    
  inflating: TSCval/37.1T2.jpg       
  inflating: TSCval/37.2FLAIR.jpg    
  inflating: TSCval/38.10FLAIR.jpg   
  inflating: TSCval/38.1T2.jpg       
  inflating: TSCval/38.2T2.jpg       
  inflating: TSCval/38.3T2.jpg       
  inflating: TSCval/38.4T2.jpg       
  inflating: TSCval/38.5FLAIR.jpg    
  inflating: TSCval/38.6FLAIR.jpg    
  inflating: TSCval/38.7FLAIR.jpg    
  inflating: TSCval/38.8FLAIR.jpg    
  inflating: TSCval/38.9FLAIR.jpg    
  inflating: TSCval/39.10FLAIR.jpg   
  inflating: TSCval/39.11FLAIR.jpg   
  inflating: TSCval/39.12FLAIR.jpg   
  inflating: TSCval/39.13FLAIR.jpg   
  inflating: TSCval/39.14FLAIR.jpg   
  inflating: TSCval/39.1T2.jpg       
  inflating: TSCval/39.2T2.jpg       
  inflating: TSCval/39.3T2.jpg       
  inflating: TSCval/39.4T2.jpg       
  inflating: TSCval/39.5T2.jpg       
  inflating: TSCval/39.6T2.jpg       
  inflating: TSCval/39.7T2.jpg       
  inflating: TSCval/39.8T2.jpg       
  inflating: TSCval/39.9FLAIR.jpg    
  inflating: TSCval/40.1T2.jpg       
  inflating: TSCval/40.2T2.jpg       
  inflating: TSCval/40.3T2.jpg       
  inflating: TSCval/40.4FLAIR.jpg    
  inflating: TSCval/40.5FLAIR.jpg    
  inflating: TSCval/41.1T2.jpg       
  inflating: TSCval/41.2T2.jpg       
  inflating: TSCval/41.3T2.jpg       
  inflating: TSCval/41.4T2.jpg       
  inflating: TSCval/41.5FLAIR.jpg    
  inflating: TSCval/41.6FLAIR.jpg    
  inflating: TSCval/41.7FLAIR.jpg    
  inflating: TSCval/41.8FLAIR.jpg    
  inflating: TSCval/42.1T2.jpg       
  inflating: TSCval/42.2T2.jpg       
  inflating: TSCval/42.3FLAIR.jpg    
  inflating: TSCval/42.4FLAIR.jpg    
  inflating: TSCval/42.5FLAIR.jpg    
  inflating: TSCval/43.1T2.jpg       
  inflating: TSCval/43.2FLAIR.jpg    
  inflating: TSCval/44.1T2.jpg       
  inflating: TSCval/44.2T2.jpg       
  inflating: TSCval/44.3FLAIR.jpg    
  inflating: TSCval/44.4FLAIR.jpg    
  inflating: TSCval/44.5FLAIR.jpg    
  inflating: TSCval/45.1T2.jpg       
  inflating: TSCval/45.2T2.jpg       
  inflating: TSCval/45.3T2.jpg       
  inflating: TSCval/45.4T2.jpg       
  inflating: TSCval/45.5FLAIR.jpg    
  inflating: TSCval/45.6FLAIR.jpg    
  inflating: TSCval/45.7FLAIR.jpg    
  inflating: TSCval/45.8FLAIR.jpg    
  inflating: TSCval/45.9FLAIR.jpg    
In [0]:
# Remove the zipped files
!rm Controltrain.zip  
!rm Controlval.zip   
!rm TSCtrain.zip  
!rm TSCval.zip

Path to original images folder

In [0]:
# Path to the folder with the original images
pathtoimagesControltrain = './Controltrain/'
pathtoimagesControlval = './Controlval/'

pathtoimagesTSCtrain = './TSCtrain/'
pathtoimagesTSCval = './TSCval/'

The reason for generating augmented images and saving them in a folder (rather than applying data augmentation directly to the model) is twofold:

1.We preferred to visualize the augmented images to make sure that they were images that were reasonably expected to happen naturally (not too rotated, not too zoomed, etc.).

2.We wanted to use several models and compare them. For doing that, we wanted them to have access to the same set of images (rather than augmenting images individually per model).

Create path to augmented images folder

In [0]:
# Create folders to save the augmented images
!mkdir augmentedControltrain augmentedTSCtrain
In [0]:
# Create here the directory to save the augmented images
pathtoaugmentedimagesControltrain = './augmentedControltrain/'

pathtoaugmentedimagesTSCtrain = './augmentedTSCtrain/'

Read in the images and augment them for Controltrain

In [0]:
# Define the image size
image_size = (224, 224)

# Read in the training images
Controltrain_images = []
Controltrain_dir = pathtoimagesControltrain
Controltrain_files = os.listdir(Controltrain_dir)
# For each image
for f in Controltrain_files:
  # Open the image
  img = Image.open(Controltrain_dir + f)
  # Resize the image so that it has a size 224x224
  img = img.resize(image_size)
  # Transform into a numpy array
  img_arr = np.array(img)
  # Transform from 224x224 to 224x224x3
  if img_arr.shape == image_size:
        img_arr = np.expand_dims(img_arr, 3)
        img_arr = gray2rgb(img_arr[:, :, 0])
  # Add the image to the array of images      
  Controltrain_images.append(img_arr)

# After having transformed all images, transform the list into a numpy array  
Controltrain_MRIs = np.array(Controltrain_images)

# Transform image files because GPU expects values to be 32-bit floats
Controltrain_MRIs = Controltrain_MRIs.astype(np.float32)

# Rescale the pixel values to be between 0 and 1
Controltrain_MRIs /= 255.
In [9]:
# Example of an image to make sure they were converted right
plt.imshow(Controltrain_MRIs[0])
plt.grid(b=None)
plt.xticks([])
plt.yticks([])
plt.show()
In [0]:
# Define the characteristics for data augmentation
datagen = ImageDataGenerator(
        rotation_range=30,
        width_shift_range=0.1,
        height_shift_range=0.1,
        shear_range=0.2,
        zoom_range=0.25,
        horizontal_flip=True,
        fill_mode='nearest')

# Path to images
Controltrain_files = os.listdir(pathtoimagesControltrain)

# Augment the images
for f in Controltrain_files:
    img = load_img(Controltrain_dir + f)
    x = img_to_array(img)
    x = x.reshape((1,) + x.shape)

    # Save the augmented images into a directory of augmented images
    i = 0
    for batch in datagen.flow(x, batch_size=1,
                              save_to_dir=pathtoaugmentedimagesControltrain, 
                              save_prefix='augmented'+str(np.random.randint(low=1, high=1e8))+str(np.random.randint(low=1e4, high=1e6))+str(np.random.randint(low=1e4, high=1e6))+str(np.random.randint(low=1e4, high=1e6))+
                              str(np.random.randint(low=1e5, high=1e8))+str(np.random.randint(low=1e2, high=1e7))+str(np.random.randint(low=1e3, high=1e5))+str(np.random.randint(low=1e2, high=1e8)), 
                              save_format='jpg'):
        i += 1
        if i > 3:
            break  # Break the cycle after having created 4 augmented images per image, otherwise the generator would loop indefinitely

Read in the images for Controlval

In [0]:
# Define the image size
image_size = (224, 224)

# Read in the validation images
Controlval_images = []
Controlval_dir = pathtoimagesControlval
Controlval_files = os.listdir(Controlval_dir)
# For each image
for f in Controlval_files:
  # Open the image
  img = Image.open(Controlval_dir + f)
  # Resize the image so that it has a size 224x224
  img = img.resize(image_size)
  # Transform into a numpy array
  img_arr = np.array(img)
  # Transform from 224x224 to 224x224x3
  if img_arr.shape == image_size:
    img_arr = np.expand_dims(img_arr, 3)
    img_arr = gray2rgb(img_arr[:, :, 0])
  # Add the image to the array of images      
  Controlval_images.append(img_arr)

# After having transformed all images, transform the list into a numpy array  
Controlval_MRIs = np.array(Controlval_images)

# Transform image files because GPU expects values to be 32-bit floats
Controlval_MRIs = Controlval_MRIs.astype(np.float32)

# Rescale the pixel values to be between 0 and 1
Controlval_MRIs /= 255.
In [12]:
# Example of an image to make sure they were converted right
plt.imshow(Controlval_MRIs[0])
plt.grid(b=None)
plt.xticks([])
plt.yticks([])
plt.show()

Read in the images and augment them for TSCtrain

In [0]:
# Define the image size
image_size = (224, 224)

# Read in the training images
TSCtrain_images = []
TSCtrain_dir = pathtoimagesTSCtrain
TSCtrain_files = os.listdir(TSCtrain_dir)
# For each image
for f in TSCtrain_files:
  # Open the image
  img = Image.open(TSCtrain_dir + f)
  # Resize the image so that it has a size 224x224
  img = img.resize(image_size)
  # Transform into a numpy array
  img_arr = np.array(img)
  # Transform from 224x224 to 224x224x3
  if img_arr.shape == image_size:
        img_arr = np.expand_dims(img_arr, 3)
        img_arr = gray2rgb(img_arr[:, :, 0])
  # Add the image to the array of images      
  TSCtrain_images.append(img_arr)

# After having transformed all images, transform the list into a numpy array  
TSCtrain_MRIs = np.array(TSCtrain_images)

# Transform image files because GPU expects values to be 32-bit floats
TSCtrain_MRIs = TSCtrain_MRIs.astype(np.float32)

# Rescale the pixel values to be between 0 and 1
TSCtrain_MRIs /= 255.
In [14]:
# Example of an image to make sure they were converted right
plt.imshow(TSCtrain_MRIs[0])
plt.grid(b=None)
plt.xticks([])
plt.yticks([])
plt.show()
In [0]:
# Define the characteristics for data augmentation
datagen = ImageDataGenerator(
        rotation_range=30,
        width_shift_range=0.1,
        height_shift_range=0.1,
        shear_range=0.2,
        zoom_range=0.25,
        horizontal_flip=True,
        fill_mode='nearest')

# Path to images
TSCtrain_files = os.listdir(pathtoimagesTSCtrain)

# Augment the images
for f in TSCtrain_files:
    img = load_img(TSCtrain_dir + f)
    x = img_to_array(img)
    x = x.reshape((1,) + x.shape)

    # Save the augmented images into a directory of augmented images
    i = 0
    for batch in datagen.flow(x, batch_size=1,
                              save_to_dir=pathtoaugmentedimagesTSCtrain, save_prefix='augmented'+str(np.random.randint(low=1e5, high=1e8))+str(np.random.randint(low=1e3, high=1e5))+str(np.random.randint(low=1e2, high=1e7))+
                              str(np.random.randint(low=1e4, high=1e6))+str(np.random.randint(low=1e2, high=1e8))+str(np.random.randint(low=1e4, high=1e6))+str(np.random.randint(low=1e4, high=1e6))
                              , save_format='jpg'):
        i += 1
        if i > 3:
            break  # Break the cycle after having created 4 augmented images per image, otherwise the generator would loop indefinitely

Read in the images for TSCval

In [0]:
# Define the image size
image_size = (224, 224)

# Read in the validation images
TSCval_images = []
TSCval_dir = pathtoimagesTSCval
TSCval_files = os.listdir(TSCval_dir)
# For each image
for f in TSCval_files:
  # Open the image
  img = Image.open(TSCval_dir + f)
  # Resize the image so that it has a size 224x224
  img = img.resize(image_size)
  # Transform into a numpy array
  img_arr = np.array(img)
  # Transform from 224x224 to 224x224x3
  if img_arr.shape == image_size:
        img_arr = np.expand_dims(img_arr, 3)
        img_arr = gray2rgb(img_arr[:, :, 0])
  # Add the image to the array of images      
  TSCval_images.append(img_arr)

# After having transformed all images, transform the list into a numpy array  
TSCval_MRIs = np.array(TSCval_images)

# Transform image files because GPU expects values to be 32-bit floats
TSCval_MRIs = TSCval_MRIs.astype(np.float32)

# Rescale the pixel values to be between 0 and 1
TSCval_MRIs /= 255.
In [17]:
# Example of an image to make sure they were converted right
plt.imshow(TSCval_MRIs[0])
plt.grid(b=None)
plt.xticks([])
plt.yticks([])
plt.show()

SECOND PART: IMPORTATION OF FINAL DATA

Path to the final images

The final images are the ones used for training and validating the models.

For the training sets they consist of the original training images and their corresponding augmented images.

For the validation set they consist of the original validation images.

In [0]:
# Create directories for the final images
!mkdir FinalControltrain FinalControlval FinalTSCtrain FinalTSCval 
In [0]:
# Copy all original images and augmented images to the final folders
!cp ./Controltrain/* ./FinalControltrain/
!cp ./augmentedControltrain/* ./FinalControltrain/
!cp ./Controlval/* ./FinalControlval/

!cp ./TSCtrain/* ./FinalTSCtrain/
!cp ./augmentedTSCtrain/* ./FinalTSCtrain/
!cp ./TSCval/* ./FinalTSCval/
In [0]:
## Path to final images
pathtofinalControltrain = './FinalControltrain/'
pathtofinalControlval = './FinalControlval/'

pathtofinalTSCtrain = './FinalTSCtrain/'
pathtofinalTSCval = './FinalTSCval/'

Import images and labels for the train set

In [0]:
## CONTROLS

# Define the image size
image_size = (224, 224)

# Read in the training images for controls
Controltrain_images = []
Controltrain_dir = pathtofinalControltrain
Controltrain_files = os.listdir(Controltrain_dir)
# For each image
for f in Controltrain_files:
  # Open the image
  img = Image.open(Controltrain_dir + f)
  # Resize the image so that it has a size 224x224
  img = img.resize(image_size)
  # Transform into a numpy array
  img_arr = np.array(img)
  # Transform from 224x224 to 224x224x3
  if img_arr.shape == image_size:
        img_arr = np.expand_dims(img_arr, 3)
        img_arr = gray2rgb(img_arr[:, :, 0])
  # Add the image to the array of images      
  Controltrain_images.append(img_arr)

# After having transformed all images, transform the list into a numpy array  
Controltrain_X = np.array(Controltrain_images)

# Create an array of labels (0 for controls)
Controltrain_y = np.array([[0]*Controltrain_X.shape[0]]).T



## TSC

# Read in the training images for TSC
TSCtrain_images = []
TSCtrain_dir = pathtofinalTSCtrain
TSCtrain_files = os.listdir(TSCtrain_dir)
# For each image
for f in TSCtrain_files:
  # Open the image
  img = Image.open(TSCtrain_dir + f)
  # Resize the image so that it has a size 224x224
  img = img.resize(image_size)
  # Transform into a numpy array
  img_arr = np.array(img)
  # Transform from 224x224 to 224x224x3
  if img_arr.shape == image_size:
        img_arr = np.expand_dims(img_arr, 3)
        img_arr = gray2rgb(img_arr[:, :, 0])
  # Add the image to the array of images      
  TSCtrain_images.append(img_arr)

# After having transformed all images, transform the list into a numpy array  
TSCtrain_X = np.array(TSCtrain_images)

# Create an array of labels (1 for TSC)
TSCtrain_y = np.array([[1]*TSCtrain_X.shape[0]]).T


## MERGE CONTROLS AND TSC

# Train merge files
train_X = np.concatenate([Controltrain_X, TSCtrain_X])
train_y = np.vstack((Controltrain_y, TSCtrain_y))

# GPU expects values to be 32-bit floats
train_X = train_X.astype(np.float32)

# Rescale the pixel values to be between 0 and 1
train_X /= 255.
In [0]:
# Shuffle in unison the train_X and the train_y array (123 is just a random number for reproducibility)
shuffled_train_X, shuffled_train_y = shuffle(train_X, train_y, random_state=123)
In [23]:
# Make sure that the dimensions are as expected
shuffled_train_X.shape
Out[23]:
(5634, 224, 224, 3)
In [24]:
# Example of an image to make sure they were converted right
plt.imshow(shuffled_train_X[0])
plt.grid(b=None)
plt.xticks([])
plt.yticks([])
plt.show()
In [25]:
# Make sure that the dimensions are as expected
shuffled_train_y.shape
Out[25]:
(5634, 1)
In [26]:
# Make sure that the label is correct for the image
shuffled_train_y[0]
Out[26]:
array([0])

Import images and labels for the validation set

In [0]:
## CONTROLS

# Define the image size
image_size = (224, 224)

# Read in the validation images for controls
Controlval_images = []
Controlval_dir = pathtofinalControlval
Controlval_files = os.listdir(Controlval_dir)
# For each image
for f in Controlval_files:
  # Open the image
  img = Image.open(Controlval_dir + f)
  # Resize the image so that it has a size 224x224
  img = img.resize(image_size)
  # Transform into a numpy array
  img_arr = np.array(img)
  # Transform from 224x224 to 224x224x3
  if img_arr.shape == image_size:
        img_arr = np.expand_dims(img_arr, 3)
        img_arr = gray2rgb(img_arr[:, :, 0])
  # Add the image to the array of images      
  Controlval_images.append(img_arr)

# After having transformed all images, transform the list into a numpy array  
Controlval_X = np.array(Controlval_images)

# Create an array of labels (0 for controls)
Controlval_y = np.array([[0]*Controlval_X.shape[0]]).T



## TSC

# Read in the validation images for TSC
TSCval_images = []
TSCval_dir = pathtofinalTSCval
TSCval_files = os.listdir(TSCval_dir)
# For each image
for f in TSCval_files:
  # Open the image
  img = Image.open(TSCval_dir + f)
  # Resize the image so that it has a size 224x224
  img = img.resize(image_size)
  # Transform into a numpy array
  img_arr = np.array(img)
  # Transform from 224x224 to 224x224x3
  if img_arr.shape == image_size:
        img_arr = np.expand_dims(img_arr, 3)
        img_arr = gray2rgb(img_arr[:, :, 0])
  # Add the image to the array of images      
  TSCval_images.append(img_arr)

# After having transformed all images, transform the list into a numpy array  
TSCval_X = np.array(TSCval_images)

# Create an array of labels (1 for TSC)
TSCval_y = np.array([[1]*TSCval_X.shape[0]]).T


## MERGE CONTROLS AND TSC

# Val merge files
val_X = np.concatenate([Controlval_X, TSCval_X])
val_y = np.vstack((Controlval_y, TSCval_y))

# GPU expects pixel values to be 32-bit floats
val_X = val_X.astype(np.float32)

# Rescale the pixel values to be between 0 and 1
val_X /= 255.
In [0]:
# Shuffle in unison the val_X and the val_y array (123 is just a random number for reproducibility)
shuffled_val_X, shuffled_val_y = shuffle(val_X, val_y, random_state=123)
In [29]:
shuffled_val_X.shape
Out[29]:
(248, 224, 224, 3)
In [30]:
# Example of an image to make sure they were converted right
plt.imshow(shuffled_val_X[0])
plt.grid(b=None)
plt.xticks([])
plt.yticks([])
plt.show()
In [31]:
shuffled_val_y.shape
Out[31]:
(248, 1)
In [32]:
shuffled_val_y[0]
Out[32]:
array([1])

Delete unnecessary files

In [33]:
!ls
augmentedControltrain  Controlval	  FinalTSCtrain  TSCtrain
augmentedTSCtrain      FinalControltrain  FinalTSCval	 TSCval
Controltrain	       FinalControlval	  sample_data
In [0]:
# Remove the zipped files
!rm -r Controltrain
!rm -r augmentedControltrain
!rm -r Controlval   
!rm -r TSCtrain 
!rm -r augmentedTSCtrain 
!rm -r TSCval
In [35]:
!ls
FinalControltrain  FinalControlval  FinalTSCtrain  FinalTSCval	sample_data

THIRD PART: EVALUATE NEURAL NETWORKS

Tuberous sclerosis complex convolutional neural network (TSCCNN)

This is a neural network consisting of:

-A set of: one Conv2D layer with 64 3x3 filters (the input layer), one Conv2D layer with 64 3x3 filters, and one MaxPooling layer with 2x2 pooling.

-One layer of GaussianNoise with 0.2 standard deviation to make the model more robust to overfitting.

-A set of: one Conv2D layer with 128 3x3 filters, one Conv2D layer with 128 3x3 filters, one BathNormalization layer, and one MaxPooling layer with 2x2 pooling.

-A set of: one Conv2D layer with 256 3x3 filters, one Conv2D layer with 256 3x3 filters, and one MaxPooling layer with 2x2 pooling.

-A set of: one Conv2D layer with 512 3x3 filters, one Conv2D layer with 512 3x3 filters, one Conv2D layer with 512 3x3 filters, one Conv2D layer with 512 3x3 filters, and one MaxPooling layer with 2x2 pooling.

-A set of: one Conv2D layer with 512 3x3 filters, one Conv2D layer with 512 3x3 filters, one BathNormalization layer, and one MaxPooling layer with 2x2 pooling.

-A GlobalAveragePooling layer to flatten the input.

-A set of: one Dense (fully connected) layer with 4096 units and ReLU activation, one dropout layer with dropout rate 0.5, one Dense (fully connected) layer with 4096 units and ReLU activation.

-One output layer with one unit and a sigmoid activation function.

The optimizer was Adam with a learning rate of 0.00025. The loss function was binary cross-entropy.

We trained the neural network for 100 epochs with a batch size of 64.

In [36]:
# Define the neural network layers
model = Sequential()
model.add(Conv2D(filters = 64, kernel_size = (3,3), input_shape = train_X.shape[1:]))
model.add(Conv2D(filters = 64, kernel_size = (3,3), activation='relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))
model.add(GaussianNoise(0.2))
model.add(Conv2D(filters = 128, kernel_size = (3,3), activation='relu'))
model.add(Conv2D(filters = 128, kernel_size = (3,3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size = (2, 2)))
model.add(Conv2D(filters = 256, kernel_size = (3,3), activation='relu'))
model.add(Conv2D(filters = 256, kernel_size = (3,3), activation='relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))
model.add(Conv2D(filters = 512, kernel_size = (3,3), activation='relu'))
model.add(Conv2D(filters = 512, kernel_size = (3,3), activation='relu'))
model.add(Conv2D(filters = 512, kernel_size = (3,3), activation='relu'))
model.add(Conv2D(filters = 512, kernel_size = (3,3), activation='relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))
model.add(Conv2D(filters = 512, kernel_size = (3,3), activation='relu'))
model.add(Conv2D(filters = 512, kernel_size = (3,3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size = (2, 2)))
model.add(GlobalAveragePooling2D())
model.add(Dense(units = 4096, activation = 'relu'))
model.add(Dropout(rate = 0.5))
model.add(Dense(units = 4096, activation = 'relu'))
model.add(Dense(units = 1, activation = 'sigmoid'))

# Define the neural network optimizer
opt = Adam(lr = 0.00025)

# Compile the model
model.compile(optimizer = opt, loss = 'binary_crossentropy', metrics = ['accuracy'])

# Fit the model in the training set
historyTSCCNN = model.fit(shuffled_train_X, shuffled_train_y, validation_data = [shuffled_val_X, shuffled_val_y], epochs = 100, batch_size = 64)

print('\n')
print('\n')
# AUC in train and validation set
auc_trainTSCCNN = roc_auc_score(shuffled_train_y, model.predict(shuffled_train_X))
print('The AUC in the train set is {}.'.format(auc_trainTSCCNN))
print('\n')
print('\n')
auc_validTSCCNN = roc_auc_score(shuffled_val_y, model.predict(shuffled_val_X))
print('The AUC in the validation set is {}.'.format(auc_validTSCCNN))

print('\n')
print('\n')
print('\n')
print('\n')

# Plot history of loss during training
plt.plot(historyTSCCNN.history['loss'], label='Train', color='red')
plt.plot(historyTSCCNN.history['val_loss'], label='Validation', color='blue')
plt.title('Loss in train and validation set', size=28)
plt.xlabel('Epoch', size=20)
plt.ylabel('Binary cross-entropy loss', size=20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.legend(fontsize=20)
plt.ylim(ymin=0, ymax=2)
plt.grid(b=None)
plt.rcParams['axes.facecolor']='lightgrey'
plt.show()

print('\n')
print('\n')
print('\n')
print('\n')

# Plot history of accuracy
plt.plot(historyTSCCNN.history['acc'], label='Train', color='red')
plt.plot(historyTSCCNN.history['val_acc'], label='Validation', color='blue')
plt.title('Accuracy in train and validation set', size=28)
plt.xlabel('Epoch', size=20)
plt.ylabel('Accuracy', size=20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.legend(fontsize=20)
plt.ylim(ymin=0, ymax=1)
plt.grid(b=None)
plt.rcParams['axes.facecolor']='lightgrey'
plt.show()
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3445: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.
Instructions for updating:
Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.cast instead.
Train on 5634 samples, validate on 248 samples
Epoch 1/100
5634/5634 [==============================] - 146s 26ms/step - loss: 0.7127 - acc: 0.5978 - val_loss: 1.0843 - val_acc: 0.4758
Epoch 2/100
5634/5634 [==============================] - 122s 22ms/step - loss: 0.6653 - acc: 0.6287 - val_loss: 1.1226 - val_acc: 0.5242
Epoch 3/100
5634/5634 [==============================] - 122s 22ms/step - loss: 0.6634 - acc: 0.6393 - val_loss: 0.7239 - val_acc: 0.5242
Epoch 4/100
5634/5634 [==============================] - 122s 22ms/step - loss: 0.6559 - acc: 0.6510 - val_loss: 3.8510 - val_acc: 0.4758
Epoch 5/100
5634/5634 [==============================] - 122s 22ms/step - loss: 0.6522 - acc: 0.6466 - val_loss: 1.6680 - val_acc: 0.4758
Epoch 6/100
5634/5634 [==============================] - 122s 22ms/step - loss: 0.6462 - acc: 0.6514 - val_loss: 1.2862 - val_acc: 0.4758
Epoch 7/100
5634/5634 [==============================] - 122s 22ms/step - loss: 0.6347 - acc: 0.6631 - val_loss: 0.7110 - val_acc: 0.5242
Epoch 8/100
5634/5634 [==============================] - 122s 22ms/step - loss: 0.6305 - acc: 0.6636 - val_loss: 0.7059 - val_acc: 0.5242
Epoch 9/100
5634/5634 [==============================] - 122s 22ms/step - loss: 0.6210 - acc: 0.6745 - val_loss: 1.4755 - val_acc: 0.4758
Epoch 10/100
5634/5634 [==============================] - 121s 22ms/step - loss: 0.6299 - acc: 0.6645 - val_loss: 0.8299 - val_acc: 0.5242
Epoch 11/100
5634/5634 [==============================] - 122s 22ms/step - loss: 0.6147 - acc: 0.6812 - val_loss: 1.3470 - val_acc: 0.5242
Epoch 12/100
5634/5634 [==============================] - 122s 22ms/step - loss: 0.6252 - acc: 0.6686 - val_loss: 1.3385 - val_acc: 0.4758
Epoch 13/100
5634/5634 [==============================] - 121s 22ms/step - loss: 0.6404 - acc: 0.6443 - val_loss: 7.6346 - val_acc: 0.4758
Epoch 14/100
5634/5634 [==============================] - 121s 22ms/step - loss: 0.6441 - acc: 0.6621 - val_loss: 0.7612 - val_acc: 0.4879
Epoch 15/100
5634/5634 [==============================] - 121s 21ms/step - loss: 0.6310 - acc: 0.6647 - val_loss: 1.5007 - val_acc: 0.4758
Epoch 16/100
5634/5634 [==============================] - 121s 21ms/step - loss: 0.6109 - acc: 0.6807 - val_loss: 3.7800 - val_acc: 0.4758
Epoch 17/100
5634/5634 [==============================] - 121s 21ms/step - loss: 0.6288 - acc: 0.6676 - val_loss: 2.2684 - val_acc: 0.4758
Epoch 18/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.6200 - acc: 0.6818 - val_loss: 2.6661 - val_acc: 0.4758
Epoch 19/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.6066 - acc: 0.6960 - val_loss: 4.2669 - val_acc: 0.4758
Epoch 20/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.5739 - acc: 0.7180 - val_loss: 6.8067 - val_acc: 0.4758
Epoch 21/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.5668 - acc: 0.7187 - val_loss: 5.5219 - val_acc: 0.4758
Epoch 22/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.5579 - acc: 0.7245 - val_loss: 3.2141 - val_acc: 0.4758
Epoch 23/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.5422 - acc: 0.7432 - val_loss: 4.7758 - val_acc: 0.4758
Epoch 24/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.5420 - acc: 0.7364 - val_loss: 3.4338 - val_acc: 0.4758
Epoch 25/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.5202 - acc: 0.7536 - val_loss: 6.5145 - val_acc: 0.4758
Epoch 26/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.5210 - acc: 0.7574 - val_loss: 3.5853 - val_acc: 0.4758
Epoch 27/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.5100 - acc: 0.7627 - val_loss: 4.0438 - val_acc: 0.4758
Epoch 28/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.5624 - acc: 0.7233 - val_loss: 2.8750 - val_acc: 0.4919
Epoch 29/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.5174 - acc: 0.7593 - val_loss: 1.5851 - val_acc: 0.4637
Epoch 30/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.5039 - acc: 0.7645 - val_loss: 0.8725 - val_acc: 0.4960
Epoch 31/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.4907 - acc: 0.7691 - val_loss: 3.4386 - val_acc: 0.4758
Epoch 32/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.4966 - acc: 0.7684 - val_loss: 2.8002 - val_acc: 0.4758
Epoch 33/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.4841 - acc: 0.7709 - val_loss: 2.2403 - val_acc: 0.4798
Epoch 34/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.4555 - acc: 0.7911 - val_loss: 1.0941 - val_acc: 0.5484
Epoch 35/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.4474 - acc: 0.7927 - val_loss: 1.7366 - val_acc: 0.4960
Epoch 36/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.4296 - acc: 0.8023 - val_loss: 1.8275 - val_acc: 0.5202
Epoch 37/100
5634/5634 [==============================] - 121s 21ms/step - loss: 0.4469 - acc: 0.7939 - val_loss: 1.2867 - val_acc: 0.5524
Epoch 38/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.4196 - acc: 0.8113 - val_loss: 2.6232 - val_acc: 0.4758
Epoch 39/100
5634/5634 [==============================] - 121s 21ms/step - loss: 0.4016 - acc: 0.8161 - val_loss: 0.9766 - val_acc: 0.5403
Epoch 40/100
5634/5634 [==============================] - 121s 21ms/step - loss: 0.3998 - acc: 0.8206 - val_loss: 3.2508 - val_acc: 0.4919
Epoch 41/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.3615 - acc: 0.8411 - val_loss: 1.0624 - val_acc: 0.5605
Epoch 42/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.3511 - acc: 0.8514 - val_loss: 2.0525 - val_acc: 0.5161
Epoch 43/100
5634/5634 [==============================] - 121s 21ms/step - loss: 0.3412 - acc: 0.8493 - val_loss: 0.9901 - val_acc: 0.5968
Epoch 44/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.3182 - acc: 0.8688 - val_loss: 1.0699 - val_acc: 0.5444
Epoch 45/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.2937 - acc: 0.8772 - val_loss: 0.9104 - val_acc: 0.5927
Epoch 46/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.2987 - acc: 0.8704 - val_loss: 0.8504 - val_acc: 0.6169
Epoch 47/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.2691 - acc: 0.8889 - val_loss: 1.0840 - val_acc: 0.6331
Epoch 48/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.2496 - acc: 0.8971 - val_loss: 0.8231 - val_acc: 0.6210
Epoch 49/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.2878 - acc: 0.8775 - val_loss: 1.4403 - val_acc: 0.5161
Epoch 50/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.3620 - acc: 0.8415 - val_loss: 1.8541 - val_acc: 0.5081
Epoch 51/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.2501 - acc: 0.9002 - val_loss: 1.2696 - val_acc: 0.6331
Epoch 52/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.2237 - acc: 0.9123 - val_loss: 1.5723 - val_acc: 0.5685
Epoch 53/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.2045 - acc: 0.9203 - val_loss: 0.9107 - val_acc: 0.6694
Epoch 54/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.2113 - acc: 0.9118 - val_loss: 0.9583 - val_acc: 0.6452
Epoch 55/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.1937 - acc: 0.9180 - val_loss: 2.3881 - val_acc: 0.6331
Epoch 56/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.1767 - acc: 0.9317 - val_loss: 1.0953 - val_acc: 0.6411
Epoch 57/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.1748 - acc: 0.9310 - val_loss: 1.3190 - val_acc: 0.6452
Epoch 58/100
5634/5634 [==============================] - 121s 21ms/step - loss: 0.3212 - acc: 0.8610 - val_loss: 0.7813 - val_acc: 0.6895
Epoch 59/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.2195 - acc: 0.9139 - val_loss: 0.8211 - val_acc: 0.6532
Epoch 60/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.2254 - acc: 0.9075 - val_loss: 1.2153 - val_acc: 0.6895
Epoch 61/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.1437 - acc: 0.9421 - val_loss: 1.0462 - val_acc: 0.7500
Epoch 62/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.2202 - acc: 0.9127 - val_loss: 0.7364 - val_acc: 0.7742
Epoch 63/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.1098 - acc: 0.9572 - val_loss: 1.5988 - val_acc: 0.6492
Epoch 64/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0985 - acc: 0.9608 - val_loss: 1.1502 - val_acc: 0.6895
Epoch 65/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.1686 - acc: 0.9379 - val_loss: 0.6841 - val_acc: 0.7903
Epoch 66/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.1021 - acc: 0.9602 - val_loss: 0.7857 - val_acc: 0.7903
Epoch 67/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0851 - acc: 0.9673 - val_loss: 0.6030 - val_acc: 0.8226
Epoch 68/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.1234 - acc: 0.9521 - val_loss: 0.9149 - val_acc: 0.7903
Epoch 69/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0676 - acc: 0.9746 - val_loss: 0.8525 - val_acc: 0.7903
Epoch 70/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0884 - acc: 0.9652 - val_loss: 1.7783 - val_acc: 0.6169
Epoch 71/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.1939 - acc: 0.9233 - val_loss: 0.6854 - val_acc: 0.8065
Epoch 72/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0790 - acc: 0.9709 - val_loss: 1.0501 - val_acc: 0.7581
Epoch 73/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0712 - acc: 0.9727 - val_loss: 0.6958 - val_acc: 0.8468
Epoch 74/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0533 - acc: 0.9791 - val_loss: 0.9207 - val_acc: 0.7621
Epoch 75/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.5821 - acc: 0.7396 - val_loss: 0.7690 - val_acc: 0.6169
Epoch 76/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.2927 - acc: 0.8802 - val_loss: 1.3071 - val_acc: 0.6452
Epoch 77/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.1541 - acc: 0.9384 - val_loss: 1.2774 - val_acc: 0.6895
Epoch 78/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.1662 - acc: 0.9402 - val_loss: 1.7724 - val_acc: 0.6573
Epoch 79/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0955 - acc: 0.9650 - val_loss: 0.9168 - val_acc: 0.7339
Epoch 80/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0615 - acc: 0.9766 - val_loss: 0.7100 - val_acc: 0.8185
Epoch 81/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0589 - acc: 0.9794 - val_loss: 0.7462 - val_acc: 0.8105
Epoch 82/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.1309 - acc: 0.9473 - val_loss: 0.6057 - val_acc: 0.8306
Epoch 83/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0499 - acc: 0.9815 - val_loss: 0.7522 - val_acc: 0.8185
Epoch 84/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0440 - acc: 0.9830 - val_loss: 0.5953 - val_acc: 0.8347
Epoch 85/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.1880 - acc: 0.9283 - val_loss: 0.7132 - val_acc: 0.7863
Epoch 86/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0694 - acc: 0.9723 - val_loss: 0.9846 - val_acc: 0.7661
Epoch 87/100
5634/5634 [==============================] - 121s 21ms/step - loss: 0.0809 - acc: 0.9693 - val_loss: 0.9750 - val_acc: 0.7661
Epoch 88/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.1022 - acc: 0.9601 - val_loss: 0.6032 - val_acc: 0.8105
Epoch 89/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0714 - acc: 0.9748 - val_loss: 0.6747 - val_acc: 0.8306
Epoch 90/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0547 - acc: 0.9796 - val_loss: 0.6497 - val_acc: 0.8266
Epoch 91/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0282 - acc: 0.9894 - val_loss: 0.7959 - val_acc: 0.8306
Epoch 92/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0295 - acc: 0.9904 - val_loss: 0.6027 - val_acc: 0.8831
Epoch 93/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0253 - acc: 0.9904 - val_loss: 0.7412 - val_acc: 0.8387
Epoch 94/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0244 - acc: 0.9911 - val_loss: 0.7652 - val_acc: 0.8306
Epoch 95/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0090 - acc: 0.9970 - val_loss: 0.6834 - val_acc: 0.8548
Epoch 96/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0112 - acc: 0.9972 - val_loss: 1.8982 - val_acc: 0.7500
Epoch 97/100
5634/5634 [==============================] - 121s 21ms/step - loss: 0.0824 - acc: 0.9752 - val_loss: 0.6339 - val_acc: 0.8468
Epoch 98/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0199 - acc: 0.9925 - val_loss: 0.8606 - val_acc: 0.8548
Epoch 99/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0345 - acc: 0.9872 - val_loss: 0.5895 - val_acc: 0.8790
Epoch 100/100
5634/5634 [==============================] - 120s 21ms/step - loss: 0.0184 - acc: 0.9933 - val_loss: 1.0416 - val_acc: 0.8347




The AUC in the train set is 0.9998788962546682.




The AUC in the validation set is 0.9235984354628424.








/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_base.py:3604: MatplotlibDeprecationWarning: 
The `ymin` argument was deprecated in Matplotlib 3.0 and will be removed in 3.2. Use `bottom` instead.
  alternative='`bottom`', obj_type='argument')
/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_base.py:3610: MatplotlibDeprecationWarning: 
The `ymax` argument was deprecated in Matplotlib 3.0 and will be removed in 3.2. Use `top` instead.
  alternative='`top`', obj_type='argument')







In [37]:
# Generate predictions in the form of probabilities for the validation set
valTSCNN = model.predict(shuffled_val_X, batch_size = 16)
valTSCNN
Out[37]:
array([[2.68722445e-01],
       [3.18884850e-06],
       [9.99404311e-01],
       [8.96126032e-04],
       [0.00000000e+00],
       [7.08699226e-05],
       [1.15185976e-04],
       [2.64150679e-01],
       [2.98023224e-08],
       [0.00000000e+00],
       [9.84982848e-02],
       [9.97680306e-01],
       [9.99336720e-01],
       [3.03685665e-05],
       [9.99880672e-01],
       [2.98168242e-01],
       [9.37426090e-02],
       [1.00000000e+00],
       [3.45886350e-02],
       [1.19209290e-07],
       [6.08861446e-05],
       [9.67940688e-01],
       [9.99999583e-01],
       [2.76063353e-01],
       [1.13546848e-05],
       [2.77513266e-03],
       [2.62179971e-03],
       [9.73221779e-01],
       [9.93127942e-01],
       [2.34478712e-03],
       [2.53617764e-05],
       [6.98617101e-03],
       [9.93224502e-01],
       [9.99978423e-01],
       [2.49856532e-01],
       [9.99597073e-01],
       [0.00000000e+00],
       [5.96046448e-08],
       [3.57627869e-07],
       [0.00000000e+00],
       [1.12414360e-04],
       [2.16689706e-03],
       [9.93646622e-01],
       [0.00000000e+00],
       [6.76512718e-05],
       [9.99999940e-01],
       [9.36441779e-01],
       [5.98153472e-03],
       [2.08616257e-07],
       [8.19874167e-01],
       [4.26173210e-06],
       [2.00748444e-04],
       [9.99994516e-01],
       [6.93422556e-03],
       [1.78813934e-07],
       [9.57891464e-01],
       [9.99997497e-01],
       [0.00000000e+00],
       [2.88852453e-02],
       [9.88568962e-01],
       [5.46781719e-01],
       [6.61371708e-01],
       [1.56636238e-02],
       [2.38418579e-07],
       [9.96419132e-01],
       [9.99456048e-01],
       [9.99191761e-01],
       [1.00000000e+00],
       [9.99997735e-01],
       [9.99912560e-01],
       [9.95951414e-01],
       [2.69731879e-01],
       [8.94069672e-08],
       [7.96924829e-01],
       [9.99999225e-01],
       [1.00000000e+00],
       [7.40641356e-03],
       [5.78165054e-05],
       [1.43868476e-01],
       [8.04926395e-01],
       [9.96216893e-01],
       [9.89545584e-01],
       [0.00000000e+00],
       [9.89373922e-01],
       [4.61429358e-04],
       [9.99990463e-01],
       [9.99982595e-01],
       [9.94332492e-01],
       [4.11570072e-05],
       [0.00000000e+00],
       [9.99999881e-01],
       [1.21645629e-02],
       [1.34739280e-03],
       [0.00000000e+00],
       [9.99999404e-01],
       [1.00000000e+00],
       [1.00000000e+00],
       [7.24976838e-01],
       [9.99934554e-01],
       [1.58786774e-03],
       [1.34110451e-06],
       [4.85777855e-06],
       [1.34110451e-06],
       [0.00000000e+00],
       [9.88706470e-01],
       [0.00000000e+00],
       [9.92417336e-06],
       [2.64957875e-01],
       [1.00000000e+00],
       [5.93066216e-06],
       [0.00000000e+00],
       [9.64171529e-01],
       [2.47955322e-05],
       [2.68220901e-07],
       [9.99994874e-01],
       [0.00000000e+00],
       [2.98023224e-08],
       [0.00000000e+00],
       [8.69728088e-01],
       [9.99556065e-01],
       [8.16240311e-01],
       [0.00000000e+00],
       [9.66641665e-01],
       [4.17232513e-07],
       [9.99880672e-01],
       [1.28149986e-06],
       [9.99999881e-01],
       [8.34465027e-07],
       [0.00000000e+00],
       [1.40377879e-03],
       [9.99753714e-01],
       [9.99357522e-01],
       [9.89918828e-01],
       [1.61230564e-05],
       [1.29479170e-03],
       [5.57137728e-02],
       [9.98582006e-01],
       [9.40623045e-01],
       [2.98023224e-07],
       [3.00526172e-01],
       [1.42368376e-02],
       [6.85453415e-07],
       [0.00000000e+00],
       [0.00000000e+00],
       [3.95728290e-01],
       [2.79334188e-03],
       [1.00000000e+00],
       [2.36105919e-03],
       [8.74134898e-03],
       [0.00000000e+00],
       [9.99997616e-01],
       [9.97352123e-01],
       [9.99609888e-01],
       [3.55085313e-01],
       [8.27079713e-02],
       [9.99138236e-01],
       [9.93941069e-01],
       [0.00000000e+00],
       [1.24186277e-04],
       [0.00000000e+00],
       [9.99987483e-01],
       [1.28149986e-06],
       [7.34442770e-02],
       [1.03712082e-05],
       [0.00000000e+00],
       [4.18332219e-03],
       [0.00000000e+00],
       [8.52988660e-02],
       [0.00000000e+00],
       [0.00000000e+00],
       [2.70876884e-02],
       [0.00000000e+00],
       [9.72275496e-01],
       [2.98023224e-07],
       [7.64301419e-03],
       [1.46031380e-06],
       [2.98023224e-08],
       [5.59389591e-05],
       [1.00000000e+00],
       [1.19209290e-07],
       [9.96845543e-01],
       [1.00000000e+00],
       [9.85374212e-01],
       [1.49011612e-07],
       [2.66003609e-03],
       [1.49011612e-07],
       [9.87463713e-01],
       [1.57952309e-06],
       [1.43003464e-02],
       [1.78813934e-07],
       [1.28149986e-06],
       [3.24892998e-03],
       [9.99985099e-01],
       [1.00000000e+00],
       [9.99703407e-01],
       [0.00000000e+00],
       [1.10268593e-06],
       [7.66249001e-02],
       [9.89821553e-01],
       [9.00922418e-01],
       [0.00000000e+00],
       [9.91456747e-01],
       [9.99529123e-01],
       [0.00000000e+00],
       [9.99999881e-01],
       [1.71661377e-05],
       [1.09794736e-03],
       [9.90731180e-01],
       [1.98583901e-02],
       [8.08144927e-01],
       [9.87649620e-01],
       [9.99995112e-01],
       [0.00000000e+00],
       [1.59394741e-03],
       [0.00000000e+00],
       [0.00000000e+00],
       [9.73661482e-01],
       [2.24709511e-05],
       [7.37488270e-04],
       [2.61664391e-05],
       [3.75488400e-03],
       [9.71588910e-01],
       [1.00000000e+00],
       [2.67177820e-04],
       [9.99925017e-01],
       [7.63374627e-01],
       [2.08616257e-07],
       [9.99999404e-01],
       [2.67745554e-02],
       [9.95672762e-01],
       [1.81794167e-06],
       [6.21080399e-05],
       [9.99996185e-01],
       [0.00000000e+00],
       [0.00000000e+00],
       [9.60491657e-01],
       [9.99636292e-01],
       [2.53617764e-05],
       [1.00000000e+00],
       [0.00000000e+00],
       [5.96046448e-08],
       [1.66893005e-06],
       [9.99971271e-01],
       [0.00000000e+00],
       [9.99996066e-01],
       [9.23871994e-07],
       [9.99998689e-01],
       [2.71201134e-06]], dtype=float32)
In [38]:
# Generate the confusion matrix in the validation set
y_true = shuffled_val_y
y_predTSCNN = valTSCNN > 0.5

confusion_matrix(y_true, y_predTSCNN)
Out[38]:
array([[113,   5],
       [ 36,  94]])
In [39]:
# Calculate accuracy in the validation set
accuracy_TSCCNN = (confusion_matrix(y_true, y_predTSCNN)[0, 0] + confusion_matrix(y_true, y_predTSCNN)[1, 1]) / (confusion_matrix(y_true, y_predTSCNN)[0, 0] + confusion_matrix(y_true, y_predTSCNN)[0, 1] + confusion_matrix(y_true, y_predTSCNN)[1, 0] + confusion_matrix(y_true, y_predTSCNN)[1, 1])
print('The accuracy in the validation set is {}.'.format(accuracy_TSCCNN))
The accuracy in the validation set is 0.8346774193548387.
In [40]:
# Calculate AUC in the validation set
auc_validTSCCNN = roc_auc_score(shuffled_val_y, model.predict(shuffled_val_X))
print('The AUC in the validation set is {}.'.format(auc_validTSCCNN))
The AUC in the validation set is 0.9235984354628424.

Save TSCNN

In [0]:
# Serialize model to JSON
model_json = model.to_json()
with open("TSCNN.json", "w") as json_file:
    json_file.write(model_json)
# Serialize weights to HDF5
model.save_weights("TSCNN.h5")

Performance TSCNN:

Loss in validation set: 1.0416

Accuracy in validation set: 0.8347

Model visualization for TSCNN

Visualization with class activation map

In [42]:
# Visualize the structure and layers of the model
model.layers
Out[42]:
[<keras.layers.convolutional.Conv2D at 0x7fc4c17a4518>,
 <keras.layers.convolutional.Conv2D at 0x7fc4c16282e8>,
 <keras.layers.pooling.MaxPooling2D at 0x7fc4c15d76a0>,
 <keras.layers.noise.GaussianNoise at 0x7fc4c1628588>,
 <keras.layers.convolutional.Conv2D at 0x7fc4c1628748>,
 <keras.layers.convolutional.Conv2D at 0x7fc4c15d76d8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4c158bda0>,
 <keras.layers.pooling.MaxPooling2D at 0x7fc4c15c1eb8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4c15c1c50>,
 <keras.layers.convolutional.Conv2D at 0x7fc4c161ea90>,
 <keras.layers.pooling.MaxPooling2D at 0x7fc4c17f6e48>,
 <keras.layers.convolutional.Conv2D at 0x7fc4c16669e8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4c17f6780>,
 <keras.layers.convolutional.Conv2D at 0x7fc4c1821400>,
 <keras.layers.convolutional.Conv2D at 0x7fc4c50c4be0>,
 <keras.layers.pooling.MaxPooling2D at 0x7fc4c1670fd0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4c5053ac8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4c1670a90>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4c17fb0f0>,
 <keras.layers.pooling.MaxPooling2D at 0x7fc4c50907f0>,
 <keras.layers.pooling.GlobalAveragePooling2D at 0x7fc4c50907b8>,
 <keras.layers.core.Dense at 0x7fc4b946e748>,
 <keras.layers.core.Dropout at 0x7fc4b9403fd0>,
 <keras.layers.core.Dense at 0x7fc4b933da58>,
 <keras.layers.core.Dense at 0x7fc4b933d470>]
In [43]:
# Iterate through the first 8 MRI images in validation set (otherwise there are issues with the amount of space in the output and running time)

# Print title
print('\033[1m' + 'CLASS ACTIVATION MAP IN THE LAST CONVOLUTIONAL LAYER OF THE NEURONAL NETWORK' + '\033[0m' + '\n \n \n \n')

for i in range(8):
  
  # Print real classification of the image
  print('Real classification of the image: {}'.format('TSC' if y_true[i][0]==1 else 'NO TSC'))
  
  # Original image
  plt.subplot(1,3,1)
  plt.imshow(shuffled_val_X[i])
  plt.grid(b=None)
  plt.xticks([])
  plt.yticks([])
  
  # Heat map
  plt.subplot(1,3,2)
  heat_map = visualize_cam(model, layer_idx=17, filter_indices=None, seed_input=shuffled_val_X[i])
  plt.imshow(heat_map)
  plt.grid(b=None)
  plt.xticks([])
  plt.yticks([])
  
  # Heat map superimposed on original image
  plt.subplot(1,3,3)
  plt.imshow(shuffled_val_X[i])
  plt.imshow(heat_map, alpha = 0.8 * valTSCNN[i][0])
  plt.grid(b=None)
  plt.xticks([])
  plt.yticks([])
  
  # Shot the image
  plt.show()
  
  # Print model classification and model probability of TSC
  print('Model classification of this image: {} \nEstimated probability of tuber(s): {} \n \n \n \n'.format('TSC' if valTSCNN[i][0]>0.5 else 'NO TSC', valTSCNN[i][0]))
CLASS ACTIVATION MAP IN THE LAST CONVOLUTIONAL LAYER OF THE NEURONAL NETWORK
 
 
 

Real classification of the image: TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 0.26872244477272034 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 3.1888484954833984e-06 
 
 
 

Real classification of the image: TSC
Model classification of this image: TSC 
Estimated probability of tuber(s): 0.9994043111801147 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 0.0008961260318756104 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 0.0 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 7.086992263793945e-05 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 0.00011518597602844238 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 0.2641506791114807 
 
 
 

InceptionV3 training all the layers

This is the InceptionV3 neural network initialized with the ImageNet weights.

We did not use the top layer, and we used an output layer with 1 units and a sigmoid activation function.

We added a GlobalAveragePooling2D and a Dense (fully-connected layer with 4096 units) before the output layer.

We used Adam optimizer with learning rate of 0.00025.

We used binary cross-entropy as loss function.

We trained the neural network for 100 epochs with a batch size of 64.

In [44]:
# Use InceptionV3 as the base model
base_model = InceptionV3(weights = 'imagenet', include_top = False, input_shape=(224, 224, 3))

# Get the output of the base model
x = base_model.output

# Add a 2D global average pooling layer
x = GlobalAveragePooling2D()(x)

# Add a fully-connected layer
x = Dense(4096, activation='relu')(x)

# Ad a layer for binary classification
predictions = Dense(units = 1, activation = 'sigmoid')(x)

# Define the model to be trained
model = Model(inputs = base_model.input, outputs = predictions)

# Train all layers in the base model
for layer in base_model.layers:
   layer.trainable = True
    
# Compile the model
opt = Adam(lr = 0.00025)
model.compile(optimizer = opt, loss = 'binary_crossentropy', metrics = ['accuracy'])

# Fit and test the model in the validation set
historyInceptionV3 = model.fit(shuffled_train_X, shuffled_train_y, validation_data = [shuffled_val_X, shuffled_val_y], epochs = 100, batch_size = 64)

print('\n')
print('\n')
# AUC in train and validation set
auc_trainInceptionV3 = roc_auc_score(shuffled_train_y, model.predict(shuffled_train_X))
print('The AUC in the train set is {}.'.format(auc_trainInceptionV3))
print('\n')
print('\n')
auc_validInceptionV3 = roc_auc_score(shuffled_val_y, model.predict(shuffled_val_X))
print('The AUC in the validation set is {}.'.format(auc_validInceptionV3))

print('\n')
print('\n')
print('\n')
print('\n')

# Plot history of loss during training
plt.plot(historyInceptionV3.history['loss'], label='Train', color='red')
plt.plot(historyInceptionV3.history['val_loss'], label='Validation', color='blue')
plt.title('Loss in train and validation set', size=28)
plt.xlabel('Epoch', size=20)
plt.ylabel('Binary cross-entropy loss', size=20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.legend(fontsize=20)
plt.ylim(ymin=0, ymax=2)
plt.grid(b=None)
plt.rcParams['axes.facecolor']='lightgrey'
plt.show()

print('\n')
print('\n')
print('\n')
print('\n')

# Plot history of accuracy
plt.plot(historyInceptionV3.history['acc'], label='Train', color='red')
plt.plot(historyInceptionV3.history['val_acc'], label='Validation', color='blue')
plt.title('Accuracy in train and validation set', size=28)
plt.xlabel('Epoch', size=20)
plt.ylabel('Accuracy', size=20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.legend(fontsize=20)
plt.ylim(ymin=0, ymax=1)
plt.grid(b=None)
plt.rcParams['axes.facecolor']='lightgrey'
plt.show()
Downloading data from https://github.com/fchollet/deep-learning-models/releases/download/v0.5/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5
87916544/87910968 [==============================] - 3s 0us/step
Train on 5634 samples, validate on 248 samples
Epoch 1/100
5634/5634 [==============================] - 127s 23ms/step - loss: 0.2906 - acc: 0.8789 - val_loss: 0.5107 - val_acc: 0.8750
Epoch 2/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0641 - acc: 0.9769 - val_loss: 0.5782 - val_acc: 0.8750
Epoch 3/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.1103 - acc: 0.9602 - val_loss: 0.7581 - val_acc: 0.8468
Epoch 4/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0218 - acc: 0.9922 - val_loss: 1.4581 - val_acc: 0.8065
Epoch 5/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.1164 - acc: 0.9592 - val_loss: 3.4011 - val_acc: 0.7540
Epoch 6/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0647 - acc: 0.9773 - val_loss: 0.8836 - val_acc: 0.8387
Epoch 7/100
5634/5634 [==============================] - 106s 19ms/step - loss: 0.0966 - acc: 0.9684 - val_loss: 0.6734 - val_acc: 0.8468
Epoch 8/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0072 - acc: 0.9975 - val_loss: 2.0771 - val_acc: 0.7581
Epoch 9/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0884 - acc: 0.9746 - val_loss: 1.3487 - val_acc: 0.8105
Epoch 10/100
5634/5634 [==============================] - 106s 19ms/step - loss: 0.0072 - acc: 0.9982 - val_loss: 0.6682 - val_acc: 0.8911
Epoch 11/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0054 - acc: 0.9979 - val_loss: 0.6874 - val_acc: 0.8992
Epoch 12/100
5634/5634 [==============================] - 106s 19ms/step - loss: 0.0107 - acc: 0.9968 - val_loss: 0.6351 - val_acc: 0.8629
Epoch 13/100
5634/5634 [==============================] - 106s 19ms/step - loss: 0.0572 - acc: 0.9853 - val_loss: 1.9889 - val_acc: 0.7782
Epoch 14/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0547 - acc: 0.9846 - val_loss: 0.5109 - val_acc: 0.9153
Epoch 15/100
5634/5634 [==============================] - 106s 19ms/step - loss: 0.0109 - acc: 0.9959 - val_loss: 0.4490 - val_acc: 0.9315
Epoch 16/100
5634/5634 [==============================] - 106s 19ms/step - loss: 0.0719 - acc: 0.9780 - val_loss: 0.9215 - val_acc: 0.8710
Epoch 17/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0313 - acc: 0.9901 - val_loss: 0.3209 - val_acc: 0.9274
Epoch 18/100
5634/5634 [==============================] - 106s 19ms/step - loss: 0.0042 - acc: 0.9986 - val_loss: 0.5257 - val_acc: 0.9234
Epoch 19/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0036 - acc: 0.9989 - val_loss: 0.6349 - val_acc: 0.9073
Epoch 20/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0037 - acc: 0.9988 - val_loss: 2.7220 - val_acc: 0.7863
Epoch 21/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0025 - acc: 0.9996 - val_loss: 2.5643 - val_acc: 0.7742
Epoch 22/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.1188 - acc: 0.9611 - val_loss: 0.6127 - val_acc: 0.8750
Epoch 23/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0224 - acc: 0.9924 - val_loss: 0.5902 - val_acc: 0.9073
Epoch 24/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0667 - acc: 0.9762 - val_loss: 0.5419 - val_acc: 0.8790
Epoch 25/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0823 - acc: 0.9698 - val_loss: 0.8134 - val_acc: 0.8024
Epoch 26/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0109 - acc: 0.9968 - val_loss: 0.6407 - val_acc: 0.8589
Epoch 27/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.1707 - acc: 0.9379 - val_loss: 1.0745 - val_acc: 0.7379
Epoch 28/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0308 - acc: 0.9892 - val_loss: 0.4590 - val_acc: 0.9032
Epoch 29/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0171 - acc: 0.9941 - val_loss: 0.7366 - val_acc: 0.8831
Epoch 30/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0056 - acc: 0.9986 - val_loss: 0.9148 - val_acc: 0.8669
Epoch 31/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0048 - acc: 0.9982 - val_loss: 1.1973 - val_acc: 0.8387
Epoch 32/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0110 - acc: 0.9970 - val_loss: 0.6679 - val_acc: 0.9032
Epoch 33/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0084 - acc: 0.9975 - val_loss: 0.8756 - val_acc: 0.8710
Epoch 34/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0494 - acc: 0.9835 - val_loss: 0.5552 - val_acc: 0.8871
Epoch 35/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0092 - acc: 0.9977 - val_loss: 0.7177 - val_acc: 0.8952
Epoch 36/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0154 - acc: 0.9961 - val_loss: 0.5721 - val_acc: 0.8952
Epoch 37/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0149 - acc: 0.9968 - val_loss: 1.1619 - val_acc: 0.8387
Epoch 38/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0067 - acc: 0.9986 - val_loss: 0.9344 - val_acc: 0.8589
Epoch 39/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0385 - acc: 0.9870 - val_loss: 0.8043 - val_acc: 0.8750
Epoch 40/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0091 - acc: 0.9972 - val_loss: 0.7079 - val_acc: 0.9153
Epoch 41/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0026 - acc: 0.9993 - val_loss: 1.5580 - val_acc: 0.8306
Epoch 42/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0066 - acc: 0.9982 - val_loss: 0.5990 - val_acc: 0.9194
Epoch 43/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0127 - acc: 0.9957 - val_loss: 0.5980 - val_acc: 0.9073
Epoch 44/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0033 - acc: 0.9993 - val_loss: 0.6901 - val_acc: 0.8831
Epoch 45/100
5634/5634 [==============================] - 105s 19ms/step - loss: 5.0055e-04 - acc: 0.9998 - val_loss: 0.8106 - val_acc: 0.8911
Epoch 46/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0076 - acc: 0.9977 - val_loss: 0.9406 - val_acc: 0.8710
Epoch 47/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0014 - acc: 0.9998 - val_loss: 0.7715 - val_acc: 0.8831
Epoch 48/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0134 - acc: 0.9961 - val_loss: 1.3188 - val_acc: 0.8185
Epoch 49/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0177 - acc: 0.9941 - val_loss: 0.7937 - val_acc: 0.8710
Epoch 50/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0028 - acc: 0.9995 - val_loss: 0.6042 - val_acc: 0.9153
Epoch 51/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0497 - acc: 0.9847 - val_loss: 0.6631 - val_acc: 0.9274
Epoch 52/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0076 - acc: 0.9977 - val_loss: 0.6902 - val_acc: 0.8992
Epoch 53/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0098 - acc: 0.9979 - val_loss: 1.0448 - val_acc: 0.8629
Epoch 54/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0053 - acc: 0.9984 - val_loss: 0.7331 - val_acc: 0.8831
Epoch 55/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0100 - acc: 0.9972 - val_loss: 1.1746 - val_acc: 0.8266
Epoch 56/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0036 - acc: 0.9989 - val_loss: 0.6751 - val_acc: 0.8750
Epoch 57/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0044 - acc: 0.9989 - val_loss: 0.5025 - val_acc: 0.9274
Epoch 58/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.1440 - acc: 0.9540 - val_loss: 0.5806 - val_acc: 0.8468
Epoch 59/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0823 - acc: 0.9698 - val_loss: 1.3392 - val_acc: 0.7742
Epoch 60/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0308 - acc: 0.9902 - val_loss: 0.5076 - val_acc: 0.8992
Epoch 61/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0915 - acc: 0.9691 - val_loss: 0.7016 - val_acc: 0.7863
Epoch 62/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0190 - acc: 0.9938 - val_loss: 0.4695 - val_acc: 0.9073
Epoch 63/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0275 - acc: 0.9901 - val_loss: 1.9678 - val_acc: 0.7016
Epoch 64/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.1728 - acc: 0.9363 - val_loss: 0.7735 - val_acc: 0.7984
Epoch 65/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0570 - acc: 0.9792 - val_loss: 0.7798 - val_acc: 0.8347
Epoch 66/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0177 - acc: 0.9941 - val_loss: 0.9815 - val_acc: 0.8710
Epoch 67/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0787 - acc: 0.9750 - val_loss: 0.4741 - val_acc: 0.9113
Epoch 68/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0355 - acc: 0.9892 - val_loss: 0.4875 - val_acc: 0.9113
Epoch 69/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0106 - acc: 0.9977 - val_loss: 0.5955 - val_acc: 0.9194
Epoch 70/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0409 - acc: 0.9869 - val_loss: 0.4953 - val_acc: 0.8952
Epoch 71/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0832 - acc: 0.9753 - val_loss: 0.8382 - val_acc: 0.7984
Epoch 72/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0222 - acc: 0.9927 - val_loss: 0.8932 - val_acc: 0.8629
Epoch 73/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0064 - acc: 0.9977 - val_loss: 0.7772 - val_acc: 0.8669
Epoch 74/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0295 - acc: 0.9904 - val_loss: 0.3734 - val_acc: 0.9234
Epoch 75/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0079 - acc: 0.9982 - val_loss: 0.5449 - val_acc: 0.8871
Epoch 76/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0715 - acc: 0.9766 - val_loss: 0.6595 - val_acc: 0.8831
Epoch 77/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0130 - acc: 0.9963 - val_loss: 0.4613 - val_acc: 0.9153
Epoch 78/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0095 - acc: 0.9965 - val_loss: 0.5709 - val_acc: 0.8911
Epoch 79/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0109 - acc: 0.9965 - val_loss: 0.6374 - val_acc: 0.9073
Epoch 80/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0034 - acc: 0.9993 - val_loss: 0.8565 - val_acc: 0.8871
Epoch 81/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0055 - acc: 0.9986 - val_loss: 0.6875 - val_acc: 0.9274
Epoch 82/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0026 - acc: 0.9995 - val_loss: 0.7500 - val_acc: 0.9194
Epoch 83/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0397 - acc: 0.9860 - val_loss: 0.6371 - val_acc: 0.9153
Epoch 84/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0235 - acc: 0.9917 - val_loss: 0.5350 - val_acc: 0.9073
Epoch 85/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0049 - acc: 0.9986 - val_loss: 0.6722 - val_acc: 0.8992
Epoch 86/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0012 - acc: 0.9998 - val_loss: 0.6500 - val_acc: 0.9032
Epoch 87/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0064 - acc: 0.9980 - val_loss: 0.8188 - val_acc: 0.9032
Epoch 88/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0102 - acc: 0.9977 - val_loss: 0.8294 - val_acc: 0.8629
Epoch 89/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0021 - acc: 0.9993 - val_loss: 0.5560 - val_acc: 0.9153
Epoch 90/100
5634/5634 [==============================] - 105s 19ms/step - loss: 5.5533e-04 - acc: 1.0000 - val_loss: 0.5200 - val_acc: 0.9274
Epoch 91/100
5634/5634 [==============================] - 105s 19ms/step - loss: 6.9353e-04 - acc: 0.9998 - val_loss: 0.5349 - val_acc: 0.9194
Epoch 92/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0046 - acc: 0.9986 - val_loss: 1.2795 - val_acc: 0.8306
Epoch 93/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0280 - acc: 0.9920 - val_loss: 0.4059 - val_acc: 0.9315
Epoch 94/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0040 - acc: 0.9989 - val_loss: 0.5326 - val_acc: 0.9032
Epoch 95/100
5634/5634 [==============================] - 104s 19ms/step - loss: 0.0022 - acc: 0.9993 - val_loss: 0.6648 - val_acc: 0.8992
Epoch 96/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0111 - acc: 0.9956 - val_loss: 0.6539 - val_acc: 0.8911
Epoch 97/100
5634/5634 [==============================] - 104s 19ms/step - loss: 0.1171 - acc: 0.9677 - val_loss: 1.6039 - val_acc: 0.7258
Epoch 98/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0242 - acc: 0.9931 - val_loss: 1.0964 - val_acc: 0.8185
Epoch 99/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0050 - acc: 0.9988 - val_loss: 0.5950 - val_acc: 0.9073
Epoch 100/100
5634/5634 [==============================] - 105s 19ms/step - loss: 0.0086 - acc: 0.9966 - val_loss: 0.5325 - val_acc: 0.9315




The AUC in the train set is 1.0.




The AUC in the validation set is 0.9583116036505867.








/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_base.py:3604: MatplotlibDeprecationWarning: 
The `ymin` argument was deprecated in Matplotlib 3.0 and will be removed in 3.2. Use `bottom` instead.
  alternative='`bottom`', obj_type='argument')
/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_base.py:3610: MatplotlibDeprecationWarning: 
The `ymax` argument was deprecated in Matplotlib 3.0 and will be removed in 3.2. Use `top` instead.
  alternative='`top`', obj_type='argument')







In [45]:
# Generate predictions in the form of probabilities in the validation set
valInceptionV3 = model.predict(shuffled_val_X, batch_size = 16)
valInceptionV3
Out[45]:
array([[9.99995828e-01],
       [2.08616257e-07],
       [9.99999940e-01],
       [1.81794167e-05],
       [7.18235970e-06],
       [3.11949849e-03],
       [3.87430191e-06],
       [1.08122826e-04],
       [4.76837158e-07],
       [1.10268593e-06],
       [5.78165054e-05],
       [9.99848127e-01],
       [9.99741077e-01],
       [7.59959221e-06],
       [1.00000000e+00],
       [9.99033034e-01],
       [9.99988198e-01],
       [1.00000000e+00],
       [8.34465027e-07],
       [8.94069672e-08],
       [0.00000000e+00],
       [9.99803543e-01],
       [9.99973059e-01],
       [6.61783576e-01],
       [1.13248825e-06],
       [1.19209290e-07],
       [9.99567866e-01],
       [9.99992251e-01],
       [9.99765038e-01],
       [9.86392498e-01],
       [4.76837158e-07],
       [9.26494598e-04],
       [9.94789422e-01],
       [9.99990344e-01],
       [9.99579430e-01],
       [9.99993563e-01],
       [2.27093697e-05],
       [1.08480453e-05],
       [5.36441803e-07],
       [3.57627869e-07],
       [1.04546547e-04],
       [9.66271758e-01],
       [9.99979854e-01],
       [8.13603401e-06],
       [3.15874815e-04],
       [9.99996901e-01],
       [9.98930871e-01],
       [2.68526375e-02],
       [1.49011612e-07],
       [9.99993682e-01],
       [9.82641935e-01],
       [8.19563866e-06],
       [9.99992192e-01],
       [9.99817014e-01],
       [2.98023224e-08],
       [9.89081264e-01],
       [9.99982715e-01],
       [2.05636024e-06],
       [1.91664696e-03],
       [9.99941707e-01],
       [8.20650101e-01],
       [9.98479009e-01],
       [5.93623519e-03],
       [2.84910202e-05],
       [9.99991596e-01],
       [1.00000000e+00],
       [9.97857809e-01],
       [1.00000000e+00],
       [9.99999762e-01],
       [9.99999642e-01],
       [9.98967648e-01],
       [9.99954760e-01],
       [4.31835651e-05],
       [9.99992847e-01],
       [9.99988198e-01],
       [9.99994457e-01],
       [9.99789715e-01],
       [9.99953568e-01],
       [1.18893385e-01],
       [9.99953806e-01],
       [9.99986053e-01],
       [9.99774456e-01],
       [7.09295273e-06],
       [9.99520779e-01],
       [3.74317169e-05],
       [9.99995649e-01],
       [9.99999642e-01],
       [9.97723818e-01],
       [9.98853803e-01],
       [6.07967377e-06],
       [9.99997973e-01],
       [7.01424539e-01],
       [6.25848770e-07],
       [2.62260437e-06],
       [1.00000000e+00],
       [9.99995768e-01],
       [9.99999702e-01],
       [9.99610662e-01],
       [9.99980092e-01],
       [8.85128975e-06],
       [9.97100651e-01],
       [2.95042992e-06],
       [1.26340985e-03],
       [4.76837158e-07],
       [1.00000000e+00],
       [4.65214252e-05],
       [2.60686874e-03],
       [9.70124304e-01],
       [1.00000000e+00],
       [2.38418579e-07],
       [0.00000000e+00],
       [9.97306705e-01],
       [7.74860382e-07],
       [9.99172211e-01],
       [9.99998212e-01],
       [1.78813934e-07],
       [1.56462193e-05],
       [8.94069672e-07],
       [8.10027122e-04],
       [9.99924242e-01],
       [9.99773026e-01],
       [7.86781311e-06],
       [1.19209290e-07],
       [1.72257423e-05],
       [9.99999881e-01],
       [6.28042340e-01],
       [1.00000000e+00],
       [5.36441803e-07],
       [2.38418579e-07],
       [9.98717666e-01],
       [9.90258098e-01],
       [9.99389410e-01],
       [9.99858975e-01],
       [0.00000000e+00],
       [9.99940276e-01],
       [5.06639481e-07],
       [9.99971986e-01],
       [9.90106165e-01],
       [4.72843647e-04],
       [9.99870420e-01],
       [8.30411911e-04],
       [1.19209290e-07],
       [6.25848770e-07],
       [2.08616257e-07],
       [9.99598980e-01],
       [1.23685271e-01],
       [1.00000000e+00],
       [2.31564045e-05],
       [1.99675560e-06],
       [5.96046448e-08],
       [9.99999642e-01],
       [9.38264489e-01],
       [9.99998510e-01],
       [9.99861598e-01],
       [9.99558687e-01],
       [9.99998689e-01],
       [9.99894440e-01],
       [3.57627869e-07],
       [4.35113907e-06],
       [6.25848770e-07],
       [9.99994814e-01],
       [3.07261944e-05],
       [8.96762609e-01],
       [2.61068344e-05],
       [4.82797623e-06],
       [9.98377800e-06],
       [3.87430191e-07],
       [9.97507334e-01],
       [9.03010368e-06],
       [8.94069672e-08],
       [1.68558955e-03],
       [8.94069672e-08],
       [7.47028947e-01],
       [5.36441803e-07],
       [9.99554873e-01],
       [9.99883056e-01],
       [5.96046448e-08],
       [2.89082527e-06],
       [1.00000000e+00],
       [3.01003456e-06],
       [9.99891758e-01],
       [1.00000000e+00],
       [9.99996543e-01],
       [1.25169754e-06],
       [9.81652617e-01],
       [1.49011612e-07],
       [9.99995768e-01],
       [9.42468643e-04],
       [9.79955316e-01],
       [8.34465027e-07],
       [5.83529472e-05],
       [5.02079725e-04],
       [9.99886155e-01],
       [1.00000000e+00],
       [9.99805927e-01],
       [1.81794167e-06],
       [2.45869160e-05],
       [9.99951005e-01],
       [2.38418579e-07],
       [9.64842796e-01],
       [6.13927841e-06],
       [9.99985695e-01],
       [1.00000000e+00],
       [1.16229057e-06],
       [1.00000000e+00],
       [4.30643559e-05],
       [3.81469727e-06],
       [9.99162674e-01],
       [9.99956608e-01],
       [9.99997973e-01],
       [9.99993086e-01],
       [9.99991059e-01],
       [6.23375177e-04],
       [7.09295273e-06],
       [3.84449959e-06],
       [7.03334808e-06],
       [9.99998689e-01],
       [1.78813934e-07],
       [2.03818083e-04],
       [6.55651093e-07],
       [9.99997258e-01],
       [1.62506104e-03],
       [1.00000000e+00],
       [6.25848770e-07],
       [9.99403954e-01],
       [9.99993205e-01],
       [0.00000000e+00],
       [9.99965906e-01],
       [9.83963251e-01],
       [5.96046448e-08],
       [1.12652779e-05],
       [8.94069672e-07],
       [9.99996006e-01],
       [8.94069672e-08],
       [3.57627869e-07],
       [9.99142587e-01],
       [9.99903381e-01],
       [4.17232513e-06],
       [9.99976933e-01],
       [2.25007534e-05],
       [9.68575478e-06],
       [5.06639481e-07],
       [9.99999881e-01],
       [2.98023224e-08],
       [9.99963701e-01],
       [1.78515911e-05],
       [1.00000000e+00],
       [3.45434248e-02]], dtype=float32)
In [46]:
# Generate the confusion matrix in the validation set
y_true = shuffled_val_y
y_predInceptionV3 = valInceptionV3 > 0.5

confusion_matrix(y_true, y_predInceptionV3)
Out[46]:
array([[110,   8],
       [  9, 121]])
In [47]:
# Calculate accuracy in the validation set
accuracy_InceptionV3 = (confusion_matrix(y_true, y_predInceptionV3)[0, 0] + confusion_matrix(y_true, y_predInceptionV3)[1, 1]) / (confusion_matrix(y_true, y_predInceptionV3)[0, 0] + confusion_matrix(y_true, y_predInceptionV3)[0, 1] + confusion_matrix(y_true, y_predInceptionV3)[1, 0] + confusion_matrix(y_true, y_predInceptionV3)[1, 1])
print('The accuracy in the validation set is {}.'.format(accuracy_InceptionV3))
The accuracy in the validation set is 0.9314516129032258.
In [48]:
# Calculate AUC in the validation set
auc_validInceptionV3 = roc_auc_score(shuffled_val_y, model.predict(shuffled_val_X))
print('The AUC in the validation set is {}.'.format(auc_validInceptionV3))
The AUC in the validation set is 0.9583116036505867.

Performance InceptionV3:

Loss in validation set: 0.5325

Accuracy in validation set: 0.9315

Save InceptionV3

In [0]:
# Serialize model to JSON
model_json = model.to_json()
with open("InceptionV3.json", "w") as json_file:
    json_file.write(model_json)
# Serialize weights to HDF5
model.save_weights("InceptionV3.h5")

Model visualization for InceptionV3

Visualization with class activation map

In [50]:
# Visualize the structure and layers of the model
model.layers
Out[50]:
[<keras.engine.input_layer.InputLayer at 0x7fc4b82d34a8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b82d34e0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b82d3160>,
 <keras.layers.core.Activation at 0x7fc4b82d3fd0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b8bc1dd8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b8375b70>,
 <keras.layers.core.Activation at 0x7fc4b75ab6d8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b841b358>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b8420710>,
 <keras.layers.core.Activation at 0x7fc4b766dc88>,
 <keras.layers.pooling.MaxPooling2D at 0x7fc4b7a7cc50>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b77bc2e8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b78cb898>,
 <keras.layers.core.Activation at 0x7fc4b78cbda0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b780a4a8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b7626978>,
 <keras.layers.core.Activation at 0x7fc4b79c2c50>,
 <keras.layers.pooling.MaxPooling2D at 0x7fc4b73f9470>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b70fc710>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b70774a8>,
 <keras.layers.core.Activation at 0x7fc4b7046898>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b72b8cf8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b6fc6f98>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b7318cc0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b7026048>,
 <keras.layers.core.Activation at 0x7fc4b7248f28>,
 <keras.layers.core.Activation at 0x7fc4b6f5af98>,
 <keras.layers.pooling.AveragePooling2D at 0x7fc4b6e0f748>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b77174a8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b720dbe0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b6f1ebe0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b6e6cef0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b73670f0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b71e16a0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b6ef16a0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b6de37b8>,
 <keras.layers.core.Activation at 0x7fc4b7367fd0>,
 <keras.layers.core.Activation at 0x7fc4b71c1f60>,
 <keras.layers.core.Activation at 0x7fc4b6ed2f60>,
 <keras.layers.core.Activation at 0x7fc4b6d55898>,
 <keras.layers.merge.Concatenate at 0x7fc4b6d234a8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b6a4c3c8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b6a64e48>,
 <keras.layers.core.Activation at 0x7fc4b69839e8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b6c12390>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b69b1630>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b844c2e8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b6922860>,
 <keras.layers.core.Activation at 0x7fc4b74bcc50>,
 <keras.layers.core.Activation at 0x7fc4b6904da0>,
 <keras.layers.pooling.AveragePooling2D at 0x7fc4b673d400>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b6cd1f28>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b79a4128>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b68398d0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b6799b00>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b6c76e80>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b84dd6a0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b6829358>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b6713390>,
 <keras.layers.core.Activation at 0x7fc4b6c62cc0>,
 <keras.layers.core.Activation at 0x7fc4b851dc88>,
 <keras.layers.core.Activation at 0x7fc4b680cc50>,
 <keras.layers.core.Activation at 0x7fc4b667e9e8>,
 <keras.layers.merge.Concatenate at 0x7fc4b66ad438>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b6357390>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b6371e10>,
 <keras.layers.core.Activation at 0x7fc4b62a59b0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b6539908>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b626dd30>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b650ea58>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b61be828>,
 <keras.layers.core.Activation at 0x7fc4b652a7f0>,
 <keras.layers.core.Activation at 0x7fc4b6220d68>,
 <keras.layers.pooling.AveragePooling2D at 0x7fc4b606b3c8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b66ade80>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b6446898>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b6158860>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b604bac8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b6621278>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b63bd2e8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b60d0358>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b5fc5da0>,
 <keras.layers.core.Activation at 0x7fc4b6597c88>,
 <keras.layers.core.Activation at 0x7fc4b641ec18>,
 <keras.layers.core.Activation at 0x7fc4b6131c18>,
 <keras.layers.core.Activation at 0x7fc4b5f3a9b0>,
 <keras.layers.merge.Concatenate at 0x7fc4b5f5fe80>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b5e627f0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b5dd3860>,
 <keras.layers.core.Activation at 0x7fc4b5da3ef0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b5d6a780>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b5ce7240>,
 <keras.layers.core.Activation at 0x7fc4b5cc0b00>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b5f5f550>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b5c062b0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b5f32da0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b5c19cf8>,
 <keras.layers.core.Activation at 0x7fc4b5e427b8>,
 <keras.layers.core.Activation at 0x7fc4b5bd4ba8>,
 <keras.layers.pooling.MaxPooling2D at 0x7fc4b5b0fcc0>,
 <keras.layers.merge.Concatenate at 0x7fc4b5b73dd8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b5720cf8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b56767f0>,
 <keras.layers.core.Activation at 0x7fc4b564ae80>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b5611710>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b562f6d8>,
 <keras.layers.core.Activation at 0x7fc4b55e8400>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b5a6f780>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b54dbc88>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b59c3fd0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b54bdc88>,
 <keras.layers.core.Activation at 0x7fc4b5938e80>,
 <keras.layers.core.Activation at 0x7fc4b547ab00>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b58ff710>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b53b8cf8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b591c6d8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b538e7f0>,
 <keras.layers.core.Activation at 0x7fc4b58d4400>,
 <keras.layers.core.Activation at 0x7fc4b53ec710>,
 <keras.layers.pooling.AveragePooling2D at 0x7fc4b51bd358>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b5b73208>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b57c7c88>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b5328898>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b521ea58>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b5add668>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b582ac88>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b527e748>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b5190d68>,
 <keras.layers.core.Activation at 0x7fc4b5a4de48>,
 <keras.layers.core.Activation at 0x7fc4b57e9b00>,
 <keras.layers.core.Activation at 0x7fc4b529e208>,
 <keras.layers.core.Activation at 0x7fc4b510a978>,
 <keras.layers.merge.Concatenate at 0x7fc4b512e518>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b4cd2588>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b4ca89e8>,
 <keras.layers.core.Activation at 0x7fc4b4c16be0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b4be2828>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b4b5f2b0>,
 <keras.layers.core.Activation at 0x7fc4b4b3cb70>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b4fbc898>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b4a7b320>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b4f929e8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b4a8fda0>,
 <keras.layers.core.Activation at 0x7fc4b4f02be0>,
 <keras.layers.core.Activation at 0x7fc4b4a4cd30>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b4eca828>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b49e9588>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b4e472e8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b493e9e8>,
 <keras.layers.core.Activation at 0x7fc4b4ea3ba8>,
 <keras.layers.core.Activation at 0x7fc4b4960898>,
 <keras.layers.pooling.AveragePooling2D at 0x7fc4b478a4a8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b512ee10>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b4de8320>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b487a940>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b47e7ba8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b50a5240>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b4d7bda0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b486f438>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b4763e80>,
 <keras.layers.core.Activation at 0x7fc4b501a898>,
 <keras.layers.core.Activation at 0x7fc4b4d356a0>,
 <keras.layers.core.Activation at 0x7fc4b4851cf8>,
 <keras.layers.core.Activation at 0x7fc4b46d1f60>,
 <keras.layers.merge.Concatenate at 0x7fc4b469e668>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b42a76d8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b41fbe80>,
 <keras.layers.core.Activation at 0x7fc4b421b1d0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b4136940>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b412d438>,
 <keras.layers.core.Activation at 0x7fc4b410ecf8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b4590048>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b40454a8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b4567e80>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b4065ef0>,
 <keras.layers.core.Activation at 0x7fc4b45051d0>,
 <keras.layers.core.Activation at 0x7fc4b4023e80>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b44a1978>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b3f3c6d8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b43e5710>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b3f14e80>,
 <keras.layers.core.Activation at 0x7fc4b43f8cf8>,
 <keras.layers.core.Activation at 0x7fc4b3f311d0>,
 <keras.layers.pooling.AveragePooling2D at 0x7fc4b3d5c5f8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b467ef28>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b43b1470>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b3e4c978>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b3d38da0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b4671b38>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b434bef0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b3dbf588>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b3cb7080>,
 <keras.layers.core.Activation at 0x7fc4b45ed978>,
 <keras.layers.core.Activation at 0x7fc4b430ae80>,
 <keras.layers.core.Activation at 0x7fc4b3e24e48>,
 <keras.layers.core.Activation at 0x7fc4b3ca0748>,
 <keras.layers.merge.Concatenate at 0x7fc4b3c6e2b0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b37caf60>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b382b048>,
 <keras.layers.core.Activation at 0x7fc4b370ab38>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b37f5828>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b367c588>,
 <keras.layers.core.Activation at 0x7fc4b36e2e48>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b3b30f98>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b36185f8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b3b12048>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b3632b00>,
 <keras.layers.core.Activation at 0x7fc4b3ad09b0>,
 <keras.layers.core.Activation at 0x7fc4b35f3e48>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b3a74a90>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b34dfe48>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b39e4588>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b34c2f98>,
 <keras.layers.core.Activation at 0x7fc4b39cde48>,
 <keras.layers.core.Activation at 0x7fc4b33fbf98>,
 <keras.layers.pooling.AveragePooling2D at 0x7fc4b332d748>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b3c4d668>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b39025f8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b33bebe0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b330aef0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b3bc2240>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b391db00>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b338f6d8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b3286780>,
 <keras.layers.core.Activation at 0x7fc4b3b3bf60>,
 <keras.layers.core.Activation at 0x7fc4b38db080>,
 <keras.layers.core.Activation at 0x7fc4b33efbe0>,
 <keras.layers.core.Activation at 0x7fc4b31f6898>,
 <keras.layers.merge.Concatenate at 0x7fc4b31c3400>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b2fdfcf8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b2fb47f0>,
 <keras.layers.core.Activation at 0x7fc4b2f07e80>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b2ed3710>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b2eee6d8>,
 <keras.layers.core.Activation at 0x7fc4b2eab400>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b31eff60>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b2d9ccc0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b3195390>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b2d7ec88>,
 <keras.layers.core.Activation at 0x7fc4b3105c18>,
 <keras.layers.core.Activation at 0x7fc4b2d3dba8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b3086cc0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b2c78cf8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b30e9c88>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b2c4e7f0>,
 <keras.layers.core.Activation at 0x7fc4b30a6ba8>,
 <keras.layers.core.Activation at 0x7fc4b2cae710>,
 <keras.layers.pooling.MaxPooling2D at 0x7fc4b2d11240>,
 <keras.layers.merge.Concatenate at 0x7fc4b2bc9e80>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b27ee8d0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b26d95f8>,
 <keras.layers.core.Activation at 0x7fc4b276d630>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b2a78828>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b26a92b0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b2a732b0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b263fd30>,
 <keras.layers.core.Activation at 0x7fc4b29bf940>,
 <keras.layers.core.Activation at 0x7fc4b25fc630>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b2946c50>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b289dc50>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b2598518>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b24a8908>,
 <keras.layers.pooling.AveragePooling2D at 0x7fc4b2394400>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b2b81ef0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b29a6c18>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b2873780>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b256f978>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b2422390>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b2394b38>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b2b5d0b8>,
 <keras.layers.core.Activation at 0x7fc4b2964b38>,
 <keras.layers.core.Activation at 0x7fc4b27c7e10>,
 <keras.layers.core.Activation at 0x7fc4b250b898>,
 <keras.layers.core.Activation at 0x7fc4b23efa58>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b228db00>,
 <keras.layers.core.Activation at 0x7fc4b2ae0e48>,
 <keras.layers.merge.Concatenate at 0x7fc4b278c6a0>,
 <keras.layers.merge.Concatenate at 0x7fc4b236dd68>,
 <keras.layers.core.Activation at 0x7fc4b228df98>,
 <keras.layers.merge.Concatenate at 0x7fc4b2206c88>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b1e58160>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b1d9fc88>,
 <keras.layers.core.Activation at 0x7fc4b1d68be0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b21411d0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b1e0d0f0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b2113d68>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b1cdc550>,
 <keras.layers.core.Activation at 0x7fc4b20b7240>,
 <keras.layers.core.Activation at 0x7fc4b1cbdeb8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b2053d68>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b1f61518>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b1bfb668>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b1ac4c18>,
 <keras.layers.pooling.AveragePooling2D at 0x7fc4b19b7518>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b22b1ba8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b20ce320>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b1efaa58>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b1c16b70>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b1b28be0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4b1a5be10>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b2225198>,
 <keras.layers.core.Activation at 0x7fc4b202b710>,
 <keras.layers.core.Activation at 0x7fc4b1ea86a0>,
 <keras.layers.core.Activation at 0x7fc4b1bd50b8>,
 <keras.layers.core.Activation at 0x7fc4b1ae6a90>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4b19488d0>,
 <keras.layers.core.Activation at 0x7fc4b21a0eb8>,
 <keras.layers.merge.Concatenate at 0x7fc4b1e58780>,
 <keras.layers.merge.Concatenate at 0x7fc4b1a1fda0>,
 <keras.layers.core.Activation at 0x7fc4b196da20>,
 <keras.layers.merge.Concatenate at 0x7fc4b190f550>,
 <keras.layers.pooling.GlobalAveragePooling2D at 0x7fc4b192dbe0>,
 <keras.layers.core.Dense at 0x7fc4b82d3f28>,
 <keras.layers.core.Dense at 0x7fc4b087d550>]
In [51]:
# Iterate through the first 8 MRI images in validation set (otherwise there are issues with the amount of space in the output and running time)

# Print title
print('\033[1m' + 'CLASS ACTIVATION MAP IN THE LAST CONVOLUTIONAL LAYER OF THE NEURONAL NETWORK' + '\033[0m' + '\n \n \n \n')

for i in range(8):
  
  # Print real classification of the image
  print('Real classification of the image: {}'.format('TSC' if y_true[i][0]==1 else 'NO TSC'))
  
  # Original image
  plt.subplot(1,3,1)
  plt.imshow(shuffled_val_X[i])
  plt.grid(b=None)
  plt.xticks([])
  plt.yticks([])
  
  # Heat map
  plt.subplot(1,3,2)
  heat_map = visualize_cam(model, layer_idx=300, filter_indices=None, seed_input=shuffled_val_X[i])
  plt.imshow(heat_map)
  plt.grid(b=None)
  plt.xticks([])
  plt.yticks([])
  
  # Heat map superimposed on original image
  plt.subplot(1,3,3)
  plt.imshow(shuffled_val_X[i])
  plt.imshow(heat_map, alpha = 0.8 * valInceptionV3[i][0])
  plt.grid(b=None)
  plt.xticks([])
  plt.yticks([])
  
  # Shot the image
  plt.show()
  
  # Print model classification and model probability of TSC
  print('Model classification of this image: {} \nEstimated probability of tuber(s): {} \n \n \n \n'.format('TSC' if valInceptionV3[i][0]>0.5 else 'NO TSC', valInceptionV3[i][0]))
CLASS ACTIVATION MAP IN THE LAST CONVOLUTIONAL LAYER OF THE NEURONAL NETWORK
 
 
 

Real classification of the image: TSC
Model classification of this image: TSC 
Estimated probability of tuber(s): 0.9999958276748657 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 2.086162567138672e-07 
 
 
 

Real classification of the image: TSC
Model classification of this image: TSC 
Estimated probability of tuber(s): 0.9999999403953552 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 1.817941665649414e-05 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 7.18235969543457e-06 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 0.0031194984912872314 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 3.874301910400391e-06 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 0.0001081228256225586 
 
 
 

ResNet50 training all the layers

This is the ResNet50 neural network initialized with the ImageNet weights.

We did not use the top layer, and we used an output layer with 1 units and a sigmoid activation function.

We added a GlobalAveragePooling2D.

We used Adam optimizer with learning rate of 0.00025.

We used binary cross-entropy as loss function.

We trained the neural network for 100 epochs with a batch size of 64.

In [52]:
# Use ResNet50 as the base model
base_model = ResNet50(weights = 'imagenet', include_top = False, input_shape=(224, 224, 3))

# Get the output of the base model
x = base_model.output

# Add a 2D global average pooling layer
x = GlobalAveragePooling2D()(x)

# Ad a layer for binary classification
predictions = Dense(units = 1, activation = 'sigmoid')(x)

# Define the model to be trained
model = Model(inputs = base_model.input, outputs = predictions)

# Train all layers in the base model
for layer in base_model.layers:
    layer.trainable = True
    
# Compile the model
opt = Adam(lr = 0.00025)
model.compile(optimizer = opt, loss = 'binary_crossentropy', metrics = ['accuracy'])

# Fit and test the model in the validation set
historyResNet50 = model.fit(shuffled_train_X, shuffled_train_y, validation_data = [shuffled_val_X, shuffled_val_y], epochs = 100, batch_size = 64)




print('\n')
print('\n')
# AUC in train and validation set
auc_trainResNet50 = roc_auc_score(shuffled_train_y, model.predict(shuffled_train_X))
print('The AUC in the train set is {}.'.format(auc_trainResNet50))
print('\n')
print('\n')
auc_validResNet50 = roc_auc_score(shuffled_val_y, model.predict(shuffled_val_X))
print('The AUC in the validation set is {}.'.format(auc_validResNet50))

print('\n')
print('\n')
print('\n')
print('\n')

# Plot history of loss during training
plt.plot(historyResNet50.history['loss'], label='Train', color='red')
plt.plot(historyResNet50.history['val_loss'], label='Validation', color='blue')
plt.title('Loss in train and validation set', size=28)
plt.xlabel('Epoch', size=20)
plt.ylabel('Binary cross-entropy loss', size=20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.legend(fontsize=20)
plt.ylim(ymin=0, ymax=2)
plt.grid(b=None)
plt.rcParams['axes.facecolor']='lightgrey'
plt.show()

print('\n')
print('\n')
print('\n')
print('\n')

# Plot history of accuracy
plt.plot(historyResNet50.history['acc'], label='Train', color='red')
plt.plot(historyResNet50.history['val_acc'], label='Validation', color='blue')
plt.title('Accuracy in train and validation set', size=28)
plt.xlabel('Epoch', size=20)
plt.ylabel('Accuracy', size=20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.legend(fontsize=20)
plt.ylim(ymin=0, ymax=1)
plt.grid(b=None)
plt.rcParams['axes.facecolor']='lightgrey'
plt.show()
/usr/local/lib/python3.6/dist-packages/keras_applications/resnet50.py:265: UserWarning: The output shape of `ResNet50(include_top=False)` has been changed since Keras 2.2.0.
  warnings.warn('The output shape of `ResNet50(include_top=False)` '
Downloading data from https://github.com/fchollet/deep-learning-models/releases/download/v0.2/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5
94658560/94653016 [==============================] - 4s 0us/step
Train on 5634 samples, validate on 248 samples
Epoch 1/100
5634/5634 [==============================] - 163s 29ms/step - loss: 0.2067 - acc: 0.9114 - val_loss: 0.3772 - val_acc: 0.8952
Epoch 2/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0740 - acc: 0.9762 - val_loss: 0.8158 - val_acc: 0.8185
Epoch 3/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0155 - acc: 0.9965 - val_loss: 2.7155 - val_acc: 0.6815
Epoch 4/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.1538 - acc: 0.9508 - val_loss: 0.5559 - val_acc: 0.8710
Epoch 5/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0307 - acc: 0.9911 - val_loss: 0.5343 - val_acc: 0.8589
Epoch 6/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0124 - acc: 0.9963 - val_loss: 0.4504 - val_acc: 0.9194
Epoch 7/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0051 - acc: 0.9984 - val_loss: 0.6430 - val_acc: 0.8629
Epoch 8/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0316 - acc: 0.9899 - val_loss: 0.6890 - val_acc: 0.8589
Epoch 9/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0088 - acc: 0.9975 - val_loss: 0.6676 - val_acc: 0.8911
Epoch 10/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0045 - acc: 0.9982 - val_loss: 0.3621 - val_acc: 0.9234
Epoch 11/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0019 - acc: 0.9993 - val_loss: 0.8299 - val_acc: 0.8589
Epoch 12/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0102 - acc: 0.9966 - val_loss: 1.1568 - val_acc: 0.8266
Epoch 13/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0236 - acc: 0.9929 - val_loss: 1.2262 - val_acc: 0.8508
Epoch 14/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.1453 - acc: 0.9569 - val_loss: 1.6840 - val_acc: 0.7823
Epoch 15/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.1147 - acc: 0.9661 - val_loss: 0.4381 - val_acc: 0.8992
Epoch 16/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0146 - acc: 0.9952 - val_loss: 0.5920 - val_acc: 0.8548
Epoch 17/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0053 - acc: 0.9989 - val_loss: 0.6228 - val_acc: 0.8589
Epoch 18/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0078 - acc: 0.9977 - val_loss: 0.5045 - val_acc: 0.8871
Epoch 19/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0035 - acc: 0.9989 - val_loss: 0.7684 - val_acc: 0.8669
Epoch 20/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0017 - acc: 0.9998 - val_loss: 0.6586 - val_acc: 0.8790
Epoch 21/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0018 - acc: 0.9995 - val_loss: 0.6339 - val_acc: 0.8750
Epoch 22/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0021 - acc: 0.9991 - val_loss: 0.6578 - val_acc: 0.8911
Epoch 23/100
5634/5634 [==============================] - 142s 25ms/step - loss: 7.4561e-04 - acc: 0.9998 - val_loss: 0.6507 - val_acc: 0.8871
Epoch 24/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0093 - acc: 0.9980 - val_loss: 0.9829 - val_acc: 0.8226
Epoch 25/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0079 - acc: 0.9977 - val_loss: 0.6332 - val_acc: 0.8629
Epoch 26/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0017 - acc: 0.9998 - val_loss: 0.6092 - val_acc: 0.8669
Epoch 27/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0011 - acc: 0.9996 - val_loss: 0.8176 - val_acc: 0.8871
Epoch 28/100
5634/5634 [==============================] - 142s 25ms/step - loss: 3.5340e-04 - acc: 1.0000 - val_loss: 0.5349 - val_acc: 0.9234
Epoch 29/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0390 - acc: 0.9885 - val_loss: 0.6193 - val_acc: 0.8750
Epoch 30/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0886 - acc: 0.9707 - val_loss: 0.5615 - val_acc: 0.8226
Epoch 31/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0142 - acc: 0.9957 - val_loss: 0.6533 - val_acc: 0.8065
Epoch 32/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0058 - acc: 0.9989 - val_loss: 0.5322 - val_acc: 0.8790
Epoch 33/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0072 - acc: 0.9988 - val_loss: 1.1146 - val_acc: 0.7984
Epoch 34/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.1091 - acc: 0.9615 - val_loss: 1.6583 - val_acc: 0.7621
Epoch 35/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0198 - acc: 0.9936 - val_loss: 0.3405 - val_acc: 0.8790
Epoch 36/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0792 - acc: 0.9714 - val_loss: 0.3451 - val_acc: 0.8750
Epoch 37/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0603 - acc: 0.9808 - val_loss: 1.0921 - val_acc: 0.7782
Epoch 38/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0894 - acc: 0.9705 - val_loss: 0.4341 - val_acc: 0.9032
Epoch 39/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0928 - acc: 0.9686 - val_loss: 1.2698 - val_acc: 0.8185
Epoch 40/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0197 - acc: 0.9949 - val_loss: 0.7194 - val_acc: 0.8266
Epoch 41/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0093 - acc: 0.9975 - val_loss: 0.3528 - val_acc: 0.9073
Epoch 42/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0352 - acc: 0.9885 - val_loss: 0.4178 - val_acc: 0.9073
Epoch 43/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0364 - acc: 0.9885 - val_loss: 0.4352 - val_acc: 0.8669
Epoch 44/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0938 - acc: 0.9714 - val_loss: 0.5019 - val_acc: 0.8831
Epoch 45/100
5634/5634 [==============================] - 141s 25ms/step - loss: 0.0131 - acc: 0.9966 - val_loss: 0.3278 - val_acc: 0.9234
Epoch 46/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0066 - acc: 0.9991 - val_loss: 0.3780 - val_acc: 0.9073
Epoch 47/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0681 - acc: 0.9787 - val_loss: 0.5900 - val_acc: 0.8790
Epoch 48/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0129 - acc: 0.9965 - val_loss: 0.3601 - val_acc: 0.9073
Epoch 49/100
5634/5634 [==============================] - 141s 25ms/step - loss: 0.0322 - acc: 0.9902 - val_loss: 0.4849 - val_acc: 0.8831
Epoch 50/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0066 - acc: 0.9986 - val_loss: 0.4893 - val_acc: 0.8831
Epoch 51/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0031 - acc: 0.9993 - val_loss: 0.5685 - val_acc: 0.8871
Epoch 52/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0040 - acc: 0.9991 - val_loss: 2.5807 - val_acc: 0.7056
Epoch 53/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.2123 - acc: 0.9347 - val_loss: 2.1064 - val_acc: 0.7419
Epoch 54/100
5634/5634 [==============================] - 141s 25ms/step - loss: 0.0585 - acc: 0.9830 - val_loss: 0.5527 - val_acc: 0.8750
Epoch 55/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0294 - acc: 0.9920 - val_loss: 0.5008 - val_acc: 0.8831
Epoch 56/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0120 - acc: 0.9968 - val_loss: 0.4889 - val_acc: 0.8992
Epoch 57/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0055 - acc: 1.0000 - val_loss: 0.4503 - val_acc: 0.8992
Epoch 58/100
5634/5634 [==============================] - 141s 25ms/step - loss: 0.0040 - acc: 0.9995 - val_loss: 0.4491 - val_acc: 0.9032
Epoch 59/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0432 - acc: 0.9881 - val_loss: 0.5549 - val_acc: 0.8831
Epoch 60/100
5634/5634 [==============================] - 141s 25ms/step - loss: 0.0817 - acc: 0.9750 - val_loss: 0.7035 - val_acc: 0.8508
Epoch 61/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0168 - acc: 0.9950 - val_loss: 0.4943 - val_acc: 0.9234
Epoch 62/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0076 - acc: 0.9980 - val_loss: 0.6359 - val_acc: 0.8911
Epoch 63/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0483 - acc: 0.9840 - val_loss: 0.4690 - val_acc: 0.9032
Epoch 64/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0184 - acc: 0.9961 - val_loss: 0.4919 - val_acc: 0.9073
Epoch 65/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0089 - acc: 0.9989 - val_loss: 0.4675 - val_acc: 0.9073
Epoch 66/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0064 - acc: 0.9989 - val_loss: 0.7971 - val_acc: 0.8508
Epoch 67/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0754 - acc: 0.9746 - val_loss: 0.6119 - val_acc: 0.8185
Epoch 68/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0292 - acc: 0.9909 - val_loss: 0.3908 - val_acc: 0.9194
Epoch 69/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0065 - acc: 0.9995 - val_loss: 0.4233 - val_acc: 0.9194
Epoch 70/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0053 - acc: 0.9996 - val_loss: 0.4832 - val_acc: 0.9073
Epoch 71/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0571 - acc: 0.9821 - val_loss: 0.4148 - val_acc: 0.8831
Epoch 72/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0086 - acc: 0.9986 - val_loss: 0.4979 - val_acc: 0.8952
Epoch 73/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0896 - acc: 0.9700 - val_loss: 1.2608 - val_acc: 0.7661
Epoch 74/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0415 - acc: 0.9854 - val_loss: 0.4759 - val_acc: 0.8629
Epoch 75/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0491 - acc: 0.9853 - val_loss: 0.4427 - val_acc: 0.8831
Epoch 76/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0097 - acc: 0.9979 - val_loss: 0.4732 - val_acc: 0.8871
Epoch 77/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0048 - acc: 0.9995 - val_loss: 0.4601 - val_acc: 0.9113
Epoch 78/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0336 - acc: 0.9888 - val_loss: 0.4512 - val_acc: 0.9153
Epoch 79/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0360 - acc: 0.9890 - val_loss: 0.9307 - val_acc: 0.8387
Epoch 80/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0070 - acc: 0.9993 - val_loss: 0.6665 - val_acc: 0.8871
Epoch 81/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0031 - acc: 0.9998 - val_loss: 0.5242 - val_acc: 0.9073
Epoch 82/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0024 - acc: 0.9996 - val_loss: 0.4669 - val_acc: 0.8992
Epoch 83/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0016 - acc: 1.0000 - val_loss: 0.4589 - val_acc: 0.9032
Epoch 84/100
5634/5634 [==============================] - 141s 25ms/step - loss: 0.0012 - acc: 1.0000 - val_loss: 0.4746 - val_acc: 0.9032
Epoch 85/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0014 - acc: 0.9998 - val_loss: 0.4530 - val_acc: 0.9073
Epoch 86/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0033 - acc: 0.9996 - val_loss: 0.4802 - val_acc: 0.9032
Epoch 87/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0651 - acc: 0.9759 - val_loss: 0.4809 - val_acc: 0.8911
Epoch 88/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0120 - acc: 0.9970 - val_loss: 0.7577 - val_acc: 0.8468
Epoch 89/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0657 - acc: 0.9755 - val_loss: 0.5297 - val_acc: 0.8750
Epoch 90/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0110 - acc: 0.9970 - val_loss: 0.6639 - val_acc: 0.8508
Epoch 91/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0066 - acc: 0.9984 - val_loss: 0.4108 - val_acc: 0.9355
Epoch 92/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0028 - acc: 0.9996 - val_loss: 0.4385 - val_acc: 0.9274
Epoch 93/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0025 - acc: 0.9996 - val_loss: 0.5943 - val_acc: 0.8790
Epoch 94/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0619 - acc: 0.9789 - val_loss: 0.4774 - val_acc: 0.9153
Epoch 95/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0072 - acc: 0.9986 - val_loss: 0.3980 - val_acc: 0.9395
Epoch 96/100
5634/5634 [==============================] - 141s 25ms/step - loss: 0.0331 - acc: 0.9860 - val_loss: 0.4290 - val_acc: 0.9234
Epoch 97/100
5634/5634 [==============================] - 141s 25ms/step - loss: 0.0066 - acc: 0.9988 - val_loss: 0.5175 - val_acc: 0.9073
Epoch 98/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0260 - acc: 0.9911 - val_loss: 0.4668 - val_acc: 0.9274
Epoch 99/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0052 - acc: 0.9993 - val_loss: 0.4755 - val_acc: 0.9234
Epoch 100/100
5634/5634 [==============================] - 142s 25ms/step - loss: 0.0037 - acc: 0.9993 - val_loss: 0.5400 - val_acc: 0.9032




The AUC in the train set is 1.0.




The AUC in the validation set is 0.95622555410691.








/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_base.py:3604: MatplotlibDeprecationWarning: 
The `ymin` argument was deprecated in Matplotlib 3.0 and will be removed in 3.2. Use `bottom` instead.
  alternative='`bottom`', obj_type='argument')
/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_base.py:3610: MatplotlibDeprecationWarning: 
The `ymax` argument was deprecated in Matplotlib 3.0 and will be removed in 3.2. Use `top` instead.
  alternative='`top`', obj_type='argument')







In [53]:
# Generate predictions in the form of probabilities in the validation set
valResNet50 = model.predict(shuffled_val_X, batch_size = 16)
valResNet50
Out[53]:
array([[9.99999404e-01],
       [1.07586384e-05],
       [9.97792125e-01],
       [9.62793827e-04],
       [2.83122063e-05],
       [7.95381069e-02],
       [4.51052189e-03],
       [1.00645423e-03],
       [7.95722008e-06],
       [1.31130219e-06],
       [3.42726707e-06],
       [9.18146014e-01],
       [9.93441343e-01],
       [4.65338230e-02],
       [9.99922276e-01],
       [9.99936581e-01],
       [9.98574913e-01],
       [1.00000000e+00],
       [3.20255756e-04],
       [0.00000000e+00],
       [8.58306885e-06],
       [9.97524738e-01],
       [9.89020705e-01],
       [8.41592252e-02],
       [2.76598334e-03],
       [3.54647636e-06],
       [6.35733724e-01],
       [9.97088075e-01],
       [9.87824917e-01],
       [9.97691810e-01],
       [2.43186951e-05],
       [1.79607451e-01],
       [8.36814642e-02],
       [9.98739183e-01],
       [9.98200059e-01],
       [9.99981046e-01],
       [1.23679638e-05],
       [4.64498997e-04],
       [4.61935997e-05],
       [6.39557838e-05],
       [4.41369414e-03],
       [7.07968175e-02],
       [9.99374270e-01],
       [1.65104866e-05],
       [8.91089439e-06],
       [9.99984503e-01],
       [9.88527656e-01],
       [7.33554363e-04],
       [0.00000000e+00],
       [9.99928474e-01],
       [1.22293830e-03],
       [0.00000000e+00],
       [9.93325830e-01],
       [9.87671494e-01],
       [1.72257423e-04],
       [9.89087105e-01],
       [9.98506546e-01],
       [1.51574612e-04],
       [1.91993713e-02],
       [9.96030092e-01],
       [5.20724058e-03],
       [9.76192355e-01],
       [6.26112938e-01],
       [2.32458115e-06],
       [9.99916196e-01],
       [9.99921441e-01],
       [8.44602048e-01],
       [9.99966860e-01],
       [9.99979615e-01],
       [9.99975085e-01],
       [8.93457532e-01],
       [1.00000000e+00],
       [3.59645486e-03],
       [8.79551232e-01],
       [9.99829054e-01],
       [1.00000000e+00],
       [4.58036065e-02],
       [2.57678926e-01],
       [7.39807904e-01],
       [9.99283552e-01],
       [9.88868356e-01],
       [9.99919891e-01],
       [1.69068575e-04],
       [9.65640187e-01],
       [1.92403793e-03],
       [1.00000000e+00],
       [9.99827504e-01],
       [9.99669313e-01],
       [9.93559718e-01],
       [2.25603580e-05],
       [1.00000000e+00],
       [9.53878164e-01],
       [1.63912773e-06],
       [0.00000000e+00],
       [9.96801019e-01],
       [9.99994159e-01],
       [9.99998689e-01],
       [9.98926044e-01],
       [9.99997973e-01],
       [0.00000000e+00],
       [9.64801073e-01],
       [5.40345907e-04],
       [0.00000000e+00],
       [1.37388706e-04],
       [9.99996662e-01],
       [6.33001328e-05],
       [4.16070223e-04],
       [6.55233860e-04],
       [9.99998212e-01],
       [3.30805779e-06],
       [0.00000000e+00],
       [9.99989867e-01],
       [5.93274832e-04],
       [2.86102295e-06],
       [9.99577463e-01],
       [1.76131725e-05],
       [0.00000000e+00],
       [7.40289688e-05],
       [1.75788999e-03],
       [9.99967158e-01],
       [9.97035325e-01],
       [2.22325325e-05],
       [2.17193365e-03],
       [5.61475754e-05],
       [9.99994278e-01],
       [4.86969948e-05],
       [9.99999881e-01],
       [5.56963384e-02],
       [8.73506069e-05],
       [5.33705175e-01],
       [9.83988643e-01],
       [9.97231722e-01],
       [9.99998569e-01],
       [0.00000000e+00],
       [4.62828159e-01],
       [0.00000000e+00],
       [9.96975422e-01],
       [9.97527480e-01],
       [1.78813934e-07],
       [9.99985576e-01],
       [3.83883715e-04],
       [3.57627869e-07],
       [0.00000000e+00],
       [1.06841326e-04],
       [3.04283619e-01],
       [9.55590606e-03],
       [1.00000000e+00],
       [5.78731298e-04],
       [5.71459532e-04],
       [1.07288361e-06],
       [9.99784112e-01],
       [9.95856166e-01],
       [9.99997675e-01],
       [3.46980095e-02],
       [8.75789285e-01],
       [9.99999702e-01],
       [9.99691963e-01],
       [1.90138817e-05],
       [2.41699219e-02],
       [4.82499599e-05],
       [9.99905586e-01],
       [7.21955299e-03],
       [3.78694236e-02],
       [1.36315823e-04],
       [1.80271268e-03],
       [0.00000000e+00],
       [5.14984131e-05],
       [9.99979377e-01],
       [2.27689743e-05],
       [2.02506781e-04],
       [1.17571354e-02],
       [1.37388706e-05],
       [6.56411648e-02],
       [3.06963921e-06],
       [3.37793112e-01],
       [1.23003125e-03],
       [0.00000000e+00],
       [0.00000000e+00],
       [1.00000000e+00],
       [3.29583883e-04],
       [9.99391973e-01],
       [9.99998450e-01],
       [9.99999881e-01],
       [4.17083502e-04],
       [8.75548959e-01],
       [1.75833702e-06],
       [9.97560024e-01],
       [2.43246555e-04],
       [8.98641944e-01],
       [1.23083591e-05],
       [6.00296259e-03],
       [1.25075012e-01],
       [9.99407530e-01],
       [1.00000000e+00],
       [9.66776371e-01],
       [3.83555889e-05],
       [6.03497028e-05],
       [9.98330534e-01],
       [1.44243240e-04],
       [9.95040953e-01],
       [1.01238489e-04],
       [9.99183774e-01],
       [9.93245125e-01],
       [1.08093023e-04],
       [1.00000000e+00],
       [3.33786011e-06],
       [1.87134743e-03],
       [4.05472577e-01],
       [9.92331624e-01],
       [9.96828318e-01],
       [9.99104202e-01],
       [9.99910474e-01],
       [3.85183990e-02],
       [6.55651093e-07],
       [1.69873238e-05],
       [3.65376472e-05],
       [9.99650598e-01],
       [2.59280205e-06],
       [3.27070057e-02],
       [1.07735395e-04],
       [9.92743731e-01],
       [8.06938171e-01],
       [9.99999881e-01],
       [1.45936608e-02],
       [9.99988198e-01],
       [9.99204040e-01],
       [0.00000000e+00],
       [9.97954130e-01],
       [1.14023685e-04],
       [4.31537628e-05],
       [0.00000000e+00],
       [2.24798918e-04],
       [9.99926686e-01],
       [4.82529402e-04],
       [1.69873238e-05],
       [3.81839484e-01],
       [9.99997854e-01],
       [9.52482224e-05],
       [9.97677386e-01],
       [1.65611506e-04],
       [2.90870667e-05],
       [1.47193670e-04],
       [9.99999523e-01],
       [5.90085983e-06],
       [9.99439299e-01],
       [1.78813934e-07],
       [1.00000000e+00],
       [2.44858861e-03]], dtype=float32)
In [54]:
# Generate the confusion matrix in the validation set
y_true = shuffled_val_y
y_predResNet50 = valResNet50 > 0.5

confusion_matrix(y_true, y_predResNet50)
Out[54]:
array([[115,   3],
       [ 21, 109]])
In [55]:
# Calculate accuracy in the validation set
accuracy_ResNet50 = (confusion_matrix(y_true, y_predResNet50)[0, 0] + confusion_matrix(y_true, y_predResNet50)[1, 1]) / (confusion_matrix(y_true, y_predResNet50)[0, 0] + confusion_matrix(y_true, y_predResNet50)[0, 1] + confusion_matrix(y_true, y_predResNet50)[1, 0] + confusion_matrix(y_true, y_predResNet50)[1, 1])
print('The accuracy in the validation set is {}.'.format(accuracy_ResNet50))
The accuracy in the validation set is 0.9032258064516129.
In [56]:
# Calculate AUC in the validation set
auc_validResNet50 = roc_auc_score(shuffled_val_y, model.predict(shuffled_val_X))
print('The AUC in the validation set is {}.'.format(auc_validResNet50))
The AUC in the validation set is 0.95622555410691.

Performance ResNet50:

Loss in validation set: 0.5400

Accuracy in validation set: 0.9032

Save ResNet50

In [0]:
# Serialize model to JSON
model_json = model.to_json()
with open("ResNet50.json", "w") as json_file:
    json_file.write(model_json)
# Serialize weights to HDF5
model.save_weights("ResNet50.h5")

Model visualization for ResNet50

Visualization with class activation map

In [58]:
# Visualize the structure and layers of the model
model.layers
Out[58]:
[<keras.engine.input_layer.InputLayer at 0x7fc499a67e80>,
 <keras.layers.convolutional.ZeroPadding2D at 0x7fc499a67f98>,
 <keras.layers.convolutional.Conv2D at 0x7fc499a67fd0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc499a6a588>,
 <keras.layers.core.Activation at 0x7fc499a6a6d8>,
 <keras.layers.convolutional.ZeroPadding2D at 0x7fc499a64ac8>,
 <keras.layers.pooling.MaxPooling2D at 0x7fc499a64b70>,
 <keras.layers.convolutional.Conv2D at 0x7fc499a0cda0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc49995d470>,
 <keras.layers.core.Activation at 0x7fc49995df60>,
 <keras.layers.convolutional.Conv2D at 0x7fc49997ca20>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4998cda90>,
 <keras.layers.core.Activation at 0x7fc4998eaa20>,
 <keras.layers.convolutional.Conv2D at 0x7fc499803cf8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4997f73c8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc499836b70>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4996c3860>,
 <keras.layers.merge.Add at 0x7fc499683d68>,
 <keras.layers.core.Activation at 0x7fc49963c4a8>,
 <keras.layers.convolutional.Conv2D at 0x7fc49963c5c0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc499592d30>,
 <keras.layers.core.Activation at 0x7fc49950ea20>,
 <keras.layers.convolutional.Conv2D at 0x7fc4994cb2e8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4994e22e8>,
 <keras.layers.core.Activation at 0x7fc49949e9e8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4993d84e0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc49934e198>,
 <keras.layers.merge.Add at 0x7fc49935cb70>,
 <keras.layers.core.Activation at 0x7fc4992e66d8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4992e65f8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc499258358>,
 <keras.layers.core.Activation at 0x7fc499227668>,
 <keras.layers.convolutional.Conv2D at 0x7fc4991f3fd0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc499163630>,
 <keras.layers.core.Activation at 0x7fc49911c5f8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4990fadd8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc499051ac8>,
 <keras.layers.merge.Add at 0x7fc4990729e8>,
 <keras.layers.core.Activation at 0x7fc498f887b8>,
 <keras.layers.convolutional.Conv2D at 0x7fc498f88c50>,
 <keras.layers.normalization.BatchNormalization at 0x7fc498f7bba8>,
 <keras.layers.core.Activation at 0x7fc498ef7898>,
 <keras.layers.convolutional.Conv2D at 0x7fc498e6af28>,
 <keras.layers.normalization.BatchNormalization at 0x7fc498e4be48>,
 <keras.layers.core.Activation at 0x7fc498e0c518>,
 <keras.layers.convolutional.Conv2D at 0x7fc498d45320>,
 <keras.layers.convolutional.Conv2D at 0x7fc498d1c9e8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc498d5d438>,
 <keras.layers.normalization.BatchNormalization at 0x7fc498c69dd8>,
 <keras.layers.merge.Add at 0x7fc498c24518>,
 <keras.layers.core.Activation at 0x7fc498b60400>,
 <keras.layers.convolutional.Conv2D at 0x7fc498b60a58>,
 <keras.layers.normalization.BatchNormalization at 0x7fc498b31748>,
 <keras.layers.core.Activation at 0x7fc498aa4eb8>,
 <keras.layers.convolutional.Conv2D at 0x7fc498a6fe10>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4989dd3c8>,
 <keras.layers.core.Activation at 0x7fc498997588>,
 <keras.layers.convolutional.Conv2D at 0x7fc498976fd0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4988e9550>,
 <keras.layers.merge.Add at 0x7fc4988a52e8>,
 <keras.layers.core.Activation at 0x7fc498804550>,
 <keras.layers.convolutional.Conv2D at 0x7fc4988380b8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4987fa748>,
 <keras.layers.core.Activation at 0x7fc498711908>,
 <keras.layers.convolutional.Conv2D at 0x7fc4986e6cc0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4986c6be0>,
 <keras.layers.core.Activation at 0x7fc498686470>,
 <keras.layers.convolutional.Conv2D at 0x7fc4985eff60>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4985d3da0>,
 <keras.layers.merge.Add at 0x7fc498593470>,
 <keras.layers.core.Activation at 0x7fc4984c92b0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4984c98d0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4984a1f98>,
 <keras.layers.core.Activation at 0x7fc49840ed30>,
 <keras.layers.convolutional.Conv2D at 0x7fc4983d55f8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc498349278>,
 <keras.layers.core.Activation at 0x7fc49835ae80>,
 <keras.layers.convolutional.Conv2D at 0x7fc4982e7e10>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4982523c8>,
 <keras.layers.merge.Add at 0x7fc498267e48>,
 <keras.layers.core.Activation at 0x7fc4981ef358>,
 <keras.layers.convolutional.Conv2D at 0x7fc4981eff60>,
 <keras.layers.normalization.BatchNormalization at 0x7fc498160588>,
 <keras.layers.core.Activation at 0x7fc4981349e8>,
 <keras.layers.convolutional.Conv2D at 0x7fc49804fda0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4980ae9b0>,
 <keras.layers.core.Activation at 0x7fc497f888d0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4981ef7f0>,
 <keras.layers.convolutional.Conv2D at 0x7fc497f00438>,
 <keras.layers.normalization.BatchNormalization at 0x7fc497fbebe0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc497e4d8d0>,
 <keras.layers.merge.Add at 0x7fc497e0ed30>,
 <keras.layers.core.Activation at 0x7fc497d48550>,
 <keras.layers.convolutional.Conv2D at 0x7fc497d48b70>,
 <keras.layers.normalization.BatchNormalization at 0x7fc497cccf98>,
 <keras.layers.core.Activation at 0x7fc497d3d2e8>,
 <keras.layers.convolutional.Conv2D at 0x7fc497c21c18>,
 <keras.layers.normalization.BatchNormalization at 0x7fc497c03b38>,
 <keras.layers.core.Activation at 0x7fc497bc2390>,
 <keras.layers.convolutional.Conv2D at 0x7fc497b2ceb8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc497b10cf8>,
 <keras.layers.merge.Add at 0x7fc497ad0550>,
 <keras.layers.core.Activation at 0x7fc497a05208>,
 <keras.layers.convolutional.Conv2D at 0x7fc497a05828>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4979dcf60>,
 <keras.layers.core.Activation at 0x7fc497949780>,
 <keras.layers.convolutional.Conv2D at 0x7fc49792dbe0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4978bc2b0>,
 <keras.layers.core.Activation at 0x7fc4978836a0>,
 <keras.layers.convolutional.Conv2D at 0x7fc49781ee48>,
 <keras.layers.normalization.BatchNormalization at 0x7fc497750828>,
 <keras.layers.merge.Add at 0x7fc4977938d0>,
 <keras.layers.core.Activation at 0x7fc497730cc0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4976c9390>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4976a1c18>,
 <keras.layers.core.Activation at 0x7fc49760e748>,
 <keras.layers.convolutional.Conv2D at 0x7fc4975d9fd0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc49754e390>,
 <keras.layers.core.Activation at 0x7fc49755df28>,
 <keras.layers.convolutional.Conv2D at 0x7fc4974eaef0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4974564a8>,
 <keras.layers.merge.Add at 0x7fc49740f780>,
 <keras.layers.core.Activation at 0x7fc4973f2208>,
 <keras.layers.convolutional.Conv2D at 0x7fc4973a42b0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc49731e8d0>,
 <keras.layers.core.Activation at 0x7fc4972db048>,
 <keras.layers.convolutional.Conv2D at 0x7fc49729c320>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4972b52e8>,
 <keras.layers.core.Activation at 0x7fc4972739e8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4971aa4e0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc49711f198>,
 <keras.layers.merge.Add at 0x7fc49712db70>,
 <keras.layers.core.Activation at 0x7fc4970b96a0>,
 <keras.layers.convolutional.Conv2D at 0x7fc4970b95c0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc496fe1518>,
 <keras.layers.core.Activation at 0x7fc496ff8f98>,
 <keras.layers.convolutional.Conv2D at 0x7fc496f16d30>,
 <keras.layers.normalization.BatchNormalization at 0x7fc496f76c50>,
 <keras.layers.core.Activation at 0x7fc496e90240>,
 <keras.layers.convolutional.Conv2D at 0x7fc496e20fd0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc496e04e10>,
 <keras.layers.merge.Add at 0x7fc496dc44e0>,
 <keras.layers.core.Activation at 0x7fc496d7a320>,
 <keras.layers.convolutional.Conv2D at 0x7fc496d7a940>,
 <keras.layers.normalization.BatchNormalization at 0x7fc496cd2860>,
 <keras.layers.core.Activation at 0x7fc496cbcbe0>,
 <keras.layers.convolutional.Conv2D at 0x7fc496c1ecc0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc496bdca58>,
 <keras.layers.core.Activation at 0x7fc496bfa978>,
 <keras.layers.convolutional.Conv2D at 0x7fc496ae7f28>,
 <keras.layers.convolutional.Conv2D at 0x7fc496a208d0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc496ac59e8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4969d3748>,
 <keras.layers.merge.Add at 0x7fc496993be0>,
 <keras.layers.core.Activation at 0x7fc4968ce3c8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4968ce9e8>,
 <keras.layers.normalization.BatchNormalization at 0x7fc49689f710>,
 <keras.layers.core.Activation at 0x7fc496810c50>,
 <keras.layers.convolutional.Conv2D at 0x7fc4967d9e48>,
 <keras.layers.normalization.BatchNormalization at 0x7fc4967afe80>,
 <keras.layers.core.Activation at 0x7fc49674b9e8>,
 <keras.layers.convolutional.Conv2D at 0x7fc4966bbc18>,
 <keras.layers.normalization.BatchNormalization at 0x7fc496698b38>,
 <keras.layers.merge.Add at 0x7fc496657390>,
 <keras.layers.core.Activation at 0x7fc49658f0f0>,
 <keras.layers.convolutional.Conv2D at 0x7fc49658f668>,
 <keras.layers.normalization.BatchNormalization at 0x7fc496567ba8>,
 <keras.layers.core.Activation at 0x7fc4964d68d0>,
 <keras.layers.convolutional.Conv2D at 0x7fc49ad106a0>,
 <keras.layers.normalization.BatchNormalization at 0x7fc49ad6f208>,
 <keras.layers.core.Activation at 0x7fc4b82e5b70>,
 <keras.layers.convolutional.Conv2D at 0x7fc499b1c860>,
 <keras.layers.normalization.BatchNormalization at 0x7fc499b86ef0>,
 <keras.layers.merge.Add at 0x7fc499c12748>,
 <keras.layers.core.Activation at 0x7fc4b83eb128>,
 <keras.layers.pooling.GlobalAveragePooling2D at 0x7fc4b82d3940>,
 <keras.layers.core.Dense at 0x7fc499a67e48>]
In [59]:
# Iterate through the first 8 MRI images in validation set (otherwise there are issues with the amount of space in the output and running time)

# Print title
print('\033[1m' + 'CLASS ACTIVATION MAP IN THE LAST CONVOLUTIONAL LAYER OF THE NEURONAL NETWORK' + '\033[0m' + '\n \n \n \n')

for i in range(8):
  
  # Print real classification of the image
  print('Real classification of the image: {}'.format('TSC' if y_true[i][0]==1 else 'NO TSC'))
  
  # Original image
  plt.subplot(1,3,1)
  plt.imshow(shuffled_val_X[i])
  plt.grid(b=None)
  plt.xticks([])
  plt.yticks([])
  
  # Heat map
  plt.subplot(1,3,2)
  heat_map = visualize_cam(model, layer_idx=171, filter_indices=None, seed_input=shuffled_val_X[i])
  plt.imshow(heat_map)
  plt.grid(b=None)
  plt.xticks([])
  plt.yticks([])
  
  # Heat map superimposed on original image
  plt.subplot(1,3,3)
  plt.imshow(shuffled_val_X[i])
  plt.imshow(heat_map, alpha = 0.8 * valResNet50[i][0])
  plt.grid(b=None)
  plt.xticks([])
  plt.yticks([])
  
  # Shot the image
  plt.show()
  
  # Print model classification and model probability of TSC
  print('Model classification of this image: {} \nEstimated probability of tuber(s): {} \n \n \n \n'.format('TSC' if valResNet50[i][0]>0.5 else 'NO TSC', valResNet50[i][0]))
CLASS ACTIVATION MAP IN THE LAST CONVOLUTIONAL LAYER OF THE NEURONAL NETWORK
 
 
 

Real classification of the image: TSC
Model classification of this image: TSC 
Estimated probability of tuber(s): 0.9999994039535522 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 1.0758638381958008e-05 
 
 
 

Real classification of the image: TSC
Model classification of this image: TSC 
Estimated probability of tuber(s): 0.99779212474823 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 0.0009627938270568848 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 2.8312206268310547e-05 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 0.07953810691833496 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 0.00451052188873291 
 
 
 

Real classification of the image: NO TSC
Model classification of this image: NO TSC 
Estimated probability of tuber(s): 0.0010064542293548584