{
  "id": 159102,
  "title": "How do I plot confusion matrix?",
  "url": "/competitions/siim-isic-melanoma-classification/discussion/159102",
  "author_name": "gao-hongnan",
  "post_date": "2020-06-16T13:00:30.187000",
  "votes": 1,
  "comment_count": 1,
  "views": 0,
  "content": "<p>Hi all, here's a genuine newbie question, when using tpu and tensorflow, how do I plot the confusion matrix of the validation set after training? Currently my function looks like this:</p>\n\n<p>`def train(fold_number):</p>\n\n<pre><code>training_data_path = '../input/siim-isic-melanoma-classification/train/'\ndf = pd.read_csv(\"/kaggle/working/sgkfold.csv\")\ndf_train = df[df.fold != fold_number].reset_index(drop=True)\ndf_valid = df[df.fold == fold_number].reset_index(drop=True)\ndf_train_path = df_train.image_name.apply(format_path_train).values\ndf_val_path   = df_valid.image_name.apply(format_path_train).values\ndf_train_labels = df_train.target.values\ndf_val_labels   = df_valid.target.values`\n\n`AUTO = tf.data.experimental.AUTOTUNE\n# For tf.dataset\nBATCH_SIZE = 8 * strategy.num_replicas_in_sync\nEPOCHS = 3    \n\ntrain_dataset = (tf.data.Dataset\n.from_tensor_slices((df_train_path, df_train_labels))\n.map(decode_image, num_parallel_calls=AUTO)\n.map(data_augment, num_parallel_calls=AUTO)\n.repeat()\n.shuffle(512)\n.batch(BATCH_SIZE)\n.prefetch(AUTO))\n\nvalid_dataset = (\ntf.data.Dataset\n.from_tensor_slices((df_val_path, df_val_labels))\n.map(decode_image, num_parallel_calls=AUTO)\n.batch(BATCH_SIZE)\n.cache()\n.prefetch(AUTO))\n\ndef build_lrfn(lr_start=0.00001, lr_max=0.00005, \n               lr_min=0.00001, lr_rampup_epochs=5, \n               lr_sustain_epochs=0, lr_exp_decay=.8):\n    lr_max = lr_max * strategy.num_replicas_in_sync\n\n    def lrfn(epoch):\n        if epoch &amp;lt; lr_rampup_epochs:\n            lr = (lr_max - lr_start) / lr_rampup_epochs * epoch + lr_start\n        elif epoch &amp;lt; lr_rampup_epochs + lr_sustain_epochs:\n            lr = lr_max\n        else:\n            lr = (lr_max - lr_min) *\\\n                 lr_exp_decay**(epoch - lr_rampup_epochs\\\n                                - lr_sustain_epochs) + lr_min\n        return lr\n    return lrfn    \n\nlrfn = build_lrfn()\nSTEPS_PER_EPOCH = df_train_labels.shape[0] // BATCH_SIZE\nlr_schedule = tf.keras.callbacks.LearningRateScheduler(lrfn, verbose=1)\nmodel_checkpoint = tf.keras.callbacks.ModelCheckpoint('GroupKFold.h5', monitor='val_loss', verbose=2, save_best_only=True)\n\n\nwith strategy.scope():\n    model = tf.keras.Sequential([\n        efn.EfficientNetB3(\n            input_shape=(256,256, 3),\n            weights=\"imagenet\",\n            include_top=False\n        ),\n        L.GlobalAveragePooling2D(),\n        L.Dense(1, activation='sigmoid')\n    ])\n    model.compile(\n        optimizer='adam',\n        loss = 'binary_crossentropy',\n        metrics=[tf.keras.metrics.AUC()],\n    )\n\nhistory = model.fit(train_dataset,\n                epochs=EPOCHS,\n                callbacks=[model_checkpoint,lr_schedule],\n                steps_per_epoch=STEPS_PER_EPOCH,\n                validation_data=valid_dataset)\nreturn model`\n</code></pre>\n\n<p>Would appreciate some guidance on how I should go about plotting the confusion matrix on the validation set, I want to check the false positives and negatives to make sure my model isn't just blindly predicting benign.</p>",
  "messages": [
    {
      "id": 888597,
      "postDate": "2020-06-16T13:00:30.187Z",
      "content": "<p>Hi all, here's a genuine newbie question, when using tpu and tensorflow, how do I plot the confusion matrix of the validation set after training? Currently my function looks like this:</p>\n\n<p>`def train(fold_number):</p>\n\n<pre><code>training_data_path = '../input/siim-isic-melanoma-classification/train/'\ndf = pd.read_csv(\"/kaggle/working/sgkfold.csv\")\ndf_train = df[df.fold != fold_number].reset_index(drop=True)\ndf_valid = df[df.fold == fold_number].reset_index(drop=True)\ndf_train_path = df_train.image_name.apply(format_path_train).values\ndf_val_path   = df_valid.image_name.apply(format_path_train).values\ndf_train_labels = df_train.target.values\ndf_val_labels   = df_valid.target.values`\n\n`AUTO = tf.data.experimental.AUTOTUNE\n# For tf.dataset\nBATCH_SIZE = 8 * strategy.num_replicas_in_sync\nEPOCHS = 3    \n\ntrain_dataset = (tf.data.Dataset\n.from_tensor_slices((df_train_path, df_train_labels))\n.map(decode_image, num_parallel_calls=AUTO)\n.map(data_augment, num_parallel_calls=AUTO)\n.repeat()\n.shuffle(512)\n.batch(BATCH_SIZE)\n.prefetch(AUTO))\n\nvalid_dataset = (\ntf.data.Dataset\n.from_tensor_slices((df_val_path, df_val_labels))\n.map(decode_image, num_parallel_calls=AUTO)\n.batch(BATCH_SIZE)\n.cache()\n.prefetch(AUTO))\n\ndef build_lrfn(lr_start=0.00001, lr_max=0.00005, \n               lr_min=0.00001, lr_rampup_epochs=5, \n               lr_sustain_epochs=0, lr_exp_decay=.8):\n    lr_max = lr_max * strategy.num_replicas_in_sync\n\n    def lrfn(epoch):\n        if epoch &amp;lt; lr_rampup_epochs:\n            lr = (lr_max - lr_start) / lr_rampup_epochs * epoch + lr_start\n        elif epoch &amp;lt; lr_rampup_epochs + lr_sustain_epochs:\n            lr = lr_max\n        else:\n            lr = (lr_max - lr_min) *\\\n                 lr_exp_decay**(epoch - lr_rampup_epochs\\\n                                - lr_sustain_epochs) + lr_min\n        return lr\n    return lrfn    \n\nlrfn = build_lrfn()\nSTEPS_PER_EPOCH = df_train_labels.shape[0] // BATCH_SIZE\nlr_schedule = tf.keras.callbacks.LearningRateScheduler(lrfn, verbose=1)\nmodel_checkpoint = tf.keras.callbacks.ModelCheckpoint('GroupKFold.h5', monitor='val_loss', verbose=2, save_best_only=True)\n\n\nwith strategy.scope():\n    model = tf.keras.Sequential([\n        efn.EfficientNetB3(\n            input_shape=(256,256, 3),\n            weights=\"imagenet\",\n            include_top=False\n        ),\n        L.GlobalAveragePooling2D(),\n        L.Dense(1, activation='sigmoid')\n    ])\n    model.compile(\n        optimizer='adam',\n        loss = 'binary_crossentropy',\n        metrics=[tf.keras.metrics.AUC()],\n    )\n\nhistory = model.fit(train_dataset,\n                epochs=EPOCHS,\n                callbacks=[model_checkpoint,lr_schedule],\n                steps_per_epoch=STEPS_PER_EPOCH,\n                validation_data=valid_dataset)\nreturn model`\n</code></pre>\n\n<p>Would appreciate some guidance on how I should go about plotting the confusion matrix on the validation set, I want to check the false positives and negatives to make sure my model isn't just blindly predicting benign.</p>",
      "rawMarkdown": "Hi all, here's a genuine newbie question, when using tpu and tensorflow, how do I plot the confusion matrix of the validation set after training? Currently my function looks like this:\n\n`def train(fold_number):\n\n    training_data_path = '../input/siim-isic-melanoma-classification/train/'\n    df = pd.read_csv(\"/kaggle/working/sgkfold.csv\")\n    df_train = df[df.fold != fold_number].reset_index(drop=True)\n    df_valid = df[df.fold == fold_number].reset_index(drop=True)\n    df_train_path = df_train.image_name.apply(format_path_train).values\n    df_val_path   = df_valid.image_name.apply(format_path_train).values\n    df_train_labels = df_train.target.values\n    df_val_labels   = df_valid.target.values`\n  \n    `AUTO = tf.data.experimental.AUTOTUNE\n    # For tf.dataset\n    BATCH_SIZE = 8 * strategy.num_replicas_in_sync\n    EPOCHS = 3    \n    \n    train_dataset = (tf.data.Dataset\n    .from_tensor_slices((df_train_path, df_train_labels))\n    .map(decode_image, num_parallel_calls=AUTO)\n    .map(data_augment, num_parallel_calls=AUTO)\n    .repeat()\n    .shuffle(512)\n    .batch(BATCH_SIZE)\n    .prefetch(AUTO))\n    \n    valid_dataset = (\n    tf.data.Dataset\n    .from_tensor_slices((df_val_path, df_val_labels))\n    .map(decode_image, num_parallel_calls=AUTO)\n    .batch(BATCH_SIZE)\n    .cache()\n    .prefetch(AUTO))\n    \n    def build_lrfn(lr_start=0.00001, lr_max=0.00005, \n                   lr_min=0.00001, lr_rampup_epochs=5, \n                   lr_sustain_epochs=0, lr_exp_decay=.8):\n        lr_max = lr_max * strategy.num_replicas_in_sync\n\n        def lrfn(epoch):\n            if epoch &lt; lr_rampup_epochs:\n                lr = (lr_max - lr_start) / lr_rampup_epochs * epoch + lr_start\n            elif epoch &lt; lr_rampup_epochs + lr_sustain_epochs:\n                lr = lr_max\n            else:\n                lr = (lr_max - lr_min) *\\\n                     lr_exp_decay**(epoch - lr_rampup_epochs\\\n                                    - lr_sustain_epochs) + lr_min\n            return lr\n        return lrfn    \n    \n    lrfn = build_lrfn()\n    STEPS_PER_EPOCH = df_train_labels.shape[0] // BATCH_SIZE\n    lr_schedule = tf.keras.callbacks.LearningRateScheduler(lrfn, verbose=1)\n    model_checkpoint = tf.keras.callbacks.ModelCheckpoint('GroupKFold.h5', monitor='val_loss', verbose=2, save_best_only=True)\n    \n    \n    with strategy.scope():\n        model = tf.keras.Sequential([\n            efn.EfficientNetB3(\n                input_shape=(256,256, 3),\n                weights=\"imagenet\",\n                include_top=False\n            ),\n            L.GlobalAveragePooling2D(),\n            L.Dense(1, activation='sigmoid')\n        ])\n        model.compile(\n            optimizer='adam',\n            loss = 'binary_crossentropy',\n            metrics=[tf.keras.metrics.AUC()],\n        )\n    \n    history = model.fit(train_dataset,\n                    epochs=EPOCHS,\n                    callbacks=[model_checkpoint,lr_schedule],\n                    steps_per_epoch=STEPS_PER_EPOCH,\n                    validation_data=valid_dataset)\n    return model`\n\n\nWould appreciate some guidance on how I should go about plotting the confusion matrix on the validation set, I want to check the false positives and negatives to make sure my model isn't just blindly predicting benign.",
      "votes": 1
    },
    {
      "id": 888677,
      "postDate": "2020-06-16T13:55:03.430Z",
      "rawMarkdown": "",
      "votes": 1,
      "isDeleted": true
    }
  ],
  "comments": [
    {
      "id": 888677,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-06-16T13:55:03.430000",
      "content": "",
      "votes": 1,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "888597": "Hi all, here's a genuine newbie question, when using tpu and tensorflow, how do I plot the confusion matrix of the validation set after training? Currently my function looks like this:\n\n`def train(fold_number):\n\n    training_data_path = '../input/siim-isic-melanoma-classification/train/'\n    df = pd.read_csv(\"/kaggle/working/sgkfold.csv\")\n    df_train = df[df.fold != fold_number].reset_index(drop=True)\n    df_valid = df[df.fold == fold_number].reset_index(drop=True)\n    df_train_path = df_train.image_name.apply(format_path_train).values\n    df_val_path   = df_valid.image_name.apply(format_path_train).values\n    df_train_labels = df_train.target.values\n    df_val_labels   = df_valid.target.values`\n  \n    `AUTO = tf.data.experimental.AUTOTUNE\n    # For tf.dataset\n    BATCH_SIZE = 8 * strategy.num_replicas_in_sync\n    EPOCHS = 3    \n    \n    train_dataset = (tf.data.Dataset\n    .from_tensor_slices((df_train_path, df_train_labels))\n    .map(decode_image, num_parallel_calls=AUTO)\n    .map(data_augment, num_parallel_calls=AUTO)\n    .repeat()\n    .shuffle(512)\n    .batch(BATCH_SIZE)\n    .prefetch(AUTO))\n    \n    valid_dataset = (\n    tf.data.Dataset\n    .from_tensor_slices((df_val_path, df_val_labels))\n    .map(decode_image, num_parallel_calls=AUTO)\n    .batch(BATCH_SIZE)\n    .cache()\n    .prefetch(AUTO))\n    \n    def build_lrfn(lr_start=0.00001, lr_max=0.00005, \n                   lr_min=0.00001, lr_rampup_epochs=5, \n                   lr_sustain_epochs=0, lr_exp_decay=.8):\n        lr_max = lr_max * strategy.num_replicas_in_sync\n\n        def lrfn(epoch):\n            if epoch &lt; lr_rampup_epochs:\n                lr = (lr_max - lr_start) / lr_rampup_epochs * epoch + lr_start\n            elif epoch &lt; lr_rampup_epochs + lr_sustain_epochs:\n                lr = lr_max\n            else:\n                lr = (lr_max - lr_min) *\\\n                     lr_exp_decay**(epoch - lr_rampup_epochs\\\n                                    - lr_sustain_epochs) + lr_min\n            return lr\n        return lrfn    \n    \n    lrfn = build_lrfn()\n    STEPS_PER_EPOCH = df_train_labels.shape[0] // BATCH_SIZE\n    lr_schedule = tf.keras.callbacks.LearningRateScheduler(lrfn, verbose=1)\n    model_checkpoint = tf.keras.callbacks.ModelCheckpoint('GroupKFold.h5', monitor='val_loss', verbose=2, save_best_only=True)\n    \n    \n    with strategy.scope():\n        model = tf.keras.Sequential([\n            efn.EfficientNetB3(\n                input_shape=(256,256, 3),\n                weights=\"imagenet\",\n                include_top=False\n            ),\n            L.GlobalAveragePooling2D(),\n            L.Dense(1, activation='sigmoid')\n        ])\n        model.compile(\n            optimizer='adam',\n            loss = 'binary_crossentropy',\n            metrics=[tf.keras.metrics.AUC()],\n        )\n    \n    history = model.fit(train_dataset,\n                    epochs=EPOCHS,\n                    callbacks=[model_checkpoint,lr_schedule],\n                    steps_per_epoch=STEPS_PER_EPOCH,\n                    validation_data=valid_dataset)\n    return model`\n\n\nWould appreciate some guidance on how I should go about plotting the confusion matrix on the validation set, I want to check the false positives and negatives to make sure my model isn't just blindly predicting benign.",
    "888677": ""
  }
}