zoukankan      html  css  js  c++  java
  • torch 中的损失函数

    1. NLLLoss 和 CrossEntropyLoss
      在图片单标签分类时,输入m张图片,输出一个m*N的Tensor,其中N是分类个数。比如输入3张图片,分3类,最后的输出是一个3*3的Tensor
    input = torch.tensor([[-0.1123, -0.6028, -0.0450],
                  [ 0.1596,  0.2215, -1.0176],
                  [-0.2359, -0.7898,  0.7097]])
    

    第123行分别是第123张图片的结果,假设第123列分别是猫、狗和猪的分类得分。
    first step: 对每一行使用Softmax,这样可以得到每张图片的概率分布。概率最大的为:1:猪;2:狗;3:猪。

    sm = torch.nn.Softmax(dim=1)
    sm(input)
    tensor([[0.3729, 0.2283, 0.3988],
            [0.4216, 0.4485, 0.1299],
            [0.2410, 0.1385, 0.6205]])
    

    second step: 对softmax结果取对数

    torch.log(sm(input))
    tensor([[-0.9865, -1.4770, -0.9192],
            [-0.8637, -0.8019, -2.0409],
            [-1.4229, -1.9767, -0.4773]])
    

    Softmax后的数值都在0~1之间,所以log之后值域是负无穷到0。
    NLLLoss的结果就是把上面的输出与Label对应的那个值拿出来,再去掉负号,再求均值。
    假设我们现在Target是[0,2,1](第一张图片是猫,第二张是猪,第三张是狗)。第一行取第0个元素,第二行取第2个,第三行取第1个,去掉负号,结果是:[0.9865,2.0409,1.9767]。再求个均值,结果是:1.66
    对比NLLLoss的结果

    loss = torch.nn.NLLLoss()
    loss(torch.log(sm(input)),target)
    # 1.6681
    

    CrossEntropyLoss 相当于上述步骤的组合,Softmax–Log–NLLLoss合并成一步

    loss2 = torch.nn.CrossEntropyLoss()
    loss2(input,target)
    # 1.6681
    
  • 相关阅读:
    vue之过滤器的用法
    数组方法
    vue指令之 v-fo循环和 v-show 以及key值的用法
    清除浮动的几种方式
    cookie和session的区别
    layui添加新增弹出框
    layui如何实现图片上传功能
    css中设置背景图片平铺整个页面
    在vue中使用样式的方法
    windows最小最大化当前窗口和关闭当前窗口
  • 原文地址:https://www.cnblogs.com/leimu/p/13346372.html
Copyright © 2011-2022 走看看