U-Net代码复现--utils dice_score.py

本文记录自己的学习过程,内容包括:

代码解读:Pytorch-UNet

深度学习编程基础:Pytorch-深度学习(新手友好)

UNet论文解读:医学图像分割:U_Net 论文阅读

数据:https://hackernoon.com/hacking-gta-v-for-carvana-kaggle-challenge-6d0b7fb4c781

完整代码解读详见:U-Net代码复现--更新中

utils

dice_score.py

在train.py中:
loss = criterion(masks_pred.squeeze(1), true_masks.float())
loss += dice_loss(F.sigmoid(masks_pred.squeeze(1)), true_masks.float(), multiclass=False)

其中:

  • 交叉信息熵:criterion = nn.CrossEntropyLoss() if model.n_classes > 1 else nn.BCEWithLogitsLoss() .
  • Dice 系数(Dice coefficient) 损失函数:dice_loss(F.sigmoid(masks_pred.squeeze(1)), true_masks.float(), multiclass=False)

Dice coefficient也被称为F1-score,是一种用于衡量两个集合相似度的指标,通常用于图像分割任务中。在医学图像分割中,Dice coefficient常用于衡量模型预测的分割掩码与真实标签之间的相似度。Dice coefficient越接近1,表示预测结果与真实标签越相似。

dice coefficient 源于二分类,本质上是衡量两个样本的重叠部分。该指标范围从0到1,其中"1"表示完整的重叠。 其计算公式为:
D i c e = 2 ∣ A ∩ B ∣ ∣ A ∣ + ∣ B ∣ Dice=\frac{2|A∩B|}{|A|+|B|} Dice=∣A∣+∣B∣2∣A∩B∣

其中 ∣ A ∩ B ∣ |A∩B| ∣A∩B∣ 表示集合A、B 之间的共同元素,|A| 表示 A 中的元素的个数,B也用相似的表示方法。

关于inter = 2 * (input * target).sum(dim=sum_dim)sum的理解参考:Pytorch:torch.sum()函数用法

python 复制代码
def dice_coeff(input: Tensor, target: Tensor, reduce_batch_first: bool = False, epsilon: float = 1e-6):
    # Average of Dice coefficient for all batches, or for a single mask
    # 确保input和target数量一致
    assert input.size() == target.size()
    # 确保imput维度为3,或者reduce_batch_first为False(这里reduce_batch_first为True,所以input.dim() == 3)
    assert input.dim() == 3 or not reduce_batch_first

	# sum_dim = (-1, -2, -3)
    sum_dim = (-1, -2) if input.dim() == 2 or not reduce_batch_first else (-1, -2, -3)

	# input 和 target像素为[0,1],相乘则得到均为1的部分,即A∩B
    inter = 2 * (input * target).sum(dim=sum_dim) # 对所有维度求和
    # 计算|A|+|B|
    sets_sum = input.sum(dim=sum_dim) + target.sum(dim=sum_dim)
    sets_sum = torch.where(sets_sum == 0, inter, sets_sum) 

    dice = (inter + epsilon) / (sets_sum + epsilon)
    return dice.mean()
python 复制代码
def multiclass_dice_coeff(input: Tensor, target: Tensor, reduce_batch_first: bool = False, epsilon: float = 1e-6):
    # Average of Dice coefficient for all classes
    return dice_coeff(input.flatten(0, 1), target.flatten(0, 1), reduce_batch_first, epsilon)
python 复制代码
def dice_loss(input: Tensor, target: Tensor, multiclass: bool = False):
    # Dice loss (objective to minimize) between 0 and 1
    fn = multiclass_dice_coeff if multiclass else dice_coeff
    return 1 - fn(input, target, reduce_batch_first=True)
相关推荐
Suyuoa6 分钟前
附录2-pytorch yolov5目标检测
python·深度学习·yolo
好看资源平台1 小时前
网络爬虫——综合实战项目:多平台房源信息采集与分析系统
爬虫·python
余生H1 小时前
transformer.js(三):底层架构及性能优化指南
javascript·深度学习·架构·transformer
进击的六角龙2 小时前
深入浅出:使用Python调用API实现智能天气预报
开发语言·python
檀越剑指大厂2 小时前
【Python系列】浅析 Python 中的字典更新与应用场景
开发语言·python
罗小罗同学2 小时前
医工交叉入门书籍分享:Transformer模型在机器学习领域的应用|个人观点·24-11-22
深度学习·机器学习·transformer
湫ccc2 小时前
Python简介以及解释器安装(保姆级教学)
开发语言·python
孤独且没人爱的纸鹤2 小时前
【深度学习】:从人工神经网络的基础原理到循环神经网络的先进技术,跨越智能算法的关键发展阶段及其未来趋势,探索技术进步与应用挑战
人工智能·python·深度学习·机器学习·ai
阿_旭2 小时前
TensorFlow构建CNN卷积神经网络模型的基本步骤:数据处理、模型构建、模型训练
人工智能·深度学习·cnn·tensorflow
羊小猪~~2 小时前
tensorflow案例7--数据增强与测试集, 训练集, 验证集的构建
人工智能·python·深度学习·机器学习·cnn·tensorflow·neo4j