paddle硬标签交叉熵算法和软标签交叉熵算法

paddle硬标签交叉熵算法和软标签交叉熵算法

前言

最近在使用paddle深度学习框架进行项目实战,拿来练手的项目是手写数字集识别,所用到的损失值计算方式是交叉熵计算。但是,通过查阅paddle官网的交叉熵实现方法的api文档,发现有两种交叉熵算法,一种是硬标签交叉熵算法,另一种是软标签交叉熵算法。由于我在网上搜索相关问题,没有对应的解答,所以,我在这里将和大家讨论一下这两个交叉熵算法。

官方解释

官方api解释

  • paddle.fluid.layers.``cross_entropy(input, label, soft_label=False, ignore_index=-100)[源代码]

该OP计算输入input和标签label间的交叉熵,可用于计算硬标签或软标签的交叉熵。

  1. 硬标签交叉熵算法:若soft_label = False, label[i1,i2,…,ik]label[i1,i2,…,ik] 表示每个样本的硬标签值:
    o u t p u t [ i 1 , i 2 , . . . , i k ] = l o g ( i n p u t [ i 1 , i 2 , . . . , i k , j ] ) , l a b e l [ i 1 , i 2 , . . . , i k ] = j , j ! = i g n o r e i n d e x output[i1,i2,...,ik]=−log(input[i1,i2,...,ik,j]),label[i1,i2,...,ik]=j,j!=ignore_index

  2. 软标签交叉熵算法:若soft_label = True,
    l a b e l [ i 1 , i 2 , . . . , i k , j ] l a b e l [ i 1 , i 2 , . . . , i k , j ] label[i1,i2,...,ik,j]label[i1,i2,...,ik,j]
    表明每个样本对应类别j的软标签值:
    o u t p u t [ i 1 , i 2 , . . . , i k ] = j l a b e l [ i 1 , i 2 , . . . , i k , j ] l o g ( i n p u t [ i 1 , i 2 , . . . , i k , j ] ) output[i1,i2,...,ik]=−∑jlabel[i1,i2,...,ik,j]∗log(input[i1,i2,...,ik,j])

  • 参数:

    input (Variable) – 维度为 [N1,N2,…,Nk,D][N1,N2,…,Nk,D] 的多维Tensor,其中最后一维D是类别数目。数据类型为float32或float64。label (Variable) – 输入input对应的标签值。若soft_label=False,要求label维度为 [N1,N2,…,Nk][N1,N2,…,Nk] 或 [N1,N2,…,Nk,1][N1,N2,…,Nk,1] ,数据类型为int64,且值必须大于等于0且小于D;若soft_label=True,要求label的维度、数据类型与input相同,且每个样本各软标签的总和为1。soft_label (bool) – 指明label是否为软标签。默认为False,表示label为硬标签;若soft_label=True则表示软标签。ignore_index (int) – 指定一个忽略的标签值,此标签值不参与计算,负值表示无需忽略任何标签值。仅在soft_label=False时有效。 默认值为-100。

返回: 表示交叉熵结果的Tensor,数据类型与input相同。若soft_label=False,则返回值维度与label维度相同;若soft_label=True,则返回值维度为 [N1,N2,…,Nk,1][N1,N2,…,Nk,1] 。

我的见解

下面拿一个例子来解释一下我的想法:

共同前提:

我们还是以手写数组集来说,一共有10种不同的数据集,数字范围在0-9.

单个图片数据的大小是28*28,单通道。每个数据对应一个标签值

使用卷积神经网络,最后一层全连接层得大小为10,并且激活函数是softmax。

硬标签交叉熵

单个图片的标签大小是1,值对应得就是数字几。

假设我们每一批次有1张图片,交叉熵函数的输入值input大小为(1,10),label标签值得大小为(1,1).

输出值得大小为(10,1)

具体计算:L = -log(input[label]),

软标签交叉熵算法

软标签它和上面稍微不太一样,图片得输入大小还是(1,10),但是label标签值的大小也是(1,10).

也许到这,大家有点迷糊,为什么这里标签值的大小也是10呢?

我的理解是,软标签,它只是一个权重比。举个例子 这个数字图片是5,然后它的label值为[0.02,0.03,0.05,0.2,0.7,0.03,0.03,0.010.01,0.02] 就是说这个标签不是一个准确的数字,而是一个概率值。

计算方式:先让input中的数进行log计算,然后与label进行向量点积操作。也就是对应位置相乘再相加。

至于哪个算法更加好一些,我没有具体实验,但是我觉得软标签比较好。原因是它没有将其他概率低的值舍去,而是全部使用参与计算。

结语

目前的想法是这样的,如后面在实践中有所发现,会及时更新。也希望有了解这方面的大佬一起交流。

发布了89 篇原创文章 · 获赞 77 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/lzx159951/article/details/105271172