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

  • 相关阅读:
    博客停止更新了,新博客地址见github
    SSH登录过程
    哈希表结构
    静态链接、动态链接
    编译、汇编、链接、加载
    IO复用 select epoll
    kali安装盘
    linux常用命令
    DDOS攻击防范系统的设计与实现
    20155202《网络对抗》Exp9 web安全基础实践
  • 原文地址:https://www.cnblogs.com/luckyplj/p/13427904.html
Copyright © 2011-2022 走看看