比较两个分割图预测
Posted
技术标签:
【中文标题】比较两个分割图预测【英文标题】:Compare two segmentation maps predictions 【发布时间】:2021-08-13 08:25:48 【问题描述】:我在未标记数据上使用两个预测分割图之间的一致性。对于标记数据,我使用的是 nn.BCEwithLogitsLoss 和 Dice Loss。
我正在制作视频,这就是为什么要输出 5 维。 (batch_size, channels, frames, height, width)
我想知道我们如何比较两个预测的分割图。
gmentation maps.
# gt_seg - Ground truth segmentation map. - (8, 1, 8, 112, 112)
# aug_gt_seg - Augmented ground truth segmentation map - (8, 1, 8, 112, 112)
predicted_seg_1 = model(data, targets) # (8, 1, 8, 112, 112)
predicted_seg_2 = model(augmented_data, augmented_targets) #(8, 1, 8, 112, 112)
# define criterion
seg_criterion_1 = nn.BCEwithLogitsLoss(size_average=True)
seg_criterion_2 = nn.DiceLoss()
# labeled losses
supervised_loss_1 = seg_criterion_1(predicted_seg_1, gt_seg)
supervised_loss_2 = seg_criterion_2(predicted_seg_1, gt_seg)
# Consistency loss
if consistency_loss == "l2":
consistency_criterion = nn.MSELoss()
cons_loss = consistency_criterion(predicted_gt_seg_1, predicted_gt_seg_2)
elif consistency_loss == "l1":
consistency_criterion = nn.L1Loss()
cons_loss = consistency_criterion(predicted_gt_seg_1, predicted_gt_seg_2)
total_supervised_loss = supervised_loss_1 + supervised_loss_2
total_consistency_loss = cons_loss
这是在两个预测分割图之间应用一致性的正确方法吗?
我主要是因为火炬网站上的定义而感到困惑。这是输入 x 与目标 y 的比较。我认为它看起来是正确的,因为我希望两个预测的分割图都相似。但是,第二个分割图不是目标。这就是为什么我很困惑。因为如果这可能是有效的,那么每个损失函数都可以以某种或另一种方式应用。这看起来对我没有吸引力。如果是正确的比较方式,是否可以扩展到其他基于分段的损失,例如 Dice Loss、IoU Loss 等?
关于标记数据损失计算的另一个查询:
# gt_seg - Ground truth segmentation map
# aug_gt_seg - Augmented ground truth segmentation map
predicted_seg_1 = model(data, targets)
predicted_seg_2 = model(augmented_data, augmented_targets)
# define criterion
seg_criterion_1 = nn.BCEwithLogitsLoss(size_average=True)
seg_criterion_2 = nn.DiceLoss()
# labeled losses
supervised_loss_1 = seg_criterion_1(predicted_seg_1, gt_seg)
supervised_loss_2 = seg_criterion_2(predicted_seg_1, gt_seg)
# augmented labeled losses
aug_supervised_loss_1 = seg_criterion_1(predicted_seg_2, aug_gt_seg)
aug_supervised_loss_2 = seg_criterion_2(predicted_seg_2, aug_gt_seg)
total_supervised_loss = supervised_loss_1 + supervised_loss_2 + aug_supervised_loss_1 + aug_supervised_loss_2
total_supervised_loss 的计算是否正确?我可以为此应用 loss.backward() 吗?
【问题讨论】:
是的,您可以将loss.backward()
应用于由多个成分损失组成的损失函数,即使是多次前向传递(在这种情况下,您每 1 次后向传递执行 2 次前向传递)。尽管存储复杂网络的计算图会为每个前向传递消耗相当多的内存。
你能解释一下最后一句与内存问题有关的内容吗?任何建议如何提高内存效率。
【参考方案1】:
是的,这是实现一致性损失的有效方法。 pytorch 文档使用的命名法将一个输入作为目标,另一个作为预测,但考虑到 L1、L2、Dice 和 IOU 损失都是对称的(即Loss(a,b)
= Loss(b,a)
)。因此,这些函数中的任何一个都将完成一种形式的一致性损失,而不管一个输入实际上是真实的还是“目标”。
【讨论】:
以上是关于比较两个分割图预测的主要内容,如果未能解决你的问题,请参考以下文章