zoukankan      html  css  js  c++  java
  • pytorch 损失函数(nn.BCELoss 和 nn.CrossEntropyLoss)(思考多标签分类问题)

    一、BCELoss 二分类损失函数

    输入维度为(n, ), 输出维度为(n, )

    如果说要预测二分类值为1的概率,则建议用该函数!

    输入比如是3维,则每一个应该是在0——1区间内(随意通常配合sigmoid函数使用),举例如下:

    import torch
    import torch.nn as nn

    m = nn.Sigmoid() loss = nn.BCELoss() input = torch.randn(3,requires_grad=True) target = torch.empty(3).random_(2) output = loss(m(input), target) output.backward() input,target,output 返回值: (tensor([-0.8728, 0.3632, -0.0547], requires_grad=True), tensor([1., 0., 0.]), tensor(0.9264, grad_fn=<BinaryCrossEntropyBackward>)) m(input)结果为: tensor([0.2947, 0.5898, 0.4863]) 计算output = (1 * ln 0.2947+(1-1)*ln(1-0.2947) + 0*ln0.5898 + (1-0)*ln(1-0.5898) + 0*ln0.4863 + (1-0)*ln(1-0.4863)) / 3 = 0.9264

    二、nn.CrossEntropyLoss 交叉熵损失函数

    输入维度(batch_size, feature_dim)

    输出维度  (batch_size, 1)

    X_input = torch.tensor[ [2.8883, 0.1760, 1.0774],

              [1.1216, -0.0562, 0.0660],

              [-1.3939, -0.0967, 0.5853]]

    y_target = torch.tensor([1,2,0])

    loss_func = nn.CrossEntropyLoss()

    loss = loss_func(X_input, y_target)

    计算流程:第一,x先softmax再log,得到x_hat  第二,y转0-1编码[1,2,0] 转[[0,1,0], [0,0,1], [1,0,0]] 再与x_hat相乘,取负取平均值

    思考问题:多标签的分类任务中,怎么使用损失函数呢,是拆分是多个二分类问题呢,还是不用拆分直接用BCE呢(https://blog.csdn.net/rosefun96/article/details/88058708,参考:BCE 可以应用到多标签的分类任务中)?有什么区别呢?

  • 相关阅读:
    组合容斥计数技巧
    [BZOJ3456]城市规划:DP+NTT+多项式求逆
    [BZOJ4456][ZJOI2016]旅行者:分治+最短路
    [51nod1383&1048]整数分解为2的幂:DP
    [BZO3572][HNOI2014]世界树:虚树+倍增
    树上最小权链覆盖:可并堆
    [BZOJ4237]稻草人:CDQ分治+单调栈
    [BZOJ3453]tyvj 1858 XLkxc:拉格朗日插值
    [BZOJ5463][APIO2018]铁人两项:Tarjan+圆方树
    [BZOJ4695]最假女选手:segment tree beats!
  • 原文地址:https://www.cnblogs.com/qiezi-online/p/14037326.html
Copyright © 2011-2022 走看看