下面以常用的softmax_cross_entropy() 函數爲例,做一個詳細介紹。
tf.losses.softmax_cross_entropy(
onehot_labels, # 注意此處參數名就叫 onehot_labels
logits,
weights=1.0,
label_smoothing=0,
scope=None,
loss_collection=tf.GraphKeys.LOSSES,
reduction=Reduction.SUM_BY_NONZERO_WEIGHTS
)
Args:
- onehot_labels: [batch_size, num_classes] one_hot類型的label.
- logits: [batch_size, num_classes] 神經網絡的logits輸出. 這兩個參數都沒什麼好解釋的,最基本的知識。
- weights: 爲可選參數,首先它是tensor 然後它可以是一個標量(此時作爲loss的係數),也可以是一個[batch_size]的向量(看源碼我個人理解就是對一個batch的樣本進行加權,不知道有什麼意義,因爲一般來說訓練樣本的輸入順序是隨機的,即每一個batch的樣本全部都是隨機的,這中情況下這個加權沒有任何意義了)
- label_smoothing: 這個參數如果設置大於0,則對label進行平滑,平滑的公式爲:
- new_onehot_labels = onehot_labels*(1-label_smoothing) + label_smoothing/num_classes
- scope: 命名空間
- loss_collection: 指定loss集合。
- reduction: 指定應用到這個loss的reduction類型.
- NONE: Un-reduced weighted losses with the same shape as input.
- SUM: Scalar sum of weighted losses.
- MEAN: Scalar ‘SUM’ divided by sum of weights.
- SUM_OVER_BATCH_SIZE: Scalar ‘SUM’ divided by number of elements in losses.
- SUM_OVER_NONZERO_WEIGHTS: Scalar ‘SUM’ divided by number of non-zero weights.
- SUM_BY_NONZERO_WEIGHTS: Same as ‘SUM_OVER_NONZERO_WEIGHTS’(注意:在損失函數中weights=1.0, 對應這裏的weighted_sum_by_nonzero_weights,配合起來就是求和)
reduction一般都是使用SUM_BY_NONZERO_WEIGHTS,不過需要注意的是設置這個參數的時候是:reduction=tf.losses.Reduction.MEAN