快捷方式

BCELoss

class torch.nn.BCELoss(weight=None, size_average=None, reduce=None, reduction='mean')[原始碼][原始碼]

建立一個標準,用於測量目標值和輸入機率之間的二元交叉熵 (Binary Cross Entropy)。

未縮減的損失(即將 reduction 設定為 'none')可以描述為:

(x,y)=L={l1,,lN},ln=wn[ynlogxn+(1yn)log(1xn)],\ell(x, y) = L = \{l_1,\dots,l_N\}^\top, \quad l_n = - w_n \left[ y_n \cdot \log x_n + (1 - y_n) \cdot \log (1 - x_n) \right],

其中 NN 是批次大小。如果 reduction 不是 'none' (預設為 'mean'),那麼

(x,y)={mean(L),如果 reduction=‘mean’;sum(L),如果 reduction=‘sum’。\ell(x, y) = \begin{cases} \operatorname{mean}(L), & \text{if reduction} = \text{`mean';}\\ \operatorname{sum}(L), & \text{if reduction} = \text{`sum'.} \end{cases}

這用於測量例如在自動編碼器中重建的誤差。請注意,目標 yy 應該是介於 0 和 1 之間的數字。

請注意,如果 xnx_n 是 0 或 1,則上述損失方程式中的其中一個對數項在數學上是未定義的。PyTorch 選擇設定 log(0)=\log (0) = -\infty,因為 limx0log(x)=\lim_{x\to 0} \log (x) = -\infty。但是,由於某些原因,損失方程式中的無限項是不理想的。

首先,如果 yn=0y_n = 0(1yn)=0(1 - y_n) = 0,那麼我們會將 0 與無窮大相乘。 其次,如果我們有一個無限大的損失值,那麼我們的梯度也會有一個無限大的項,因為 limx0ddxlog(x)=\lim_{x\to 0} \frac{d}{dx} \log (x) = \infty。 這會使 BCELoss 的 backward 方法相對於 xnx_n 變成非線性,並且將其用於線性迴歸之類的事情將不是那麼直接。

我們的解決方案是 BCELoss 將其 log 函數輸出限制為大於或等於 -100。 這樣,我們始終可以擁有一個有限的損失值和一個線性的 backward 方法。

參數
  • weight (Tensor, optional) – 手動調整每個批次元素損失的權重。 如果給定,則必須是大小為 nbatch 的 Tensor。

  • size_average (bool, optional) – 已棄用 (請參閱 reduction)。 預設情況下,損失會在批次中的每個損失元素上平均。 請注意,對於某些損失,每個樣本有多個元素。 如果欄位 size_average 設為 False,則會對每個小批次進行損失的總和。 當 reduceFalse 時,則會忽略此設定。 預設值: True

  • reduce (bool, optional) – 已棄用 (請參閱 reduction)。 預設情況下,根據 size_average,損失會在每個小批次的觀察值上平均或求和。 當 reduceFalse 時,則會改為傳回每個批次元素的損失,並忽略 size_average。 預設值: True

  • reduction (縮減) ( str, optional (可選)) – 指定應用於輸出的縮減方式: 'none' (無) | 'mean' (平均) | 'sum' (總和)'none':不進行縮減; 'mean':輸出的總和將除以輸出中的元素數量; 'sum':輸出將被加總。 注意:size_averagereduce 正在逐步淘汰,同時,指定這兩個參數中的任何一個將覆蓋 reduction。 預設值: 'mean'

形狀 (Shape)
  • 輸入 (Input): ()(*), 其中 * 代表任意數量的維度。

  • 目標 (Target): ()(*), 與輸入形狀相同。

  • 輸出 (Output): 純量 (scalar)。如果 reduction'none', 則為 ()(*), 與輸入形狀相同。

範例 (Examples)

>>> m = nn.Sigmoid()
>>> loss = nn.BCELoss()
>>> input = torch.randn(3, 2, requires_grad=True)
>>> target = torch.rand(3, 2, requires_grad=False)
>>> output = loss(m(input), target)
>>> output.backward()

文件

取得 PyTorch 的完整開發者文件

檢視文件

教學

取得為初學者和高級開發者提供的深入教學課程

檢視教學

資源

尋找開發資源並獲得您的問題解答

檢視資源