手動分開計算交叉熵每個位置的loss值

2021-10-25 18:58:32 字數 1224 閱讀 6854

交叉熵損失函式最後得到的是所有位置的平均loss,如果我們想要知道每個位置的loss多少,可以分開計算,如下例子所示:

import torch

fn = torch.nn.crossentropyloss()

logits = torch.tensor([[0.7595, 0.3526, 0.0479, 0.6684],

[0.5149, 0.4248, 0.5377, 0.9349],

[0.0801, 0.2237, 0.2990, 0.3178],

[0.0583, 0.7461, 0.3659, 0.8972],

[0.7178, 0.1821, 0.9660, 0.1914],

[0.5666, 0.8041, 0.9830, 0.0220]])

print(logits)

labels = torch.tensor([[1, 0], [1, 0], [0, 1]]).view(-1)

print(labels)

loss = fn(logits, labels)

print(f'損失函式計算的loss ')

loss_2 = -torch.nn.functional.log_softmax(logits, dim=-1).gather(1, labels.unsqueeze(-1)).squeeze(1)

print(f'每個位置的loss ') # 每個位置的loss

print(f'平均loss ')

結果:

tensor([[0.7595, 0.3526, 0.0479, 0.6684],

[0.5149, 0.4248, 0.5377, 0.9349],

[0.0801, 0.2237, 0.2990, 0.3178],

[0.0583, 0.7461, 0.3659, 0.8972],

[0.7178, 0.1821, 0.9660, 0.1914],

[0.5666, 0.8041, 0.9830, 0.0220]])

tensor([1, 0, 1, 0, 0, 1])

損失函式計算的loss 1.4655965566635132

每個位置的loss tensor([1.5284, 1.4949, 1.3970, 1.8966, 1.2406, 1.2360])

平均loss 1.4655965566635132

手動計算矩陣梯度或者矩陣導數

機器學習中的引數優化需要做矩陣梯度或者求導,比如在 動手學習深度學習 中的 自動求梯度 的例子,對函式 y 2x x 2x x 求關於列向量 x 的梯度。下面用手動推到出矩陣的梯度。假設x是 0.1.2.3.那麼對應的y是28,那麼這個點的梯度或者導數是怎麼計算的?x的4個元素,讓某乙個元素加1,保...

蠻荒而漫長的手動計算時代

1 本章所介紹的手動時期一系列典型的計算工具,其發展歷程,正是人類文明演進的剖面 從利用自然,到改造自然,再到發明創造。手指是最易獲取的 工具 石子一類其次,這兩種都是自然界現成的物品 從契刻開始,人們有了改進自然物的想法 結繩和算籌則已是批量化 統一化製造的產物 算盤 納皮爾籌和對數尺更是目的性很...

用Jasper計算交叉增長率

交叉表的每一列都是動態生成的,進行列間計算時需要動態引用,用jasper指令碼實現此類需求有一定難度,用集算器在資料準備階段實現則相對簡單,下面用例子來說明。資料庫表store儲存著多種產品在2014 2015年的銷售量,需要用交叉表呈現每種產品每年的銷售量,並計算出各產品的年增長率。部分源資料如下...