zoukankan      html  css  js  c++  java
  • mxnet & pytorch 交叉熵损失

    1. 对比 pytorch: nn.CrossEntropyLoss()  & mxnet: gluon.loss.SoftmaxCrossEntropyLoss()

     

    一般而言默认用法即可:(inputs只是分类器的得分,softmax和log包括在loss里)

    pytorch:

    d=np.array([[1,2,3],[54,45,2],[67,4,2]])    # inputs
    l=np.array([0,2,1])    # label
    print(nn.CrossEntropyLoss(reduction='mean')(torch.Tensor(d),torch.Tensor(l).long()))    # 默认求均值
    print(nn.CrossEntropyLoss(reduction='none')(torch.Tensor(d),torch.Tensor(l).long()))    # 不作任何处理
    tensor(39.1359)
    tensor([ 2.4076, 52.0001, 63.0000])

    mxnet:

    d=np.array([[1,2,3],[54,45,2],[67,4,2]])
    l=np.array([0,2,1])
    print(gluon.loss.SoftmaxCrossEntropyLoss(from_logits=False)(mx.nd.array(d), mx.nd.array(l)).mean())       # 手动求均值 
    print(gluon.loss.SoftmaxCrossEntropyLoss(from_logits=False)(mx.nd.array(d), mx.nd.array(l)))              # 默认不作任何处理
    [39.13591]
    <NDArray 1 @cpu(0)>
    [ 2.407606 52.000122 63.      ]
    <NDArray 3 @cpu(0)>

    2. 对比 pytorch: nn.KLDivLoss() & mxnet: gluon.loss.KLDivLoss()

     

    一般而言默认用法即可:(inputs是经过log_softmax,target无需取log)

    pytorch:

    pred=np.array([[1,43,2],[45,5,2],[7,14,12]])
    target=np.array([[2,43,1],[34,11,2],[13,7,9]])
    print(nn.KLDivLoss(reduction='mean')(F.log_softmax(torch.Tensor(pred)), F.softmax(torch.Tensor(target))))   # 默认为mean
    print(nn.KLDivLoss(reduction='none')(F.log_softmax(torch.Tensor(pred)), F.softmax(torch.Tensor(target))))   # 不作处理
    tensor(0.7682)
    tensor([[ 1.5629e-18,  0.0000e+00, -5.7495e-19],
            [ 0.0000e+00,  1.7445e-09,  1.3931e-13],
            [ 6.9624e+00, -1.4309e-02, -3.3963e-02]])

    mxnet:

    pred=np.array([[1,43,2],[45,5,2],[7,14,12]])
    target=np.array([[2,43,1],[34,11,2],[13,7,9]])
    print(gluon.loss.KLDivLoss(from_logits=True)(mx.nd.log_softmax(mx.nd.array(pred)), mx.nd.softmax(mx.nd.array(target))).mean())   # 手动求均值
    print(gluon.loss.KLDivLoss(from_logits=True)(mx.nd.log_softmax(mx.nd.array(pred)), mx.nd.softmax(mx.nd.array(target))))   # 默认不作处理
    [0.7682333]
    <NDArray 1 @cpu(0)>
    [1.0047849e-17 5.8190314e-10 2.3046999e+00]
    <NDArray 3 @cpu(0)>

    有个疑惑,这里因为显示的计算了softmax,所以from_logits=True,然而发现将from_logits=False时结果一样。

  • 相关阅读:
    [HNOI2006]超级英雄
    [CTSC1999]家园
    火星探险问题
    [HNOI2008]GT考试
    [USACO14DEC]后卫马克Guard Mark
    [NOI2018]归程
    [USACO15DEC]最大流Max Flow
    [NOIPlus]斗地主
    [LUOGU] P3128 [USACO15DEC]最大流Max Flow
    [BZOJ] 1878: [SDOI2009]HH的项链
  • 原文地址:https://www.cnblogs.com/king-lps/p/13177369.html
Copyright © 2011-2022 走看看