You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于MONAI的肝脏分割训练函数出现ZeroDivisionError问题求助

解决MONAI肝脏分割训练中的ZeroDivisionError问题

错误原因分析

这个ZeroDivisionError的核心是**train_step始终为0**——遍历train_loader的循环根本没执行,说明你的训练数据加载器里没有加载到任何数据,或者数据加载逻辑存在问题导致循环直接跳过。手动把train_step设为0.01会严重放大损失值,扭曲优化器更新逻辑,绝对不可取。

解决方案

1. 先排查数据加载有效性

在train函数开头添加代码,确认数据加载器是否正常加载了数据:

# 检查数据加载器状态
print(f"训练集批次总数: {len(train_loader)}")
print(f"测试集批次总数: {len(test_loader)}")

如果输出为0,说明数据集路径、预处理管道(比如MONAI的Dataset/DataLoader构建逻辑)或批量大小设置存在问题,需要先修复数据加载环节。

2. 添加防除以零的安全兜底逻辑

即使数据加载正常,也应该添加判断避免崩溃,同时不影响正常训练效果:
修改训练集平均损失/指标计算部分:

print('-'*20)

# 安全计算训练集平均损失和指标
if train_step > 0:
    train_epoch_loss /= train_step
    epoch_metric_train /= train_step
else:
    # 无训练数据时用0填充,避免崩溃且不影响后续曲线
    train_epoch_loss = 0.0
    epoch_metric_train = 0.0

print(f'Epoch_loss: {train_epoch_loss:.4f}')
save_loss_train.append(train_epoch_loss)
np.save(os.path.join(model_dir, 'loss_train.npy'), save_loss_train)

print(f'Epoch_metric: {epoch_metric_train:.4f}')
save_metric_train.append(epoch_metric_train)
np.save(os.path.join(model_dir, 'metric_train.npy'), save_metric_train)

同样给测试集部分添加相同的安全判断:

# 安全计算测试集平均损失和指标
if test_step > 0:
    test_epoch_loss /= test_step
    epoch_metric_test /= test_step
else:
    test_epoch_loss = 0.0
    epoch_metric_test = 0.0

3. 修复训练日志的错误计算

你代码里的训练日志打印有逻辑错误:len(train_loader) // train_loader.batch_size完全多余,len(train_loader)本身就是训练集的批次总数,改成:

print(
    f"{train_step}/{len(train_loader)}, "
    f"Train_loss: {train_loss.item():.4f}"
)

这个错误可能会让你误以为加载了数据,干扰问题排查。

内容的提问来源于stack exchange,提问作者Jonathan Natakusuma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:57:41