计算softmax交叉熵损失的几个方法
import numpy as np
import tensorflow as tf
#numpy version
labels = np.array([[0, 0, 1],
[0, 1, 0],
[1, 0, 0],
[1, 0, 0],
[0, 1, 0]], dtype=np.float32)
#logits是np.dot(X,W)的结果
logits = np.array([[1, 2, 7],
[3, 5, 2],
[6, 1, 3],
[8, 2, 0],
[3, 6, 1]], dtype=np.float32)
#softmax不改变输入数据的维度
def softmax(logits):
return np.exp(logits)/(np.sum(np.exp(logits),1).reshape(-1,1))
losslist=-np.sum(np.multiply(labels,np.log(softmax(logits))),1)
total_loss=np.average(losslist)
print(losslist)
print(total_loss)
#tensorflow version1
losslist_tf1 = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)
total_loss_tf1 = tf.reduce_mean(losslist_tf1)
with tf.Session()as sess:
sess.run(tf.global_variables_initializer())
print(sess.run([losslist_tf1,total_loss_tf1]))
#tensorflow version2
losslist_tf2=-tf.reduce_sum(tf.multiply(labels,tf.log(tf.nn.softmax(logits=logits))),1)
total_loss_tf2=tf.reduce_mean(losslist_tf2)
with tf.Session()as sess:
sess.run(tf.global_variables_initializer())
print(sess.run([losslist_tf2,total_loss_tf2]))
#tensorflow version3
numlabels=tf.argmax(labels,1)
losslist_tf3 = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=numlabels, logits=logits)
total_loss_tf3 = tf.reduce_mean(losslist_tf1)
with tf.Session()as sess:
sess.run(tf.global_variables_initializer())
print(sess.run([losslist_tf3,total_loss_tf3]))
四个版本最后输出都是
[array([ 0.00917445, 0.16984604, 0.05498521, 0.00281022, 0.05498521], dtype=float32), 0.05836023]