{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\nimport os\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\nfrom sklearn import model_selection\n\nKAGGLE_PATH = \"/kaggle/input/siim-isic-melanoma-classification/\"\nIMG_PATH_TRAIN = \"/kaggle/input/siim-isic-melanoma-classification/jpeg/train/\"\nIMG_PATH_TEST = \"/kaggle/input/siim-isic-melanoma-classification/jpeg/test/\"\n\ndf_train = pd.read_csv(os.path.join(KAGGLE_PATH, \"train.csv\"))\ndf_train[\"kfold\"] = -1\ndf_train[\"target\"] = df_train[\"target\"].astype(str)\ndf_train[\"image_file_name\"] = df_train[\"image_name\"] + \".jpg\"\ndf_train = df_train.sample(frac=1).reset_index(drop=True) # shuffle dataframe\ny = df_train.target.values\nkf = model_selection.StratifiedKFold(n_splits=5)\nfor fold_, (train_idx, test_idx) in enumerate(kf.split(X=df_train, y=y)):\n    df_train.loc[test_idx, \"kfold\"] = fold_\n        \ndf_test = pd.read_csv(os.path.join(KAGGLE_PATH, \"test.csv\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"IMG_HEIGHT, IMG_WIDTH = 96, 96\nBATCH_SIZE = 32\nK_FOLD = 0\n\ntrain_image_generator = ImageDataGenerator(rescale=1./255)\nvalid_image_generator = ImageDataGenerator(rescale=1./255)\n\ntrain_data_gen = train_image_generator.flow_from_dataframe(\n    df_train[df_train.kfold != K_FOLD],\n    directory=IMG_PATH_TRAIN,\n    x_col=\"image_file_name\",\n    y_col=\"target\",\n    batch_size=BATCH_SIZE,\n    shuffle=True,\n    target_size=(IMG_HEIGHT, IMG_WIDTH),\n    class_mode='binary'\n)\n\nvalid_data_gen = valid_image_generator.flow_from_dataframe(\n    df_train[df_train.kfold == K_FOLD],\n    directory=IMG_PATH_TRAIN,\n    x_col=\"image_file_name\",\n    y_col=\"target\",\n    batch_size=BATCH_SIZE,\n    shuffle=True,\n    target_size=(IMG_HEIGHT, IMG_WIDTH),\n    class_mode='binary'\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Define base model pre-trained weights\nbase_model = tf.keras.applications.MobileNetV2(\n    input_shape=(IMG_HEIGHT, IMG_WIDTH, 3),\n    include_top=False,\n    weights='imagenet')\nbase_model.trainable = False\n\n# Add a classification head\nglobal_average_layer = tf.keras.layers.GlobalAveragePooling2D()\nprediction_layer = tf.keras.layers.Dense(1)\n\n# Define model\nmodel = tf.keras.Sequential([\n  base_model,\n  global_average_layer,\n  prediction_layer\n])\n\nopt = tf.keras.optimizers.Adam(learning_rate=0.001)\nmodel.compile(\n    optimizer='adam',\n    loss = tf.keras.losses.BinaryCrossentropy(label_smoothing = 0.1),\n    metrics=['binary_crossentropy']\n)\n\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"my_callbacks = [\n    tf.keras.callbacks.EarlyStopping(patience=5),\n    tf.keras.callbacks.ModelCheckpoint(\n        filepath='model.{epoch:02d}-{val_loss:.2f}.h5',\n        save_best_only=True)\n]\n\nmodel.fit(\n    train_data_gen,\n    validation_data=valid_data_gen,\n    epochs=10,\n    callbacks=my_callbacks\n)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}