交叉熵损失函数(paddle)

1.参数

  • 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。

2.说明

参数input为n维数组,n是分类的个数

label为一个分类值,

输入中最大值的下标对应的label值就是正确结果

[inferencer6, feed_target_names6, fetch_targets6] = fluid.io.load_inference_model(
    '/bot11.model', exe)



cnt = 0
def pred(o,t,id,program,cnt,infos):

    a = fluid.create_lod_tensor(np.array([[i] for i in o[0]]),[[len(o[0])]],place)
    b = fluid.create_lod_tensor(np.array([[i] for i in o[1]]),[[len(o[1])]],place)
    c = fluid.create_lod_tensor(np.array([[i] for i in o[2]]),[[len(o[2])]],place)
    d = fluid.create_lod_tensor(np.array([[i] for i in o[3]]),[[len(o[3])]],place)
    
    results = exe.run(program,feed={'a': a,'b': b,
                                       'c': c,'d': d},
                      fetch_list=fetch_targets6,return_numpy=False)
    if np.argmax(results[0]) != t:
        cnt[0] += 1
        print(id,t,np.argmax(results[0]),cnt[0],infos[id-1][-1])
    
    return results

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

  1. 硬标签交叉熵算法:若soft_label = False, label[i1,i2,...,ik]label[i1,i2,...,ik] 表示每个样本的硬标签值:

    output[i1,i2,...,ik]=log(input[i1,i2,...,ik,j]),label[i1,i2,...,ik]=j,j!=ignore_indexoutput[i1,i2,...,ik]=−log(input[i1,i2,...,ik,j]),label[i1,i2,...,ik]=j,j!=ignore_index
  2. 软标签交叉熵算法:若soft_label = True, label[i1,i2,...,ik,j]label[i1,i2,...,ik,j] 表明每个样本对应类别j的软标签值:

    output[i1,i2,...,ik]=jlabel[i1,i2,...,ik,j]log(input[i1,i2,...,ik,j])

猜你喜欢

转载自www.cnblogs.com/yangyang12138/p/12764975.html