ZeroDivisionError: деление с плавающей точкой на ноль во время агрегации патчей вывода net_segment
Я запустил (в Ubuntu 16.04 в экземпляре виртуальной машины Google Cloud):
net_segment inference -c <path-to-config>
для проблемы двоичной сегментации с использованием unet_2d
с softmax и (96,96,1) пространственным окном. Это было после того, как я тренировал свою модель в течение 10 эпох и сохранил контрольную точку. Я не уверен, почему он рисует ошибку деления нуля из windows_aggregator_resize.py
, Какова причина этой проблемы и что я могу сделать, чтобы исправить это?
Вот некоторые настройки вывода и соответствующая ошибка:
pixdim: (1.0, 1.0, 1.0)
[NETWORK]
batch_size: 1
cutoff: (0.01, 0.99)
name: unet_2d
normalisation: False
volume_padding_size: (96, 96, 0)
reg_type: L2
window_sampling: resize
multimod_foreground_type: and
[INFERENCE]
border = (96,96,0)
inference_iter = -1
output_interp_order = 0
spatial_window_size = (96,96,2)
INFO:niftynet: Accessing /home/xchaosfailx1/niftynet/models/MSD/heart_la_seg/models/model.ckpt-10 ...
INFO:niftynet: Restoring parameters from /home/xchaosfailx1/niftynet/models/MSD/heart_la_seg/models/model.ckpt-10
INFO:niftynet: Cleaning up...
WARNING:niftynet: stopped early, incomplete loops
INFO:niftynet: stopping sampling threads
INFO:niftynet: SegmentationApplication stopped (time in second 17.07).
Traceback (most recent call last):
File "/home/xchaosfailx1/.local/bin/net_segment", line 11, in <module>
sys.exit(main())
File "/home/xchaosfailx1/.local/lib/python3.5/site-packages/niftynet/__init__.py", line 139, in main
app_driver.run_application()
File "/home/xchaosfailx1/.local/lib/python3.5/site-packages/niftynet/engine/application_driver.py", line 275, in run_application
self._inference_loop(session, loop_status)
File "/home/xchaosfailx1/.local/lib/python3.5/site-packages/niftynet/engine/application_driver.py", line 493, in _inference_loop
self._loop(iter_generator(itertools.count(), INFER), sess, loop_status)
File "/home/xchaosfailx1/.local/lib/python3.5/site-packages/niftynet/engine/application_driver.py", line 442, in _loop
iter_msg.current_iter_output[NETWORK_OUTPUT])
File "/home/xchaosfailx1/.local/lib/python3.5/site-packages/niftynet/application/segmentation_application.py", line 390, in interpret_output
batch_output['window'], batch_output['location'])
File "/home/xchaosfailx1/.local/lib/python3.5/site-packages/niftynet/engine/windows_aggregator_resize.py", line 55, in decode_batch
self._save_current_image(window[batch_id, ...], resize_to_shape)
File "/home/xchaosfailx1/.local/lib/python3.5/site-packages/niftynet/engine/windows_aggregator_resize.py", line 82, in _save_current_image
[float(p) / float(d) for p, d in zip(window_shape, image_shape)]
File "/home/xchaosfailx1/.local/lib/python3.5/site-packages/niftynet/engine/windows_aggregator_resize.py", line 82, in <listcomp>
[float(p) / float(d) for p, d in zip(window_shape, image_shape)]
ZeroDivisionError: float division by zero
Для воспроизведения ошибки:
- изменил отступы в
niftynet.network.unet_2d.py
отvalid
вsame
- набор данных [Task2_Heart]: https://drive.google.com/drive/folders/1HqEgzS8BV2c7xYNrZdEAnrHk7osJJ--2
- обновленный конфиг: https://drive.google.com/open?id=1RI111BZLv4Lhf9cGvHo_sAHRt_k5Xt0I
2 ответа
Не проверял данные логического вывода, но я думаю, spatial_window_size
в [INFERENCE]
должно быть 96, 96, 1
как это то, что вы установили на тренировке.
Ошибка, которую я сделал, заключалась в том, что я установил границу (96,96,0) под [Inference]
в ту же форму, что и мое пространственное окно (96,96,1), поэтому, когда партия была обрезана в decode_batch
обрезанное изображение имело форму изображения с нулями. Следовательно, когда коэффициент масштабирования был рассчитан в _save_current_image
, это привело к ошибке ZeroDivsionError. Временное исправление состояло в том, чтобы убрать заполнение тома и изменить border=(0,0,0)
,