Label Smoothing实战:如何在PyTorch中轻松实现标签平滑(附代码示例)

标签平滑 label smoothing 文章目录简介什么是label smoothinglabel smoothing作用torch实现label smoothing 简介 label smoothing其实是机器学习和深度学习上比较常用的一个小 trick。 这里简单做一些记录。 什么是label smoothing 什么是标签平滑呢? 这里举一个例子: 面对一个多分类问题 假设我们的当前对于xi的ground truth 是[0, 0, 0, 1] 说明对于xi来说他属于第四类,但是一般来说我们输出的会是经过softmax激活的一个概率向 阅读详情

告别“非黑即白”:在PyTorch中优雅应用标签平滑提升模型泛化力

在深度学习的竞技场里,我们常常教导模型要“自信”——让它在看到一张猫的图片时,无比确信地输出“猫”这个类别。这种“自信”的量化,通常体现在损失函数上,比如交叉熵损失,它会严厉惩罚那些与真实标签(one-hot编码,如[0, 0, 1])有偏差的预测。然而,过度的自信有时并非好事。想象一下,一个学生如果只背诵标准答案,而对任何微小的变体都手足无措,那他的“泛化”能力恐怕堪忧。模型也是如此,对训练数据中那些可能带有噪声、或类别边界本就模糊的样本过于“较真”,反而容易陷入过拟合的泥潭,在新数据面前表现僵硬。

这就是标签平滑登场的背景。它并非一种全新的、颠覆性的算法,而更像是一位充满智慧的教练,它告诉模型:“世界并非总是非黑即白,有时候,给其他可能性留一点点余地,你会变得更强大。” 具体来说,它通过软化(Smooth)原本“坚硬”的one-hot标签,为模型训练引入了一丝温和的不确定性,从而作为一种有效的正则化手段,提升模型的泛化能力和鲁棒性。对于使用PyTorch进行图像分类、自然语言处理等任务的开发者而言,掌握标签平滑的实战技巧,就如同在工具箱里添置了一件既精巧又实用的利器。本文将带你从原理到代码,从调参到效果分析,彻底掌握在PyTorch项目中轻松实现标签平滑的艺术。

1. 标签平滑:原理与直觉的深度剖析

要理解标签平滑,我们得先回到交叉熵损失的起点。对于一个K类分类问题,标准的交叉熵损失函数如下:

L = - Σ_{k=1}^{K} y_k * log(p_k)

其中,y_k是真实标签的one-hot表示(对于真实类别为t,y_t=1,其余为0),p_k是模型预测的第k个类别的概率。这个公式的本质,是最大化模型对真实类别预测的对数似然。当y_t=1时,损失函数会“逼迫”p_t无限接近1,这导致两个潜在问题:

  1. 对错误标签零容忍:如果训练样本本身存在标注错误(这在大型数据集中难以避免),模型会被强制去拟合一个错误的“绝对真理”,从而学到错误的知识。
  2. 过度自信与泛化 gap:模型在训练集上会变得极其自信(预测概率接近1),但这种自信可能源于对训练数据特定噪声的过拟合,而非学到了本质特征。这会导致模型在验证集或测试集上,面对未见过的数据变体时,置信度急剧下降,表现变差。

标签平滑的核心思想,就是给这个“绝对真理”降降温。它不再使用非0即1的硬标签,而是将真实类别的概率从1降低一点,同时将省下来的概率质量均匀地分配给所有其他类别。

其数学公式简洁而优美:

y'_k = (1 - ε) * y_k + ε / K

这里:

  • y'_k是平滑后的新标签。
  • ε是一个小的平滑超参数,通常设置在0.05到0.2之间。
  • K是总类别数。

举个例子,对于一个3分类问题(K=3),真实标签为第2类(one-hot为[0, 1, 0]),取ε=0.1:

  • 平滑后,真实类别的概率变为:1 - 0.1 = 0.9
  • 其余每个类别的概率为:0.1 / 3 ≈ 0.0333
  • 因此,新的标签向量变为:[0.0333, 0.9, 0.0333]

注意:标签平滑改变了训练目标,但不改变模型最终的推理(Inference)过程。在预测时,我们依然选择概率最高的类别作为输出。平滑只是在训练阶段为模型提供了一个更“柔和”、更具信息量的学习目标。

从信息论的角度看,这相当于在损失函数中引入了一个均匀分布的先验。优化目标从单纯的“拟合数据”变成了“拟合数据的同时,让预测分布不要偏离均匀分布太远”。这有效地惩罚了模型做出过于极端(概率接近0或1)的预测,鼓励其输出更“温和”、更“校准”的概率,从而提升泛化性能。

2. 在PyTorch中实现标签平滑的三种实战路径

理论清晰后,我们进入实战环节。在PyTorch中,实现标签平滑有多种方式,从最直观的手动计算到利用内置功能,我们将逐一拆解,并附上可直接运行的代码示例。

2.1 方法一:手动计算平滑损失(理解本质)

这是最基础的方法,帮助我们透彻理解平滑过程。我们将创建一个自定义的损失函数类。

import torch
import torch.nn as nn
import torch.nn.functional as F

class LabelSmoothingCrossEntropy(nn.Module):
    """
    手动实现的标签平滑交叉熵损失。
    """
    def __init__(self, smoothing=0.1, reduction='mean'):
        super(LabelSmoothingCrossEntropy, self).__init__()
        self.smoothing = smoothing
        self.reduction = reduction

    def forward(self, logits, targets):
        """
        Args:
            logits: 模型原始输出,形状为 [batch_size, num_classes],未经过softmax。
            targets: 真实标签,形状为 [batch_size],是类别的索引(LongTensor)。
        Returns:
            计算得到的损失值。
        """
        num_classes = logits.size(-1)
        # 将索引标签转换为one-hot编码
        one_hot = torch.zeros_like(logits).scatter(1, targets.unsqueeze(1), 1)
        # 应用标签平滑公式
        smoothed_labels = (1.0 - self.smoothing) * one_hot + self.smoothing / num_classes

        # 计算对数softmax
        log_probs = F.log_softmax(logits, dim=-1)
        # 计算交叉熵:-Σ (y_smoothed * log(p))
        loss = - (smoothed_labels * log_probs).sum(dim=-1)

        # 根据reduction参数聚合损失
        if self.reduction == 'mean':
            return loss.mean()
        elif self.reduction == 'sum':
            return loss.sum()
        else: # 'none'
            return loss

# 使用示例
if __name__ == "__main__":
    # 模拟数据:batch_size=4, num_classes=5
    logits = torch.randn(4, 5)
    targets = torch.tensor([0, 2, 4, 1])

    criterion = LabelSmoothingCrossEntropy(smoothing=0.1)
    loss = criterion(logits, targets)
    print(f"手动平滑损失: {loss.item():.4f}")

    # 对比标准交叉熵损失
    criterion_ce = nn.CrossEntropyLoss()
    loss_ce = criterion_ce(logits, targets)
    print(f"标准交叉熵损失: {loss_ce.item():.4f}")

这种方法的好处是完全透明,你可以清晰地看到平滑是如何作用于one-hot标签的。但它的效率并非最优,因为涉及到了scatter操作和逐元素乘法。

2.2 方法二:高效向量化实现(推荐)

上述方法可以进一步优化,利用数学等价形式,避免显式构造平滑后的标签矩阵,计算更高效。

class LabelSmoothingCrossEntropyV2(nn.Module):
    """
    高效向量化实现的标签平滑交叉熵损失。
    利用公式:LS = (1-ε)*CE + ε * H(u, p),其中H是交叉熵,u是均匀分布。
    等价于:CE(logits, smoothed_labels) = CE(logits, y) - ε * KL(u||p) / K? 
    更常见的推导是直接计算:-((1-ε)*log(p_true) + (ε/K)*Σ_{k≠true} log(p_k))
    可以优化为一次log_softmax和gather操作。
    """
    def __init__(self, smoothing=0.1, reduction='mean'):
        super().__init__()
        self.smoothing = smoothing
        self.reduction = reduction

    def forward(self, logits, targets):
        log_probs = F.log_softmax(logits, dim=-1)
        with torch.no_grad():
            # 创建与log_probs同形的平滑标签(非one-hot,用于计算加权和)
            smooth_dist = torch.full_like(log_probs, self.smoothing / (logits.size(-1) - 1))
            smooth_dist.scatter_(1, targets.unsqueeze(1), 1.0 - self.smoothing)

        # 计算损失:-Σ smooth_dist * log_probs
        loss = - (smooth_dist * log_probs).sum(dim=-1)

        if self.reduction == 'mean':
            return loss.mean()
        elif self.reduction == 'sum':
            return loss.sum()
        return loss

这个版本在计算上更优,特别是当类别数很多时。它直接构造了平滑后的概率分布矩阵,然后进行点乘求和。

2.3 方法三:结合PyTorch内置的KL散度损失

我们还可以从另一个角度理解标签平滑损失:它是原始交叉熵损失与预测分布和均匀分布之间的KL散度的一个加权和。PyTorch的nn.KLDivLoss结合log_softmax可以高效地计算这个组合。

class LabelSmoothingCrossEntropyV3(nn.Module):
    """
    使用KL散度损失实现标签平滑。
    根据公式:L = (1-ε) * H(y, p) + ε * H(u, p)
    其中 H(u, p) = KL(u||p) + H(u),而H(u)是常数,可以忽略。
    因此 L = (1-ε)*CE + ε * KL(u||p)
    """
    def __init__(self, smoothing=0.1, reduction='batchmean'): # KLDivLoss常用‘batchmean’
        super().__init__()
        self.smoothing = smoothing
        self.kldiv = nn.KLDivLoss(reduction=reduction)

    def forward(self, logits, targets):
        num_classes = logits.size(-1)
        log_probs = F.log_softmax(logits, dim=-1)

        # 创建均匀分布的目标
        uniform_dist = torch.full_like(log_probs, 1.0 / num_classes)

        # 计算对均匀分布的KL散度
        kl_loss = self.kldiv(log_probs, uniform_dist)

        # 计算标准交叉熵(通过nll_loss)
        ce_loss = F.nll_loss(log_probs, targets, reduction='none').mean() # 假设reduction='mean'

        # 加权组合
        loss = (1.0 - self.smoothing) * ce_loss + self.smoothing * kl_loss
        return loss

这种方法在数学表达上非常清晰,直接对应理论公式。nn.KLDivLoss要求输入是log-probabilities(我们用log_softmax得到)和probabilities(均匀分布)。

为了更直观地对比这三种实现方式的核心差异和适用场景,可以参考下表:

特性/方法手动计算 (方法一)高效向量化 (方法二)KL散度组合 (方法三)
核心原理显式构造平滑后标签,计算加权交叉熵优化计算图,避免冗余操作将损失分解为CE和KL散度的加权和
代码复杂度中等,易于理解和调试较高,需要理解向量化技巧中等,数学概念清晰
计算效率一般(需scatter操作)高(纯Tensor操作)高(利用内置高效KLDivLoss)
可读性最佳,流程一目了然较好较好,理论直接对应代码
推荐场景学习、调试、小规模实验生产环境、大规模训练需要灵活调整CE与KL权重时

在实际项目中,方法二(高效向量化)通常是兼顾性能与可维护性的最佳选择。你可以像使用标准nn.CrossEntropyLoss一样使用它:

model = YourModel()
criterion = LabelSmoothingCrossEntropyV2(smoothing=0.1)
optimizer = torch.optim.Adam(model.parameters())

for epoch in range(num_epochs):
    for images, labels in train_loader:
        outputs = model(images)
        loss = criterion(outputs, labels)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

3. 超参数ε:如何调校这把“温柔的手术刀”

标签平滑的效果很大程度上取决于平滑强度ε的选择。这个参数控制着我们将多少概率质量从真实标签“转移”到其他类别。

  • ε = 0:退化为标准的交叉熵损失,模型追求绝对自信。
  • ε 增大:标签越“模糊”,模型被鼓励输出更平缓的概率分布,正则化效果越强。
  • ε 过大:标签信息过于模糊,可能导致模型无法有效学习,训练收敛缓慢甚至性能下降。

那么,如何设置这个关键参数呢?以下是一些经过实践检验的指导原则:

  1. 常用起始范围:对于大多数计算机视觉(如图像分类)和自然语言处理任务,ε在0.05到0.2之间通常能取得不错的效果。0.1是一个被广泛使用的默认值,也是一个很好的起点。
  2. 任务依赖:
    • 数据噪声大:如果数据集标注质量不高,存在较多噪声,可以尝试稍大的ε值(如0.15-0.2),让模型不要过于相信任何一个标签。
    • 类别边界模糊:在一些细粒度分类(如不同犬种、车型)或情感分析(积极、消极间的中性)任务中,类别本身存在模糊地带,适度的平滑(0.1左右)往往有益。
    • 数据集极大且干净:对于像ImageNet这样标注相对精准的大规模数据集,较小的ε(如0.05-0.1)可能就足够了。
  3. 与模型容量/训练时长结合:
    • 模型越复杂(容量越大),越容易过拟合,可能更需要标签平滑(可尝试稍大的ε)。
    • 如果训练周期很长,过拟合风险增加,引入标签平滑作为正则化是明智的。
  4. 必须进行验证集调优:这和其他超参数一样,没有放之四海而皆准的最优值。你应该在验证集上进行网格搜索或随机搜索,观察模型准确率、损失曲线,特别是模型校准度的变化。

提示:一个评估平滑效果的好方法是观察模型在验证集上的预测概率分布。使用标签平滑后,模型预测的top-1概率值分布通常会从集中在1附近变得更为分散和合理,这往往是泛化能力提升和模型校准度改善的信号。

你可以设计一个简单的实验来观察ε的影响:

import matplotlib.pyplot as plt

def evaluate_smoothing_effect(model, val_loader, smoothing_list):
    """
    评估不同平滑系数对验证集准确率的影响。
    """
    accuracies = []
    model.eval()
    with torch.no_grad():
        for eps in smoothing_list:
            criterion = LabelSmoothingCrossEntropyV2(smoothing=eps)
            total_correct = 0
            total_samples = 0
            for images, labels in val_loader:
                outputs = model(images)
                loss = criterion(outputs, labels)
                _, preds = torch.max(outputs, 1)
                total_correct += (preds == labels).sum().item()
                total_samples += labels.size(0)
            acc = total_correct / total_samples
            accuracies.append(acc)
            print(f"Smoothing ε={eps:.3f}, Val Acc: {acc:.4f}")
    return accuracies

# 假设 model 和 val_loader 已定义
# smoothing_values = [0.0, 0.05, 0.1, 0.15, 0.2]
# accs = evaluate_smoothing_effect(model, val_loader, smoothing_values)
# 之后可以绘制 accs 随 smoothing_values 变化的曲线

4. 超越基础:标签平滑的高级技巧与组合策略

掌握了基本实现和调参后,我们可以探索一些更高级的应用技巧,让标签平滑发挥更大威力。

4.1 类别不平衡下的自适应平滑

标准的标签平滑对所有类别“一视同仁”,但在类别不平衡的数据集中,这可能不是最优的。我们可以让平滑强度ε与类别频率成反比,即对样本少的类别进行更强的平滑(让模型更不确定),对样本多的类别进行较弱的平滑。

class AdaptiveLabelSmoothing(nn.Module):
    """
    自适应标签平滑,根据类别频率调整平滑强度。
    """
    def __init__(self, class_frequencies, base_smoothing=0.1, reduction='mean'):
        super().__init__()
        self.class_frequencies = torch.tensor(class_frequencies) # 每个类别的频率
        self.base_smoothing = base_smoothing
        self.reduction = reduction
        # 计算每个类别的自适应epsilon:频率越低,epsilon相对越大
        # 这里使用一个简单的映射:epsilon_i = base_smoothing * (1 / sqrt(freq_i))
        self.eps_per_class = base_smoothing / torch.sqrt(self.class_frequencies)
        # 归一化,使得平均epsilon接近base_smoothing
        self.eps_per_class = self.eps_per_class / self.eps_per_class.mean() * base_smoothing

    def forward(self, logits, targets):
        num_classes = logits.size(-1)
        batch_size = logits.size(0)

        log_probs = F.log_softmax(logits, dim=-1)
        loss = torch.zeros(batch_size, device=logits.device)

        for i in range(batch_size):
            target_idx = targets[i].item()
            eps = self.eps_per_class[target_idx]

            # 为当前样本构建平滑标签
            smooth_label = torch.full((num_classes,), eps / (num_classes - 1), device=logits.device)
            smooth_label[target_idx] = 1.0 - eps

            # 计算该样本的损失
            loss[i] = - (smooth_label * log_probs[i]).sum()

        if self.reduction == 'mean':
            return loss.mean()
        elif self.reduction == 'sum':
            return loss.sum()
        return loss

4.2 与其它正则化技术的协同

标签平滑很少单独使用,它通常与其它正则化方法组成“组合拳”,共同对抗过拟合。

  • 与Dropout搭配:这是非常经典的组合。Dropout在网络内部随机“关闭”神经元,防止协同适应;标签平滑则在损失函数层面软化目标。两者从不同维度引入噪声,通常能产生叠加的正则化效果。
  • 与数据增强搭配:强大的数据增强(如RandAugment, MixUp, CutMix)本身就能极大地扩展训练数据分布。当使用MixUp或CutMix时,它们已经通过线性插值混合了图像和标签,相当于一种更激进的“标签平滑”。此时,是否需要额外的标签平滑需要实验验证,有时可能只需很小的ε或甚至不需要。
  • 与权重衰减(L2正则化)搭配:权重衰减约束模型参数的大小,标签平滑约束输出概率的分布。它们的目标一致但作用点不同,可以同时使用。

一个常见的训练配置可能如下所示:

# 模型定义,包含Dropout层
model = models.resnet50(pretrained=True)
model.fc = nn.Sequential(
    nn.Dropout(p=0.5), # Dropout正则化
    nn.Linear(model.fc.in_features, num_classes)
)

# 损失函数:标签平滑
criterion = LabelSmoothingCrossEntropyV2(smoothing=0.1)

# 优化器:包含权重衰减 (L2正则化)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=1e-4)

# 训练循环中还可以结合学习率调度器(如CosineAnnealingLR)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=num_epochs)

4.3 可视化:平滑前后,模型“世界观”的改变

理解标签平滑如何影响模型学习的最直观方式就是可视化。我们可以比较使用标准交叉熵和平滑交叉熵训练出的模型,其最后一层特征空间(通过t-SNE或PCA降维)的分布有何不同。

通常,使用标签平滑训练的模型,其同类样本的特征在嵌入空间中会聚集得更紧密,而不同类别的边界可能更加清晰柔和,这反映了模型学到了更具判别力且不过度拟合噪声的特征。

# 伪代码,展示可视化思路
def visualize_features(model, dataloader, use_smoothing=False):
    model.eval()
    all_features = []
    all_labels = []
    criterion = LabelSmoothingCrossEntropyV2(smoothing=0.1) if use_smoothing else nn.CrossEntropyLoss()

    with torch.no_grad():
        for images, labels in dataloader:
            features = model.extract_features(images) # 假设有一个方法提取倒数第二层特征
            all_features.append(features.cpu())
            all_labels.append(labels.cpu())

    all_features = torch.cat(all_features, dim=0).numpy()
    all_labels = torch.cat(all_labels, dim=0).numpy()

    # 使用t-SNE进行降维可视化
    from sklearn.manifold import TSNE
    tsne = TSNE(n_components=2, random_state=42)
    features_2d = tsne.fit_transform(all_features)

    plt.figure(figsize=(12, 5))
    plt.subplot(1, 2, 1)
    # 绘制未使用平滑的特征分布
    # ...
    plt.subplot(1, 2, 2)
    # 绘制使用平滑后的特征分布
    # ...
    plt.show()

在实际项目中,我发现将标签平滑与适度的Dropout和余弦退火学习率调度结合,在多个图像分类任务上都能稳定带来0.5%到2%的Top-1准确率提升,尤其是在模型快要过拟合的后期阶段,它的效果更为明显。它就像给训练过程加入了一点“润滑剂”,让优化路径更加平滑,最终停在一个更泛化的解上。

Pytorch:交叉熵损失(CrossEntropyLoss)以及标签平滑(LabelSmoothing)的实现 浅谈Label Smoothing Label Smoothing也称之为标签平滑,其实是一种防止过拟合的正则化方法。传统的分类loss采用softmax loss,先对全连接层的输出计算softmax,视为各类别的置信度概率,再利用交叉熵计算损失。 在这个过程中尽可能使得各样本在正确类别上的输出概率为1,这要使得对应的z值为+∞,这拉大了其与其他类别间的距离。 现在假设一个多分类任务标签是[1,0,0],如果它本身的label的出现了问题,这对模型的伤害是非常大的,因为在训练的过程中强行学习一个非本 阅读详情

相关推荐

Pytorch 中Label Smoothing CrossEntropyLoss实现

一般情况下我们都是直接调用Pytorch自带的交叉熵损失函数计算loss,但涉及到魔改以及优化时,我们需要自己动手实现loss function,在这个过程中如果能对交叉熵损失的代码实现有一定的了解会帮助我们写出更优美的代码。其次是标签平滑这个trick通常简单有效,只需要改改损失函数既可带来性能上的提升,通常与交叉熵配合食用。因此,本文基于这两个出发点,介绍基于Pytorch框架下的交叉熵损失实现以及标签平滑的实现。

flyingluohaipeng的博客 2678

Label Smoothing标签平滑详解+Pytorch保姆级实际操作

简介 Label Smoothing是一个帮助多分类模型进行正则化的操作。 从提出Label Smoothing的论文出发 "When Does Label Smoothing Help? "这篇文章指出Szegedy et al.提出了Label Smoothing. 因此我们就从Szegedy et al.的文章入手。在这里我们简称Label Smoothing为LS。 标签平滑也可以被简称为LSR(Label-Smoothing Regularization)。 不使用LS时的情况 假设我们有一个K分

狗狗狗大王的博客 1万+

深度学习中小知识点系列(十) 解析标签平滑(Label Smoothing)

标签平滑也可以称之为标签平滑归一化:Label Smoothing Regularization (LSR),通常应用于文本分类任务,像L2和 dropout 等一样,它是一种正则化的方法,只不过这种方法是通过在 label 中添加噪声,从而实现对模型的约束。目的是防止模型在训练时过于自信地预测标签,防止过拟合,提高模型的泛化能力。有关标签可以参考如下论文(

专注于人工智能学习,总结 1485

label-smoothing标签平滑__pytorch版实现

标签平滑(label-smoothing)主要用于防止过拟合,增强模型的泛化能力。在one-hot的基础上,添加一个平滑系数ε\varepsilonε,使得最大预测与其它类别平均值之间差距的经验分布更加平滑。 Pytorch代码实现 import torch def smooth_one_hot(true_labels: torch.Tensor, classes: int, smoothing=0.0): """ if smoothing == 0, it's one-hot meth

sinat_38685124的博客 6161

别再只用CrossEntropyLoss了!PyTorch实战Label Smoothing,让你的分类模型涨点更稳(附代码避坑)

本文详细介绍了PyTorch中标签平滑(Label Smoothing)技术的实战应用,帮助解决分类模型过度自信的问题。通过代码示例和CIFAR-10实验对比,展示了标签平滑在提升模型准确率、校准度和鲁棒性方面的显著效果,并提供了参数选择、常见陷阱及解决方案等实用技巧。

weixin_30892763的博客 484

Label Smoothing介绍及其代码实现

标签平滑(Label Smoothing)的原理其实很简单,它大部分的用处用一句话总结就是: >修改数据集的标签来增加扰动,避免模型的判断过于自信从而陷入过拟合

JacksonKim的博客 2277

深度学习:标签平滑(Label Smoothing Regularization)

文章目录1.标签平滑的作用—防止过拟合2. 传统的交叉熵损失计算3.带有标签平滑的交叉熵损失的计算4.标签平滑与传统的交叉熵损失的比较与分析5. 标签平滑的应用场景 1.标签平滑的作用—防止过拟合 在进行多分类时,很多时候采用one-hot标签进行计算交叉熵损失,而单纯的交叉熵损失时,只考虑到了正确标签的位置的损失,而忽略了错误标签位置的损失。这样导致模型可能会在训练集上拟合的非常好,但由于其错误标签位置的损失没有计算,导致预测的时候,预测错误的概率比较大,也就是常说的过拟合。 标签平滑可以在一定程度上防止

qq_41915623的博客 6111

别再只用CrossEntropyLoss了!PyTorch实战Label Smoothing,让你的分类模型更稳一点

本文深入探讨了PyTorch中Label Smoothing(标签平滑)技术的实现与应用,帮助开发者突破分类模型的准确率瓶颈。通过对比传统交叉熵损失函数,详细介绍了三种实现方式及超参数调优策略,并结合图像分类任务展示完整集成方法,有效提升模型泛化能力0.5%-2%。

weixin_30414305的博客 278

正则化技巧:标签平滑(Label Smoothing)以及在 PyTorch 中的实现

过拟合和概率校准是训练深度学习模型时出现的两个问题。深度学习中有很多正则化技术可以解决过拟合问题;权重衰减、早停机制和dropout是都是最常见的方式。Platt缩放和保序回归可以用于模型校准。 但是有没有一种方法可以同时对抗过度拟合和过度自信呢? 标签平滑是一种正则化技术,它扰动目标变量,使模型对其预测的确定性降低。它被视为一种正则化技术,因为它限制了softmax 函数的最大概率使最大概率不会比其他标签大得多(过度自信)。 在本文中,我们将解释标签平滑的原理,实现了一个使用这种技术的交叉熵损失函数,并评

deephub 8057

QNX Neutrino 进程间通信编程之Message-passing/Pulse

Interprocess Communication(IPC,进程间通信)在QNX Neutrino从一个嵌入式实时系统向一个全面的POSIX系统转变起着至关重要的作用。IPC是将在内核中提供各种服务的进程内聚在一起的粘合剂。在QNX中,消息传递是IPC的主要形式,也提供了其他的形式,除非有特殊的说明,否则这些形式也都是基于本地消息传递而实现的。本篇幅主要讲解Message-passing和Pulse。

zhuwade的博客 3533

AI原生应用在UGC内容审核中的实战经验

AI原生应用(AI-Native Application)——以机器学习模型为核心驱动力,深度整合数据、算法、工程架构的完整系统——为破解这一三角难题提供了全新范式。全链路数据驱动:从数据采集、模型训练到决策优化,形成闭环自治系统,无需人工规则干预多模态深度理解:同时处理文本、图像、音频、视频等多类型内容,理解语义而非简单匹配特征自适应进化能力:通过人机协同反馈持续学习新型违规模式,模型周级迭代成为常态审核效率提升300%:单条视频审核耗时从2.3秒降至0.7秒。

AI算力网络与通信的博客 1150

NLP炼丹技巧:标签平滑label smoothing

标注数据中存在错误样本,可以采用标签平滑的方法进行缓解。

yuansaijie0604的专栏 3034

VTK四视图联动避坑指南:解决vtkImagePlaneWidget窗宽窗位同步与切片序号更新的那些坑

本文详细解析了VTK四视图联动开发中的关键技术点与常见问题,包括切片位置同步、窗宽窗位同步的实现原理及回调机制设计。针对开发中遇到的回调事件不触发、渲染性能低下等问题,提供了实用的解决方案和优化技巧,帮助开发者高效构建医学影像和科学可视化应用。

weixin_42638178的博客 392

【Pytorch】label smoothing

本质上就是将标签变得平滑,让预测的结果不那么相信所属的类别,起到增强鲁棒性的作用。 标签平滑的想法首先被提出用于训练 Inception-v2 [26]。它将真实概率的构造改成: 其中ε是一个小常数,K 是标签总数量。 图 4:ImageNet 上标签平滑效果的可视化。顶部:当增加ε时,目标类别与其它类别之间的理论差距减小。下图:最大预测与其它类别平均值之间差距的经验分布。很明...

mjiansun的专栏 8271

海康门禁二次开发实战:用Java实现员工考勤系统的人脸权限管理

本文详细介绍了如何利用Java技术栈进行海康威视门禁系统的二次开发,实现员工考勤系统的人脸权限管理。从开发环境准备、SDK集成到设备连接、人脸数据批量处理,再到权限管理与异常处理,全面解析了海康门禁对接开发的关键步骤和最佳实践,助力企业构建高效、安全的智能考勤系统。

weixin_29191669的博客 262

华为OD新系统机试真题 2026.5.10 - 美观的灯笼

华为OD新系统机试真题【美观的灯笼】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【美观的灯笼】

qq_45776114的博客 644

pytorch label smoothing代码

pytorch label smoothing代码 import torch import torch.nn as nn from torch.autograd import Variable import matplotlib.pyplot as plt import numpy as np class LabelSmoothing(nn.Module): # "Implemen...

Najlepszy的博客 2359

面向 OData V4 的 Fiori elements 为何强制使用 draft、它到底是什么、以及是否能关闭

本文深入解析了SAP Fiori elements中draft handling的核心机制与必要性。关键点包括:1)draft机制通过中间版本实现复杂编辑的安全恢复与并发控制;2)Fiori elements for OData V4强制要求draft-enabled服务支持事务编辑;3)非draft服务仅适用于只读场景;4)替代方案需承担完全自定义开发的成本。文章基于SAP官方文档,系统阐述了draft在事务型应用中的基础性作用,为架构决策提供了明确指导。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 269

Label Smoothing实战:如何在PyTorch中轻松实现分类任务的正则化(附代码)

本文详细介绍了在PyTorch中实现标签平滑(Label Smoothing)正则化技术的实战方法。通过将分类任务中绝对化的one-hot标签转换为软标签,可以有效防止模型过拟合、提升泛化能力与预测校准度。文章提供了两种核心实现代码,并分享了平滑因子调优、效果评估及与其他正则化技术协同使用的实用技巧。

k6l7m8n9的博客 758

CONN工具箱分析fmri数据笔记1

前言一、安装二、预处理三、去噪 前言 CONN:functional connectivity toolbox,是基于MATLAB和SPM的一个对功能磁共振数据进行分析的一个工具箱。可以进行以下分析: Seed-based correlations (SBC), ROI-to-ROI correlations, graph analyses, Independent component analyses(group-ICA), Masked (ICA) Amplitude of Low-Frequency.

weixin_52073820的博客 6587

2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)

2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)

王老师青少年编程 992

标签平滑(label smoothing)

标签平滑(labelsmoothing)出自GoogleNetv3。

Billie使劲学的博客 2813

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

标签平滑Label Smoothing

标签平滑Label Smoothing前言Label Smoothing代码实现后续相关 前言 对于分类问题,lable常常是one-hot编码的,即[0,0,1,0,0]形式。全概率1和0鼓励所属类别和其他类别之间的差距尽可能加大,然而,在分类问题中不同种类的类别不一定完全没有相似的特征,不能这样一杆子打死。 对于我们常用的交叉熵损失函数,我们需要用预测分布q去拟合真实分布p,现在我们来看一下拟合one-hot的分布所带来的问题: 1)例如,输出为[0.1,0.7,0.1,0.1],由于要使得Loss尽

qq_41917697的博客 1722

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

标签平滑(label smoothing) torch和tensorflow的实现

在常见的多分类问题中,先经过softmax处理后进行交叉熵计算,原理很简单可以将计算loss理解为,为了使得网络对测试集预测的概率分布和其真实分布接近,常用的做法是使用one-hot对真实标签进行编码,然后用预测概率去拟合one-hot的真实概率。但是这样会带来两个问题: 无法保证模型的泛化能力,使网络过于自信会导致过拟合; 全概率和0概率鼓励所属类别和其他类别之间的差距尽可能加大,而由梯度有界可知,这种情况很难adapt。会造成模型过于相信预测的类别。 标签平滑可以缓解这个问题,可以有两个角度理解这件事

qwe1110的博客 1943

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: Qt打印实战:基于QPrinter的高效表格与文档输出
下一篇: 用状态机玩转AXI4-Lite:手把手实现FPGA与BRAM的乒乓操作
android
博客等级 码龄22年 48粉丝 1455原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值