tensorflow: 交叉熵

按照tensorflow官方教程搭建好的一个model中的loss函数应该是采用如下的计算方法:

cross_entropy = -tf.reduce_sum(y_*tf.log(y))

其中,这个公式就是按照标准的交叉熵函数进行定义的,比较简陋,去掉了常数项系数,但是没改变总体的性质,所以算是基本交叉熵函数。

但是呢,tensorflow系统中提供了计算交叉熵函数的接口。

以下这两个函数:

①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)

两个函数的区别

以上两个函数,①是计算logits和label之间的交叉熵,并且直接给出softmax回归结果,其中要求label输入的格式是:类别,0,1,2,3,4,5,6,7,8,9(10个类的话)
②同样是计算logits和label之间的交叉熵,并给出softmax预测,但是与①的区别就是输入的label的格式必须是:
one-hot类型的变量,[0,0,0,1],[0,0,1,0],[0,1,0,0],[1,0,0,0](4个类别的话)


这几天在用TensorFlow搭建一个神经网络来做一个binary classifier,搭建一个典型的神经网络的基本思路是:

  • 定义神经网络的layers(层)以及初始化每一层的参数
  • 然后迭代:
    • 前向传播(Forward propagation)
    • 计算cost(Compute cost)
    • 反向传播(Backward propagation)
    • 更新参数(Update parameters)
  • 使用训练好的参数去做预测

在训练的时候发现了一个很奇怪的现象:每一次迭代所有的cost都为0。一开始以为是参数初始化出了问题,花了好多时间在上面。后来仔细研究了一下发现是最后一层的输出函数用错了,我用的是tf.nn.softmax_cross_entropy_with_logits来计算cost。 我们知道softmax一般是用来做multiclass classifier的,也就是输出的类别要大于两个。对于一个binary classifier而言,很明显我们要用sigmoid函数也就是tf.nn.sigmoid_cross_entropy_with_logits来计算cost,于是问题解决。


原文:

https://blog.csdn.net/zbzb1000/article/details/67634891

https://www.cnblogs.com/sddai/p/8526955.html


猜你喜欢

转载自blog.csdn.net/qq_25987491/article/details/80665603