{"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":"import os\nimport cv2\nimport time\nimport scipy as sp\nimport numpy as np\nimport random as rn\nimport pandas as pd\nfrom tqdm import tqdm\nfrom PIL import Image\nfrom functools import partial\nimport matplotlib.pyplot as plt\n\n# Machine Learning\nimport tensorflow as tf\nimport keras\nfrom keras import initializers\nfrom keras import regularizers\nfrom keras import constraints\nfrom keras import backend as K\nfrom keras.activations import elu\nfrom keras.optimizers import Adam\nfrom keras.models import Sequential\nfrom keras.engine import Layer, InputSpec\nfrom keras.utils.generic_utils import get_custom_objects\nfrom keras.callbacks import Callback, EarlyStopping, ReduceLROnPlateau\nfrom keras.layers import Dense, Conv2D, Flatten, GlobalAveragePooling2D, Dropout,MaxPooling2D,BatchNormalization,GlobalMaxPooling2D\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.metrics import cohen_kappa_score\n\n# Specify title of our final model\nSAVED_MODEL_NAME = 'effnet_modelB5.h5'\n\n# Set seed for reproducability\nseed = 1234\nrn.seed(seed)\nnp.random.seed(seed)\ntf.random.set_seed(seed)\nos.environ['PYTHONHASHSEED'] = str(seed)\n\n# For keeping time. GPU limit for this competition is set to ± 9 hours.\nt_start = time.time()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nfrom tensorflow.keras.models import load_model","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\nfrom keras.applications.xception import Xception\nfrom keras.preprocessing import image\nfrom keras.applications.resnet50 import preprocess_input, decode_predictions\nimport numpy as np\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\neffnet = tf.keras.applications.MobileNetV2(input_shape=(256,256,3),\n                                               include_top=False,\n                                               weights='imagenet')\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for layer in effnet.layers:\n    layer.trainable = True","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nmetrics=tf.keras.metrics.AUC(name='auc')\ndef build_model():\n\n    model = Sequential()\n    model.add(effnet)\n    model.add(GlobalAveragePooling2D())\n    model.add(Dropout(0.25))\n#    model.add(Dense(2, activation=elu))\n    model.add(Dense(1, activation=\"sigmoid\"))\n    model.compile(loss='binary_crossentropy',\n                  optimizer=keras.optimizers.Adam(learning_rate=0.00005, beta_1=0.9, beta_2=0.999, amsgrad=False),\n                  metrics=metrics)\n    print(model.summary())\n    return model\n\n# Initialize model\nmodel = build_model()\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\ndf=pd.read_csv(\"../input/jpeg-melanoma-256x256/train.csv\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ntrain, valid = train_test_split(df, test_size=0.2)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train[\"target\"]=train[\"target\"].astype(str)\nvalid[\"target\"]=valid[\"target\"].astype(str)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train[\"image_name\"]=train[\"image_name\"]+\".jpg\"\nvalid[\"image_name\"]=valid[\"image_name\"]+\".jpg\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(\n        rescale=1/255,\n        zoom_range=0.0,\n        horizontal_flip=True)\n\n\ntest_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255)\n\ntrain_generator = train_datagen.flow_from_dataframe(\n        dataframe=train,\n        directory='../input/jpeg-melanoma-256x256/train/',\n        x_col=\"image_name\",\n        y_col=\"target\",\n        target_size=(256, 256),\n        batch_size=32,\n        class_mode='binary')\n\nvalidation_generator = test_datagen.flow_from_dataframe(\n        dataframe=valid,\n        directory='../input/jpeg-melanoma-256x256/train/',\n        x_col=\"image_name\",\n        y_col=\"target\",\n        target_size=(256, 256),\n        batch_size=16,\n        class_mode='binary')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"es = EarlyStopping(monitor='val_loss', mode='auto', verbose=1, patience=4)\nrlr =ReduceLROnPlateau(monitor='val_loss', \n                        factor=0.5, \n                        patience=3, \n                        verbose=1, \n                        mode='auto', \n                        epsilon=0.0001)\n\n\n#class_weight = {0: 1.99,\n#               1:1.}\n\nmodel_checkpoint_callback = tf.keras.callbacks.ModelCheckpoint(\n    filepath=SAVED_MODEL_NAME,\n    save_weights_only=True,\n    monitor='val_acc',\n    mode='max',\n    save_best_only=True)\nhistory = model.fit(\n        train_generator,\n        epochs=5,\n        shuffle=True,\n        validation_data=validation_generator,\n        callbacks=[model_checkpoint_callback])\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"converter = tf.lite.TFLiteConverter.from_keras_model(model)\ntflite_model = converter.convert()\n\n# Save the model.\nwith open('model.tflite', 'wb') as f:\n  f.write(tflite_model)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.utils import plot_model\nplot_model(model,to_file='model_plot.png',show_shapes=True,show_layer_names=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom sklearn.model_selection import train_test_split\nimport matplotlib.pyplot as plt\n\nauc = history.history['auc']\nval_auc = history.history['val_auc']\n\nloss = history.history['loss']\nval_loss = history.history['val_loss']\nepochs=5\nepochs_range = range(epochs)\n\nplt.figure(figsize=(10,4))\nplt.subplot(1,2,1)\nplt.plot(epochs_range, auc, label='Training Accuracy')\nplt.plot(epochs_range, val_auc, label='Validation Accuracy')\nplt.legend(loc='lower right')\nplt.title('Training and Validation Accuracy')\nplt.ylabel(\"Accuracy (training and validation)\")\nplt.xlabel(\"Training Steps\")\n\nplt.subplot(1, 2, 2)\nplt.plot(epochs_range, loss, label='Training Loss')\nplt.plot(epochs_range, val_loss, label='Validation Loss')\nplt.legend(loc='upper right')\nplt.title('Training and Validation Loss')\nplt.ylabel(\"Loss (training and validation)\")\nplt.xlabel(\"Training Steps\")\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import classification_report,confusion_matrix\npredictions1=model.predict(validation_generator,steps=len(validation_generator))\ny=np.argmax(predictions1,axis=1)\n\nprint('Classification Report')\ncr=classification_report(y_true=validation_generator.classes,y_pred=y,target_names=validation_generator.class_indices)\nprint(cr)\nevaluates=model.evaluate(validation_generator)\nprint(evaluates)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport seaborn as sn\nprint('Confusion Matrix')\ncm = confusion_matrix(validation_generator.classes,y)\ndf = pd.DataFrame(cm,columns=validation_generator.class_indices)\nplt.figure(figsize=(10,7))\nsn.heatmap(df,annot=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}