1. 程式人生 > >tensorflow之損失函式:sparse_softmax_cross_entropy_with_logits 與 softmax_cross_entropy_with_logits的區別

tensorflow之損失函式:sparse_softmax_cross_entropy_with_logits 與 softmax_cross_entropy_with_logits的區別

原函式: 

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

tf.nn.softmax_cross_entropy_with_logits(
    _sentinel=None,
    labels=None,
    logits=None,
    dim=-1,
    name=None
)

1.sparse_softmax_cross_entropy_with_logits中 lables接受直接的數字標籤  如[1], [2], [3], [4] (型別只能為int32,int64) 

labels=tf.constant([0,1,2,3],dtype=tf.int32)
logits=tf.Variable(tf.random_normal([4,4]))
loss=tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels,logits=logits)
sess=tf.Session()
init=tf.global_variables_initializer()
sess.run(init)
print(sess.run(loss))

2.而softmax_cross_entropy_with_logits中 labels接受one-hot標籤  如[1,0,0,0], [0,1,0,0],[0,0,1,0], [0,0,0,1] (型別為int32, int64)

相當於sparse_softmax_cross_entropy_with_logits 對標籤多做一個one-hot動作

labels=tf.constant([[1,0,0,0], [0,1,0,0],[0,0,1,0], [0,0,0,1] ],dtype=tf.int32)
logits=tf.Variable(tf.random_normal([4,4]))
loss=tf.nn.softmax_cross_entropy_with_logits(labels=labels,logits=logits)
sess=tf.Session()
init=tf.global_variables_initializer()
sess.run(init)
print(sess.run(loss))

注意!!!上面兩個函式的返回值並不是一個數,而是一個向量,如果要求交叉熵,我們要再做一步tf.reduce_sum操作,就是對向量裡面所有元素求和,如果求loss,則要做一步tf.reduce_mean操作,對向量求均值!