在深度学习的编程题里面经常出现的一个函数.下面的文字是大致翻译于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是个很小的负数的时候,导致取到无穷大,那么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。