F.cross_entropyおよびF.binary_cross_entropy_with_logits



F Cross_entropy F



F.cross_entropy関数に対応するクラスはtorch.nn.CrossEntropyLossです。これは、logsoftmaxを自動的に追加し、使用時に損失を計算します(実際、これはnn.LogSoftmax()とnn.NLLLoss()の融合です)。
この関数は、複数分類問題のクロスエントロピー損失を計算するために使用されます

関数形式:
画像
このフォームは理解しやすいです



画像

Cはクラスの数です
入力1次元の場合x [N、C] n次元の場合[N、c、d1、d2、d3…]
ターゲット1次元の場合[N] n次元の場合[N、C、d1、d2、d3]この値の範囲は0〜C-1である必要があります
重み[C]は各カテゴリの重みを表します
ここでのターゲットはlong型でなければならないことに注意してください



ここでの重みは、各カテゴリの重みです。
通常の状況(デフォルト)では、すべての要素の損失が平均化されるため、最終的な損失の式は次のようになります。
画像
Wnは、n番目のサンプルの対応するgtカテゴリの重みを表し、Pnは、モデルによって予測された対応するgtカテゴリの確率です。分子上のすべてのサンプルの損失を加算してから、すべてのサンプルの重みの合計で除算します。

import numpy as np import torch from torch.nn import functional as F x = np.array([[1, 2], [1, 2], [1, 1]]).astype(np.float32) y = np.array([1, 1, 0]) weight = np.array([2, 1]) x = torch.from_numpy(x) print(F.softmax(x, dim=1)) y = torch.from_numpy(y).long() weight = torch.from_numpy(weight).float() loss = F.cross_entropy(x, y, weight=weight) print(loss)

手動計算
画像


F.binary_cross_entropy_with_logits()の対応するクラスはtorch.nn.BCEWithLogitsLossです。これは、使用時にシグモイドを自動的に追加し、損失を計算します。 (実際には、nn.sigmoidとnn.BCELossの組み合わせです)



この関数は、複数分類問題のクロスエントロピー損失を計算するために使用されます
ここに
入力[N、*]
target [N、*]
ここでのターゲットはfloat型である必要があります

nn.BCELossの直接の例を次に示します。 nn.BCELossを使用する場合、入力がシグモイド活性化の確率値であることを確認する必要があることに注意してください

ここでの重みは各ポイントの重みです

import torch from torch import nn def binary_cross_entropyloss(prob, target, weight=None): loss = -weight * (target * torch.log(prob) + (1 - target) * (torch.log(1 - prob))) loss = torch.sum(loss) / torch.numel(target) return loss label = torch.tensor([ [1., 0], [1., 0], ]) predict = torch.tensor([ [0.1, 0.3], [0.2, 0.8] ]) weight1 = torch.tensor([ [1., 2], [1., 1.], ]) loss1 = nn.BCELoss(weight=weight1) l1 = loss1(predict, label) loss = binary_cross_entropyloss(predict, label, weight=weight1) print(l1, loss)

画像