tf.nn.sigmoid_cross_entropy_with_logits()

在深度学习的编程题里面经常出现的一个函数.下面的文字是大致翻译于tensorflow官网对其的介绍:

函数原型:

tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,,labels=None,logits=None,name=None)

对于给定的logits计算sigmoid的交叉熵。

衡量的是分类任务中的概率误差,他也是试用于每一个类别都是相不排斥的(代码中可以看出),例如,有的可以划到多个类别中,给你一张照片,同时包含大象和狗。简单的来说,我们使得x=logits,z=labels,那么误差是:

logits和labels必须有相同的类型和大小。

第一个参数:_sentinel内部的并不使用。

第二个参数:labels和logits的shape和type一样。

第三个参数:logits类型为float32或者float64

第四个参数:操作的名称,可省。

返回的是:一个张量,和logits的大小一致。是逻辑损失

import numpy as np
import tensorflow as tf

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

labels=np.array([[1.,0.,0.],[0.,1.,0.],[0.,0.,1.]])
logits=np.array([[11.,8.,7.],[10.,14.,3.],[1.,2.,4.]])
y_pred=sigmoid(logits)
prob_error1=-labels*np.log(y_pred)-(1-labels)*np.log(1-y_pred)
print(prob_error1)

print(".............")
labels1=np.array([[0.,1.,0.],[1.,1.,0.],[0.,0.,1.]])#不一定只属于一个类别
logits1=np.array([[1.,8.,7.],[10.,14.,3.],[1.,2.,4.]])
y_pred1=sigmoid(logits1)
prob_error11=-labels1*np.log(y_pred1)-(1-labels1)*np.log(1-y_pred1)
print(prob_error11)

print(".............")
with tf.Session() as sess:
    print(sess.run(tf.nn.sigmoid_cross_entropy_with_logits(labels=labels,logits=logits)))
    print(".............")
    print(sess.run(tf.nn.sigmoid_cross_entropy_with_logits(labels=labels1,logits=logits1)))

结果:你会发现第一个输出与第三个一致,第二个输出和第四个一致

[[1.67015613e-05 8.00033541e+00 7.00091147e+00]
 [1.00000454e+01 8.31528373e-07 3.04858735e+00]
 [1.31326169e+00 2.12692801e+00 1.81499279e-02]]
.............
[[1.31326169e+00 3.35406373e-04 7.00091147e+00]
 [4.53988992e-05 8.31528373e-07 3.04858735e+00]
 [1.31326169e+00 2.12692801e+00 1.81499279e-02]]
.............
2018-08-03 20:54:55.486212: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
[[1.67015613e-05 8.00033541e+00 7.00091147e+00]
 [1.00000454e+01 8.31528373e-07 3.04858735e+00]
 [1.31326169e+00 2.12692801e+00 1.81499279e-02]]
.............
[[1.31326169e+00 3.35406373e-04 7.00091147e+00]
 [4.53988992e-05 8.31528373e-07 3.04858735e+00]
 [1.31326169e+00 2.12692801e+00 1.81499279e-02]]

Process finished with exit code 0

之后再补上其他的计算代价的函数!!!

溢出案例:

其实也就是x是个很小的负数的时候,导致e^{-x}取到无穷大,那么log再取log之后很大。

代码如下:

import numpy as np
import tensorflow as tf
 
def sigmoid(x):
    return 1.0/(1+np.exp(-x))
 
labels=np.array([[1.,0.,0.],[0.,1.,0.],[0.,0.,1.]])
logits=np.array([[-800,-2.,-3],[-10.,-700.,-13.],[-1.,-2.,0]])
y_pred=sigmoid(logits)
prob_error1=-labels*np.log(y_pred)-(1-labels)*np.log(1-y_pred)
print("bad result:",prob_error1)
prob_error2=np.maximum(logits,0)-logits*labels+np.log(1+np.exp(-np.abs(logits)))
prob_error3=logits-logits*labels+np.log(1+np.exp(-logits))
print("good_result:",prob_error2)
print("bad result:",prob_error3)
 
with tf.Session() as sess:
    print("tf good result:")
    print(sess.run(tf.nn.sigmoid_cross_entropy_with_logits(labels=labels,logits=logits)))

实验结果:很清楚的看到,我自己按照上面推到写出来的优化代码得到的结果没有溢出,tf内置的函数也没有溢出,但是其他两个未优化的第一行第一列出现了inf。

 

 

  • 27
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值