ClipReID的监督对比损失SupConLoss

下面是带有详细注释的SupConLoss类代码,这些注释解释了代码中每个部分的作用和逻辑:

python 复制代码
import torch
import torch.nn as nn

class SupConLoss(nn.Module):
    """定义一个监督对比损失类,继承自nn.Module"""
    def __init__(self, device):
        """初始化函数
        Args:
            device (torch.device): 计算设备(CPU或GPU)
        """
        super(SupConLoss, self).__init__()
        self.device = device  # 将计算设备存储为类的一个属性
        self.temperature = 1.0  # 设置温度参数,默认为1.0,用于控制相似度计算的尺度

    def forward(self, text_features, image_features, t_label, i_targets):
        """前向传播函数,计算损失
        Args:
            text_features (torch.Tensor): 文本特征张量
            image_features (torch.Tensor): 图像特征张量
            t_label (torch.Tensor): 文本特征对应的标签
            i_targets (torch.Tensor): 图像特征对应的目标标签
        Returns:
            torch.Tensor: 计算得到的损失值
        """
        # 计算批次中文本特征和图像特征的数量
        batch_size = text_features.shape[0]
        batch_size_N = image_features.shape[0]

        # 创建一个掩码矩阵,标记哪些文本和图像特征对属于相同类别
        mask = torch.eq(t_label.unsqueeze(1).expand(batch_size, batch_size_N),
                        i_targets.unsqueeze(0).expand(batch_size, batch_size_N)).float().to(self.device)

        # 计算logits矩阵,即文本和图像特征间的点积,除以温度参数以调整尺度
        logits = torch.div(torch.matmul(text_features, image_features.T), self.temperature)

        # 为了数值稳定性,从每个logits中减去其最大值(防止exp运算溢出)
        logits_max, _ = torch.max(logits, dim=1, keepdim=True)
        logits = logits - logits_max.detach()

        # 计算每对特征的指数值
        exp_logits = torch.exp(logits)

        # 计算log概率,即log(softmax(logits))
        log_prob = logits - torch.log(exp_logits.sum(1, keepdim=True))

        # 计算正样本对的平均对数概率,使用掩码进行加权
        mean_log_prob_pos = (mask * log_prob).sum(1) / mask.sum(1)

        # 计算最终损失值,为正样本对的平均对数概率的负平均值
        loss = -mean_log_prob_pos.mean()

        return loss

这个类是为了在多模态学习场景中使用,特别适合处理需要同时考虑文本和图像数据的任务,如在图像标注或跨模态检索中。通过这种损失函数,模型被训练以学习将相同类别的不同模态数据映射到相近的特征空间,从而提高任务性能。

这段代码定义了一个名为 SupConLoss 的类,它是一个深度学习中用于计算监督对比损失(Supervised Contrastive Loss)的自定义损失函数类。这种损失函数通常用于多模态学习场景,比如同时处理文本和图像的特征。让我们逐步解析这段代码的主要部分:

类定义和初始化

  • SupConLoss 继承自 nn.Module,这是 PyTorch 中所有神经网络模块的基类。
  • 在初始化方法 __init__ 中,它接受一个 device 参数,用来指定运算应该在哪个设备上进行(如CPU或GPU)。
  • self.temperature 是一个标量,用于控制损失计算中的温度参数,影响特征向量之间相似度的缩放。

前向传播 forward 方法

  • 输入参数包括 text_featuresimage_features,这两个是来自不同模态(文本和图像)的特征向量。
  • t_labeli_targets 是这些特征向量对应的标签,用于确定哪些特征向量是正样本对。
  • 计算批次大小 batch_size(文本特征的数量)和 batch_size_N(图像特征的数量)。

计算相似性矩阵和掩码

  • 创建一个掩码 mask,该掩码通过比较扩展后的 t_labeli_targets 来确定哪些文本和图像特征对应于相同的类别。
  • 计算 logits 矩阵,它表示文本特征和图像特征之间的点积(归一化通过除以温度参数)。这个矩阵度量了两个不同模态间特征的相似度。

数值稳定性

  • 通过从每行的 logits 中减去该行的最大值来防止数值爆炸。

计算概率和对数概率

  • 使用 exp_logits 计算所有特征对的指数。
  • log_prob 是计算所有对的对数概率,用于计算对数似然。

计算损失

  • mean_log_prob_pos 计算每个样本与其正样本之间的对数概率的加权平均值。
  • 最终损失是这些平均对数概率的负值的平均,即 -mean_log_prob_pos.mean()

这种损失函数在训练中鼓励来自同一类别的不同模态特征向量之间的距离更近,而来自不同类别的特征向量之间的距离更远,有助于改善多模态学习任务中的特征表示。

相关推荐
无脑敲代码,bug漫天飞1 小时前
COR 损失函数
人工智能·机器学习
幽兰的天空1 小时前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
HPC_fac130520678162 小时前
以科学计算为切入点:剖析英伟达服务器过热难题
服务器·人工智能·深度学习·机器学习·计算机视觉·数据挖掘·gpu算力
网易独家音乐人Mike Zhou4 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
安静读书4 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
小喵要摸鱼7 小时前
Python 神经网络项目常用语法
python
一念之坤9 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
wxl7812279 小时前
如何使用本地大模型做数据分析
python·数据挖掘·数据分析·代码解释器
NoneCoder9 小时前
Python入门(12)--数据处理
开发语言·python