{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":20270,"databundleVersionId":1222630,"sourceType":"competition"},{"sourceId":104884,"sourceType":"datasetVersion","datasetId":54339},{"sourceId":1150616,"sourceType":"datasetVersion","datasetId":649927},{"sourceId":1193409,"sourceType":"datasetVersion","datasetId":679322},{"sourceId":1243687,"sourceType":"datasetVersion","datasetId":690737}],"dockerImageVersionId":29926,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Main Idea\n\nLets merge these datasets from [topic](https://www.kaggle.com/c/siim-isic-melanoma-classification/discussion/154296#864656) by [@andrewmvd](https://www.kaggle.com/andrewmvd):\n\n---\n- [Melanoma Detection Dataset](https://www.kaggle.com/wanderdust/skin-lesion-analysis-toward-melanoma-detection)\n- [Skin Lesion Images for Melanoma Classification](https://www.kaggle.com/andrewmvd/isic-2019)\n- [Skin Cancer MNIST: HAM10000](https://www.kaggle.com/kmader/skin-cancer-mnist-ham10000)\n---\n\n- [SIIM-ISIC Melanoma Classification](https://www.kaggle.com/c/siim-isic-melanoma-classification/data)\n","metadata":{}},{"cell_type":"code","source":"pip install --upgrade tensorflow","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T12:08:29.892593Z","iopub.execute_input":"2025-03-13T12:08:29.892941Z","iopub.status.idle":"2025-03-13T12:10:34.007433Z","shell.execute_reply.started":"2025-03-13T12:08:29.892913Z","shell.execute_reply":"2025-03-13T12:10:34.006019Z"}},"outputs":[{"name":"stdout","text":"Collecting tensorflow\n  Downloading tensorflow-2.11.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (588.3 MB)\n\u001b[K     |████████████████████████████████| 588.3 MB 4.1 kB/s  eta 0:00:01\n\u001b[?25hRequirement already satisfied, skipping upgrade: protobuf<3.20,>=3.9.2 in /opt/conda/lib/python3.7/site-packages (from tensorflow) (3.11.4)\nRequirement already satisfied, skipping upgrade: typing-extensions>=3.6.6 in /opt/conda/lib/python3.7/site-packages (from tensorflow) (3.7.4.1)\nCollecting numpy>=1.20\n  Downloading numpy-1.21.6-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (15.7 MB)\n\u001b[K     |████████████████████████████████| 15.7 MB 31.7 MB/s eta 0:00:01\n\u001b[?25hRequirement already satisfied, skipping upgrade: gast<=0.4.0,>=0.2.1 in /opt/conda/lib/python3.7/site-packages (from tensorflow) (0.2.2)\nCollecting tensorboard<2.12,>=2.11\n  Downloading tensorboard-2.11.2-py3-none-any.whl (6.0 MB)\n\u001b[K     |████████████████████████████████| 6.0 MB 47.1 MB/s eta 0:00:01\n\u001b[?25hCollecting tensorflow-estimator<2.12,>=2.11.0\n  Downloading tensorflow_estimator-2.11.0-py2.py3-none-any.whl (439 kB)\n\u001b[K     |████████████████████████████████| 439 kB 47.8 MB/s eta 0:00:01\n\u001b[?25hRequirement already satisfied, skipping upgrade: six>=1.12.0 in /opt/conda/lib/python3.7/site-packages (from tensorflow) (1.14.0)\nRequirement already satisfied, skipping upgrade: h5py>=2.9.0 in /opt/conda/lib/python3.7/site-packages (from tensorflow) (2.10.0)\nCollecting keras<2.12,>=2.11.0\n  Downloading keras-2.11.0-py2.py3-none-any.whl (1.7 MB)\n\u001b[K     |████████████████████████████████| 1.7 MB 16.2 MB/s eta 0:00:01\n\u001b[?25hRequirement already satisfied, skipping upgrade: setuptools in /opt/conda/lib/python3.7/site-packages (from tensorflow) (46.1.3.post20200325)\nRequirement already satisfied, skipping upgrade: opt-einsum>=2.3.2 in /opt/conda/lib/python3.7/site-packages (from tensorflow) (3.2.1)\nCollecting absl-py>=1.0.0\n  Downloading absl_py-2.1.0-py3-none-any.whl (133 kB)\n\u001b[K     |████████████████████████████████| 133 kB 67.5 MB/s eta 0:00:01\n\u001b[?25hCollecting flatbuffers>=2.0\n  Downloading flatbuffers-25.2.10-py2.py3-none-any.whl (30 kB)\nRequirement already satisfied, skipping upgrade: wrapt>=1.11.0 in /opt/conda/lib/python3.7/site-packages (from tensorflow) (1.11.2)\nCollecting libclang>=13.0.0\n  Downloading libclang-18.1.1-py2.py3-none-manylinux2010_x86_64.whl (24.5 MB)\n\u001b[K     |████████████████████████████████| 24.5 MB 40.9 MB/s eta 0:00:01\n\u001b[?25hRequirement already satisfied, skipping upgrade: google-pasta>=0.1.1 in /opt/conda/lib/python3.7/site-packages (from tensorflow) (0.2.0)\nCollecting astunparse>=1.6.0\n  Downloading astunparse-1.6.3-py2.py3-none-any.whl (12 kB)\nRequirement already satisfied, skipping upgrade: termcolor>=1.1.0 in /opt/conda/lib/python3.7/site-packages (from tensorflow) (1.1.0)\nRequirement already satisfied, skipping upgrade: grpcio<2.0,>=1.24.3 in /opt/conda/lib/python3.7/site-packages (from tensorflow) (1.28.1)\nRequirement already satisfied, skipping upgrade: packaging in /opt/conda/lib/python3.7/site-packages (from tensorflow) (20.1)\nCollecting tensorflow-io-gcs-filesystem>=0.23.1; platform_machine != \"arm64\" or platform_system != \"Darwin\"\n  Downloading tensorflow_io_gcs_filesystem-0.34.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (2.4 MB)\n\u001b[K     |████████████████████████████████| 2.4 MB 24.7 MB/s eta 0:00:01\n\u001b[?25hRequirement already satisfied, skipping upgrade: markdown>=2.6.8 in /opt/conda/lib/python3.7/site-packages (from tensorboard<2.12,>=2.11->tensorflow) (3.2.1)\nCollecting tensorboard-plugin-wit>=1.6.0\n  Downloading tensorboard_plugin_wit-1.8.1-py3-none-any.whl (781 kB)\n\u001b[K     |████████████████████████████████| 781 kB 27.8 MB/s eta 0:00:01\n\u001b[?25hRequirement already satisfied, skipping upgrade: google-auth<3,>=1.6.3 in /opt/conda/lib/python3.7/site-packages (from tensorboard<2.12,>=2.11->tensorflow) (1.14.0)\nRequirement already satisfied, skipping upgrade: google-auth-oauthlib<0.5,>=0.4.1 in /opt/conda/lib/python3.7/site-packages (from tensorboard<2.12,>=2.11->tensorflow) (0.4.1)\nCollecting tensorboard-data-server<0.7.0,>=0.6.0\n  Downloading tensorboard_data_server-0.6.1-py3-none-manylinux2010_x86_64.whl (4.9 MB)\n\u001b[K     |████████████████████████████████| 4.9 MB 36.8 MB/s eta 0:00:01\n\u001b[?25hRequirement already satisfied, skipping upgrade: werkzeug>=1.0.1 in /opt/conda/lib/python3.7/site-packages (from tensorboard<2.12,>=2.11->tensorflow) (1.0.1)\nRequirement already satisfied, skipping upgrade: wheel>=0.26 in /opt/conda/lib/python3.7/site-packages (from tensorboard<2.12,>=2.11->tensorflow) (0.34.2)\nRequirement already satisfied, skipping upgrade: requests<3,>=2.21.0 in /opt/conda/lib/python3.7/site-packages (from tensorboard<2.12,>=2.11->tensorflow) (2.23.0)\nRequirement already satisfied, skipping upgrade: pyparsing>=2.0.2 in /opt/conda/lib/python3.7/site-packages (from packaging->tensorflow) (2.4.7)\nRequirement already satisfied, skipping upgrade: rsa<4.1,>=3.1.4 in /opt/conda/lib/python3.7/site-packages (from google-auth<3,>=1.6.3->tensorboard<2.12,>=2.11->tensorflow) (4.0)\nRequirement already satisfied, skipping upgrade: cachetools<5.0,>=2.0.0 in /opt/conda/lib/python3.7/site-packages (from google-auth<3,>=1.6.3->tensorboard<2.12,>=2.11->tensorflow) (3.1.1)\nRequirement already satisfied, skipping upgrade: pyasn1-modules>=0.2.1 in /opt/conda/lib/python3.7/site-packages (from google-auth<3,>=1.6.3->tensorboard<2.12,>=2.11->tensorflow) (0.2.7)\nRequirement already satisfied, skipping upgrade: requests-oauthlib>=0.7.0 in /opt/conda/lib/python3.7/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.12,>=2.11->tensorflow) (1.2.0)\nRequirement already satisfied, skipping upgrade: chardet<4,>=3.0.2 in /opt/conda/lib/python3.7/site-packages (from requests<3,>=2.21.0->tensorboard<2.12,>=2.11->tensorflow) (3.0.4)\nRequirement already satisfied, skipping upgrade: certifi>=2017.4.17 in /opt/conda/lib/python3.7/site-packages (from requests<3,>=2.21.0->tensorboard<2.12,>=2.11->tensorflow) (2020.4.5.1)\nRequirement already satisfied, skipping upgrade: idna<3,>=2.5 in /opt/conda/lib/python3.7/site-packages (from requests<3,>=2.21.0->tensorboard<2.12,>=2.11->tensorflow) (2.9)\nRequirement already satisfied, skipping upgrade: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /opt/conda/lib/python3.7/site-packages (from requests<3,>=2.21.0->tensorboard<2.12,>=2.11->tensorflow) (1.24.3)\nRequirement already satisfied, skipping upgrade: pyasn1>=0.1.3 in /opt/conda/lib/python3.7/site-packages (from rsa<4.1,>=3.1.4->google-auth<3,>=1.6.3->tensorboard<2.12,>=2.11->tensorflow) (0.4.8)\nRequirement already satisfied, skipping upgrade: oauthlib>=3.0.0 in /opt/conda/lib/python3.7/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.12,>=2.11->tensorflow) (3.0.1)\n\u001b[31mERROR: kmeans-smote 0.1.2 has requirement imbalanced-learn<0.5,>=0.4.0, but you'll have imbalanced-learn 0.6.2 which is incompatible.\u001b[0m\n\u001b[31mERROR: kmeans-smote 0.1.2 has requirement numpy<1.16,>=1.13, but you'll have numpy 1.21.6 which is incompatible.\u001b[0m\n\u001b[31mERROR: kmeans-smote 0.1.2 has requirement scikit-learn<0.21,>=0.19.0, but you'll have scikit-learn 0.22.2.post1 which is incompatible.\u001b[0m\n\u001b[31mERROR: hypertools 0.6.2 has requirement scikit-learn<0.22,>=0.19.1, but you'll have scikit-learn 0.22.2.post1 which is incompatible.\u001b[0m\n\u001b[31mERROR: allennlp 0.9.0 has requirement spacy<2.2,>=2.1.0, but you'll have spacy 2.2.3 which is incompatible.\u001b[0m\nInstalling collected packages: numpy, tensorboard-plugin-wit, tensorboard-data-server, absl-py, tensorboard, tensorflow-estimator, keras, flatbuffers, libclang, astunparse, tensorflow-io-gcs-filesystem, tensorflow\n  Attempting uninstall: numpy\n    Found existing installation: numpy 1.18.1\n    Uninstalling numpy-1.18.1:\n      Successfully uninstalled numpy-1.18.1\n  Attempting uninstall: absl-py\n    Found existing installation: absl-py 0.9.0\n    Uninstalling absl-py-0.9.0:\n      Successfully uninstalled absl-py-0.9.0\n  Attempting uninstall: tensorboard\n    Found existing installation: tensorboard 2.1.1\n    Uninstalling tensorboard-2.1.1:\n      Successfully uninstalled tensorboard-2.1.1\n  Attempting uninstall: tensorflow-estimator\n    Found existing installation: tensorflow-estimator 2.1.0\n    Uninstalling tensorflow-estimator-2.1.0:\n      Successfully uninstalled tensorflow-estimator-2.1.0\n  Attempting uninstall: keras\n    Found existing installation: Keras 2.3.1\n    Uninstalling Keras-2.3.1:\n      Successfully uninstalled Keras-2.3.1\n  Attempting uninstall: tensorflow\n    Found existing installation: tensorflow 2.1.0\n    Uninstalling tensorflow-2.1.0:\n      Successfully uninstalled tensorflow-2.1.0\nSuccessfully installed absl-py-2.1.0 astunparse-1.6.3 flatbuffers-25.2.10 keras-2.11.0 libclang-18.1.1 numpy-1.21.6 tensorboard-2.11.2 tensorboard-data-server-0.6.1 tensorboard-plugin-wit-1.8.1 tensorflow-2.11.0 tensorflow-estimator-2.11.0 tensorflow-io-gcs-filesystem-0.34.0\n\u001b[33mWARNING: You are using pip version 20.1; however, version 24.0 is available.\nYou should consider upgrading via the '/opt/conda/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\nNote: you may need to restart the kernel to use updated packages.\n","output_type":"stream"}],"execution_count":3},{"cell_type":"markdown","source":"# **Install Required Libraries**# ","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport os\nimport tensorflow as tf\nimport matplotlib.pyplot as plt\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.applications import ResNet50\n\nfrom tensorflow.keras.layers import Dense, Flatten, Dropout\nfrom tensorflow.keras.models import Model\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T12:13:36.192943Z","iopub.execute_input":"2025-03-13T12:13:36.193329Z","iopub.status.idle":"2025-03-13T12:13:36.199052Z","shell.execute_reply.started":"2025-03-13T12:13:36.193293Z","shell.execute_reply":"2025-03-13T12:13:36.198086Z"}},"outputs":[],"execution_count":7},{"cell_type":"markdown","source":"# **Load Metadata**","metadata":{}},{"cell_type":"code","source":"# Load metadata\ndf = pd.read_csv('/kaggle/input/skin-cancer-mnist-ham10000/HAM10000_metadata.csv')\n\n# Display first few rows\nprint(df.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T12:15:00.985362Z","iopub.execute_input":"2025-03-13T12:15:00.985709Z","iopub.status.idle":"2025-03-13T12:15:01.052286Z","shell.execute_reply.started":"2025-03-13T12:15:00.985676Z","shell.execute_reply":"2025-03-13T12:15:01.051315Z"}},"outputs":[{"name":"stdout","text":"     lesion_id      image_id   dx dx_type   age   sex localization\n0  HAM_0000118  ISIC_0027419  bkl   histo  80.0  male        scalp\n1  HAM_0000118  ISIC_0025030  bkl   histo  80.0  male        scalp\n2  HAM_0002730  ISIC_0026769  bkl   histo  80.0  male        scalp\n3  HAM_0002730  ISIC_0025661  bkl   histo  80.0  male        scalp\n4  HAM_0001466  ISIC_0031633  bkl   histo  75.0  male          ear\n","output_type":"stream"}],"execution_count":9},{"cell_type":"markdown","source":"# **Labels Explanation:**","metadata":{}},{"cell_type":"code","source":"df['label'] = df['dx'].apply(lambda x: 1 if x == 'mel' else 0)  # 1 for melanoma, 0 for non-melanoma\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T12:15:46.848278Z","iopub.execute_input":"2025-03-13T12:15:46.848681Z","iopub.status.idle":"2025-03-13T12:15:46.858457Z","shell.execute_reply.started":"2025-03-13T12:15:46.848652Z","shell.execute_reply":"2025-03-13T12:15:46.857411Z"}},"outputs":[],"execution_count":13},{"cell_type":"markdown","source":"# **Prepare Image Paths**","metadata":{}},{"cell_type":"code","source":"# Define image folder paths\nimage_dir_1 = \"/kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_1/\"\nimage_dir_2 = \"/kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_2/\"\n\n# Map images to their correct paths\ndf['image_path'] = df['image_id'].apply(lambda x: image_dir_1 + x + \".jpg\" \n                                        if os.path.exists(image_dir_1 + x + \".jpg\") \n                                        else image_dir_2 + x + \".jpg\")\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T12:40:23.408867Z","iopub.execute_input":"2025-03-13T12:40:23.409268Z","iopub.status.idle":"2025-03-13T12:40:37.802465Z","shell.execute_reply.started":"2025-03-13T12:40:23.409236Z","shell.execute_reply":"2025-03-13T12:40:37.801554Z"}},"outputs":[],"execution_count":48},{"cell_type":"markdown","source":"# **Train-Test Split**","metadata":{}},{"cell_type":"code","source":"train_df, test_df = train_test_split(df, test_size=0.2, stratify=df['label'], random_state=42)\n# train_df, test_df = train_test_split(df, test_size=0.1, stratify=df['label'], random_state=42)\ntrain_df[\"label\"] = train_df[\"label\"].astype(str)\ntest_df[\"label\"] = test_df[\"label\"].astype(str)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T12:40:59.701178Z","iopub.execute_input":"2025-03-13T12:40:59.701558Z","iopub.status.idle":"2025-03-13T12:40:59.728842Z","shell.execute_reply.started":"2025-03-13T12:40:59.701525Z","shell.execute_reply":"2025-03-13T12:40:59.727761Z"}},"outputs":[{"name":"stderr","text":"/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:3: SettingWithCopyWarning: \nA value is trying to be set on a copy of a slice from a DataFrame.\nTry using .loc[row_indexer,col_indexer] = value instead\n\nSee the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n  This is separate from the ipykernel package so we can avoid doing imports until\n/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:4: SettingWithCopyWarning: \nA value is trying to be set on a copy of a slice from a DataFrame.\nTry using .loc[row_indexer,col_indexer] = value instead\n\nSee the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n  after removing the cwd from sys.path.\n","output_type":"stream"}],"execution_count":49},{"cell_type":"markdown","source":"# **Preprocess Images**","metadata":{}},{"cell_type":"code","source":"IMG_SIZE = (224, 224)  # Resize images for EfficientNet\n\ntrain_datagen = ImageDataGenerator(\n    rescale=1./255, \n    rotation_range=30, \n    horizontal_flip=True, \n    zoom_range=0.2)\n\ntest_datagen = ImageDataGenerator(rescale=1./255)\n\ntrain_generator = train_datagen.flow_from_dataframe(\n    dataframe=train_df, \n    x_col=\"image_path\", \n    y_col=\"label\",  # Make sure labels are strings\n    target_size=IMG_SIZE, \n    batch_size=32, \n    class_mode='binary')  # Class mode is binary for melanoma classification\n\ntest_generator = test_datagen.flow_from_dataframe(\n    test_df, \n    x_col=\"image_path\", \n    y_col=\"label\", \n    target_size=IMG_SIZE, \n    batch_size=32, \n    class_mode='binary')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T12:41:08.330608Z","iopub.execute_input":"2025-03-13T12:41:08.330962Z","iopub.status.idle":"2025-03-13T12:41:22.479389Z","shell.execute_reply.started":"2025-03-13T12:41:08.330931Z","shell.execute_reply":"2025-03-13T12:41:22.47837Z"}},"outputs":[{"name":"stdout","text":"Found 8012 validated image filenames belonging to 2 classes.\nFound 2003 validated image filenames belonging to 2 classes.\n","output_type":"stream"}],"execution_count":50},{"cell_type":"markdown","source":"# **Build a CNN Model**","metadata":{}},{"cell_type":"code","source":"base_model = ResNet50(weights=\"imagenet\", include_top=False, input_shape=(224, 224, 3))\n\n# Freeze base model layers\nfor layer in base_model.layers:\n    layer.trainable = False\n\n# Add custom layers\nx = Flatten()(base_model.output)\nx = Dense(128, activation='relu')(x)\nx = Dropout(0.5)(x)\nx = Dense(1, activation='sigmoid')(x)  # Binary classification\n\n# Create model\nmodel = Model(inputs=base_model.input, outputs=x)\n\n# Compile model\nmodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n\n# Summary\nmodel.summary()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T12:41:39.433477Z","iopub.execute_input":"2025-03-13T12:41:39.433849Z","iopub.status.idle":"2025-03-13T12:41:42.403291Z","shell.execute_reply.started":"2025-03-13T12:41:39.433813Z","shell.execute_reply":"2025-03-13T12:41:42.402285Z"}},"outputs":[{"name":"stdout","text":"Model: \"model_4\"\n__________________________________________________________________________________________________\nLayer (type)                    Output Shape         Param #     Connected to                     \n==================================================================================================\ninput_5 (InputLayer)            [(None, 224, 224, 3) 0                                            \n__________________________________________________________________________________________________\nconv1_pad (ZeroPadding2D)       (None, 230, 230, 3)  0           input_5[0][0]                    \n__________________________________________________________________________________________________\nconv1_conv (Conv2D)             (None, 112, 112, 64) 9472        conv1_pad[0][0]                  \n__________________________________________________________________________________________________\nconv1_bn (BatchNormalization)   (None, 112, 112, 64) 256         conv1_conv[0][0]                 \n__________________________________________________________________________________________________\nconv1_relu (Activation)         (None, 112, 112, 64) 0           conv1_bn[0][0]                   \n__________________________________________________________________________________________________\npool1_pad (ZeroPadding2D)       (None, 114, 114, 64) 0           conv1_relu[0][0]                 \n__________________________________________________________________________________________________\npool1_pool (MaxPooling2D)       (None, 56, 56, 64)   0           pool1_pad[0][0]                  \n__________________________________________________________________________________________________\nconv2_block1_1_conv (Conv2D)    (None, 56, 56, 64)   4160        pool1_pool[0][0]                 \n__________________________________________________________________________________________________\nconv2_block1_1_bn (BatchNormali (None, 56, 56, 64)   256         conv2_block1_1_conv[0][0]        \n__________________________________________________________________________________________________\nconv2_block1_1_relu (Activation (None, 56, 56, 64)   0           conv2_block1_1_bn[0][0]          \n__________________________________________________________________________________________________\nconv2_block1_2_conv (Conv2D)    (None, 56, 56, 64)   36928       conv2_block1_1_relu[0][0]        \n__________________________________________________________________________________________________\nconv2_block1_2_bn (BatchNormali (None, 56, 56, 64)   256         conv2_block1_2_conv[0][0]        \n__________________________________________________________________________________________________\nconv2_block1_2_relu (Activation (None, 56, 56, 64)   0           conv2_block1_2_bn[0][0]          \n__________________________________________________________________________________________________\nconv2_block1_0_conv (Conv2D)    (None, 56, 56, 256)  16640       pool1_pool[0][0]                 \n__________________________________________________________________________________________________\nconv2_block1_3_conv (Conv2D)    (None, 56, 56, 256)  16640       conv2_block1_2_relu[0][0]        \n__________________________________________________________________________________________________\nconv2_block1_0_bn (BatchNormali (None, 56, 56, 256)  1024        conv2_block1_0_conv[0][0]        \n__________________________________________________________________________________________________\nconv2_block1_3_bn (BatchNormali (None, 56, 56, 256)  1024        conv2_block1_3_conv[0][0]        \n__________________________________________________________________________________________________\nconv2_block1_add (Add)          (None, 56, 56, 256)  0           conv2_block1_0_bn[0][0]          \n                                                                 conv2_block1_3_bn[0][0]          \n__________________________________________________________________________________________________\nconv2_block1_out (Activation)   (None, 56, 56, 256)  0           conv2_block1_add[0][0]           \n__________________________________________________________________________________________________\nconv2_block2_1_conv (Conv2D)    (None, 56, 56, 64)   16448       conv2_block1_out[0][0]           \n__________________________________________________________________________________________________\nconv2_block2_1_bn (BatchNormali (None, 56, 56, 64)   256         conv2_block2_1_conv[0][0]        \n__________________________________________________________________________________________________\nconv2_block2_1_relu (Activation (None, 56, 56, 64)   0           conv2_block2_1_bn[0][0]          \n__________________________________________________________________________________________________\nconv2_block2_2_conv (Conv2D)    (None, 56, 56, 64)   36928       conv2_block2_1_relu[0][0]        \n__________________________________________________________________________________________________\nconv2_block2_2_bn (BatchNormali (None, 56, 56, 64)   256         conv2_block2_2_conv[0][0]        \n__________________________________________________________________________________________________\nconv2_block2_2_relu (Activation (None, 56, 56, 64)   0           conv2_block2_2_bn[0][0]          \n__________________________________________________________________________________________________\nconv2_block2_3_conv (Conv2D)    (None, 56, 56, 256)  16640       conv2_block2_2_relu[0][0]        \n__________________________________________________________________________________________________\nconv2_block2_3_bn (BatchNormali (None, 56, 56, 256)  1024        conv2_block2_3_conv[0][0]        \n__________________________________________________________________________________________________\nconv2_block2_add (Add)          (None, 56, 56, 256)  0           conv2_block1_out[0][0]           \n                                                                 conv2_block2_3_bn[0][0]          \n__________________________________________________________________________________________________\nconv2_block2_out (Activation)   (None, 56, 56, 256)  0           conv2_block2_add[0][0]           \n__________________________________________________________________________________________________\nconv2_block3_1_conv (Conv2D)    (None, 56, 56, 64)   16448       conv2_block2_out[0][0]           \n__________________________________________________________________________________________________\nconv2_block3_1_bn (BatchNormali (None, 56, 56, 64)   256         conv2_block3_1_conv[0][0]        \n__________________________________________________________________________________________________\nconv2_block3_1_relu (Activation (None, 56, 56, 64)   0           conv2_block3_1_bn[0][0]          \n__________________________________________________________________________________________________\nconv2_block3_2_conv (Conv2D)    (None, 56, 56, 64)   36928       conv2_block3_1_relu[0][0]        \n__________________________________________________________________________________________________\nconv2_block3_2_bn (BatchNormali (None, 56, 56, 64)   256         conv2_block3_2_conv[0][0]        \n__________________________________________________________________________________________________\nconv2_block3_2_relu (Activation (None, 56, 56, 64)   0           conv2_block3_2_bn[0][0]          \n__________________________________________________________________________________________________\nconv2_block3_3_conv (Conv2D)    (None, 56, 56, 256)  16640       conv2_block3_2_relu[0][0]        \n__________________________________________________________________________________________________\nconv2_block3_3_bn (BatchNormali (None, 56, 56, 256)  1024        conv2_block3_3_conv[0][0]        \n__________________________________________________________________________________________________\nconv2_block3_add (Add)          (None, 56, 56, 256)  0           conv2_block2_out[0][0]           \n                                                                 conv2_block3_3_bn[0][0]          \n__________________________________________________________________________________________________\nconv2_block3_out (Activation)   (None, 56, 56, 256)  0           conv2_block3_add[0][0]           \n__________________________________________________________________________________________________\nconv3_block1_1_conv (Conv2D)    (None, 28, 28, 128)  32896       conv2_block3_out[0][0]           \n__________________________________________________________________________________________________\nconv3_block1_1_bn (BatchNormali (None, 28, 28, 128)  512         conv3_block1_1_conv[0][0]        \n__________________________________________________________________________________________________\nconv3_block1_1_relu (Activation (None, 28, 28, 128)  0           conv3_block1_1_bn[0][0]          \n__________________________________________________________________________________________________\nconv3_block1_2_conv (Conv2D)    (None, 28, 28, 128)  147584      conv3_block1_1_relu[0][0]        \n__________________________________________________________________________________________________\nconv3_block1_2_bn (BatchNormali (None, 28, 28, 128)  512         conv3_block1_2_conv[0][0]        \n__________________________________________________________________________________________________\nconv3_block1_2_relu (Activation (None, 28, 28, 128)  0           conv3_block1_2_bn[0][0]          \n__________________________________________________________________________________________________\nconv3_block1_0_conv (Conv2D)    (None, 28, 28, 512)  131584      conv2_block3_out[0][0]           \n__________________________________________________________________________________________________\nconv3_block1_3_conv (Conv2D)    (None, 28, 28, 512)  66048       conv3_block1_2_relu[0][0]        \n__________________________________________________________________________________________________\nconv3_block1_0_bn (BatchNormali (None, 28, 28, 512)  2048        conv3_block1_0_conv[0][0]        \n__________________________________________________________________________________________________\nconv3_block1_3_bn (BatchNormali (None, 28, 28, 512)  2048        conv3_block1_3_conv[0][0]        \n__________________________________________________________________________________________________\nconv3_block1_add (Add)          (None, 28, 28, 512)  0           conv3_block1_0_bn[0][0]          \n                                                                 conv3_block1_3_bn[0][0]          \n__________________________________________________________________________________________________\nconv3_block1_out (Activation)   (None, 28, 28, 512)  0           conv3_block1_add[0][0]           \n__________________________________________________________________________________________________\nconv3_block2_1_conv (Conv2D)    (None, 28, 28, 128)  65664       conv3_block1_out[0][0]           \n__________________________________________________________________________________________________\nconv3_block2_1_bn (BatchNormali (None, 28, 28, 128)  512         conv3_block2_1_conv[0][0]        \n__________________________________________________________________________________________________\nconv3_block2_1_relu (Activation (None, 28, 28, 128)  0           conv3_block2_1_bn[0][0]          \n__________________________________________________________________________________________________\nconv3_block2_2_conv (Conv2D)    (None, 28, 28, 128)  147584      conv3_block2_1_relu[0][0]        \n__________________________________________________________________________________________________\nconv3_block2_2_bn (BatchNormali (None, 28, 28, 128)  512         conv3_block2_2_conv[0][0]        \n__________________________________________________________________________________________________\nconv3_block2_2_relu (Activation (None, 28, 28, 128)  0           conv3_block2_2_bn[0][0]          \n__________________________________________________________________________________________________\nconv3_block2_3_conv (Conv2D)    (None, 28, 28, 512)  66048       conv3_block2_2_relu[0][0]        \n__________________________________________________________________________________________________\nconv3_block2_3_bn (BatchNormali (None, 28, 28, 512)  2048        conv3_block2_3_conv[0][0]        \n__________________________________________________________________________________________________\nconv3_block2_add (Add)          (None, 28, 28, 512)  0           conv3_block1_out[0][0]           \n                                                                 conv3_block2_3_bn[0][0]          \n__________________________________________________________________________________________________\nconv3_block2_out (Activation)   (None, 28, 28, 512)  0           conv3_block2_add[0][0]           \n__________________________________________________________________________________________________\nconv3_block3_1_conv (Conv2D)    (None, 28, 28, 128)  65664       conv3_block2_out[0][0]           \n__________________________________________________________________________________________________\nconv3_block3_1_bn (BatchNormali (None, 28, 28, 128)  512         conv3_block3_1_conv[0][0]        \n__________________________________________________________________________________________________\nconv3_block3_1_relu (Activation (None, 28, 28, 128)  0           conv3_block3_1_bn[0][0]          \n__________________________________________________________________________________________________\nconv3_block3_2_conv (Conv2D)    (None, 28, 28, 128)  147584      conv3_block3_1_relu[0][0]        \n__________________________________________________________________________________________________\nconv3_block3_2_bn (BatchNormali (None, 28, 28, 128)  512         conv3_block3_2_conv[0][0]        \n__________________________________________________________________________________________________\nconv3_block3_2_relu (Activation (None, 28, 28, 128)  0           conv3_block3_2_bn[0][0]          \n__________________________________________________________________________________________________\nconv3_block3_3_conv (Conv2D)    (None, 28, 28, 512)  66048       conv3_block3_2_relu[0][0]        \n__________________________________________________________________________________________________\nconv3_block3_3_bn (BatchNormali (None, 28, 28, 512)  2048        conv3_block3_3_conv[0][0]        \n__________________________________________________________________________________________________\nconv3_block3_add (Add)          (None, 28, 28, 512)  0           conv3_block2_out[0][0]           \n                                                                 conv3_block3_3_bn[0][0]          \n__________________________________________________________________________________________________\nconv3_block3_out (Activation)   (None, 28, 28, 512)  0           conv3_block3_add[0][0]           \n__________________________________________________________________________________________________\nconv3_block4_1_conv (Conv2D)    (None, 28, 28, 128)  65664       conv3_block3_out[0][0]           \n__________________________________________________________________________________________________\nconv3_block4_1_bn (BatchNormali (None, 28, 28, 128)  512         conv3_block4_1_conv[0][0]        \n__________________________________________________________________________________________________\nconv3_block4_1_relu (Activation (None, 28, 28, 128)  0           conv3_block4_1_bn[0][0]          \n__________________________________________________________________________________________________\nconv3_block4_2_conv (Conv2D)    (None, 28, 28, 128)  147584      conv3_block4_1_relu[0][0]        \n__________________________________________________________________________________________________\nconv3_block4_2_bn (BatchNormali (None, 28, 28, 128)  512         conv3_block4_2_conv[0][0]        \n__________________________________________________________________________________________________\nconv3_block4_2_relu (Activation (None, 28, 28, 128)  0           conv3_block4_2_bn[0][0]          \n__________________________________________________________________________________________________\nconv3_block4_3_conv (Conv2D)    (None, 28, 28, 512)  66048       conv3_block4_2_relu[0][0]        \n__________________________________________________________________________________________________\nconv3_block4_3_bn (BatchNormali (None, 28, 28, 512)  2048        conv3_block4_3_conv[0][0]        \n__________________________________________________________________________________________________\nconv3_block4_add (Add)          (None, 28, 28, 512)  0           conv3_block3_out[0][0]           \n                                                                 conv3_block4_3_bn[0][0]          \n__________________________________________________________________________________________________\nconv3_block4_out (Activation)   (None, 28, 28, 512)  0           conv3_block4_add[0][0]           \n__________________________________________________________________________________________________\nconv4_block1_1_conv (Conv2D)    (None, 14, 14, 256)  131328      conv3_block4_out[0][0]           \n__________________________________________________________________________________________________\nconv4_block1_1_bn (BatchNormali (None, 14, 14, 256)  1024        conv4_block1_1_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block1_1_relu (Activation (None, 14, 14, 256)  0           conv4_block1_1_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block1_2_conv (Conv2D)    (None, 14, 14, 256)  590080      conv4_block1_1_relu[0][0]        \n__________________________________________________________________________________________________\nconv4_block1_2_bn (BatchNormali (None, 14, 14, 256)  1024        conv4_block1_2_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block1_2_relu (Activation (None, 14, 14, 256)  0           conv4_block1_2_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block1_0_conv (Conv2D)    (None, 14, 14, 1024) 525312      conv3_block4_out[0][0]           \n__________________________________________________________________________________________________\nconv4_block1_3_conv (Conv2D)    (None, 14, 14, 1024) 263168      conv4_block1_2_relu[0][0]        \n__________________________________________________________________________________________________\nconv4_block1_0_bn (BatchNormali (None, 14, 14, 1024) 4096        conv4_block1_0_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block1_3_bn (BatchNormali (None, 14, 14, 1024) 4096        conv4_block1_3_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block1_add (Add)          (None, 14, 14, 1024) 0           conv4_block1_0_bn[0][0]          \n                                                                 conv4_block1_3_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block1_out (Activation)   (None, 14, 14, 1024) 0           conv4_block1_add[0][0]           \n__________________________________________________________________________________________________\nconv4_block2_1_conv (Conv2D)    (None, 14, 14, 256)  262400      conv4_block1_out[0][0]           \n__________________________________________________________________________________________________\nconv4_block2_1_bn (BatchNormali (None, 14, 14, 256)  1024        conv4_block2_1_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block2_1_relu (Activation (None, 14, 14, 256)  0           conv4_block2_1_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block2_2_conv (Conv2D)    (None, 14, 14, 256)  590080      conv4_block2_1_relu[0][0]        \n__________________________________________________________________________________________________\nconv4_block2_2_bn (BatchNormali (None, 14, 14, 256)  1024        conv4_block2_2_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block2_2_relu (Activation (None, 14, 14, 256)  0           conv4_block2_2_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block2_3_conv (Conv2D)    (None, 14, 14, 1024) 263168      conv4_block2_2_relu[0][0]        \n__________________________________________________________________________________________________\nconv4_block2_3_bn (BatchNormali (None, 14, 14, 1024) 4096        conv4_block2_3_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block2_add (Add)          (None, 14, 14, 1024) 0           conv4_block1_out[0][0]           \n                                                                 conv4_block2_3_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block2_out (Activation)   (None, 14, 14, 1024) 0           conv4_block2_add[0][0]           \n__________________________________________________________________________________________________\nconv4_block3_1_conv (Conv2D)    (None, 14, 14, 256)  262400      conv4_block2_out[0][0]           \n__________________________________________________________________________________________________\nconv4_block3_1_bn (BatchNormali (None, 14, 14, 256)  1024        conv4_block3_1_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block3_1_relu (Activation (None, 14, 14, 256)  0           conv4_block3_1_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block3_2_conv (Conv2D)    (None, 14, 14, 256)  590080      conv4_block3_1_relu[0][0]        \n__________________________________________________________________________________________________\nconv4_block3_2_bn (BatchNormali (None, 14, 14, 256)  1024        conv4_block3_2_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block3_2_relu (Activation (None, 14, 14, 256)  0           conv4_block3_2_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block3_3_conv (Conv2D)    (None, 14, 14, 1024) 263168      conv4_block3_2_relu[0][0]        \n__________________________________________________________________________________________________\nconv4_block3_3_bn (BatchNormali (None, 14, 14, 1024) 4096        conv4_block3_3_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block3_add (Add)          (None, 14, 14, 1024) 0           conv4_block2_out[0][0]           \n                                                                 conv4_block3_3_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block3_out (Activation)   (None, 14, 14, 1024) 0           conv4_block3_add[0][0]           \n__________________________________________________________________________________________________\nconv4_block4_1_conv (Conv2D)    (None, 14, 14, 256)  262400      conv4_block3_out[0][0]           \n__________________________________________________________________________________________________\nconv4_block4_1_bn (BatchNormali (None, 14, 14, 256)  1024        conv4_block4_1_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block4_1_relu (Activation (None, 14, 14, 256)  0           conv4_block4_1_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block4_2_conv (Conv2D)    (None, 14, 14, 256)  590080      conv4_block4_1_relu[0][0]        \n__________________________________________________________________________________________________\nconv4_block4_2_bn (BatchNormali (None, 14, 14, 256)  1024        conv4_block4_2_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block4_2_relu (Activation (None, 14, 14, 256)  0           conv4_block4_2_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block4_3_conv (Conv2D)    (None, 14, 14, 1024) 263168      conv4_block4_2_relu[0][0]        \n__________________________________________________________________________________________________\nconv4_block4_3_bn (BatchNormali (None, 14, 14, 1024) 4096        conv4_block4_3_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block4_add (Add)          (None, 14, 14, 1024) 0           conv4_block3_out[0][0]           \n                                                                 conv4_block4_3_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block4_out (Activation)   (None, 14, 14, 1024) 0           conv4_block4_add[0][0]           \n__________________________________________________________________________________________________\nconv4_block5_1_conv (Conv2D)    (None, 14, 14, 256)  262400      conv4_block4_out[0][0]           \n__________________________________________________________________________________________________\nconv4_block5_1_bn (BatchNormali (None, 14, 14, 256)  1024        conv4_block5_1_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block5_1_relu (Activation (None, 14, 14, 256)  0           conv4_block5_1_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block5_2_conv (Conv2D)    (None, 14, 14, 256)  590080      conv4_block5_1_relu[0][0]        \n__________________________________________________________________________________________________\nconv4_block5_2_bn (BatchNormali (None, 14, 14, 256)  1024        conv4_block5_2_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block5_2_relu (Activation (None, 14, 14, 256)  0           conv4_block5_2_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block5_3_conv (Conv2D)    (None, 14, 14, 1024) 263168      conv4_block5_2_relu[0][0]        \n__________________________________________________________________________________________________\nconv4_block5_3_bn (BatchNormali (None, 14, 14, 1024) 4096        conv4_block5_3_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block5_add (Add)          (None, 14, 14, 1024) 0           conv4_block4_out[0][0]           \n                                                                 conv4_block5_3_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block5_out (Activation)   (None, 14, 14, 1024) 0           conv4_block5_add[0][0]           \n__________________________________________________________________________________________________\nconv4_block6_1_conv (Conv2D)    (None, 14, 14, 256)  262400      conv4_block5_out[0][0]           \n__________________________________________________________________________________________________\nconv4_block6_1_bn (BatchNormali (None, 14, 14, 256)  1024        conv4_block6_1_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block6_1_relu (Activation (None, 14, 14, 256)  0           conv4_block6_1_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block6_2_conv (Conv2D)    (None, 14, 14, 256)  590080      conv4_block6_1_relu[0][0]        \n__________________________________________________________________________________________________\nconv4_block6_2_bn (BatchNormali (None, 14, 14, 256)  1024        conv4_block6_2_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block6_2_relu (Activation (None, 14, 14, 256)  0           conv4_block6_2_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block6_3_conv (Conv2D)    (None, 14, 14, 1024) 263168      conv4_block6_2_relu[0][0]        \n__________________________________________________________________________________________________\nconv4_block6_3_bn (BatchNormali (None, 14, 14, 1024) 4096        conv4_block6_3_conv[0][0]        \n__________________________________________________________________________________________________\nconv4_block6_add (Add)          (None, 14, 14, 1024) 0           conv4_block5_out[0][0]           \n                                                                 conv4_block6_3_bn[0][0]          \n__________________________________________________________________________________________________\nconv4_block6_out (Activation)   (None, 14, 14, 1024) 0           conv4_block6_add[0][0]           \n__________________________________________________________________________________________________\nconv5_block1_1_conv (Conv2D)    (None, 7, 7, 512)    524800      conv4_block6_out[0][0]           \n__________________________________________________________________________________________________\nconv5_block1_1_bn (BatchNormali (None, 7, 7, 512)    2048        conv5_block1_1_conv[0][0]        \n__________________________________________________________________________________________________\nconv5_block1_1_relu (Activation (None, 7, 7, 512)    0           conv5_block1_1_bn[0][0]          \n__________________________________________________________________________________________________\nconv5_block1_2_conv (Conv2D)    (None, 7, 7, 512)    2359808     conv5_block1_1_relu[0][0]        \n__________________________________________________________________________________________________\nconv5_block1_2_bn (BatchNormali (None, 7, 7, 512)    2048        conv5_block1_2_conv[0][0]        \n__________________________________________________________________________________________________\nconv5_block1_2_relu (Activation (None, 7, 7, 512)    0           conv5_block1_2_bn[0][0]          \n__________________________________________________________________________________________________\nconv5_block1_0_conv (Conv2D)    (None, 7, 7, 2048)   2099200     conv4_block6_out[0][0]           \n__________________________________________________________________________________________________\nconv5_block1_3_conv (Conv2D)    (None, 7, 7, 2048)   1050624     conv5_block1_2_relu[0][0]        \n__________________________________________________________________________________________________\nconv5_block1_0_bn (BatchNormali (None, 7, 7, 2048)   8192        conv5_block1_0_conv[0][0]        \n__________________________________________________________________________________________________\nconv5_block1_3_bn (BatchNormali (None, 7, 7, 2048)   8192        conv5_block1_3_conv[0][0]        \n__________________________________________________________________________________________________\nconv5_block1_add (Add)          (None, 7, 7, 2048)   0           conv5_block1_0_bn[0][0]          \n                                                                 conv5_block1_3_bn[0][0]          \n__________________________________________________________________________________________________\nconv5_block1_out (Activation)   (None, 7, 7, 2048)   0           conv5_block1_add[0][0]           \n__________________________________________________________________________________________________\nconv5_block2_1_conv (Conv2D)    (None, 7, 7, 512)    1049088     conv5_block1_out[0][0]           \n__________________________________________________________________________________________________\nconv5_block2_1_bn (BatchNormali (None, 7, 7, 512)    2048        conv5_block2_1_conv[0][0]        \n__________________________________________________________________________________________________\nconv5_block2_1_relu (Activation (None, 7, 7, 512)    0           conv5_block2_1_bn[0][0]          \n__________________________________________________________________________________________________\nconv5_block2_2_conv (Conv2D)    (None, 7, 7, 512)    2359808     conv5_block2_1_relu[0][0]        \n__________________________________________________________________________________________________\nconv5_block2_2_bn (BatchNormali (None, 7, 7, 512)    2048        conv5_block2_2_conv[0][0]        \n__________________________________________________________________________________________________\nconv5_block2_2_relu (Activation (None, 7, 7, 512)    0           conv5_block2_2_bn[0][0]          \n__________________________________________________________________________________________________\nconv5_block2_3_conv (Conv2D)    (None, 7, 7, 2048)   1050624     conv5_block2_2_relu[0][0]        \n__________________________________________________________________________________________________\nconv5_block2_3_bn (BatchNormali (None, 7, 7, 2048)   8192        conv5_block2_3_conv[0][0]        \n__________________________________________________________________________________________________\nconv5_block2_add (Add)          (None, 7, 7, 2048)   0           conv5_block1_out[0][0]           \n                                                                 conv5_block2_3_bn[0][0]          \n__________________________________________________________________________________________________\nconv5_block2_out (Activation)   (None, 7, 7, 2048)   0           conv5_block2_add[0][0]           \n__________________________________________________________________________________________________\nconv5_block3_1_conv (Conv2D)    (None, 7, 7, 512)    1049088     conv5_block2_out[0][0]           \n__________________________________________________________________________________________________\nconv5_block3_1_bn (BatchNormali (None, 7, 7, 512)    2048        conv5_block3_1_conv[0][0]        \n__________________________________________________________________________________________________\nconv5_block3_1_relu (Activation (None, 7, 7, 512)    0           conv5_block3_1_bn[0][0]          \n__________________________________________________________________________________________________\nconv5_block3_2_conv (Conv2D)    (None, 7, 7, 512)    2359808     conv5_block3_1_relu[0][0]        \n__________________________________________________________________________________________________\nconv5_block3_2_bn (BatchNormali (None, 7, 7, 512)    2048        conv5_block3_2_conv[0][0]        \n__________________________________________________________________________________________________\nconv5_block3_2_relu (Activation (None, 7, 7, 512)    0           conv5_block3_2_bn[0][0]          \n__________________________________________________________________________________________________\nconv5_block3_3_conv (Conv2D)    (None, 7, 7, 2048)   1050624     conv5_block3_2_relu[0][0]        \n__________________________________________________________________________________________________\nconv5_block3_3_bn (BatchNormali (None, 7, 7, 2048)   8192        conv5_block3_3_conv[0][0]        \n__________________________________________________________________________________________________\nconv5_block3_add (Add)          (None, 7, 7, 2048)   0           conv5_block2_out[0][0]           \n                                                                 conv5_block3_3_bn[0][0]          \n__________________________________________________________________________________________________\nconv5_block3_out (Activation)   (None, 7, 7, 2048)   0           conv5_block3_add[0][0]           \n__________________________________________________________________________________________________\nflatten_4 (Flatten)             (None, 100352)       0           conv5_block3_out[0][0]           \n__________________________________________________________________________________________________\ndense_8 (Dense)                 (None, 128)          12845184    flatten_4[0][0]                  \n__________________________________________________________________________________________________\ndropout_4 (Dropout)             (None, 128)          0           dense_8[0][0]                    \n__________________________________________________________________________________________________\ndense_9 (Dense)                 (None, 1)            129         dropout_4[0][0]                  \n==================================================================================================\nTotal params: 36,433,025\nTrainable params: 12,845,313\nNon-trainable params: 23,587,712\n__________________________________________________________________________________________________\n","output_type":"stream"}],"execution_count":51},{"cell_type":"markdown","source":"# **Train the Model**","metadata":{}},{"cell_type":"code","source":"pd.set_option('display.max_colwidth', None)\npd.set_option('display.max_rows', None)  # Shows all rows (if needed)\n\n\nprint(train_df.head())  \nprint(test_df.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T12:42:37.596866Z","iopub.execute_input":"2025-03-13T12:42:37.597305Z","iopub.status.idle":"2025-03-13T12:42:37.61461Z","shell.execute_reply.started":"2025-03-13T12:42:37.597267Z","shell.execute_reply":"2025-03-13T12:42:37.613263Z"}},"outputs":[{"name":"stdout","text":"        lesion_id      image_id   dx    dx_type   age     sex localization  \\\n9445  HAM_0007376  ISIC_0032616   nv  consensus  40.0    male         back   \n3918  HAM_0005169  ISIC_0027557   nv  follow_up  50.0  female        trunk   \n6741  HAM_0000028  ISIC_0026012   nv      histo  35.0  female         back   \n1379  HAM_0000417  ISIC_0025783  mel      histo  65.0    male         back   \n8862  HAM_0004170  ISIC_0031476   nv      histo  65.0    male      abdomen   \n\n     label  \\\n9445     0   \n3918     0   \n6741     0   \n1379     1   \n8862     0   \n\n                                                                            image_path  \n9445  /kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_2/ISIC_0032616.jpg  \n3918  /kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_1/ISIC_0027557.jpg  \n6741  /kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_1/ISIC_0026012.jpg  \n1379  /kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_1/ISIC_0025783.jpg  \n8862  /kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_2/ISIC_0031476.jpg  \n        lesion_id      image_id   dx    dx_type   age     sex  \\\n7962  HAM_0002417  ISIC_0032943   nv      histo   NaN    male   \n1392  HAM_0003449  ISIC_0027263  mel      histo  85.0    male   \n6559  HAM_0004812  ISIC_0025682   nv  follow_up  35.0  female   \n7029  HAM_0002409  ISIC_0028843   nv      histo  35.0  female   \n5     HAM_0001466  ISIC_0027850  bkl      histo  75.0    male   \n\n         localization label  \\\n7962  upper extremity     0   \n1392             back     1   \n6559            trunk     0   \n7029             back     0   \n5                 ear     0   \n\n                                                                            image_path  \n7962  /kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_2/ISIC_0032943.jpg  \n1392  /kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_1/ISIC_0027263.jpg  \n6559  /kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_1/ISIC_0025682.jpg  \n7029  /kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_1/ISIC_0028843.jpg  \n5     /kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_1/ISIC_0027850.jpg  \n","output_type":"stream"}],"execution_count":52},{"cell_type":"code","source":"import os\nprint(os.path.exists(\"/kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_2/ISIC_0029306.jpg\"))\nprint(os.path.exists(\"/kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_1/ISIC_0027850.jpg\"))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T12:42:56.658375Z","iopub.execute_input":"2025-03-13T12:42:56.658721Z","iopub.status.idle":"2025-03-13T12:42:56.667776Z","shell.execute_reply.started":"2025-03-13T12:42:56.658692Z","shell.execute_reply":"2025-03-13T12:42:56.666631Z"}},"outputs":[{"name":"stdout","text":"True\nTrue\n","output_type":"stream"}],"execution_count":53},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"# **Train the Model**","metadata":{}},{"cell_type":"code","source":"history = model.fit(\n    train_generator,\n    validation_data=test_generator,\n    epochs=10)\n\n\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T12:43:02.34004Z","iopub.execute_input":"2025-03-13T12:43:02.340433Z","iopub.status.idle":"2025-03-13T16:15:17.544862Z","shell.execute_reply.started":"2025-03-13T12:43:02.340396Z","shell.execute_reply":"2025-03-13T16:15:17.542337Z"}},"outputs":[{"name":"stdout","text":"Train for 251 steps, validate for 63 steps\nEpoch 1/10\n251/251 [==============================] - 1282s 5s/step - loss: 1.2254 - accuracy: 0.8809 - val_loss: 0.5471 - val_accuracy: 0.8887\nEpoch 2/10\n251/251 [==============================] - 1293s 5s/step - loss: 0.3191 - accuracy: 0.8890 - val_loss: 0.7298 - val_accuracy: 0.8887\nEpoch 3/10\n251/251 [==============================] - 1268s 5s/step - loss: 0.3073 - accuracy: 0.8889 - val_loss: 0.4468 - val_accuracy: 0.8887\nEpoch 4/10\n251/251 [==============================] - 1260s 5s/step - loss: 0.2799 - accuracy: 0.8889 - val_loss: 0.4364 - val_accuracy: 0.8887\nEpoch 5/10\n251/251 [==============================] - 1264s 5s/step - loss: 0.2698 - accuracy: 0.8889 - val_loss: 0.6075 - val_accuracy: 0.8887\nEpoch 6/10\n251/251 [==============================] - 1264s 5s/step - loss: 0.2668 - accuracy: 0.8889 - val_loss: 0.6142 - val_accuracy: 0.8887\nEpoch 7/10\n251/251 [==============================] - 1277s 5s/step - loss: 0.2591 - accuracy: 0.8889 - val_loss: 0.8150 - val_accuracy: 0.8887\nEpoch 8/10\n251/251 [==============================] - 1274s 5s/step - loss: 0.2623 - accuracy: 0.8889 - val_loss: 0.8525 - val_accuracy: 0.8887\nEpoch 9/10\n251/251 [==============================] - 1274s 5s/step - loss: 0.2454 - accuracy: 0.8889 - val_loss: 0.6955 - val_accuracy: 0.8887\nEpoch 10/10\n251/251 [==============================] - 1276s 5s/step - loss: 0.2441 - accuracy: 0.8889 - val_loss: 0.6087 - val_accuracy: 0.8887\n","output_type":"stream"}],"execution_count":54},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"# **Evaluate the Model**# ","metadata":{}},{"cell_type":"code","source":"loss, accuracy = model.evaluate(test_generator)\nprint(f\"Test Accuracy: {accuracy * 100:.2f}%\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T16:15:17.550348Z","iopub.execute_input":"2025-03-13T16:15:17.550856Z","iopub.status.idle":"2025-03-13T16:18:35.147529Z","shell.execute_reply.started":"2025-03-13T16:15:17.550797Z","shell.execute_reply":"2025-03-13T16:18:35.146642Z"}},"outputs":[{"name":"stdout","text":"63/63 [==============================] - 197s 3s/step - loss: 0.6087 - accuracy: 0.8887\nTest Accuracy: 88.87%\n","output_type":"stream"}],"execution_count":55},{"cell_type":"code","source":"model.save(\"/kaggle/working/melanoma_detector_model.h5\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T16:22:16.978198Z","iopub.execute_input":"2025-03-13T16:22:16.978616Z","iopub.status.idle":"2025-03-13T16:22:17.743991Z","shell.execute_reply.started":"2025-03-13T16:22:16.978578Z","shell.execute_reply":"2025-03-13T16:22:17.742438Z"}},"outputs":[],"execution_count":57},{"cell_type":"code","source":"!cp /kaggle/working/melanoma_detector_model.h5 /kaggle/outputs/\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-13T16:24:35.939425Z","iopub.execute_input":"2025-03-13T16:24:35.939869Z","iopub.status.idle":"2025-03-13T16:24:37.253517Z","shell.execute_reply.started":"2025-03-13T16:24:35.939827Z","shell.execute_reply":"2025-03-13T16:24:37.252203Z"}},"outputs":[{"name":"stdout","text":"cp: cannot create regular file '/kaggle/outputs/': Not a directory\n","output_type":"stream"}],"execution_count":58},{"cell_type":"code","source":"import cv2\n\ndef predict_image(image_path):\n    img = cv2.imread(image_path)\n    img = cv2.resize(img, IMG_SIZE)\n    img = img / 255.0  # Normalize\n    img = np.expand_dims(img, axis=0)  # Add batch dimension\n\n    prediction = model.predict(img)[0][0]\n    return \"Melanoma\" if prediction > 0.5 else \"Non-Melanoma\"\n\n# Test on a new image\nprint(predict_image(\"/kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_2/ISIC_0029306.jpg\"))","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Changelog\n\n\n- v2 initial version\n- v4 add StratifiedGroupKFold\n- v5 remove: skin-lesion-analysis-toward-melanoma-detection (see [here](https://www.kaggle.com/c/siim-isic-melanoma-classification/discussion/155859#878163))\n- v7 exclude duplicates (see [here](https://www.kaggle.com/c/siim-isic-melanoma-classification/discussion/157701)), add stratification by `count of target_id`, add `folds_13062020.csv` ","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom glob import glob\nimport cv2\nfrom skimage import io\nfrom tqdm import tqdm\nimport seaborn as sns","metadata":{"trusted":true,"_kg_hide-input":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!mkdir '512x512-dataset-melanoma'\n!mkdir '512x512-test'","metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train = pd.read_csv('../input/siim-isic-melanoma-classification/train.csv')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# isic 2019","metadata":{}},{"cell_type":"code","source":"df_gt = pd.read_csv('../input/isic-2019/ISIC_2019_Training_GroundTruth.csv')\nimage_id = df_gt.iloc[25]['image']\nimage = cv2.imread(f'../input/isic-2019/ISIC_2019_Training_Input/ISIC_2019_Training_Input/{image_id}.jpg', cv2.IMREAD_COLOR)\nimage = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\nio.imshow(image);","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## [@ipateam](https://www.kaggle.com/ipateam) Thanks a lot for [finding dublicated images](https://www.kaggle.com/c/siim-isic-melanoma-classification/discussion/155859#878163)! ","metadata":{}},{"cell_type":"code","source":"df_downsampled = df_gt[df_gt['image'].str.contains('downsampled')]\ndf_downsampled.shape[0]","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print('[ALL]:', df_gt.shape[0])\nprint('[∩ isic2020]:', len(set(df_train['image_name'].values).intersection(df_gt['image'].values)))\nprint('[downsampled isic2019 ∩ isic2020]:', len(set(df_train['image_name'].values).intersection([\n    image_id[:-12] for image_id in df_downsampled['image'].values\n])))\nprint('[downsampled isic2019 ∩ isic2019]:', len(set(df_gt['image'].values).intersection([\n    image_id[:-12] for image_id in df_downsampled['image'].values\n])))","metadata":{"_kg_hide-input":true,"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# SLATMD [Almost completely repeated] [Removed]","metadata":{}},{"cell_type":"code","source":"paths = glob('../input/skin-lesion-analysis-toward-melanoma-detection/skin-lesions/*/*/*.jpg')\nimage = cv2.imread(paths[777], cv2.IMREAD_COLOR)\nimage = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\nio.imshow(image);","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"image_ids = [path.split('/')[-1][:-4] for path in paths]\nprint('[ALL]:', len(image_ids))\nprint('[∩ isic2020]:', len(set(image_ids).intersection(df_train['image_name'].values)))\nprint('[∩ isic2019]:', len(set(image_ids).intersection(df_gt['image'].values)))\nprint('[∩ isic2019 downsampled]:', len(set(image_ids).intersection([image_id[:-12] for image_id in df_gt[df_gt['image'].str.contains('downsampled')]['image'].values])))","metadata":{"_kg_hide-input":true,"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Skin Cancer MNIST: HAM10000 [Repeated]","metadata":{}},{"cell_type":"code","source":"df_meta = pd.read_csv('../input/skin-cancer-mnist-ham10000/HAM10000_metadata.csv')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"image_id = df_meta.iloc[777]['image_id']\nimage = cv2.imread(f'../input/skin-cancer-mnist-ham10000/HAM10000_images_part_1/{image_id}.jpg', cv2.IMREAD_COLOR)\nimage = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\nio.imshow(image);","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print('[ALL]:', df_meta.shape[0])\nprint('[∩ isic2020]:', len(set(df_meta['image_id'].values).intersection(df_train['image_name'].values)))\nprint('[∩ isic2019]:', len(set(df_meta['image_id'].values).intersection(df_gt['image'].values)))\nprint('[∩ slatmd]:', len(set(df_meta['image_id'].values).intersection(image_ids)))","metadata":{"_kg_hide-input":true,"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Merge datasets & metadata","metadata":{}},{"cell_type":"code","source":"NEED_IMAGE_SAVE = False","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataset = {\n    'patient_id' : [],\n    'image_id': [],\n    'target': [],\n    'source': [],\n    'sex': [],\n    'age_approx': [],\n    'anatom_site_general_challenge': [],\n}\n\n# isic2020\ndf_train = pd.read_csv('../input/siim-isic-melanoma-classification/train.csv', index_col='image_name')\nfor image_id, row in tqdm(df_train.iterrows(), total=df_train.shape[0]):\n    if image_id in dataset['image_id']:\n        continue\n    dataset['patient_id'].append(row['patient_id'])\n    dataset['image_id'].append(image_id)\n    dataset['target'].append(row['target'])\n    dataset['source'].append('ISIC20')\n    dataset['sex'].append(row['sex'])\n    dataset['age_approx'].append(row['age_approx'])\n    dataset['anatom_site_general_challenge'].append(row['anatom_site_general_challenge'])\n\n    if NEED_IMAGE_SAVE:\n        image = cv2.imread(f'../input/siim-isic-melanoma-classification/jpeg/train/{image_id}.jpg', cv2.IMREAD_COLOR)\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        image = cv2.resize(image, (512, 512), cv2.INTER_AREA)\n        cv2.imwrite(f'./512x512-dataset-melanoma/{image_id}.jpg', image)\n\n# isic2019\ndf_gt = pd.read_csv('../input/isic-2019/ISIC_2019_Training_GroundTruth.csv', index_col='image')\ndf_meta = pd.read_csv('../input/isic-2019/ISIC_2019_Training_Metadata.csv', index_col='image')\nfor image_id, row in tqdm(df_meta.iterrows(), total=df_meta.shape[0]):\n    if image_id in dataset['image_id']:\n        continue\n\n    dataset['patient_id'].append(row['lesion_id'])\n    dataset['image_id'].append(image_id)\n    dataset['target'].append(int(df_gt.loc[image_id]['MEL']))\n    dataset['source'].append('ISIC19')\n    dataset['sex'].append(row['sex'])\n    dataset['age_approx'].append(row['age_approx'])\n    dataset['anatom_site_general_challenge'].append(\n        {'anterior torso': 'torso', 'posterior torso': 'torso'}.get(row['anatom_site_general'], row['anatom_site_general'])\n    )\n    \n    if NEED_IMAGE_SAVE:\n        image = cv2.imread(f'../input/isic-2019/ISIC_2019_Training_Input/ISIC_2019_Training_Input/{image_id}.jpg', cv2.IMREAD_COLOR)\n        image = cv2.resize(image, (512, 512), cv2.INTER_AREA)\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        cv2.imwrite(f'./512x512-dataset-melanoma/{image_id}.jpg', image)\n\n\n# skin-lesion-analysis-toward-melanoma-detection [REMOVED]\n# paths = glob('../input/skin-lesion-analysis-toward-melanoma-detection/skin-lesions/*/*/*.jpg')\n# for path in tqdm(paths, total=len(paths)):\n#     diagnosis, image_id = path.split('/')[-2:]\n#     image_id = image_id[:-4]\n    \n#     if image_id in dataset['image_id']:\n#         continue\n    \n#     target = int(diagnosis == 'melanoma')\n#     dataset['patient_id'].append(np.nan)\n#     dataset['image_id'].append(image_id)\n#     dataset['target'].append(target)\n#     dataset['source'].append('SLATMD')\n#     dataset['sex'].append(np.nan)\n#     dataset['age_approx'].append(np.nan)\n#     dataset['anatom_site_general_challenge'].append(np.nan)\n    \n#     if NEED_IMAGE_SAVE:\n#         image = cv2.imread(path, cv2.IMREAD_COLOR)\n#         image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n#         image = cv2.resize(image, (512, 512), cv2.INTER_AREA)\n#         cv2.imwrite(f'./512x512-dataset-melanoma/{image_id}.jpg', image)\n    \ndataset = pd.DataFrame(dataset).set_index('image_id')    ","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataset.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Excluding duplicates (with [clustering approach](https://www.kaggle.com/shonenkov/dbscan-clustering-check-marking))","metadata":{}},{"cell_type":"code","source":"df_duplicates = pd.read_csv('../input/melanoma-merged-external-data-512x512-jpeg/duplicates_13062020.csv', index_col='image_ids')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def get_value(duplicate_data, row, field):\n    if row[field] == 1 or duplicate_data.shape[0] <= 2:\n        return duplicate_data.iloc[0][field]\n    if 'ISIC20' in duplicate_data.source.values:\n        duplicate_data = duplicate_data[duplicate_data.source == 'ISIC20']\n    return sorted(duplicate_data[field].value_counts().items(), key=lambda x: -x[1])[0][0]","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cleaned_duplicates = {\n    'image_id': [],\n    'patient_id': [],\n    'target': [],\n    'source': [],\n    'sex': [],\n    'age_approx': [],\n    'anatom_site_general_challenge': [],\n}\ndrop_image_ids = []\nfor image_ids, row in df_duplicates.iterrows():\n    image_ids = image_ids.split('.')\n    drop_image_ids.extend(image_ids)\n    duplicate_data = dataset.loc[image_ids].sort_values('source', ascending=False)\n    for field in [    \n        'patient_id',\n        'target',\n        'source',\n        'sex',\n        'age_approx',\n        'anatom_site_general_challenge',\n    ]:\n        cleaned_duplicates[field].append(get_value(duplicate_data, row, field))\n    cleaned_duplicates['image_id'].append(duplicate_data.index.values[0])\n\ncleaned_duplicates = pd.DataFrame(cleaned_duplicates).set_index('image_id')\ncleaned_duplicates.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataset = dataset.drop(drop_image_ids)\ndataset = dataset.append(cleaned_duplicates)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataset.to_csv('marking.csv')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Simple EDA:","metadata":{}},{"cell_type":"code","source":"dataset['source'].hist();","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(dataset['target'].value_counts())\ndataset['target'].hist();","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataset['sex'].fillna('unknown').hist();","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataset['age_approx'].hist(bins=50);","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataset['anatom_site_general_challenge'].fillna('unknown').value_counts()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Stratify GroupKFold Splitting\n\nhttps://www.kaggle.com/jakubwasikowski/stratified-group-k-fold-cross-validation","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport random\nimport pandas as pd\nfrom collections import Counter, defaultdict\n\ndef stratified_group_k_fold(X, y, groups, k, seed=None):\n    \"\"\" https://www.kaggle.com/jakubwasikowski/stratified-group-k-fold-cross-validation \"\"\"\n    labels_num = np.max(y) + 1\n    y_counts_per_group = defaultdict(lambda: np.zeros(labels_num))\n    y_distr = Counter()\n    for label, g in zip(y, groups):\n        y_counts_per_group[g][label] += 1\n        y_distr[label] += 1\n\n    y_counts_per_fold = defaultdict(lambda: np.zeros(labels_num))\n    groups_per_fold = defaultdict(set)\n\n    def eval_y_counts_per_fold(y_counts, fold):\n        y_counts_per_fold[fold] += y_counts\n        std_per_label = []\n        for label in range(labels_num):\n            label_std = np.std([y_counts_per_fold[i][label] / y_distr[label] for i in range(k)])\n            std_per_label.append(label_std)\n        y_counts_per_fold[fold] -= y_counts\n        return np.mean(std_per_label)\n    \n    groups_and_y_counts = list(y_counts_per_group.items())\n    random.Random(seed).shuffle(groups_and_y_counts)\n\n    for g, y_counts in tqdm(sorted(groups_and_y_counts, key=lambda x: -np.std(x[1])), total=len(groups_and_y_counts)):\n        best_fold = None\n        min_eval = None\n        for i in range(k):\n            fold_eval = eval_y_counts_per_fold(y_counts, i)\n            if min_eval is None or fold_eval < min_eval:\n                min_eval = fold_eval\n                best_fold = i\n        y_counts_per_fold[best_fold] += y_counts\n        groups_per_fold[best_fold].add(g)\n\n    all_groups = set(groups)\n    for i in range(k):\n        train_groups = all_groups - groups_per_fold[i]\n        test_groups = groups_per_fold[i]\n\n        train_indices = [i for i, g in enumerate(groups) if g in train_groups]\n        test_indices = [i for i, g in enumerate(groups) if g in test_groups]\n\n        yield train_indices, test_indices","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\ndf_folds = pd.read_csv('marking.csv')\ndf_folds['patient_id'] = df_folds['patient_id'].fillna(df_folds['image_id'])\ndf_folds['sex'] = df_folds['sex'].fillna('unknown')\ndf_folds['anatom_site_general_challenge'] = df_folds['anatom_site_general_challenge'].fillna('unknown')\ndf_folds['age_approx'] = df_folds['age_approx'].fillna(round(df_folds['age_approx'].mean()))\n\npatient_id_2_count = df_folds[['patient_id', 'image_id']].groupby('patient_id').count()['image_id'].to_dict()\n\ndf_folds = df_folds.set_index('image_id')\n\ndef get_stratify_group(row):\n    stratify_group = row['sex']\n#     stratify_group += f'_{row[\"anatom_site_general_challenge\"]}'\n    stratify_group += f'_{row[\"source\"]}'\n    stratify_group += f'_{row[\"target\"]}'\n    patient_id_count = patient_id_2_count[row[\"patient_id\"]]\n    if patient_id_count > 80:\n        stratify_group += f'_80'\n    elif patient_id_count > 60:\n        stratify_group += f'_60'\n    elif patient_id_count > 50:\n        stratify_group += f'_50'\n    elif patient_id_count > 30:\n        stratify_group += f'_30'\n    elif patient_id_count > 20:\n        stratify_group += f'_20'\n    elif patient_id_count > 10:\n        stratify_group += f'_10'\n    else:\n        stratify_group += f'_0'\n    return stratify_group\n\ndf_folds['stratify_group'] = df_folds.apply(get_stratify_group, axis=1)\ndf_folds['stratify_group'] = df_folds['stratify_group'].astype('category').cat.codes","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\ndf_folds.loc[:, 'fold'] = 0\n\nskf = stratified_group_k_fold(X=df_folds.index, y=df_folds['stratify_group'], groups=df_folds['patient_id'], k=5, seed=42)\n\nfor fold_number, (train_index, val_index) in enumerate(skf):\n    df_folds.loc[df_folds.iloc[val_index].index, 'fold'] = fold_number","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"set(df_folds[df_folds['fold'] == 0]['patient_id'].values).intersection(df_folds[df_folds['fold'] == 1]['patient_id'].values)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_folds[df_folds['fold'] == 0]['target'].hist();","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_folds[df_folds['fold'] == 1]['target'].hist();","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_folds.to_csv('folds_13062020.csv')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Test","metadata":{}},{"cell_type":"code","source":"# test isic2020\ndf_test = pd.read_csv('../input/siim-isic-melanoma-classification/test.csv', index_col='image_name')\nfor image_id, row in tqdm(df_test.iterrows(), total=df_test.shape[0]):   \n    if NEED_IMAGE_SAVE:\n        image = cv2.imread(f'../input/siim-isic-melanoma-classification/jpeg/test/{image_id}.jpg', cv2.IMREAD_COLOR)\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        image = cv2.resize(image, (512, 512), cv2.INTER_AREA)\n        cv2.imwrite(f'../input/512x512-test/{image_id}.jpg', image)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Final Dataset\n\nFinal dataset jpeg 512x512 you can find [here](https://www.kaggle.com/shonenkov/melanoma-merged-external-data-512x512-jpeg)\n\nexamples for usage:","metadata":{}},{"cell_type":"code","source":"df_folds = pd.read_csv('../input/melanoma-merged-external-data-512x512-jpeg/folds_13062020.csv')\ndf_folds.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"image = cv2.imread(f'../input/melanoma-merged-external-data-512x512-jpeg/512x512-dataset-melanoma/512x512-dataset-melanoma/ISIC_0074268.jpg', cv2.IMREAD_COLOR)\nio.imshow(image);","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"image = cv2.imread(f'../input/melanoma-merged-external-data-512x512-jpeg/512x512-test/512x512-test/ISIC_0089356.jpg', cv2.IMREAD_COLOR)\nio.imshow(image);","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Thank you all for reading my kernel!\n\n","metadata":{}}]}