tf.nn.sigmoid_cross_entropy_with_logits出现负数

tf.nn.sigmoid_cross_entropy_with_logits

使用这个loss函数,出现loss出现负数的情况,在理论情况下,这个函数应该是不会存在负数的情况,查看这个函数的具体表达为:

该函数定义为:

import tensorflow as tf
import numpy as np

def sigmoid(x):
    return 1.0/(1+np.exp(-x))

# 5个样本三分类问题,且一个样本可以同时拥有多类
y = np.array([[1,0,0],[0,1,0],[0,0,1],[1,1,0],[0,1,0]] 
logits = np.array([[12,3,2],[3,10,1],[1,2,5],[4,6.5,1.2],[3,6,1]])
# 按计算公式计算
y_pred = sigmoid(logits)
E1 = -y*np.log(y_pred)-(1-y)*np.log(1-y_pred)
print(E1)     # 按计算公式计算的结果
# 按封装方法计算
sess =tf.Session()
y = np.array(y).astype(np.float64) # labels是float64的数据类型
E2 = sess.run(tf.nn.sigmoid_cross_entropy_with_logits(labels=y,logits=logits))
print(E2)  

这个函数实际的内部实现的式子是下式:

max(x, 0) - x * z + log(1 + exp(-abs(x)))

其中max(x,0)和log(1+exp(-abs(x)))部分都是大于零的,因而如果这个函数出现负数的情况,一定是xz部分的问题,xz为正数的话,那么该式子才可能是负数,而对于x*z为证书有两种情况

1.x>0且z>0,上式可以化简为:

x*(1-z)+log(1+exp(-x)),这种情况下,1-z<0则可能发生此式子为负数,也就是z>1的情况;

2.x<0且z<0,上式可以化简为:

-x*z+log(1+exp(x))=log(exp(-xz))+log(1+exp(x))=x(1-2z),这种情况在z<0且x<0的情况下,此式子绝对为负数

综合上述例子中,x取任意值都可能,但是一般情况下z的取值范围为0<=z<=1,但是上述出现负数的情况,都是z不是在正常的取值范围内,导致了情况发生,因而可以发现,如果该函数输出值为负数,那么一定是z,也就是说labels出现了异常(超出了设计的取值范围[0,1]导致的)。

因而,解决问题的办法也很简单,就是检查labels输入的取值范围是否在[0,1]之间。而经过检查代码中出现这样的问题是,labels同样来自于模型输出,在模型训练过程中,最后一层并没有加sigmoid的处理,导致作为labels的输入时,输入数据越界而产生了负数的loss。


softmax_cross_entropy_with_logits

import tensorflow as tf
import numpy as np

def softmax(x):
    sum_raw = np.sum(np.exp(x),axis=-1)
    x1 = np.ones(np.shape(x))
    for i in range(np.shape(x)[0]):
        x1[i] = np.exp(x[i])/sum_raw[i]
    return x1

y = np.array([[1,0,0],[0,1,0],[0,0,1],[1,0,0],[0,1,0]])# 每一行只有一个1
logits =np.array([[12,3,2],[3,10,1],[1,2,5],[4,6.5,1.2],[3,6,1]])
# 按计算公式计算
y_pred =softmax(logits)
E1 = -np.sum(y*np.log(y_pred),-1)
print(E1)
# 按封装方法计算
sess = tf.Session()
y = np.array(y).astype(np.float64)
E2 = sess.run(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=logits))
print(E2)

【转载】:http://blog.sina.com.cn/s/blog_6ca0f5eb0102xjxd.html

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值