1. 交叉熵
假如网络是一个3分类任务,网络的输出 l o g i t s = [ 3 , 1 , − 3 ] logits=[3,1,-3] logits=[3,1,−3]表示分为每一类的可能性大小:3表示归为标签0(3的下标)的可能性;1表示归为标签1(1的下标)的可能性;-3表示归为标签2(-3的下标)的可能性。因为3最大,所以归为标签0的可能最大,对应的损失应该最小。
2. 计算方法
-
假设 l o g i t s = [ y 1 , y 2 , y 3 ] logits=[y_1,y_2,y_3] logits=[y1,y2,y3]。
-
s o f t m a x = [ e x p ( y 1 ) ∑ i = 1 3 e x p ( y i ) , e x p ( y 2 ) ∑ i = 1 3 e x p ( y i ) , e x p ( y 3 ) ∑ i = 1 3 e x p ( y i ) ] softmax=[ \frac{exp(y_1)}{\sum_{i=1}^{3} exp(y_i)}, \quad \frac{exp(y_2)}{\sum_{i=1}^{3} exp(y_i)}, \quad \frac{exp(y_3)}{\sum_{i=1}^{3} exp(y_i)}] softmax=[∑i=13exp(yi)exp(y1),∑i=13exp(yi)exp(y2),∑i=13exp(yi)exp(y3)]。
-
l o g _ s o f t = [ − ln e x p ( y 1 ) ∑ i = 1 3 e x p ( y i ) , − ln e x p ( y 2 ) ∑ i = 1 3 e x p ( y i ) , − ln e x p ( y 3 ) ∑ i = 1 3 e x p ( y i ) ] log\_soft=[- \ln \frac{exp(y_1)}{\sum_{i=1}^{3} exp(y_i)}, \quad -\ln \frac{exp(y_2)}{\sum_{i=1}^{3} exp(y_i)}, \quad -\ln \frac{exp(y_3)}{\sum_{i=1}^{3} exp(y_i)}] log_soft=[−ln∑i=13exp(yi)exp(y1),−ln∑i=13exp(yi)exp(y2),−ln∑i=13exp(yi)exp(y3)]。
-
l a b e l s labels labels比 l o g i t s logits logits少一个维度,表示实际的类别。比如 l a b e l s = 0 labels=0 labels=0,则 l o s s = l o g _ s o f t [ 0 ] loss=log\_soft[0] loss=log_soft[0]。
3. Tensorflow计算交叉熵
import tensorflow as tf
import math
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
batch_size = 1
num_classes = 3
logits = tf.constant([3, 1, -3], shape=[batch_size, num_classes], dtype=tf.float32)
labels = tf.constant([0], shape=[batch_size,], dtype=tf.int32)
with tf.Session() as sess:
softmax = tf.nn.softmax(logits)
print"--softmax: ", softmax.eval()
log_soft = [-math.log(i) for i in softmax.eval()[0]]
print"--1: ", log_soft
print"--2: ", tf.losses.sparse_softmax_cross_entropy(logits=logits, labels=labels).eval()
temp = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=labels)
print"--3: ", tf.reduce_mean(temp).eval()
说明:
- 第12行计算 s o f t _ m a x soft\_max soft_max。
- 第14行计算 l o g _ s o f t log\_soft log_soft。 l o g _ s o f t [ i ] log\_soft[i] log_soft[i]:对应标签 i i i的损失。
- 第17行计算交叉熵。计算的结果和 l o g _ s o f t [ l a b e l s ] log\_soft[labels] log_soft[labels]一样。
4. Pytorch计算交叉熵
import torch
from torch.autograd import Variable
logits = Variable(torch.Tensor([[3, 1, -3]]))
labels = Variable(torch.LongTensor([0]), requires_grad=False)
loss = torch.nn.functional.cross_entropy(logits, labels)
print loss