{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport cv2\nfrom tensorflow import keras\n\nplt.style.use('fivethirtyeight')\n%matplotlib inline","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\ntest = pd.read_csv(\"../input/histopathologic-cancer-detection/sample_submission.csv\",dtype=str)\ndata = pd.read_csv(\"../input/histopathologic-cancer-detection/train_labels.csv\",dtype=str)\n\ntrain_dir         = \"../input/histopathologic-cancer-detection/train/\"\ntrain_files       = os.listdir(train_dir)\n\ntest_dir          = \"../input/histopathologic-cancer-detection/test/\"\ntest_files        = os.listdir(test_dir)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true},"cell_type":"code","source":"%%time\n\nfrom distutils.dir_util import copy_tree\n\nos.mkdir('test_folder')\nos.mkdir('test_folder/test_images')\n\nfromDirectory = test_dir\ntoDirectory = \"test_folder/test_images\"\n\ncopy_tree(fromDirectory, toDirectory, verbose=0)\n\ntest_file = \"test_folder\"\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(data.head())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data[\"id\"] = data[\"id\"].apply(lambda x: x + \".tif\")\ntest[\"id\"] = test[\"id\"].apply(lambda x: x + \".tif\")\n\ndata = data[data['id'] != 'dd6dfed324f9fcb6f93f46f32fc800f2ec196be2.tif']\ndata = data[data['id'] != '9369c7278ec8bcc6c880d99194de09fc2bd4efbe.tif']\nprint(data.head())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"samples = 8\n    \nfig, axes = plt.subplots(1, len(data[:samples]), figsize = (20, 2))\nfor idx, ax in enumerate(axes):\n    ax.imshow(cv2.imread(train_dir + data.id[idx]))\n    ax.set_title(\"Label: \" + str(data.label[idx]))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(data.label.value_counts())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from plotly.graph_objects import Figure, Pie\n\nlabels = [\"No Cancer Detected\", \"Cancer Detected\"]\nvalues = data[\"label\"].value_counts()\n\ngraph = Figure(data=[Pie(labels=labels, values=values, hole=0.5, marker_colors=[\"rgb(0, 203, 0)\", \"rgb(203, 0, 0)\"])])\ngraph.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nX = data[\"id\"]\nY = data[\"label\"]\n\n#X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.20, random_state=42, stratify = Y)\ntrainer, tester = train_test_split(data, test_size=0.20, random_state=42, stratify = Y)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\ndatagen = ImageDataGenerator(rescale=1.0/255, validation_split = 0.25)\ntestgen = ImageDataGenerator(rescale=1.0/255)\n\n\ntrain_gen = datagen.flow_from_dataframe(dataframe=trainer, directory = train_dir,x_col=\"id\", y_col=\"label\", class_mode=\"binary\" , target_size=(96,96), batch_size=100, subset = \"training\", seed = 42)\n\nvalid_gen = datagen.flow_from_dataframe(dataframe=trainer, directory = train_dir,x_col=\"id\", y_col=\"label\", class_mode=\"binary\" , target_size=(96,96), batch_size=100, subset = \"validation\", seed = 42)\n\n\ntest_gen = testgen.flow_from_dataframe(dataframe=tester, directory = train_dir,x_col=\"id\", y_col=\"label\", seed = 42, class_mode=\"binary\", target_size=(96,96), batch_size=1, shuffle = False)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Flatten, Conv2D, Dropout, MaxPooling2D\nfrom tensorflow.distribute import MirroredStrategy\n\n\nstrat = MirroredStrategy()\nwith strat.scope():\n    this_model = Sequential(\n        [\n            Conv2D(filters=32, kernel_size = 3, padding='same', activation = 'relu', input_shape = (96, 96, 3), name = 'Conv2D_1'),\n            Conv2D(filters=32, kernel_size = 3, padding='same', activation = 'relu', name = 'Conv2D_2'),\n            Conv2D(filters=32, kernel_size = 3, padding='same', activation = 'relu', name = 'Conv2D_3'),\n            Dropout(0.3, name = 'Dropout_1'),\n            MaxPooling2D(pool_size = 3, name = 'MaxPooling2D_1'),\n        \n            Conv2D(filters=64, kernel_size = 3, padding='same', activation = 'relu', name = 'Conv2D_4'),\n            Conv2D(filters=64, kernel_size = 3, padding='same', activation = 'relu', name = 'Conv2D_5'),\n            Conv2D(filters=64, kernel_size = 3, padding='same', activation = 'relu', name = 'Conv2D_6'),\n            Dropout(0.3, name = 'Dropout_2'),\n            MaxPooling2D(pool_size = 3, name = 'MaxPooling2D_2'),\n        \n            Conv2D(filters=128, kernel_size = 3, padding='same', activation = 'relu', name = 'Conv2D_7'),\n#            Conv2D(filters=128, kernel_size = 3, padding='same', activation = 'relu', name = 'Conv2D_8'),\n#            Conv2D(filters=128, kernel_size = 3, padding='same', activation = 'relu', name = 'Conv2D_9'),\n#            Dropout(0.25, name = 'Dropout_3'),\n#            MaxPooling2D(pool_size = 3, name = 'MaxPooling2D_3'),\n            \n            Conv2D(filters=256, kernel_size = 3, padding='same', activation = 'relu', name = 'Conv2D_10'),\n            Conv2D(filters=512, kernel_size = 3, padding='same', activation = 'relu', name = 'Conv2D_11'),\n            Flatten(name = 'Flatten_1'),\n            Dense(512, activation=\"relu\", name = 'Dense_1'),\n            Dense(1, activation = \"sigmoid\", name = 'Dense_2')\n        ]\n)\nthis_model.compile(loss=\"binary_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"])\n\nthis_model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.callbacks import EarlyStopping, ModelCheckpoint,ReduceLROnPlateau\nbatch_size = 100\nnum_samples = len(data)\n\n\nes = EarlyStopping(monitor = \"val_loss\", patience = 3)\ncp = ModelCheckpoint(filepath = \"best_weights.hdf5\", verbose=1, save_best_only=True)\ncb = [cp,es]\neps = train_gen.n // batch_size\nvalid_steps = valid_gen.n // batch_size\n\nprev_model = this_model.fit_generator(train_gen, epochs = 5,steps_per_epoch=eps, validation_data=valid_gen, validation_steps=valid_steps,callbacks = cb)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nthis_model.load_weights('best_weights.hdf5')\ntest_gen.reset()\n\nmodel_predict = this_model.predict_generator(test_gen, steps=len(test_gen.classes)-1, verbose=1)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.metrics import confusion_matrix, classification_report\n\nval_preds = np.argmax(model_predict, axis=1)\nval_trues = valid_gen.classes\ncm = confusion_matrix(val_trues, val_preds)\nprint(cm)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.plot(prev_model.history['accuracy'])\nplt.plot(prev_model.history['val_accuracy'])\nplt.title('Model accuracy')\nplt.ylabel('Accuracy')\nplt.xlabel('Epoch')\nplt.legend(['Train', 'Validation'], loc='best')\nplt.show()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.plot(prev_model.history['loss'])\nplt.plot(prev_model.history['val_loss'])\nplt.title('Model loss')\nplt.ylabel('Loss')\nplt.xlabel('Epoch')\nplt.legend(['Train', 'Validation'], loc='best')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.utils import plot_model\n\n\ndot_img_file = '/tmp/this_model.png'\nplot_model(this_model, to_file=dot_img_file, show_shapes=True)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true},"cell_type":"code","source":"shutil.rmtree(test_file)","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}