|
40 | 40 | },
|
41 | 41 | {
|
42 | 42 | "cell_type": "code",
|
43 |
| - "execution_count": null, |
| 43 | + "execution_count": 1, |
44 | 44 | "metadata": {},
|
45 | 45 | "outputs": [],
|
46 | 46 | "source": [
|
|
57 | 57 | },
|
58 | 58 | {
|
59 | 59 | "cell_type": "code",
|
60 |
| - "execution_count": null, |
| 60 | + "execution_count": 1, |
61 | 61 | "metadata": {},
|
62 | 62 | "outputs": [
|
63 | 63 | {
|
64 | 64 | "name": "stderr",
|
65 | 65 | "output_type": "stream",
|
66 | 66 | "text": [
|
67 |
| - "/usr/local/lib/python3.8/dist-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", |
| 67 | + "/usr/local/lib/python3.10/dist-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", |
68 | 68 | " from .autonotebook import tqdm as notebook_tqdm\n"
|
69 | 69 | ]
|
70 | 70 | },
|
71 | 71 | {
|
72 | 72 | "name": "stdout",
|
73 | 73 | "output_type": "stream",
|
74 | 74 | "text": [
|
75 |
| - "MONAI version: 1.2.0rc4+21.g7f067564\n", |
| 75 | + "MONAI version: 1.3.0\n", |
76 | 76 | "Numpy version: 1.22.2\n",
|
77 |
| - "Pytorch version: 2.0.0a0+1767026\n", |
78 |
| - "MONAI flags: HAS_EXT = False, USE_COMPILED = False, USE_META_DICT = False\n", |
79 |
| - "MONAI rev id: 7f06756472fd5514c3c2f2a6710e3fa4d1748e90\n", |
80 |
| - "MONAI __file__: /workspace/monai/monai-in-dev/monai/__init__.py\n", |
| 77 | + "Pytorch version: 2.1.0a0+29c30b1\n", |
| 78 | + "MONAI flags: HAS_EXT = True, USE_COMPILED = False, USE_META_DICT = False\n", |
| 79 | + "MONAI rev id: 865972f7a791bf7b42efbcd87c8402bd865b329e\n", |
| 80 | + "MONAI __file__: /opt/monai/monai/__init__.py\n", |
81 | 81 | "\n",
|
82 | 82 | "Optional dependencies:\n",
|
83 | 83 | "Pytorch Ignite version: 0.4.11\n",
|
84 | 84 | "ITK version: 5.3.0\n",
|
85 | 85 | "Nibabel version: 5.1.0\n",
|
86 |
| - "scikit-image version: 0.20.0\n", |
| 86 | + "scikit-image version: 0.22.0\n", |
| 87 | + "scipy version: 1.11.1\n", |
87 | 88 | "Pillow version: 9.2.0\n",
|
88 | 89 | "Tensorboard version: 2.9.0\n",
|
89 | 90 | "gdown version: 4.7.1\n",
|
90 |
| - "TorchVision version: 0.15.0a0\n", |
| 91 | + "TorchVision version: 0.16.0a0\n", |
91 | 92 | "tqdm version: 4.65.0\n",
|
92 | 93 | "lmdb version: 1.4.1\n",
|
93 | 94 | "psutil version: 5.9.4\n",
|
94 | 95 | "pandas version: 1.5.2\n",
|
95 | 96 | "einops version: 0.6.1\n",
|
96 | 97 | "transformers version: 4.21.3\n",
|
97 |
| - "mlflow version: 2.3.0\n", |
| 98 | + "mlflow version: 2.7.1\n", |
98 | 99 | "pynrrd version: 1.0.0\n",
|
| 100 | + "clearml version: 1.13.1\n", |
99 | 101 | "\n",
|
100 | 102 | "For details about installing the optional dependencies, please visit:\n",
|
101 | 103 | " https://docs.monai.io/en/latest/installation.html#installing-the-recommended-dependencies\n",
|
|
111 | 113 | "import sys\n",
|
112 | 114 | "import tempfile\n",
|
113 | 115 | "import torch\n",
|
| 116 | + "import ignite\n", |
114 | 117 | "\n",
|
115 | 118 | "from monai.apps import MedNISTDataset\n",
|
116 | 119 | "from monai.config import print_config\n",
|
117 | 120 | "from monai.data import DataLoader\n",
|
118 |
| - "from monai.engines import SupervisedTrainer\n", |
119 |
| - "from monai.handlers import StatsHandler\n", |
| 121 | + "from monai.engines import SupervisedTrainer, SupervisedEvaluator\n", |
| 122 | + "from monai.handlers import StatsHandler, TensorBoardStatsHandler, ValidationHandler\n", |
| 123 | + "from monai.handlers.utils import from_engine\n", |
120 | 124 | "from monai.inferers import SimpleInferer\n",
|
121 | 125 | "from monai.networks import eval_mode\n",
|
122 | 126 | "from monai.networks.nets import densenet121\n",
|
|
139 | 143 | },
|
140 | 144 | {
|
141 | 145 | "cell_type": "code",
|
142 |
| - "execution_count": null, |
| 146 | + "execution_count": 2, |
143 | 147 | "metadata": {},
|
144 | 148 | "outputs": [
|
145 | 149 | {
|
146 | 150 | "name": "stdout",
|
147 | 151 | "output_type": "stream",
|
148 | 152 | "text": [
|
149 |
| - "/workspace/data\n" |
| 153 | + "/workspace/Data\n" |
150 | 154 | ]
|
151 | 155 | }
|
152 | 156 | ],
|
|
171 | 175 | },
|
172 | 176 | {
|
173 | 177 | "cell_type": "code",
|
174 |
| - "execution_count": null, |
| 178 | + "execution_count": 3, |
175 | 179 | "metadata": {},
|
176 | 180 | "outputs": [],
|
177 | 181 | "source": [
|
|
205 | 209 | },
|
206 | 210 | {
|
207 | 211 | "cell_type": "code",
|
208 |
| - "execution_count": null, |
| 212 | + "execution_count": 4, |
209 | 213 | "metadata": {},
|
210 | 214 | "outputs": [
|
211 | 215 | {
|
212 | 216 | "name": "stdout",
|
213 | 217 | "output_type": "stream",
|
214 | 218 | "text": [
|
215 |
| - "2023-04-21 15:37:46,567 - INFO - Verified 'MedNIST.tar.gz', md5: 0bc7306e7427e00ad1c5526a6677552d.\n", |
216 |
| - "2023-04-21 15:37:46,567 - INFO - File exists: /workspace/data/MedNIST.tar.gz, skipped downloading.\n", |
217 |
| - "2023-04-21 15:37:46,568 - INFO - Non-empty folder exists in /workspace/data/MedNIST, skipped extracting.\n" |
| 219 | + "2024-02-22 05:34:20,240 - INFO - Verified 'MedNIST.tar.gz', md5: 0bc7306e7427e00ad1c5526a6677552d.\n", |
| 220 | + "2024-02-22 05:34:20,241 - INFO - File exists: /workspace/Data/MedNIST.tar.gz, skipped downloading.\n", |
| 221 | + "2024-02-22 05:34:20,241 - INFO - Non-empty folder exists in /workspace/Data/MedNIST, skipped extracting.\n" |
218 | 222 | ]
|
219 | 223 | },
|
220 | 224 | {
|
221 | 225 | "name": "stderr",
|
222 | 226 | "output_type": "stream",
|
223 | 227 | "text": [
|
224 |
| - "Loading dataset: 100%|██████████| 47164/47164 [00:18<00:00, 2525.58it/s]\n" |
| 228 | + "Loading dataset: 100%|██████████| 47164/47164 [00:19<00:00, 2430.78it/s]\n", |
| 229 | + "Loading dataset: 100%|██████████| 5895/5895 [00:02<00:00, 2508.13it/s]\n" |
225 | 230 | ]
|
226 | 231 | }
|
227 | 232 | ],
|
228 | 233 | "source": [
|
229 |
| - "dataset = MedNISTDataset(root_dir=root_dir, transform=transform, section=\"training\", download=True)" |
| 234 | + "dataset = MedNISTDataset(root_dir=root_dir, transform=transform, section=\"training\", download=True)\n", |
| 235 | + "valdata = MedNISTDataset(root_dir=root_dir, transform=transform, section=\"validation\", download=False)" |
230 | 236 | ]
|
231 | 237 | },
|
232 | 238 | {
|
|
238 | 244 | "\n",
|
239 | 245 | "To train a model that can perform the classification task, we will use the DenseNet-121 which is known for its performance on the ImageNet dataset.\n",
|
240 | 246 | "\n",
|
241 |
| - "For a typical supervised training workflow, MONAI provides `SupervisedTrainer` to define the hyper-parameters." |
| 247 | + "For a typical supervised training workflow, MONAI provides `SupervisedTrainer` to define the hyper-parameters and `SupervisedEvaluator` to track model progress with handlers to save metrics. " |
242 | 248 | ]
|
243 | 249 | },
|
244 | 250 | {
|
245 | 251 | "cell_type": "code",
|
246 |
| - "execution_count": null, |
| 252 | + "execution_count": 5, |
247 | 253 | "metadata": {},
|
248 | 254 | "outputs": [],
|
249 | 255 | "source": [
|
250 | 256 | "max_epochs = 5\n",
|
251 | 257 | "model = densenet121(spatial_dims=2, in_channels=1, out_channels=6).to(\"cuda:0\")\n",
|
252 | 258 | "\n",
|
253 | 259 | "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n",
|
| 260 | + "\n", |
| 261 | + "evaluator = SupervisedEvaluator(\n", |
| 262 | + " device=torch.device(\"cuda:0\"),\n", |
| 263 | + " val_data_loader=DataLoader(valdata, batch_size=512, shuffle=False, num_workers=4),\n", |
| 264 | + " network=model,\n", |
| 265 | + " inferer=SimpleInferer(),\n", |
| 266 | + " key_val_metric={\"val_acc\": ignite.metrics.Accuracy(from_engine([\"pred\", \"label\"]))},\n", |
| 267 | + " val_handlers=[\n", |
| 268 | + " StatsHandler(iteration_log=False),\n", |
| 269 | + " TensorBoardStatsHandler(iteration_log=False)\n", |
| 270 | + " ],\n", |
| 271 | + ")\n", |
254 | 272 | "trainer = SupervisedTrainer(\n",
|
255 | 273 | " device=torch.device(\"cuda:0\"),\n",
|
256 | 274 | " max_epochs=max_epochs,\n",
|
|
259 | 277 | " optimizer=torch.optim.Adam(model.parameters(), lr=1e-5),\n",
|
260 | 278 | " loss_function=torch.nn.CrossEntropyLoss(),\n",
|
261 | 279 | " inferer=SimpleInferer(),\n",
|
262 |
| - " train_handlers=StatsHandler(),\n", |
| 280 | + " train_handlers=[\n", |
| 281 | + " ValidationHandler(validator=evaluator, epoch_level=True, interval=1),\n", |
| 282 | + " StatsHandler(),\n", |
| 283 | + " TensorBoardStatsHandler(tag_name=\"train_loss\", output_transform=from_engine([\"loss\"], first=True))\n", |
| 284 | + " ],\n", |
263 | 285 | ")"
|
264 | 286 | ]
|
265 | 287 | },
|
|
290 | 312 | },
|
291 | 313 | {
|
292 | 314 | "cell_type": "code",
|
293 |
| - "execution_count": null, |
| 315 | + "execution_count": 7, |
294 | 316 | "metadata": {},
|
295 | 317 | "outputs": [
|
296 | 318 | {
|
|
344 | 366 | "name": "python",
|
345 | 367 | "nbconvert_exporter": "python",
|
346 | 368 | "pygments_lexer": "ipython3",
|
347 |
| - "version": "3.8.10" |
| 369 | + "version": "3.10.12" |
348 | 370 | }
|
349 | 371 | },
|
350 | 372 | "nbformat": 4,
|
|
0 commit comments