{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","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":275038,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":235520,"modelId":257204}],"dockerImageVersionId":30919,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\n# for dirname, _, filenames in os.walk('/kaggle/input'):\n#     for filename in filenames:\n        # print(os.path.join(dirname, filename))\nprint(\"/kaggle/input/siim-isic-melanoma-classification/sample_submission.csv\\n\"\n      \"/kaggle/input/siim-isic-melanoma-classification/train.csv\\n\"\n      \"/kaggle/input/siim-isic-melanoma-classification/test.csv\\n\"\n      \"/kaggle/input/siim-isic-melanoma-classification/jpeg/test/ISIC_2417927.jpg\\n\"\n      \"/kaggle/input/siim-isic-melanoma-classification/test/ISIC_7770700.dcm\\n\"\n      \"/kaggle/input/siim-isic-melanoma-classification/train/ISIC_9691303.dcm\")\n\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-03-05T11:57:54.471260Z","iopub.execute_input":"2025-03-05T11:57:54.471598Z","iopub.status.idle":"2025-03-05T11:57:54.476778Z","shell.execute_reply.started":"2025-03-05T11:57:54.471574Z","shell.execute_reply":"2025-03-05T11:57:54.475994Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport os\nimport pathlib,shutil\nfrom PIL import Image\n\n\nimport matplotlib.pyplot as plt\nfrom tensorflow.keras import layers, models\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom PIL import Image\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_curve, auc\n\nimport logging\ntf.get_logger().setLevel(logging.ERROR)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-05T11:57:57.515266Z","iopub.execute_input":"2025-03-05T11:57:57.515561Z","iopub.status.idle":"2025-03-05T11:57:57.525935Z","shell.execute_reply.started":"2025-03-05T11:57:57.515540Z","shell.execute_reply":"2025-03-05T11:57:57.524890Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_dirc=pathlib.Path('/kaggle/input/siim-isic-melanoma-classification/jpeg')\ntest_dirc=data_dirc / 'test'\ntrain_dirc=data_dirc / 'train'\n\ntrain_images_count=len(list(train_dirc.glob(\"*.jpg\")))\ntest_images_count=len(list(test_dirc.glob(\"*.jpg\")))\nprint(train_images_count)\nprint(test_images_count)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-05T11:58:01.294748Z","iopub.execute_input":"2025-03-05T11:58:01.295140Z","iopub.status.idle":"2025-03-05T11:58:02.589896Z","shell.execute_reply.started":"2025-03-05T11:58:01.295108Z","shell.execute_reply":"2025-03-05T11:58:02.588677Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Num GPUs Available:\", len(tf.config.experimental.list_physical_devices('GPU')))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-05T11:58:05.687917Z","iopub.execute_input":"2025-03-05T11:58:05.688317Z","iopub.status.idle":"2025-03-05T11:58:05.693706Z","shell.execute_reply.started":"2025-03-05T11:58:05.688284Z","shell.execute_reply":"2025-03-05T11:58:05.692850Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"strategy = tf.distribute.MirroredStrategy()\nprint(\"✅ Using GPU:\", tf.config.experimental.list_physical_devices('GPU'))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-05T11:58:08.049242Z","iopub.execute_input":"2025-03-05T11:58:08.049681Z","iopub.status.idle":"2025-03-05T11:58:08.056854Z","shell.execute_reply.started":"2025-03-05T11:58:08.049647Z","shell.execute_reply":"2025-03-05T11:58:08.055901Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"batch_size=32\nimg_h=150\nimg_w=150","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-05T11:58:10.044314Z","iopub.execute_input":"2025-03-05T11:58:10.044633Z","iopub.status.idle":"2025-03-05T11:58:10.048356Z","shell.execute_reply.started":"2025-03-05T11:58:10.044608Z","shell.execute_reply":"2025-03-05T11:58:10.047228Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"img=Image.open('/kaggle/input/siim-isic-melanoma-classification/jpeg/test/ISIC_2417927.jpg')\nprint(f\"og image size{img.size}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-05T11:58:12.202693Z","iopub.execute_input":"2025-03-05T11:58:12.203021Z","iopub.status.idle":"2025-03-05T11:58:12.211624Z","shell.execute_reply.started":"2025-03-05T11:58:12.202997Z","shell.execute_reply":"2025-03-05T11:58:12.210754Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"csv_path='/kaggle/input/siim-isic-melanoma-classification/train.csv'\ndf=pd.read_csv(csv_path)\ndf['image_path'] = df['image_name'].apply(lambda x: os.path.join(train_dirc, f\"{x}.jpg\"))\ndf['target'] = df['target'].astype(str)\n\ncsv_path_test='/kaggle/input/siim-isic-melanoma-classification/test.csv'\ntest_df=pd.read_csv(csv_path_test)\ntest_df['image_path']=test_df['image_name'].apply(lambda x: os.path.join(test_dirc, f\"{x}.jpg\"))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-05T11:58:14.424915Z","iopub.execute_input":"2025-03-05T11:58:14.425242Z","iopub.status.idle":"2025-03-05T11:58:14.567205Z","shell.execute_reply.started":"2025-03-05T11:58:14.425219Z","shell.execute_reply":"2025-03-05T11:58:14.566456Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=30,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    fill_mode='nearest',\n    validation_split=0.2\n)\n\ntrain_generator = train_datagen.flow_from_dataframe(\n    dataframe=df,\n    directory=None,\n    x_col='image_path',\n    y_col='target',\n    target_size=(img_h, img_w),\n    batch_size=batch_size,\n    class_mode='binary',\n    subset='training'\n)\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-05T11:58:17.626609Z","iopub.execute_input":"2025-03-05T11:58:17.626947Z","iopub.status.idle":"2025-03-05T11:59:06.992119Z","shell.execute_reply.started":"2025-03-05T11:58:17.626920Z","shell.execute_reply":"2025-03-05T11:59:06.991447Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_datagen = ImageDataGenerator(rescale=1./255)\ntest_generator = test_datagen.flow_from_dataframe(\n    dataframe=test_df,\n    x_col='image_path',\n    target_size=(img_h, img_w),\n    batch_size=batch_size,\n    class_mode=None,\n    shuffle=False\n)\n\nval_generator = train_datagen.flow_from_dataframe(\n    dataframe=df,\n    directory=None,\n    x_col='image_path',\n    y_col='target',\n    target_size=(img_h, img_w),\n    batch_size=batch_size,\n    class_mode='binary',\n    subset='validation'\n)\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-05T12:05:16.003233Z","iopub.execute_input":"2025-03-05T12:05:16.003616Z","iopub.status.idle":"2025-03-05T12:05:47.728106Z","shell.execute_reply.started":"2025-03-05T12:05:16.003584Z","shell.execute_reply":"2025-03-05T12:05:47.727242Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"with strategy.scope():\n    model = models.Sequential([\n        layers.Conv2D(16, (3,3), activation='relu', padding='same', input_shape=(150,150,3)),\n        layers.BatchNormalization(),\n        layers.MaxPooling2D((2,2)),\n    \n        layers.Conv2D(32, (3,3), activation='relu', padding='same'),\n        layers.BatchNormalization(),\n        layers.MaxPooling2D((2,2)),\n    \n        layers.Conv2D(64, (3,3), activation='relu', padding='same'),\n        layers.BatchNormalization(),\n        layers.MaxPooling2D((2,2)),\n    \n        layers.GlobalAveragePooling2D(),\n        layers.Dropout(0.4),  # Slightly reduced dropout\n    \n        layers.Dense(64, activation='relu'),  # Reduced from 128 to 64\n        layers.Dropout(0.4),\n        \n        layers.Dense(1, activation='sigmoid')\n    ])\n\n    model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),\n                  loss='binary_crossentropy',\n                  metrics=['accuracy'])\n\nmodel.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-05T12:09:24.232208Z","iopub.execute_input":"2025-03-05T12:09:24.232523Z","iopub.status.idle":"2025-03-05T12:09:24.347980Z","shell.execute_reply.started":"2025-03-05T12:09:24.232501Z","shell.execute_reply":"2025-03-05T12:09:24.347131Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history = model.fit(\n    train_generator,\n    validation_data=val_generator,\n    epochs=10,\n    batch_size=batch_size\n)\n!nvidia-smi","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-03T04:24:34.744831Z","iopub.execute_input":"2025-03-03T04:24:34.745061Z","iopub.status.idle":"2025-03-03T10:42:45.079688Z","shell.execute_reply.started":"2025-03-03T04:24:34.745036Z","shell.execute_reply":"2025-03-03T10:42:45.077232Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"save the model should anything happens to this notebook/account","metadata":{}},{"cell_type":"code","source":"from IPython.display import FileLink\n\nmodel.save(\"/kaggle/working/model.h5\")\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-05T12:09:30.826099Z","iopub.execute_input":"2025-03-05T12:09:30.826470Z","iopub.status.idle":"2025-03-05T12:09:30.888684Z","shell.execute_reply.started":"2025-03-05T12:09:30.826442Z","shell.execute_reply":"2025-03-05T12:09:30.887336Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.models import load_model\n\nmodel_path = \"/kaggle/input/melanoma-detection/keras/default/1/skin_cancer_model.h5\"\nmodel = load_model(model_path)\nprint(\"✅ Model Loaded Successfully!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-06T06:12:28.007932Z","iopub.execute_input":"2025-03-06T06:12:28.008344Z","iopub.status.idle":"2025-03-06T06:12:44.164180Z","shell.execute_reply.started":"2025-03-06T06:12:28.008305Z","shell.execute_reply":"2025-03-06T06:12:44.163005Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(test_generator)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-05T12:09:37.904627Z","iopub.execute_input":"2025-03-05T12:09:37.904916Z","iopub.status.idle":"2025-03-05T12:09:37.909878Z","shell.execute_reply.started":"2025-03-05T12:09:37.904895Z","shell.execute_reply":"2025-03-05T12:09:37.908980Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f\"Total samples: {test_generator.n}\")\nprint(f\"Class mode: {test_generator.class_mode}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-05T12:09:40.852261Z","iopub.execute_input":"2025-03-05T12:09:40.852575Z","iopub.status.idle":"2025-03-05T12:09:40.857423Z","shell.execute_reply.started":"2025-03-05T12:09:40.852549Z","shell.execute_reply":"2025-03-05T12:09:40.856518Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"predictions = model.predict(test_generator)\nprint(predictions[:5])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-05T12:09:45.834788Z","iopub.execute_input":"2025-03-05T12:09:45.835198Z","iopub.status.idle":"2025-03-05T12:18:31.670453Z","shell.execute_reply.started":"2025-03-05T12:09:45.835165Z","shell.execute_reply":"2025-03-05T12:18:31.669382Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"filenames = test_generator.filenames  \nfilenames = [fname.split(\"/\")[-1].replace(\".jpg\", \"\") for fname in test_generator.filenames]\n\ntest_predictions = model.predict(test_generator, steps=len(test_generator), verbose=1)\n\nsubmission_df = pd.DataFrame({\n    \"id\": filenames,  \n    \"label\": test_predictions.flatten()\n})\n\nsubmission_df.to_csv(\"submission.csv\", index=False)\nsubmission_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-05T13:19:42.913190Z","iopub.execute_input":"2025-03-05T13:19:42.913668Z","iopub.status.idle":"2025-03-05T13:28:53.253878Z","shell.execute_reply.started":"2025-03-05T13:19:42.913640Z","shell.execute_reply":"2025-03-05T13:28:53.252711Z"}},"outputs":[],"execution_count":null}]}