最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PyTorch基礎(chǔ)之torch.nn.CrossEntropyLoss交叉熵?fù)p失

 更新時(shí)間:2023年02月02日 09:00:19   作者:gy笨瓜  
這篇文章主要介紹了PyTorch基礎(chǔ)之torch.nn.CrossEntropyLoss交叉熵?fù)p失講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

torch.nn.CrossEntropyLoss交叉熵?fù)p失

本文只考慮基本情況,未考慮加權(quán)。

torch.nnCrossEntropyLosss使用的公式

目標(biāo)類別采用one-hot編碼

其中,class表示當(dāng)前樣本類別在one-hot編碼中對(duì)應(yīng)的索引(從0開(kāi)始),

x[j]表示預(yù)測(cè)函數(shù)的第j個(gè)輸出

公式(1)表示先對(duì)預(yù)測(cè)函數(shù)使用softmax計(jì)算每個(gè)類別的概率,再使用log(以e為底)計(jì)算后的相反數(shù)表示當(dāng)前類別的損失,只表示其中一個(gè)樣本的損失計(jì)算方式,非全部樣本。

每個(gè)樣本使用one-hot編碼表示所屬類別時(shí),只有一項(xiàng)為1,因此與基本的交叉熵?fù)p失函數(shù)相比,省略了其它值為0的項(xiàng),只剩(1)所表示的項(xiàng)。

sample

torch.nn.CrossEntropyLoss使用流程

torch.nn.CrossEntropyLoss為一個(gè)類,并非單獨(dú)一個(gè)函數(shù),使用到的相關(guān)簡(jiǎn)單參數(shù)會(huì)在使用中說(shuō)明,并非對(duì)所有參數(shù)進(jìn)行說(shuō)明。

首先創(chuàng)建類對(duì)象

In [1]: import torch
In [2]: import torch.nn as nn
In [3]: loss_function = nn.CrossEntropyLoss(reduction="none")

參數(shù)reduction默認(rèn)為"mean",表示對(duì)所有樣本的loss取均值,最終返回只有一個(gè)值

參數(shù)reduction取"none",表示保留每一個(gè)樣本的loss

計(jì)算損失

In [4]: pred = torch.tensor([[0.0541,0.1762,0.9489],[-0.0288,-0.8072,0.4909]], dtype=torch.float32)
In [5]: class_index = torch.tensor([0, 2], dtype=torch.int64)
In [6]: loss_value = loss_function(pred, class_index)
In [7]: loss_value
Out[7]: tensor([1.5210, 0.6247]) # 與上述【sample】計(jì)算一致

實(shí)際計(jì)算損失值調(diào)用函數(shù)時(shí),傳入pred預(yù)測(cè)值與class_index類別索引

在傳入每個(gè)類別時(shí),class_index應(yīng)為一維,長(zhǎng)度為樣本個(gè)數(shù),每個(gè)元素表示對(duì)應(yīng)樣本的類別索引,非one-hot編碼方式傳入

測(cè)試torch.nn.CrossEntropyLoss的reduction參數(shù)為默認(rèn)值"mean"

In [1]: import torch
In [2]: import torch.nn as nn
In [3]: loss_function = nn.CrossEntropyLoss(reduction="mean")
In [4]: pred = torch.tensor([[0.0541,0.1762,0.9489],[-0.0288,-0.8072,0.4909]], dtype=torch.float32)
In [5]: class_index = torch.tensor([0, 2], dtype=torch.int64)
In [6]: loss_value = loss_function(pred, class_index)
In [7]: loss_value
Out[7]: 1.073 # 與上述【sample】計(jì)算一致

交叉熵?fù)p失nn.CrossEntropyLoss()的真正計(jì)算過(guò)程

對(duì)于多分類損失函數(shù)Cross Entropy Loss,就不過(guò)多的解釋,網(wǎng)上的博客不計(jì)其數(shù)。在這里,講講對(duì)于CE Loss的一些真正的理解。

首先大部分博客給出的公式如下:

其中p為真實(shí)標(biāo)簽值,q為預(yù)測(cè)值。

在低維復(fù)現(xiàn)此公式,結(jié)果如下。在此強(qiáng)調(diào)一點(diǎn),pytorch中CE Loss并不會(huì)將輸入的target映射為one-hot編碼格式,而是直接取下標(biāo)進(jìn)行計(jì)算。

import torch
import torch.nn as nn
import math
import numpy as np

#官方的實(shí)現(xiàn)
entroy=nn.CrossEntropyLoss()
input=torch.Tensor([[0.1234, 0.5555,0.3211],[0.1234, 0.5555,0.3211],[0.1234, 0.5555,0.3211],])
target = torch.tensor([0,1,2])
output = entroy(input, target)
print(output)
#輸出 tensor(1.1142)

#自己實(shí)現(xiàn)
input=np.array(input)
target = np.array(target)
def cross_entorpy(input, target):
    output = 0
    length = len(target)
    for i in range(length):
        hou = 0
        for j in input[i]:
            hou += np.log(input[i][target[i]])
        output += -hou
    return np.around(output / length, 4)
print(cross_entorpy(input, target))
#輸出 3.8162

我們按照官方給的CE Loss和根據(jù)公式得到的答案并不相同,說(shuō)明公式是有問(wèn)題的。

正確公式

實(shí)現(xiàn)代碼如下

import torch
import torch.nn as nn
import math
import numpy as np

entroy=nn.CrossEntropyLoss()
input=torch.Tensor([[0.1234, 0.5555,0.3211],[0.1234, 0.5555,0.3211],[0.1234, 0.5555,0.3211],])
target = torch.tensor([0,1,2])
output = entroy(input, target)
print(output)
#輸出 tensor(1.1142)
#%%
input=np.array(input)
target = np.array(target)
def cross_entorpy(input, target):
    output = 0
    length = len(target)
    for i in range(length):
        hou = 0
        for j in input[i]:
            hou += np.exp(j)
        output += -input[i][target[i]] + np.log(hou)
    return np.around(output / length, 4)
print(cross_entorpy(input, target))
#輸出 1.1142

對(duì)比自己實(shí)現(xiàn)的公式和官方給出的結(jié)果,可以驗(yàn)證公式的正確性。

觀察公式可以發(fā)現(xiàn)其實(shí)nn.CrossEntropyLoss()是nn.logSoftmax()和nn.NLLLoss()的整合版本。

nn.logSoftmax(),公式如下

nn.NLLLoss(),公式如下

將nn.logSoftmax()作為變量帶入nn.NLLLoss()可得

因?yàn)?/p>

可看做一個(gè)常量,故上式可化簡(jiǎn)為:

對(duì)比nn.Cross Entropy Loss公式,結(jié)果顯而易見(jiàn)。

驗(yàn)證代碼如下。

import torch
import torch.nn as nn
import math
import numpy as np

entroy=nn.CrossEntropyLoss()
input=torch.Tensor([[0.1234, 0.5555,0.3211],[0.1234, 0.5555,0.3211],[0.1234, 0.5555,0.3211],])
target = torch.tensor([0,1,2])
output = entroy(input, target)
print(output)
# 輸出為tensor(1.1142)
m = nn.LogSoftmax()
loss = nn.NLLLoss()
input=m(input)
output = loss(input, target)
print(output)
# 輸出為tensor(1.1142)

綜上,可得兩個(gè)結(jié)論

1.nn.Cross Entropy Loss的公式。

2.nn.Cross Entropy Loss為nn.logSoftmax()和nn.NLLLoss()的整合版本。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

镶黄旗| 阿荣旗| 兴仁县| 丘北县| 基隆市| 张家港市| 沁源县| 乐昌市| 涟源市| 思南县| 赫章县| 芜湖县| 高邮市| 石楼县| 巴彦淖尔市| 清新县| 河南省| 梁山县| 靖宇县| 万山特区| 泸西县| 宣城市| 河北省| 改则县| 阳城县| 利津县| 南皮县| 阳朔县| 如皋市| 岑巩县| 锦州市| 盐亭县| 清河县| 弋阳县| 马关县| 白河县| 逊克县| 赤壁市| 阜康市| 泰来县| 漳平市|