交叉熵(cross-entropy)

原理

1.为什么使用交叉熵作为代价函数地址:https://www.zhihu.com/question/65288314

2.理解交叉熵作为损失函数在神经网络的作用:https://blog.youkuaiyun.com/chaipp0607/article/details/73392175

说实话2的解释,讲述了一个数据的处理流程,好像没有牵涉到理论,讲的浅显易懂,结合下面的代码是极好的。

代码

代码参考地址:https://zhuanlan.zhihu.com/p/27842203

我将代码合在下面两个片段中了,

第一个讲解的是softmax函数的作用

import tensorflow as tf
import numpy as np

#logits数据,就是神经网络中输出的结果。
logits = np.array([[1, 2, 7],
                   [3, 5, 2],
                   [6, 1, 3],
                   [8, 2, 0],
                   [3, 6, 1]], dtype=np.float32)

predicts = tf.nn.softmax(logits=logits, dim=-1)
with tf.Session() as sess:
    print(sess.run(predicts))

输出:

[[  2.45611509e-03   6.67641265e-03   9.90867496e-01]
 [  1.14195190e-01   8.43794703e-01   4.20100652e-02]
 [  9.46499169e-01   6.37746137e-03   4.71234173e-02]
 [  9.97193694e-01   2.47179624e-03   3.34521203e-04]
 [  4.71234173e-02   9.46499169e-01   6.37746137e-03]]

第二个是交叉熵

import tensorflow as tf
import numpy as np

labels = np.array([[0, 0, 1],
                   [0, 1, 0],
                   [1, 0, 0],
                   [1, 0, 0],
                   [0, 1, 0]], dtype=np.float32)

logits = np.array([[1, 2, 7],
                   [3, 5, 2],
                   [6, 1, 3],
                   [8, 2, 0],
                   [3, 6, 1]], dtype=np.float32)

#手动求交叉熵
labels = tf.clip_by_value(labels, 1e-10, 1.0)
predicts = tf.clip_by_value(predicts, 1e-10, 1.0)
cross_entropy = tf.reduce_sum(labels * tf.log(labels/predicts), axis=1)

#使用tf.nn.softmax_cross_entropy_with_logits()求交叉熵
cross_entropy2 = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=labels)


#使用tf.nn.sparse_softmax_cross_entropy_with_logits求交叉熵
classes = tf.argmax(labels, axis=1)  # 顺着列(axis=1)的方向取得所有列相应的分量的最大值的下标,返回的是一个shape=(len(labels),)的向量
cross_entropy3 = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, 
                                                                labels=classes)

with tf.Session() as sess:
    #手动求交叉熵
    loss1 = sess.run(cross_entropy)
    print(loss1)
    
    #使用tf.nn.softmax_cross_entropy_with_logits()求交叉熵
    loss2 = sess.run(cross_entropy2)
    print(loss2)
    
    ##使用tf.nn.sparse_softmax_cross_entropy_with_logits求交叉熵
    loss3 = sess.run(cross_entropy3)
    print(loss3)

输出:

[ 0.00917445  0.16984604  0.05498521  0.00281022  0.05498521]
[ 0.00917445  0.16984604  0.05498521  0.00281022  0.05498521]
[ 0.00917445  0.16984604  0.05498521  0.00281022  0.05498521]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值