From 97e9d29342afcb28f7e03ba518bd3ae3d277c0ca Mon Sep 17 00:00:00 2001 From: Yiheng Wang Date: Wed, 24 Mar 2021 16:39:45 +0800 Subject: [PATCH] Fix notebook issues Signed-off-by: Yiheng Wang --- 2d_classification/mednist_tutorial.ipynb | 39 +++++++++++-------- .../ignite/densenet_training_dict.py | 9 +++-- .../torch/densenet_training_dict.py | 9 ++++- .../covid_classification.ipynb | 34 +++++++++------- modules/learning_rate.ipynb | 38 ++++++++++-------- 5 files changed, 78 insertions(+), 51 deletions(-) diff --git a/2d_classification/mednist_tutorial.ipynb b/2d_classification/mednist_tutorial.ipynb index 23bfb312a9..5a3ca93035 100644 --- a/2d_classification/mednist_tutorial.ipynb +++ b/2d_classification/mednist_tutorial.ipynb @@ -45,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": { "tags": [] }, @@ -54,23 +54,23 @@ "name": "stdout", "output_type": "stream", "text": [ - "MONAI version: 0.4.0+42.g58bc231\n", - "Numpy version: 1.19.5\n", - "Pytorch version: 1.7.1\n", - "MONAI flags: HAS_EXT = False, USE_COMPILED = False\n", - "MONAI rev id: 58bc231cb8a3eff6864cf857b2b4dc263d6738cc\n", + "MONAI version: 0+untagged.1.ge8e2f3e.dirty\n", + "Numpy version: 1.19.2\n", + "Pytorch version: 1.8.0a0+52ea372\n", + "MONAI flags: HAS_EXT = True, USE_COMPILED = False\n", + "MONAI rev id: e8e2f3e2efb6bf8072b7ded40cb57bca01e07773\n", "\n", "Optional dependencies:\n", - "Pytorch Ignite version: 0.4.2\n", + "Pytorch Ignite version: 0.4.4\n", "Nibabel version: 3.2.1\n", - "scikit-image version: 0.18.1\n", - "Pillow version: 8.1.0\n", - "Tensorboard version: 2.4.0\n", + "scikit-image version: 0.15.0\n", + "Pillow version: 8.1.2\n", + "Tensorboard version: 1.15.0+nv\n", "gdown version: 3.12.2\n", - "TorchVision version: 0.8.2\n", + "TorchVision version: 0.9.0a0\n", "ITK version: 5.1.2\n", - "tqdm version: 4.51.0\n", - "lmdb version: 1.0.0\n", + "tqdm version: 4.53.0\n", + "lmdb version: 1.1.1\n", "psutil version: 5.8.0\n", "\n", "For details about installing the optional dependencies, please visit:\n", @@ -105,7 +105,9 @@ "from monai.metrics import compute_roc_auc\n", "from monai.networks.nets import DenseNet121\n", "from monai.transforms import (\n", + " Activations,\n", " AddChannel,\n", + " AsDiscrete,\n", " Compose,\n", " LoadImage,\n", " RandFlip,\n", @@ -367,7 +369,10 @@ ")\n", "\n", "val_transforms = Compose(\n", - " [LoadImage(image_only=True), AddChannel(), ScaleIntensity(), ToTensor()])" + " [LoadImage(image_only=True), AddChannel(), ScaleIntensity(), ToTensor()])\n", + "\n", + "act = Activations(softmax=True)\n", + "to_onehot = AsDiscrete(to_onehot=True, n_classes=num_class)" ] }, { @@ -1161,8 +1166,10 @@ " )\n", " y_pred = torch.cat([y_pred, model(val_images)], dim=0)\n", " y = torch.cat([y, val_labels], dim=0)\n", - " auc_metric = compute_roc_auc(\n", - " y_pred, y, to_onehot_y=True, softmax=True)\n", + " y_onehot = to_onehot(y)\n", + " y_pred_act = act(y_pred)\n", + " auc_metric = compute_roc_auc(y_pred_act, y_onehot)\n", + " del y_pred_act, y_onehot\n", " metric_values.append(auc_metric)\n", " acc_value = torch.eq(y_pred.argmax(dim=1), y)\n", " acc_metric = acc_value.sum().item() / len(acc_value)\n", diff --git a/3d_classification/ignite/densenet_training_dict.py b/3d_classification/ignite/densenet_training_dict.py index 7f50dd496b..c9a21356a7 100644 --- a/3d_classification/ignite/densenet_training_dict.py +++ b/3d_classification/ignite/densenet_training_dict.py @@ -22,7 +22,7 @@ import monai from monai.handlers import ROCAUC, StatsHandler, TensorBoardStatsHandler, stopping_fn_from_metric -from monai.transforms import AddChanneld, Compose, LoadImaged, RandRotate90d, Resized, ScaleIntensityd, ToTensord +from monai.transforms import Activations, AddChanneld, AsDiscrete, Compose, LoadImaged, RandRotate90d, Resized, ScaleIntensityd, ToTensord def main(): @@ -121,10 +121,13 @@ def prepare_batch(batch, device=None, non_blocking=False): metric_name = "Accuracy" # add evaluation metric to the evaluator engine - val_metrics = {metric_name: Accuracy(), "AUC": ROCAUC(to_onehot_y=True, softmax=True)} + val_metrics = {metric_name: Accuracy(), "AUC": ROCAUC()} + + post_label = AsDiscrete(to_onehot=True, n_classes=2) + post_pred = Activations(softmax=True) # Ignite evaluator expects batch=(img, label) and returns output=(y_pred, y) at every iteration, # user can add output_transform to return other values - evaluator = create_supervised_evaluator(net, val_metrics, device, True, prepare_batch=prepare_batch) + evaluator = create_supervised_evaluator(net, val_metrics, device, True, prepare_batch=prepare_batch, output_transform=lambda x, y, y_pred: (post_pred(y_pred), post_label(y)) # add stats event handler to print validation stats via evaluator val_stats_handler = StatsHandler( diff --git a/3d_classification/torch/densenet_training_dict.py b/3d_classification/torch/densenet_training_dict.py index 092d34e832..0a6fbe868c 100644 --- a/3d_classification/torch/densenet_training_dict.py +++ b/3d_classification/torch/densenet_training_dict.py @@ -20,7 +20,7 @@ import monai from monai.metrics import compute_roc_auc -from monai.transforms import AddChanneld, Compose, LoadImaged, RandRotate90d, Resized, ScaleIntensityd, ToTensord +from monai.transforms import Activations, AddChanneld, AsDiscrete, Compose, LoadImaged, RandRotate90d, Resized, ScaleIntensityd, ToTensord def main(): @@ -76,6 +76,8 @@ def main(): ToTensord(keys=["img"]), ] ) + act = Activations(softmax=True) + to_onehot = AsDiscrete(to_onehot=True, n_classes=2) # Define dataset, data loader check_ds = monai.data.Dataset(data=train_files, transform=train_transforms) @@ -135,7 +137,10 @@ def main(): acc_value = torch.eq(y_pred.argmax(dim=1), y) acc_metric = acc_value.sum().item() / len(acc_value) - auc_metric = compute_roc_auc(y_pred, y, to_onehot_y=True, softmax=True) + y_onehot = to_onehot(y) + y_pred_act = act(y_pred) + auc_metric = compute_roc_auc(y_pred_act, y_onehot) + del y_pred_act, y_onehot if acc_metric > best_metric: best_metric = acc_metric best_metric_epoch = epoch + 1 diff --git a/modules/interpretability/covid_classification.ipynb b/modules/interpretability/covid_classification.ipynb index b7b9980ac2..60a6b16166 100644 --- a/modules/interpretability/covid_classification.ipynb +++ b/modules/interpretability/covid_classification.ipynb @@ -37,23 +37,23 @@ "name": "stdout", "output_type": "stream", "text": [ - "MONAI version: 0.4.0+62.g8fef0e1\n", - "Numpy version: 1.19.5\n", - "Pytorch version: 1.7.1\n", - "MONAI flags: HAS_EXT = False, USE_COMPILED = False\n", - "MONAI rev id: 8fef0e12b4b79aa124b9ba85f8dd8f452baad1cf\n", + "MONAI version: 0+untagged.1.ge8e2f3e.dirty\n", + "Numpy version: 1.19.2\n", + "Pytorch version: 1.8.0a0+52ea372\n", + "MONAI flags: HAS_EXT = True, USE_COMPILED = False\n", + "MONAI rev id: e8e2f3e2efb6bf8072b7ded40cb57bca01e07773\n", "\n", "Optional dependencies:\n", - "Pytorch Ignite version: 0.4.2\n", + "Pytorch Ignite version: 0.4.4\n", "Nibabel version: 3.2.1\n", - "scikit-image version: 0.18.1\n", - "Pillow version: 7.0.0\n", - "Tensorboard version: 2.2.0\n", + "scikit-image version: 0.15.0\n", + "Pillow version: 8.1.2\n", + "Tensorboard version: 1.15.0+nv\n", "gdown version: 3.12.2\n", - "TorchVision version: 0.8.2\n", + "TorchVision version: 0.9.0a0\n", "ITK version: 5.1.2\n", - "tqdm version: 4.51.0\n", - "lmdb version: 1.0.0\n", + "tqdm version: 4.53.0\n", + "lmdb version: 1.1.1\n", "psutil version: 5.8.0\n", "\n", "For details about installing the optional dependencies, please visit:\n", @@ -81,6 +81,7 @@ "from monai.networks.utils import eval_mode\n", "from monai.networks.nets import DenseNet121\n", "from monai.transforms import (\n", + " Activations, AsDiscrete,\n", " Compose, LoadImage, Lambda, AddChannel,\n", " ScaleIntensity, ToTensor, RandRotate,\n", " RandFlip, Rand2DElastic, RandZoom, Resize,\n", @@ -238,6 +239,9 @@ " ToTensor(),\n", "])\n", "\n", + "act = Activations(softmax=True)\n", + "to_onehot = AsDiscrete(to_onehot=True, n_classes=num_class)\n", + "\n", "\n", "all_files = glob(os.path.join(train_dir, \"*.png\"))\n", "random.shuffle(all_files)\n", @@ -1344,8 +1348,10 @@ " y_pred = torch.cat([y_pred, outputs], dim=0)\n", " y = torch.cat([y, val_labels], dim=0)\n", "\n", - " auc_metric = monai.metrics.compute_roc_auc(\n", - " y_pred, y, to_onehot_y=True, softmax=True)\n", + " y_onehot = to_onehot(y)\n", + " y_pred_act = act(y_pred)\n", + " auc_metric = monai.metrics.compute_roc_auc(y_pred_act, y_onehot)\n", + " del y_pred_act, y_onehot\n", " auc.append(auc_metric)\n", "\n", " acc_value = torch.eq(y_pred.argmax(dim=1), y)\n", diff --git a/modules/learning_rate.ipynb b/modules/learning_rate.ipynb index 4ce7d9f4ab..1c93fecc13 100644 --- a/modules/learning_rate.ipynb +++ b/modules/learning_rate.ipynb @@ -50,23 +50,23 @@ "name": "stdout", "output_type": "stream", "text": [ - "MONAI version: 0.4.0+66.g028a965.dirty\n", - "Numpy version: 1.19.5\n", - "Pytorch version: 1.7.1\n", - "MONAI flags: HAS_EXT = False, USE_COMPILED = False\n", - "MONAI rev id: 028a965b208e2ef4265d51ec9c7ec8bd43b83359\n", + "MONAI version: 0+untagged.1.ge8e2f3e.dirty\n", + "Numpy version: 1.19.2\n", + "Pytorch version: 1.8.0a0+52ea372\n", + "MONAI flags: HAS_EXT = True, USE_COMPILED = False\n", + "MONAI rev id: e8e2f3e2efb6bf8072b7ded40cb57bca01e07773\n", "\n", "Optional dependencies:\n", - "Pytorch Ignite version: 0.4.2\n", + "Pytorch Ignite version: 0.4.4\n", "Nibabel version: 3.2.1\n", - "scikit-image version: 0.18.1\n", - "Pillow version: 8.1.0\n", - "Tensorboard version: 2.4.0\n", + "scikit-image version: 0.15.0\n", + "Pillow version: 8.1.2\n", + "Tensorboard version: 1.15.0+nv\n", "gdown version: 3.12.2\n", - "TorchVision version: 0.8.2\n", + "TorchVision version: 0.9.0a0\n", "ITK version: 5.1.2\n", - "tqdm version: 4.51.0\n", - "lmdb version: 1.0.0\n", + "tqdm version: 4.53.0\n", + "lmdb version: 1.1.1\n", "psutil version: 5.8.0\n", "\n", "For details about installing the optional dependencies, please visit:\n", @@ -101,6 +101,8 @@ "from monai.networks.utils import eval_mode\n", "from monai.optimizers import LearningRateFinder\n", "from monai.transforms import (\n", + " Activations,\n", + " AsDiscrete,\n", " AddChanneld,\n", " CenterSpatialCropd,\n", " Compose,\n", @@ -252,7 +254,10 @@ "print(len(train_ds))\n", "print(len(val_ds))\n", "print(train_ds[0][\"image\"].shape)\n", - "num_classes = train_ds.get_num_classes()" + "num_classes = train_ds.get_num_classes()\n", + "\n", + "act = Activations(softmax=True)\n", + "to_onehot = AsDiscrete(to_onehot=True, n_classes=num_classes)" ] }, { @@ -499,9 +504,10 @@ " y = torch.cat([y, val_labels], dim=0)\n", "\n", " for d in data:\n", - " auc_metric = compute_roc_auc(\n", - " data[d][\"y_pred\"], y, to_onehot_y=True, softmax=True\n", - " )\n", + " y_onehot = to_onehot(y)\n", + " y_pred_act = act(data[d][\"y_pred\"])\n", + " auc_metric = compute_roc_auc(y_pred_act, y_onehot)\n", + " del y_pred_act, y_onehot\n", " data[d][\"auc\"][\"x\"].append(epoch + 1)\n", " data[d][\"auc\"][\"y\"].append(auc_metric)\n", "\n",