{"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 tensorflow as tf \nimport tensorflow_addons as tfa \nimport numpy as np \nimport pandas as pd \nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\n","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","papermill":{"duration":6.147395,"end_time":"2020-11-21T13:23:31.06931","exception":false,"start_time":"2020-11-21T13:23:24.921915","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-03-05T13:30:59.496016Z","iopub.execute_input":"2022-03-05T13:30:59.496347Z","iopub.status.idle":"2022-03-05T13:30:59.709125Z","shell.execute_reply.started":"2022-03-05T13:30:59.496301Z","shell.execute_reply":"2022-03-05T13:30:59.708230Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_img_dir = '../input/siim-isic-melanoma-classification/jpeg/train/'\ntest_img_dir = '../input/siim-isic-melanoma-classification/jpeg/test/'\ntrain = pd.read_csv('../input/siim-isic-melanoma-classification/train.csv')\ntest = pd.read_csv('../input/siim-isic-melanoma-classification/test.csv')","metadata":{"papermill":{"duration":0.115619,"end_time":"2020-11-21T13:23:31.201069","exception":false,"start_time":"2020-11-21T13:23:31.08545","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-03-05T10:39:22.228792Z","iopub.execute_input":"2022-03-05T10:39:22.229428Z","iopub.status.idle":"2022-03-05T10:39:22.292903Z","shell.execute_reply.started":"2022-03-05T10:39:22.229391Z","shell.execute_reply":"2022-03-05T10:39:22.291980Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# check for balance\ntrain.target.value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-03-05T10:39:24.009162Z","iopub.execute_input":"2022-03-05T10:39:24.009978Z","iopub.status.idle":"2022-03-05T10:39:24.018032Z","shell.execute_reply.started":"2022-03-05T10:39:24.009944Z","shell.execute_reply":"2022-03-05T10:39:24.017070Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# trial to balance the dataset manually\n\nnegative = train[train['target']==0].sample(2500)\npositive = train[train['target']==1]\ntrain=pd.concat([negative,positive])\ntrain=train.reset_index()","metadata":{"execution":{"iopub.status.busy":"2022-03-05T10:39:25.771064Z","iopub.execute_input":"2022-03-05T10:39:25.771925Z","iopub.status.idle":"2022-03-05T10:39:25.791106Z","shell.execute_reply.started":"2022-03-05T10:39:25.771893Z","shell.execute_reply":"2022-03-05T10:39:25.790191Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# loading the data\ntrain_car = []\nfor image_name in train.image_name:\n    train_car.append(tf.keras.preprocessing.image.img_to_array(\n        tf.keras.preprocessing.image.load_img(path = (train_img_dir + image_name + \".jpg\"), color_mode = \"rgba\", target_size = (128,128)), dtype=\"float32\")\n                    )\n    ","metadata":{"papermill":{"duration":0.063198,"end_time":"2020-11-21T13:23:31.337066","exception":false,"start_time":"2020-11-21T13:23:31.273868","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-03-05T10:39:28.601935Z","iopub.execute_input":"2022-03-05T10:39:28.602713Z","iopub.status.idle":"2022-03-05T10:49:42.343508Z","shell.execute_reply.started":"2022-03-05T10:39:28.602651Z","shell.execute_reply":"2022-03-05T10:49:42.342540Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train[\"img\"] = train_car\ntest[\"path\"] = [(test_img_dir + img_name + \".jpg\") for img_name in test.image_name]","metadata":{"execution":{"iopub.status.busy":"2022-03-05T11:11:30.895335Z","iopub.execute_input":"2022-03-05T11:11:30.895638Z","iopub.status.idle":"2022-03-05T11:11:30.910932Z","shell.execute_reply.started":"2022-03-05T11:11:30.895607Z","shell.execute_reply":"2022-03-05T11:11:30.909893Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{"papermill":{"duration":5.398706,"end_time":"2020-11-21T13:23:36.751818","exception":false,"start_time":"2020-11-21T13:23:31.353112","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-03-05T11:12:27.736607Z","iopub.execute_input":"2022-03-05T11:12:27.736907Z","iopub.status.idle":"2022-03-05T11:12:45.340529Z","shell.execute_reply.started":"2022-03-05T11:12:27.736876Z","shell.execute_reply":"2022-03-05T11:12:45.339583Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.shape","metadata":{"papermill":{"duration":0.028268,"end_time":"2020-11-21T13:23:39.323447","exception":false,"start_time":"2020-11-21T13:23:39.295179","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-03-05T11:16:29.887341Z","iopub.execute_input":"2022-03-05T11:16:29.887663Z","iopub.status.idle":"2022-03-05T11:16:29.894527Z","shell.execute_reply.started":"2022-03-05T11:16:29.887631Z","shell.execute_reply":"2022-03-05T11:16:29.893419Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# split the data\nx_train, x_cross_validation, y_train, y_cross_validation = train_test_split(train.img, train.target, test_size=0.2, shuffle = True, random_state=42)","metadata":{"papermill":{"duration":0.971155,"end_time":"2020-11-21T13:23:40.521236","exception":false,"start_time":"2020-11-21T13:23:39.550081","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-03-05T13:33:36.336527Z","iopub.execute_input":"2022-03-05T13:33:36.336869Z","iopub.status.idle":"2022-03-05T13:33:36.347785Z","shell.execute_reply.started":"2022-03-05T13:33:36.336807Z","shell.execute_reply":"2022-03-05T13:33:36.346757Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# scale the pixels between 0 and 1\nx_train /= 255\nx_cross_validation /= 255\n# redefine dtypes\ny_train = np.array(y_train, dtype = \"float32\")\ny_cross_validation = np.array(y_cross_validation, dtype = \"float32\")\nx_train = np.array([np.array(val) for val in x_train])\nx_cross_validation = np.array([np.array(val) for val in x_cross_validation])","metadata":{"papermill":{"duration":0.363061,"end_time":"2020-11-21T13:34:31.37234","exception":false,"start_time":"2020-11-21T13:34:31.009279","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-03-05T13:33:37.857538Z","iopub.execute_input":"2022-03-05T13:33:37.858090Z","iopub.status.idle":"2022-03-05T13:33:38.838363Z","shell.execute_reply.started":"2022-03-05T13:33:37.858055Z","shell.execute_reply":"2022-03-05T13:33:38.837394Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = tf.keras.models.Sequential()\n\n# Convolutional & Max Pooling layers\n\nmodel.add(tf.keras.layers.Conv2D(16, kernel_size=(3, 3), activation='relu', input_shape=(128,128,4)))\nmodel.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(tf.keras.layers.Conv2D(64, kernel_size=(3, 3), activation='relu'))\nmodel.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(tf.keras.layers.Conv2D(128, kernel_size=(3, 3), activation='relu'))\nmodel.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2)))\n\n# Flatten & Dense layers\n\nmodel.add(tf.keras.layers.Flatten())\nmodel.add(tf.keras.layers.Dense(512, activation='relu'))\n\n# performing binary classification\nmodel.add(tf.keras.layers.Dense(1, activation='sigmoid'))\n\nmodel.compile(loss = tfa.losses.SigmoidFocalCrossEntropy(),\n              optimizer = tf.keras.optimizers.Adam(),\n              metrics = ['binary_accuracy',\n                       tf.keras.metrics.FalsePositives(),\n                       tf.keras.metrics.FalseNegatives(), \n                       tf.keras.metrics.TruePositives(),\n                       tf.keras.metrics.TrueNegatives()\n                      ]\n             )\n\nmodel.summary()\n","metadata":{"papermill":{"duration":3.885154,"end_time":"2020-11-21T13:34:35.418455","exception":false,"start_time":"2020-11-21T13:34:31.533301","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-03-05T13:33:41.925419Z","iopub.execute_input":"2022-03-05T13:33:41.925722Z","iopub.status.idle":"2022-03-05T13:33:42.020022Z","shell.execute_reply.started":"2022-03-05T13:33:41.925688Z","shell.execute_reply":"2022-03-05T13:33:42.018978Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# saving the best model for our predictions\ncheckpointer = tf.keras.callbacks.ModelCheckpoint(filepath=\"weights.hdf5\", verbose=1, save_best_only=True)\n\nhistory = model.fit(x = x_train,\n                    y = y_train,\n                    validation_data=(x_cross_validation, y_cross_validation),\n                    batch_size=100,\n                    epochs=100,\n                    verbose=1, \n                    callbacks=[checkpointer]\n                   )","metadata":{"papermill":{"duration":136.630284,"end_time":"2020-11-21T13:36:52.077802","exception":false,"start_time":"2020-11-21T13:34:35.447518","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-03-05T13:33:45.322463Z","iopub.execute_input":"2022-03-05T13:33:45.322742Z","iopub.status.idle":"2022-03-05T13:35:35.485287Z","shell.execute_reply.started":"2022-03-05T13:33:45.322713Z","shell.execute_reply":"2022-03-05T13:35:35.484264Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# visualize the loss & accuracy with the train and crossvalidation\nf, (f1, f2) = plt.subplots(1, 2, figsize=(12, 6))\nf.suptitle('CNN Performance', fontsize=16)\n\nf1.plot(history.history['binary_accuracy'], label='Train Accuracy')\nf1.plot(history.history['val_binary_accuracy'], label='Cross Validation Accuracy')\nf1.set_ylabel('Accuracy')\nf1.set_xlabel('Epoch')\nf1.set_title('Accuracy')\nf1.legend(loc=\"best\")\n\nf2.plot(history.history['loss'], label='Train Loss')\nf2.plot(history.history['val_loss'], label='Cross Validation Loss')\nf2.set_ylabel('Loss')\nf2.set_xlabel('Epoch')\nf2.set_title('Loss')\nf2.legend(loc=\"best\")","metadata":{"papermill":{"duration":1.243898,"end_time":"2020-11-21T13:36:54.047245","exception":false,"start_time":"2020-11-21T13:36:52.803347","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-03-05T13:35:45.867482Z","iopub.execute_input":"2022-03-05T13:35:45.867779Z","iopub.status.idle":"2022-03-05T13:35:46.341858Z","shell.execute_reply.started":"2022-03-05T13:35:45.867748Z","shell.execute_reply":"2022-03-05T13:35:46.340932Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# input to be predicted\ntest = tf.keras.preprocessing.image.img_to_array(tf.keras.preprocessing.image.load_img(path = (\"../input/siim-isic-melanoma-classification/jpeg/test/ISIC_0052060.jpg\"), color_mode = \"rgba\", target_size = (128,128)), dtype=\"float32\")\ntest = test / 255\ntest=np.reshape(test,(1,128,128,4))\ntest = np.array(test)\n# load the best model\nmodel.load_weights('weights.hdf5')\n\nmodel.predict(test)\n    \n","metadata":{"papermill":{"duration":310.563581,"end_time":"2020-11-21T13:42:05.274967","exception":false,"start_time":"2020-11-21T13:36:54.711386","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-03-05T14:00:27.868592Z","iopub.execute_input":"2022-03-05T14:00:27.868902Z","iopub.status.idle":"2022-03-05T14:00:28.294134Z","shell.execute_reply.started":"2022-03-05T14:00:27.868871Z","shell.execute_reply":"2022-03-05T14:00:28.293189Z"},"trusted":true},"execution_count":null,"outputs":[]}]}