对于分类问题的误差,我们一般采用计算交叉熵的方法。
交叉熵(Cross Entropy)损失函数公式:
基于TensorFlow函数手工实现交叉熵
import tensorflow as tf
def entropy_func(y,y_hat):
#参数y是分类问题的真实标签,one-hot编码后的nX1矩阵;y_hat是预测的标签,softmax的结果
softmax_data = tf.placeholder(tf.float32)
onehot_data = tf.placeholder(tf.float32)
loss = (-1) *
tf.reduce_sum(tf.multiply(onehot_data,tf.log(softmax_data)))
#tf.reduce_sum()函数输入一个序列,返回它们的和
#tf.log()函数返回所输入值的自然对数
cross_entropy = tf.cast(loss,dtype=tf.float32)
with tf.Session() as sess:
output =
sess.run(cross_entropy,feed_dict={softmax_data:y_hat,onehot_data:y})
return output
y = [1.0,0.0,0.0]
y_hat = [0.659,0.242,0.099]
entropy_func(y,y_hat)
结果:
0.41703176
基于TensorFlow中交叉熵API接口实现
import tensorflow as tf
def entropy_api(y,y_hat):
#参数y是分类问题的真实标签,one-hot编码后的nX1矩阵;y_hat是预测的标签,logits的结果
logits_data = tf.placeholder(tf.float32)
onehot_data = tf.placeholder(tf.float32)
cross_entropy =
tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits_data,labels=y))
with tf.Session() as sess:
output = sess.run(cross_entropy,feed_dict={logits_data:y_hat,onehot_data:y})
return output
y_hat = [1.2,0.9,0.4]
y = [1,0,0]
entropy_api(y,y_hat)
结果:
0.78396875
注意,API接口中的参数是logits结果,不是softmax。