tf.nn.sparse_softmax_cross_entropy_with_logits()的内部计算的理解

探索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张量的正确形式。)
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()

下面是运行结果:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值