{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from keras.callbacks import ReduceLROnPlateau, EarlyStopping\nimport tensorflow as tf\nfrom sklearn.preprocessing import LabelEncoder\nfrom keras.models import load_model\nfrom keras.applications.xception import Xception\nimport time\nimport seaborn as sns\nfrom sklearn.metrics import roc_curve\nfrom sklearn.metrics import auc\nfrom sklearn.model_selection import *\nfrom keras.preprocessing.image import ImageDataGenerator \nfrom keras.applications.vgg16 import VGG16\nfrom keras.layers import Conv2D, MaxPool2D, Dense, Flatten, Dropout, BatchNormalization, Input\nfrom keras.models import Sequential, Model\nimport numpy as np\nfrom sklearn.metrics import cohen_kappa_score\nfrom sklearn.metrics import confusion_matrix\nimport keras.backend as K\nimport tensorflow as tf\nfrom keras.optimizers import SGD\nimport matplotlib.pyplot as plt\n\nfrom numpy.random import seed\nseed(1)\nimport pandas as pd\nimport openslide","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-09-01T02:08:26.342861Z","iopub.execute_input":"2021-09-01T02:08:26.343313Z","iopub.status.idle":"2021-09-01T02:08:31.799316Z","shell.execute_reply.started":"2021-09-01T02:08:26.343217Z","shell.execute_reply":"2021-09-01T02:08:31.798418Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pathlib\n\ndef create_df(data_dir):\n    data=[]\n    labels=[]\n    directorio = pathlib.Path(data_dir)\n    for fichero in directorio.iterdir():\n        data.append(data_dir+fichero.name)\n\n        lbl=train[(train['image_id'] == fichero.name[:32])]\n        labels.append(lbl['gleason_score'].unique()[0])\n\n    df=pd.DataFrame(data)\n    df.columns=['images']\n    df['gleason_score']=labels\n    return df\n    ","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:08:31.802591Z","iopub.execute_input":"2021-09-01T02:08:31.802842Z","iopub.status.idle":"2021-09-01T02:08:31.809909Z","shell.execute_reply.started":"2021-09-01T02:08:31.802818Z","shell.execute_reply":"2021-09-01T02:08:31.809057Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train=pd.read_csv('/kaggle/input/prostate-cancer-grade-assessment/train.csv')\ntrain.head()","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:08:31.811719Z","iopub.execute_input":"2021-09-01T02:08:31.812136Z","iopub.status.idle":"2021-09-01T02:08:31.869187Z","shell.execute_reply.started":"2021-09-01T02:08:31.812106Z","shell.execute_reply":"2021-09-01T02:08:31.868221Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Eliminacion de elementos mal etiquetados","metadata":{}},{"cell_type":"code","source":"train.drop([7273],inplace=True)\n\ntrain['gleason_score'] = train['gleason_score'].apply(\n    lambda x: \"0+0\" if x==\"negative\" else x)","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:08:31.870923Z","iopub.execute_input":"2021-09-01T02:08:31.871303Z","iopub.status.idle":"2021-09-01T02:08:31.882084Z","shell.execute_reply.started":"2021-09-01T02:08:31.871265Z","shell.execute_reply":"2021-09-01T02:08:31.881251Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['gleason_score'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:08:31.883262Z","iopub.execute_input":"2021-09-01T02:08:31.883599Z","iopub.status.idle":"2021-09-01T02:08:31.894104Z","shell.execute_reply.started":"2021-09-01T02:08:31.883564Z","shell.execute_reply":"2021-09-01T02:08:31.89307Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dataset de entrenamiento creado","metadata":{}},{"cell_type":"markdown","source":"**mypandataset** contiene las imagenes de entrenamiento, validacion y prueba habiendo balanceado las imagenes del **prostate-cancer-grade-assessment** dataset teniendo un minimo de 43 imagenes por clase. El numero de clases en total es de 10 por cada categoria de Gleason.","metadata":{}},{"cell_type":"code","source":"train_dir = '../input/mypandadataset/train/'\ntrain_df = create_df(train_dir)\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:08:31.895643Z","iopub.execute_input":"2021-09-01T02:08:31.896114Z","iopub.status.idle":"2021-09-01T02:08:32.660948Z","shell.execute_reply.started":"2021-09-01T02:08:31.896078Z","shell.execute_reply":"2021-09-01T02:08:32.660024Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['gleason_score'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:08:32.662359Z","iopub.execute_input":"2021-09-01T02:08:32.662711Z","iopub.status.idle":"2021-09-01T02:08:32.670141Z","shell.execute_reply.started":"2021-09-01T02:08:32.662675Z","shell.execute_reply":"2021-09-01T02:08:32.669245Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dataset de validacion creado","metadata":{}},{"cell_type":"code","source":"val_dir = '../input/mypandadataset/val/'\nval_df = create_df(val_dir)\nval_df.head()","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:08:32.673211Z","iopub.execute_input":"2021-09-01T02:08:32.673724Z","iopub.status.idle":"2021-09-01T02:08:32.861053Z","shell.execute_reply.started":"2021-09-01T02:08:32.673669Z","shell.execute_reply":"2021-09-01T02:08:32.860291Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_df['gleason_score'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:08:32.862727Z","iopub.execute_input":"2021-09-01T02:08:32.86307Z","iopub.status.idle":"2021-09-01T02:08:32.872137Z","shell.execute_reply.started":"2021-09-01T02:08:32.863036Z","shell.execute_reply":"2021-09-01T02:08:32.871092Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Creacion de los generadores de imagen para los datos de entrenamiento y validacion","metadata":{}},{"cell_type":"code","source":"val_datagen=train_datagen = ImageDataGenerator(rescale=1./255,\n                                              horizontal_flip=True,\n                                              vertical_flip = True)\ntrain_generator = train_datagen.flow_from_dataframe(\n    train_df,\n    x_col='images',\n    y_col='gleason_score',\n    target_size=(224, 224),\n    batch_size=8,\n    shuffle = True,\n    class_mode='categorical')\n\nvalidation_generator = val_datagen.flow_from_dataframe(\n    val_df,\n    x_col='images',\n    y_col='gleason_score',\n    target_size=(224, 224),\n    batch_size=8,\n    class_mode='categorical')","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:08:32.873599Z","iopub.execute_input":"2021-09-01T02:08:32.874Z","iopub.status.idle":"2021-09-01T02:08:32.906569Z","shell.execute_reply.started":"2021-09-01T02:08:32.873953Z","shell.execute_reply":"2021-09-01T02:08:32.905688Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def vgg16_model( num_classes=None):\n\n    #model = VGG16(weights='/kaggle/input/keras-pretrained-models/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5',include_top=False, input_shape=(224, 224, 3))\n    model = VGG16(weights='imagenet',include_top=False, input_shape=(224, 224, 3))    \n    #x=Dropout(0.2)(model.output)\n    x=Flatten()(model.output)\n    #x =Dense(200, activation = 'relu')(x)\n    output=Dense(num_classes,activation='softmax')(x)\n    model=Model(model.input,output)\n    return model\n\nvgg_conv=vgg16_model(10)\n\nvgg_conv.summary()","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:08:32.907639Z","iopub.execute_input":"2021-09-01T02:08:32.907947Z","iopub.status.idle":"2021-09-01T02:08:35.783672Z","shell.execute_reply.started":"2021-09-01T02:08:32.907916Z","shell.execute_reply":"2021-09-01T02:08:35.78287Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.applications.vgg19 import VGG19\ndef vgg19_model(num_classes = None):\n    #vgg19_weights = '../input/vgg19/vgg19_weights_tf_dim_ordering_tf_kernels.h5'\n    model = VGG19(weights='imagenet',include_top=False, input_shape=(224, 224, 3))\n    #model = VGG19(weights='/input/vgg19/vgg19_weights_tf_dim_ordering_tf_kernels.h5', include_top=False, input_shape=(224, 224, 3))\n    x=Dropout(0.3)(model.output)\n    x=Flatten()(x)\n    x =Dense(32, activation = 'relu')(x)\n    x =Dropout(0.2)(x)\n    output=Dense(num_classes,activation='softmax')(x)\n    model=Model(model.input,output)\n    return model\n\n#vgg19_conv = vgg19_model(10)\n#vgg19_conv.summary()","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:08:35.785009Z","iopub.execute_input":"2021-09-01T02:08:35.785368Z","iopub.status.idle":"2021-09-01T02:08:35.79172Z","shell.execute_reply.started":"2021-09-01T02:08:35.785331Z","shell.execute_reply":"2021-09-01T02:08:35.790686Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"opt = SGD(lr= 1e-4)\nvgg_conv.compile(loss='categorical_crossentropy',optimizer=opt ,metrics=['accuracy'])# lr 1e-4\n#vgg19_conv.compile(loss='categorical_crossentropy',optimizer=opt ,metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:08:35.793248Z","iopub.execute_input":"2021-09-01T02:08:35.793682Z","iopub.status.idle":"2021-09-01T02:08:35.956075Z","shell.execute_reply.started":"2021-09-01T02:08:35.793643Z","shell.execute_reply":"2021-09-01T02:08:35.955235Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs = 60\nbatch_size=8#16\nnb_train_steps = train_df.shape[0]//batch_size\nnb_val_steps=val_df.shape[0]//batch_size\n#nb_train_steps = 10#128\n#nb_val_steps = 5#64\nprint(\"Number of training and validation steps: {} and {}\".format(nb_train_steps,nb_val_steps))","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:08:35.95773Z","iopub.execute_input":"2021-09-01T02:08:35.9584Z","iopub.status.idle":"2021-09-01T02:08:35.965002Z","shell.execute_reply.started":"2021-09-01T02:08:35.958364Z","shell.execute_reply":"2021-09-01T02:08:35.964021Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Entrenamiento de la red VGG16 a 60 epocas con un batchsize de 8","metadata":{}},{"cell_type":"code","source":"vgg_hist = vgg_conv.fit_generator(\n    train_generator,\n    steps_per_epoch=nb_train_steps,\n    epochs=epochs,\n    validation_data=validation_generator,\n    validation_steps=nb_val_steps\n)\n\n'''vgg_hist = vgg19_conv.fit_generator(\n    train_generator,\n    steps_per_epoch=nb_train_steps,\n    epochs=epochs,\n    validation_data=validation_generator,\n    validation_steps=nb_val_steps\n)'''","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:08:35.966387Z","iopub.execute_input":"2021-09-01T02:08:35.967045Z","iopub.status.idle":"2021-09-01T02:22:02.734408Z","shell.execute_reply.started":"2021-09-01T02:08:35.966988Z","shell.execute_reply":"2021-09-01T02:22:02.73358Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vgg_baseline = vgg_conv.save('VGG16_Baseline.h5')\n#vgg_baseline = vgg19_conv.save('VGG19_Baseline.h5')","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:22:02.73735Z","iopub.execute_input":"2021-09-01T02:22:02.737613Z","iopub.status.idle":"2021-09-01T02:22:02.843933Z","shell.execute_reply.started":"2021-09-01T02:22:02.737588Z","shell.execute_reply":"2021-09-01T02:22:02.843125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vgg_baseline_weights = vgg_conv.save_weights('vgg16_baseline_weights.h5')\n#vgg_baseline_weights = vgg19_conv.save_weights('vgg19_baseline_weights.h5')","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:22:02.845146Z","iopub.execute_input":"2021-09-01T02:22:02.845549Z","iopub.status.idle":"2021-09-01T02:22:02.937084Z","shell.execute_reply.started":"2021-09-01T02:22:02.845506Z","shell.execute_reply":"2021-09-01T02:22:02.936209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plotTraining(hist, epochs, typeData):\n    \n    if typeData==\"loss\":\n        plt.figure(1,figsize=(10,5))\n        yc=hist.history['loss']\n        xc=range(epochs)\n        plt.ylabel('Loss', fontsize=24)\n        plt.plot(xc,yc,'-r',label='Loss Training')\n    if typeData==\"accuracy\":\n        plt.figure(2,figsize=(10,5))\n        yc=hist.history['accuracy']\n        for i in range(0, len(yc)):\n            yc[i]=100*yc[i]\n        xc=range(epochs)\n        plt.ylabel('Accuracy (%)', fontsize=24)\n        plt.plot(xc,yc,'-r',label='Accuracy Training')\n    if typeData==\"val_loss\":\n        plt.figure(1,figsize=(10,5))\n        yc=hist.history['val_loss']\n        xc=range(epochs)\n        plt.ylabel('Loss', fontsize=24)\n        plt.plot(xc,yc,'--b',label='Loss Validate')\n    if typeData==\"val_accuracy\":\n        plt.figure(2,figsize=(10,5))\n        yc=hist.history['val_accuracy']\n        for i in range(0, len(yc)):\n            yc[i]=100*yc[i]\n        xc=range(epochs)\n        plt.ylabel('Accuracy (%)', fontsize=24)\n        plt.plot(xc,yc,'--b',label='Training Validate')\n        \n\n    plt.rc('xtick',labelsize=24)\n    plt.rc('ytick',labelsize=24)\n    plt.rc('legend', fontsize=18) \n    plt.legend()\n    plt.xlabel('Number of Epochs',fontsize=24)\n    plt.grid(True)","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:22:02.938499Z","iopub.execute_input":"2021-09-01T02:22:02.939004Z","iopub.status.idle":"2021-09-01T02:22:02.953672Z","shell.execute_reply.started":"2021-09-01T02:22:02.938952Z","shell.execute_reply":"2021-09-01T02:22:02.952915Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Graficas de entrenamiento y validacion para Loss y Accuracy","metadata":{}},{"cell_type":"code","source":"plotTraining(vgg_hist,epochs,\"loss\")\nplotTraining(vgg_hist,epochs,\"accuracy\")\nplotTraining(vgg_hist,epochs,\"val_loss\")\nplotTraining(vgg_hist,epochs,\"val_accuracy\")","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:22:02.955029Z","iopub.execute_input":"2021-09-01T02:22:02.955562Z","iopub.status.idle":"2021-09-01T02:22:03.316695Z","shell.execute_reply.started":"2021-09-01T02:22:02.955524Z","shell.execute_reply":"2021-09-01T02:22:03.315987Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dataset de prueba creado","metadata":{}},{"cell_type":"code","source":"test_dir = '../input/mypandadataset/test/'\ntest_df = create_df(test_dir)\ntest_df.head()","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:22:03.318765Z","iopub.execute_input":"2021-09-01T02:22:03.319296Z","iopub.status.idle":"2021-09-01T02:22:03.439524Z","shell.execute_reply.started":"2021-09-01T02:22:03.319257Z","shell.execute_reply":"2021-09-01T02:22:03.438841Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Matriz de confusion, pression, recall y f1-score","metadata":{}},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix, f1_score, roc_curve, precision_score, recall_score, accuracy_score, roc_auc_score\nfrom sklearn import metrics\nfrom mlxtend.plotting import plot_confusion_matrix\nfrom keras.models import load_model\nimport numpy as np\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\nwidth_shape = 224\nheight_shape = 224\n\nnames = ['gleason 00','gleason 33','gleason 34','gleason 43','gleason 44', 'gleason 35', 'gleason 53', 'gleason 45', 'gleason 54', 'gleason 55']\n\ntest_datagen = ImageDataGenerator()\ntest_generator = test_datagen.flow_from_dataframe(\n    test_df,\n    x_col='images',\n    y_col='gleason_score',\n    target_size=(224, 224),\n    batch_size=8,\n    shuffle = True,\n    class_mode='categorical')\n\n\ncustom_Model= load_model(\"VGG16_Baseline.h5\")\n#custom_Model= load_model(\"VGG19_Baseline.h5\")\n\npredictions = custom_Model.predict_generator(generator=test_generator)\n#predictions = custom_Model.predict_generator(generator=validation_generator)\n\ny_pred = np.argmax(predictions, axis=1)\ny_real = test_generator.classes\n#y_real = validation_generator.classes\n\n\n\nmatc=confusion_matrix(y_real, y_pred)\n\nplot_confusion_matrix(conf_mat=matc, figsize=(9,9), class_names = names, show_normed=False)\nplt.tight_layout()\n\nprint(metrics.classification_report(y_real,y_pred, digits = 4))","metadata":{"execution":{"iopub.status.busy":"2021-09-01T02:22:44.879761Z","iopub.execute_input":"2021-09-01T02:22:44.880193Z","iopub.status.idle":"2021-09-01T02:22:49.797663Z","shell.execute_reply.started":"2021-09-01T02:22:44.880144Z","shell.execute_reply":"2021-09-01T02:22:49.796865Z"},"trusted":true},"execution_count":null,"outputs":[]}]}