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

这篇具有很好参考价值的文章主要介绍了标签平滑(label smoothing) torch和tensorflow的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在常见的多分类问题中,先经过softmax处理后进行交叉熵计算,原理很简单可以将计算loss理解为,为了使得网络对测试集预测的概率分布和其真实分布接近,常用的做法是使用one-hot对真实标签进行编码,然后用预测概率去拟合one-hot的真实概率。但是这样会带来两个问题:

无法保证模型的泛化能力,使网络过于自信会导致过拟合;
全概率和0概率鼓励所属类别和其他类别之间的差距尽可能加大,而由梯度有界可知,这种情况很难adapt。会造成模型过于相信预测的类别。
标签平滑可以缓解这个问题,可以有两个角度理解这件事。

角度一
软化这种one-hot编码方式。

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

等号左侧:是一种新的预测的分布

等号右侧:前半部分是对原分布乘一个权重, ϵ \epsilonϵ 是一个超参,需要自己设定,取值在0到1范围内。后半部分u是一个均匀分布,k表示模型的类别数。

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

由以上公式可以看出,这种方式使label有 ϵ \epsilonϵ 概率来自于均匀分布, 1 − ϵ 1-\epsilon1−ϵ 概率来自于原分布。这就相当于在原label上增加噪声,让模型的预测值不要过度集中于概率较高的类别,把一些概率放在概率较低的类别。

因此,交叉熵可以替换为:

可以理解为:loss为对“预测的分布与真实分布”及“预测分布与先验分布(均匀分布)”的惩罚。

代码实现如下:
 

class LabelSmoothingCrossEntropy(nn.Module):
    def __init__(self, eps=0.1, reduction='mean', ignore_index=-100):
        super(LabelSmoothingCrossEntropy, self).__init__()
        self.eps = eps
        self.reduction = reduction
        self.ignore_index = ignore_index

    def forward(self, output, target):
        c = output.size()[-1]
        log_pred = torch.log_softmax(output, dim=-1)
        if self.reduction == 'sum':
            loss = -log_pred.sum()
        else:
            loss = -log_pred.sum(dim=-1)
            if self.reduction == 'mean':
                loss = loss.mean()


        return loss * self.eps / c + (1 - self.eps) * torch.nn.functional.nll_loss(log_pred, target,                                                                                 reduction=self.reduction,                                                                                   ignore_index=self.ignore_index)

角度二

对于以Dirac函数分布的真实标签,我们将它变成分为两部分获得(替换):

  • 第一部分:将原本Dirac分布的标签变量替换为(1 - ϵ)的Dirac函数;
  • 第二部分:以概率 ϵ ,在u(k)u(k) 中份分布的随机变量。
    def label_smoothing(inputs, epsilon=0.1):
    	K = inputs.get_shape().as_list()[-1]    # number of channels
    	return ((1-epsilon) * inputs) + (epsilon / K)

    代码的第一行是取Y的channel数也就是类别数,第二行就是对应公式了。
    下面用一个例子理解一下:

    假设我做一个蛋白质二级结构分类,是三分类,那么K=3;假如一个真实标签是[0, 0, 1],取epsilon = 0.1,
    新标签就变成了 (1 - 0.1)× [0, 0, 1] + (0.1 / 3) = [0, 0, 0.9] + [0.0333, 0.0333, 0.0333]= [0.0333, 0.0333, 0.9333]
    实际上分了一点概率给其他两类(均匀分),让标签没有那么绝对化,留给学习一点泛化的空间。
    从而能够提升整体的效果。

torch版本

首先,让我们使用一个辅助函数来计算两个值之间的线性组合:

def linear_combination(x, y, epsilon): 
    return epsilon*x + (1-epsilon)*y

接下来,我们使用 PyTorch nn.Module实现一个新的损失函数

import torch.nn.functional as F


def reduce_loss(loss, reduction='mean'):
    return loss.mean() if reduction=='mean' else loss.sum() if reduction=='sum' else loss


class LabelSmoothingCrossEntropy(nn.Module):
    def __init__(self, epsilon:float=0.1, reduction='mean'):
        super().__init__()
        self.epsilon = epsilon
        self.reduction = reduction
    
    def forward(self, preds, target):
        n = preds.size()[-1]
        log_preds = F.log_softmax(preds, dim=-1)
        loss = reduce_loss(-log_preds.sum(dim=-1), self.reduction)
        nll = F.nll_loss(log_preds, target, reduction=self.reduction)
        return linear_combination(loss/n, nll, self.epsilon)

我们现在可以在我们的代码中使用这个类。 对于这个例子,我们使用标准的 fast.ai pets 例子。

from fastai.vision import *
from fastai.metrics import error_rate

# prepare the data
path = untar_data(URLs.PETS)
path_img = path/'images'
fnames = get_image_files(path_img)

bs = 64
np.random.seed(2)
pat = r'/([^/]+)_\d+.jpg$'
data = ImageDataBunch.from_name_re(path_img, fnames, pat, ds_tfms=get_transforms(), size=224, bs=bs) \
                     .normalize(imagenet_stats)

# train the model
learn = cnn_learner(data, models.resnet34, metrics=error_rate)
learn.loss_func = LabelSmoothingCrossEntropy()
learn.fit_one_cycle(4)

Tensorflow中使用方法时候只要在损失函数中加上label_smoothing的值即可,如下:

tf.losses.softmax_cross_entropy(
    onehot_labels,
    logits,
    weights=1.0,
    label_smoothing=0,
    scope=None,
    loss_collection=tf.GraphKeys.LOSSES,
    reduction=Reduction.SUM_BY_NONZERO_WEIGHTS
)
  • ————————————————
    原文链接:https://blog.csdn.net/qq_40176087/article/details/121519888

  • 标签平滑Label Smoothing_奔跑的小仙女的博客-CSDN博客_label smoothing文章来源地址https://www.toymoban.com/news/detail-427750.html

到了这里,关于标签平滑(label smoothing) torch和tensorflow的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HTML <label> 标签

    带有两个输入字段和相关标记的简单 HTML 表单: 元素 Chrome IE Firefox Safari Opera label Yes Yes Yes Yes Yes 所有主流浏览器都支持 label 标签。 Safari 2 或更早的版本不支持 label 标签。 label 标签为 input 元素定义标注(标记)。 label 元素不会向用户呈现任何特殊效果。不过,它为鼠标用

    2024年02月12日
    浏览(41)
  • HTML的label标签有什么用?

    当你想要将表单元素(如输入框、复选框、单选按钮等)与其描述文本关联起来,以便提供更好的用户界面和可访问性时,就可以使用HTML中的 label 标签。 label 标签用于为表单元素提供标签或标识,使用户能够更清楚地了解每个表单元素的用途。 label 标签的作用有两个主要方

    2024年02月11日
    浏览(28)
  • lvgl 笔记 标签部件 (lv_label)

    最基础的用法只需要两行代码,分别创建和配置即可:  配置字体背景色使用 lv_obj_set_style_bg_color() 即可,但要顺便使用 lv_obj_set_style_bg_opa() 配置透明度,因为默认透明度是100%,这样将不会显示背景色。   lv_obj_set_style_text_color() 可以配置文字颜色。 lv_label_set_recolor() 函数可以

    2024年02月07日
    浏览(46)
  • k8s集群Node节点管理:节点信息查看及节点label标签管理

    如果是kubeasz安装,所有节点(包括master与node)都已经可以对集群进行管理 如果是kubeadm安装,在node节点上管理时会报如下错误 只要把master上的管理文件 /etc/kubernetes/admin.conf 拷贝到node节点的 $HOME/.kube/config 就可以让node节点也可以实现kubectl命令管理 1, 在node节点的用户家目录创建

    2024年02月03日
    浏览(38)
  • 合宙Air724UG LuatOS-Air LVGL API控件-标签 (Label)

    标签 (Label) 标签是 LVGL 用来显示文字的控件。 标签是通过  lvgl.label_create  函数创建的。 可以使用  lvgl.label_set_text  设置标签上的文字显示内容。 标签是有宽度的,默认情况下,在设置文字后会自行调整,标签宽度会自动扩充到文本宽度。但是这种显示方式是可以进行更改

    2024年02月09日
    浏览(35)
  • TDengine学习(1):采集量(Metric),标签(label),数据采集点,表,超级表,子表、库

    因为TDengine是面向物联网诞生的一种数据库,所以在一些概念的命名上有一点相应的特色。 比如需要对一辆高铁上的各种信息进行采集,采集信息存入数据库中。我们可以对高铁车厢内的一些数据进行采集,比如:车厢内温度、车厢内湿度、车厢内噪音…;也可以对车厢外即

    2024年02月10日
    浏览(23)
  • NVIDIA驱动、CUDA、cuDNN、Torch、Tensorflow对应版本一文搞明白

    目录 CUDA下载:CUDA Toolkit Archive | NVIDIA Developer cuDNN下载:cuDNN Archive | NVIDIA Developer 1.NVIDIA驱动和CUDA版本对应  2.CUDA和cuDNN版本对应  3.Tensorflow和CUDA、cuDNN版本对应(经过官方测试的构建配置) 3.1 GPU  3.2 CPU 4.pytorch和CUDA对应 网址:CUDA 12.1 Update 1 Release Notes 网址:cuDNN Archive | NVIDIA

    2024年02月15日
    浏览(35)
  • TensorFlow图像多标签分类实例

    接下来,我们将从零开始讲解一个基于TensorFlow的图像多标签分类实例,这里以图片验证码为例进行讲解。 在我们访问某个网站的时候,经常会遇到图片验证码。图片验证码的主要目的是区分爬虫程序和人类,并将爬虫程序阻挡在外。 下面的程序就是模拟人类识别验证码,从

    2024年02月08日
    浏览(36)
  • TensorFlow二元-多类-多标签分类示例

    探索不同类型的分类模型,使用 TensorFlow 构建二元、多类和多标签分类器。 简述 逻辑回归 二元交叉熵 二元分类架构 案例:逻辑回归预测获胜团队 简述 Softmax 函数 分类交叉熵 多类分类架构 案例:预测航天飞机散热器位置 案例:创建字符识别模型 案例:构建电影类型标签

    2024年02月11日
    浏览(31)
  • vue使用smooth-signature实现移动端电子签字,包括横竖屏

    1.使用smooth-signature 二.页面引入插件 三.实现效果 四.完整代码 五.参考 https://github.com/linjc/smooth-signature

    2024年02月07日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包