交叉熵

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=[lni=13exp(yi)exp(y1),lni=13exp(yi)exp(y2),lni=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()

  说明:

  1. 第12行计算 s o f t _ m a x soft\_max soft_max
  2. 第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的损失。
  3. 第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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值