探索tf.nn.sparse_softmax_cross_entropy_with_logits,
def sparse_softmax_cross_entropy_with_logits(
_sentinel=None, # pylint: disable=invalid-name
labels=None,
logits=None,
name=None):
它求得是张量最后一维与标签的交叉熵,再对最后一维求和。(其中,labels参数是一维的张量,元素是对应的索引,转换为对应的列表再求交叉熵。比如labels是[1,2],那么列表就是[[0,1,0],[0,0,1]]下面是labels张量的正确形式。)
![](https://i-blog.csdnimg.cn/blog_migrate/d00cb5283a16fe60eb85dd6edf2a1bd9.png)
tf.nn.sparse_softmax_cross_entropy_with_logits(),放在图片上,就是对一个像素深度方向的向量,与对应的标签做交叉熵,再求一个像素深度方向交叉熵的和。loss值是对所有像素点的交叉熵和取平均。一句话说,就是像素点上求交叉熵的和, 像素间求上一步的平均数。实验代码如下:
import tensorflow as tf
import numpy as np
sess = tf.InteractiveSession()
def index_to_list(index):
list = np.zeros([2,3], dtype=int)
for j in range(2):
for i in range(3):
if i == index[j]:
list[j][i] = 1
else:
list[j][i] = 0
return list
# index = [1, 2]
# c = index_to_list(index)
# print(c)
a = tf.placeholder(tf.float32, [2,3])
b = tf.placeholder(tf.int64, [2])
aa = [[1.0, 2.0, 3.0], [2.0, 1.0, 3.0]]
bb = [2,1]
cross_entropy = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=a, labels=b))
c = sess.run(cross_entropy, feed_dict={a:[[1.0, 2.0, 3.0], [2.0, 1.0, 3.0]], b:[2, 1]})
a_softmax = tf.nn.softmax(aa)
b_list = index_to_list(bb)
loss = tf.reduce_mean(-tf.reduce_sum(b_list*tf.log(a_softmax), axis=1))
print(sess.run(loss))
print(c)
sess.close()
下面是运行结果: