dyn_unet训练过程中的错误

网络训练错误总结

  • 1.AssertionError: ground truth has different shape (torch.Size([2, 2, 128, 128, 32])) from input (torch.Size([3, 2, 128, 128, 32]))

1.AssertionError: ground truth has different shape (torch.Size([2, 2, 128, 128, 32])) from input (torch.Size([3, 2, 128, 128, 32]))

想要通过交叉验证的方式训练网络,写好了交叉验证的代码之后,将后面的网络训练代码复制过来,运行时报错。错误如下:
在这里插入图片描述
在网络训练代码上debug,观察到输入image和label的中、尺寸都是[2, 1, 128, 128, 32],但是model输出尺寸为[2, 3, 2, 128, 128, 32]
(我的图像是三维图像,加载图像时全部resize为[128, 128, 32], batch_size设置为2,网络输入通道数为1,输出通道数为2)。
经过查看dyn_unet的源码注释,发现是monai版本更新后,模型输出的形式有所改变:
monai 0.4.0 版本的参数注释如下。
dyn_unet训练过程中的错误_第1张图片
在这里面,我使用了深监督,monai0.4.0使用深监督后的输出是一个列表,这个列表里包含3个tensor,是不同尺度下的特征图,在计算loss的时候,将这三个特征图分别与label进行计算,再取加权和。
monai 0.5.0 版本的参数注释如下:
dyn_unet训练过程中的错误_第2张图片
在0.5.0这个版本中,使用深监督的输出不再是一个列表,而是一个组合的tensor.如上边注释给出的例子一样。如果三个特征图(二维)的尺寸分别为(1, 2, 32, 24), (1, 2, 16, 12)和 (1, 2, 8, 6),则会将所有特征图的尺寸都变为与最大尺寸相同,即变为(1, 2, 32, 24),然后最终输出一个组合的tensor,其尺寸为(1, 3, 2, 8, 6)。这个时候,如果我们要分别提取三个特征图,就不能再简单的对列表进行索引了,而是要使用解除绑定指令torch.unbind()先将绑定的tensor解除绑定再分别计算loss.
以下是针对我自己代码的loss进行的改动:
在原来代码中加入preds = list(torch.unbind(preds, dim=1)),错误解除。

def _compute_loss(preds, label):
    preds = list(torch.unbind(preds, dim=1))
    labels = [label] + [interpolate(label, pred.shape[2:]) for pred in preds[1:]]
    return sum([0.5 ** i * loss_function(p, l) for i, (p, l) in enumerate(zip(preds, labels))])

你可能感兴趣的:(错误总结,深度学习,python)