CLIP的loss计算

CLIP的loss计算

loss_img = nn.CrossEntropyLoss()
loss_txt = nn.CrossEntropyLoss()
self.logit_scale = nn.Parameter(torch.ones([]) * np.log(1 / 0.07))

logits_per_image = logit_scale * image_features @ text_features.t()
logits_per_text = logit_scale * text_features @ image_features.t()

ground_truth = torch.arange(len(logits_per_image)).long()
ground_truth = ground_truth.cuda(args.local_device_rank, non_blocking=True)

total_loss = (
    loss_img(logits_per_image, ground_truth)
    + loss_txt(logits_per_text, ground_truth)
) / 2

logit_scale参数的作用是在计算图像和文本之间的相似度分数时进行缩放,它本质上是一个可学习的温度参数(temperature parameter)。 np.log(1 / 0.07) 约等于2.659为经验值。

图像特征和文本特征矩阵的转置相乘,得到M*M的矩阵,M为batch size,代表每个图像特征向量和所有文本向量的相似度。
文本特征矩阵乘以图像特征的转置矩阵,得到每个文本特征向量和所有图像特征向量的相似度。
ground_truth为正确类别的索引值,即第一行图像特征对应的正确类别为第一个文本特征,第二行图像特征对应第二个文本特征,正好是对角线的位置。
最终loss为这两个loss的均值。

nn.CrossEntropyLoss() 的目标标签有两种格式,类别的索引值或者类别的概率值。

在这里插入图片描述

import torch
import torch.nn as nn

logits = torch.rand(10, 10)
targets = torch.arange(10)

criterion = nn.CrossEntropyLoss()
loss = criterion(logits, targets)
print("Cross Entropy Loss:", loss.item())

#等价于
m1 = nn.LogSoftmax(dim=-1)
m2 = nn.NLLLoss()
y1 = m1(logits)
y2 = m2(y1,targets)
print(y2.item())

参考:
深入理解交叉熵损失CrossEntropyLoss - nn.NLLLoss(Negative Log-Likelihood Loss)

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于PyTorch的CLIP模型知识蒸馏训练代码,包括KL散度损失、软标签损失和硬标签损失: ```python import torch import torch.nn.functional as F from torch import nn, optim from torchvision import transforms, models from torch.utils.data import DataLoader # 加载预训练模型 teacher_model = models.clip_vit_large(pretrained=True) student_model = models.clip_vit_base(pretrained=False) # 定义数据预处理和增强 transformations = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) # 加载数据集 train_dataset = ImageFolder('train_folder', transformations) train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True) # 定义损失函数 kl_div_loss = nn.KLDivLoss(reduction='batchmean') soft_loss = nn.CrossEntropyLoss(reduction='mean') hard_loss = nn.CrossEntropyLoss(reduction='mean') # 定义优化器 optimizer = optim.Adam(student_model.parameters(), lr=0.001) # 开始训练 for epoch in range(10): for inputs, targets in train_loader: optimizer.zero_grad() # 计算教师模型输出和标签 with torch.no_grad(): teacher_outputs = teacher_model.encode_image(inputs) teacher_targets = F.softmax(teacher_outputs / 0.5, dim=-1) # 计算学生模型输出和标签 student_outputs = student_model.encode_image(inputs) student_targets = F.softmax(student_outputs / 0.5, dim=-1) # 计算KL散度损失 kl_loss = kl_div_loss(student_targets.log(), teacher_targets) # 计算软标签损失 soft_loss_value = soft_loss(student_outputs, targets) # 计算硬标签损失 hard_loss_value = hard_loss(student_outputs, targets) # 计算总损失 loss = kl_loss + 0.5 * soft_loss_value + 0.5 * hard_loss_value # 反向传播和更新参数 loss.backward() optimizer.step() print(f'Epoch {epoch+1} Loss: {loss.item()}') ``` 需要注意的是,这只是一个简单的示例代码,实际应用中还需要根据数据集和模型做出一些调整和优化。另外,由于CLIP模型较为复杂,可能需要较长的训练时间和更多的计算资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值