近日看《深度学习之tensorflow。。。》例7-1,作者用到了交叉熵计算损失,用S函数作为激活函数:原代码如下:
output =tf.nn.sigmoid( tf.matmul(input_features, W) + b)
cross_entropy = -(input_lables * tf.log(output) + (1 - input_lables) * tf.log(1 - output))
loss = tf.reduce_mean(cross_entropy)
实际上,tensoflow提供了四种交叉熵函数可以直接调用,而不必再构造交叉熵公式。结合S函数的交叉熵函数为:
sigmoid_cross_entropy_with_logits(期待值,计算值)
看下面的小例子,两种方式的交叉熵结果一致:
import tensorflow as tf
import numpy as np
t=np.random.multivariate_normal([2,2],[[1,0],[0,1]],5)
input_lables=np.random.multivariate_normal([2,2],[[1,0],[0,1]],5)
output=tf.nn.sigmoid(t)
loss=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=input_lables,logits=t))
cross=-(input_lables*tf.log(output)+(1-input_lables)*tf.log(1-output))
loss2=tf.reduce_mean(cross)
with tf.Session() as sess:
print(loss.eval())
print("----------------------")
print(loss2.eval())
所以原书7-1此部分代码可以改为:
loss=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=input_lables,logits=tf.matmul(input_features,W)+b))
当然,原书代码更清晰的表明了S型交叉熵的运行原理