CrossEntropyLoss¶
- class torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean', label_smoothing=0.0)[source][source]¶
此準則計算輸入 logits 和目標之間的交叉熵損失。
它在訓練具有 C 個類別的分類問題時非常有用。 如果提供,可選參數
weight
應為 1D Tensor,用於為每個類別分配權重。 當您擁有不平衡的訓練集時,這特別有用。預期 input 包含每個類別的未正規化 logits (通常 不 需要為正數或總和為 1)。input 必須是大小為 (對於非批次輸入)、 或 (對於 K 維情況,其中 )。 最後一個適用於更高維度的輸入,例如計算 2D 影像的每像素交叉熵損失。
此準則預期的 target 應包含以下其中一項:
類別索引,範圍為 ,其中 是類別的數量;如果指定了 ignore_index,則此損失也接受此類別索引 (此索引不一定在類別範圍內)。 此案例的未縮減 (即將
reduction
設為'none'
) 損失可以描述為其中 是輸入值, 是目標值, 是權重, 是類別數量,而 涵蓋了小批量維度以及 用於 K 維的情況。 如果
reduction
不是'none'
(預設為'mean'
),則請注意,這種情況等同於對輸入應用
LogSoftmax
,然後應用NLLLoss
。每個類別的機率;當需要每個小批量項目有多個類別的標籤時非常有用,例如用於混合標籤、標籤平滑等。這種情況下未經過縮減(即
reduction
設定為'none'
)的損失可以描述為其中 是輸入值, 是目標值, 是權重, 是類別數量,而 涵蓋了小批量維度以及 用於 K 維的情況。 如果
reduction
不是'none'
(預設為'mean'
),則
注意
當 target 包含類別索引時,此準則的效能通常會更好,因為這樣可以進行最佳化的計算。只有在每個小批量項目限制為單一類別標籤時,才考慮將 target 作為類別機率提供。
- 參數
weight (Tensor, 選用) – 給予每個類別的手動重新縮放權重。如果給定,則必須是大小為 C 且為浮點數 dtype 的 Tensor
size_average (bool, 選用) – 已棄用 (請參閱
reduction
)。預設情況下,損失會在批次中的每個損失元素上進行平均。請注意,對於某些損失,每個樣本有多個元素。如果欄位size_average
設定為False
,則會改為對每個小批量加總損失。當reduce
為False
時,會忽略此項。預設值:True
ignore_index (int, 選用) – 指定要忽略且不影響輸入梯度的目標值。當
size_average
為True
時,損失會在未忽略的目標上進行平均。請注意,ignore_index
僅適用於目標包含類別索引時。reduce (bool, optional) – 已棄用(請參閱
reduction
)。預設情況下,損失會根據size_average
的設定,對每個小批次的觀察值進行平均或加總。當reduce
為False
時,會改為傳回每個批次元素的損失,並忽略size_average
。預設值:True
reduction (str, optional) – 指定要套用至輸出的縮減方式:
'none'
|'mean'
|'sum'
。'none'
:不套用任何縮減,'mean'
:取輸出的加權平均值,'sum'
:將輸出加總。注意:size_average
和reduce
正在逐步棄用中,同時,指定這兩個參數中的任何一個都會覆寫reduction
。預設值:'mean'
label_smoothing (float, optional) – 一個介於 [0.0, 1.0] 之間的浮點數。指定計算損失時的平滑量,其中 0.0 表示不進行平滑處理。目標變成原始真實值和均勻分佈的混合,如 Rethinking the Inception Architecture for Computer Vision 中所述。預設值:.
- 形狀
輸入:形狀 、 或 ,在 K 維損失的情況下,其中 。
目標:如果包含類別索引,形狀為 、 或 ,其中 ,如果是 K 維損失,則每個值應介於 之間。如果包含類別機率,則與輸入形狀相同,且每個值應介於 之間。
輸出:如果 reduction 是 ‘none’,則形狀為 , 或 ,其中 ,在 K 維損失的情況下,取決於輸入的形狀。 否則,為純量。
其中
範例
>>> # Example of target with class indices >>> loss = nn.CrossEntropyLoss() >>> input = torch.randn(3, 5, requires_grad=True) >>> target = torch.empty(3, dtype=torch.long).random_(5) >>> output = loss(input, target) >>> output.backward() >>> >>> # Example of target with class probabilities >>> input = torch.randn(3, 5, requires_grad=True) >>> target = torch.randn(3, 5).softmax(dim=1) >>> output = loss(input, target) >>> output.backward()