zoukankan      html  css  js  c++  java
  • Pytorch学习笔记12----损失函数nn.CrossEntropyLoss()、nn.NLLLoss()

    1.CrossEntropyLoss()损失函数

    交叉熵主要是用来判定实际的输出与期望的输出的接近程度,为什么这么说呢,举个例子:在做分类的训练的时候,如果一个样本属于第K类,那么这个类别所对应的的输出节点的输出值应该为1,而其他节点的输出都为0,即[0,0,1,0,….0,0],这个数组也就是样本的Label,是神经网络最期望的输出结果。也就是说用它来衡量网络的输出与标签的差异,利用这种差异经过反向传播去更新网络参数。

    nn.CrossEntropyLoss()这个损失函数用于多分类问题虽然说的是交叉熵,但是和我理解的交叉熵不一样。nn.CrossEntropyLoss()是nn.logSoftmax()和nn.NLLLoss()的整合,可以直接使用它来替换网络中的这两个操作。下面我们来看一下计算过程。

    首先输入是size是(minibatch,C)。这里的C是类别数。损失函数的计算如下:

    损失函数中也有权重weight参数设置,若设置权重,则公式为:

    其他参数不具体说,和nn.BCELoss()设置差不多,默认情况下,对minibatch的loss求均值。

    注意这里的标签值class,并不参与直接计算,而是作为一个索引,索引对象为实际类别

    举个栗子,我们一共有三种类别,批量大小为1(为了好计算),那么输入size为(1,3),具体值为torch.Tensor([[-0.7715, -0.6205,-0.2562]])。标签值为target = torch.tensor([0]),这里标签值为0,表示属于第0类。loss计算如下:

    import torch
    import torch.nn as nn
    import math
    
    entroy=nn.CrossEntropyLoss()
    input=torch.Tensor([[-0.7715, -0.6205,-0.2562]])
    target = torch.tensor([0])
    output = entroy(input, target)
    print(output)
    #根据公式计算

    输出:

    tensor(1.3447)

    动手自己算:

    参考文献:

    https://blog.csdn.net/geter_CS/article/details/84857220

  • 相关阅读:
    CV方向的高效阅读英文文献方法总结
    数据增强方法总结
    CNN结构演变总结(三)设计原则
    CNN结构演变总结(二)轻量化模型
    CNN结构演变总结(一)经典模型
    CNN可视化技术总结(四)--可视化工具与项目
    Codeforces972 D. Kuro and GCD and XOR and SUM 01Trie
    Codeforces 982 D. Shark
    Codeforces Round #700 (Div. 2) A~D题解
    codeforces 1004 D. Sonya and Matrix 构造
  • 原文地址:https://www.cnblogs.com/luckyplj/p/13427904.html
Copyright © 2011-2022 走看看