損失函數講解合集
binary_crossentropy
categorical_crossentropy
概述
本文講解的是categorical_crossentropy損失函數,categorical_crossentropy和binary_crossentropy比較容易混淆,想了解binary_crossentropy可以點擊查看。本文將通過數學公式+代碼的形式講解。
正文
公式分析
categorical_crossentropy損失函數的公式如下(一般搭配softmax激活函數使用):
根據公式我們可以發現,因爲yi,要麼是0,要麼是1。而當yi等於0時,結果就是0,當且僅當yi等於1時,纔會有結果。也就是說categorical_crossentropy只專注與一個結果,因而它一般配合softmax做單標籤分類。
代碼分析
接下來我分別用tensorflow的api,以及列出詳細結算過程這兩種方法帶大家體驗一下計算。
舉例1:當batch_size爲1,輸出shape爲(1,1,2)時
使用tensorflow api計算:
import tensorflow as tf
y_true = [[[0.,1.]]]
y_pred = [[[0.4,0.6]]]# 假設已經經過了softmax,所以和必須爲1
loss = tf.keras.losses.categorical_crossentropy(y_true, y_pred)
loss.numpy()
輸出:
array([[0.5108256]], dtype=float32)
根據公式計算:
loss = -( 0*tf.math.log(0.4) + 1*tf.math.log(0.6) )
loss
輸出:
<tf.Tensor: shape=(), dtype=float32, numpy=0.5108256>
可以看到它們結果一樣
舉例2:當batch_size爲1,輸出shape爲(1,1,4)時
使用tensorflow api計算:
import tensorflow as tf
y_true = [[[0.,0.,1.,0.]]]
y_pred = [[[0.1,0.6,0.1,0.2]]]# 假設已經經過了softmax,所以和必須爲1
loss = tf.keras.losses.categorical_crossentropy(y_true, y_pred)
loss.numpy()
輸出:
array([[2.3025851]], dtype=float32)
根據公式計算:
loss = -( 0*tf.math.log(0.1) +
0*tf.math.log(0.6) +
1*tf.math.log(0.1) +
0*tf.math.log(0.2) )
loss
輸出:
<tf.Tensor: shape=(), dtype=float32, numpy=2.3025851>
可以看到它們結果一樣