softmax计算loss时,注意错误:交叉熵实验

以下内容来自《深度学习之Tensor Flow入门、原理与进阶实战》学习
实例描述
下面一段代码,假设有一个标签labels和一个网络输出值logits
进行一下实验:

"""
Created on Tue Jun 13 09:53:41 2017
@author: 代码医生      注意原作者出处
@blog:http://blog.csdn.net/lijin6249
"""
import tensorflow as tf

labels = [[0,0,1],[0,1,0]]
logits = [[2,  0.5,6],
          [0.1,0,  3]]
logits_scaled = tf.nn.softmax(logits)
logits_scaled2 = tf.nn.softmax(logits_scaled)


result1 = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)
result2 = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits_scaled)
result3 = -tf.reduce_sum(labels*tf.log(logits_scaled),1)


with tf.Session() as sess:
    print ("scaled=",sess.run(logits_scaled))    
    print ("scaled2=",sess.run(logits_scaled2)) #经过第二次的softmax后,分布概率会有变化
    

    print ("rel1=",sess.run(result1),"\n")#正确的方式
    print ("rel2=",sess.run(result2),"\n")#如果将softmax变换完的值放进去会,就相当于算第二次softmax的loss,所以会出错
    print ("rel3=",sess.run(result3))
    **# 对于softmax后的结果logits我们可以对其使用公式 -tf.reduce_sum(labels*tf.log(logits_scaled),1),就等同于
    # softmax_cross_entropy_with_logits 得到的结果。**

#以下部分:输入的标签不是标准的one-hot,与one-hot标签对比
#标签总概率为1
labels = [[0.4,0.1,0.5],[0.3,0.6,0.1]]
result4 = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)
with tf.Session() as sess:
    print ("rel4=",sess.run(result4),"\n") 

#以下部分:sparse_softmax_cross_entropy_with_logits用法。
#sparse
labels = [2,1] #其实是0 1 2 三个类。等价 第一行 001 第二行 010
result5 = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits)
with tf.Session() as sess:
    print ("rel5=",sess.run(result5),"\n")
    
#注意!!!这个函数的返回值并不是一个数,而是一个向量,
#如果要求交叉熵loss,我们要对向量求均值,
#就是对向量再做一步tf.reduce_mean操作    
loss=tf.reduce_mean(result1)
with tf.Session() as sess:
    print ("loss=",sess.run(loss))
    
labels = [[0,0,1],[0,1,0]]    
loss2 = tf.reduce_mean(-tf.reduce_sum(labels * tf.log(logits_scaled),1) )
with tf.Session() as sess:
    print ("loss2=",sess.run(loss2))

结果:rel1=rel2

scaled= [[0.01791432 0.00399722 0.97808844]
 [0.04980332 0.04506391 0.90513283]]
scaled2= [[0.21747023 0.21446465 0.56806517]
 [0.2300214  0.22893383 0.5410447 ]]
 
rel1= [0.02215516 3.0996735 ] 
rel2= [0.56551915 1.4743223 ] 
rel3= [0.02215518 3.0996735 ]

rel4= [2.1721554 2.7696736] 

rel5= [0.02215516 3.0996735 ] 

loss= 1.5609143
loss2= 1.5609143

分析验证:
1.logits里面的值原本加和都是大于1的,但是经过sofmax之后,总和变成了1;
2.比较scaled 和scaled2可以看到,scaled才是真实转化的softmax值;
3.对于已经用softmax转换过的scaled,在计算loss时,就不能再用TensorFlow里面的softmax_cross_entropy_with_logits()了;
4.对于非one-hot编码为标签的数据进行交叉熵的计算,对比rel1和rel4,对于正确分类的交叉熵和错误分类的交叉熵,非one-hot编码没有标准one-hot那么明显;
5.sparse_softmax_cross_entropy_with_logits()区别于softmax_cross_entropy_with_logits(),其真实值与预测值不需要one-hot编码,但是分类的个数一定要从0开始。rel5=rel1;
6.可以分别从result1和logits_scaled得到loss。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值