tensorflow当中sigmoid以Softmax在交叉熵cross_entropy_with_logits中计算原理以及代码实证

来源:互联网 发布:网络广播电台软件 编辑:程序博客网 时间:2024/05/16 05:58

    总论:

        支持原创精神,转载请注明来源!

         sigmoid主要用于二分类问题,其计算定义当中含有非此即彼,而对于用于多分类的softmax则没有这种意思,理由如下

         注意的得,sigmiod和softmax计算有两步不一样,但是可以从在交叉熵的计算可以看出明显的区别,即sigmiod的非此即彼

      计算定义:

         sigmiod未知:
y = np.array([[1,0,0],[0,1,0],[0,0,1]]).astype(np.float64)logits = np.array([[12,3,2],[3,10,1],[1,2,5]]).astype(np.float64)y_logits = tf.nn.sigmoid(logits)cross_entropy1 = -(y*tf.log(y_logits)+(1-y)*tf.log(1-y_logits))#!!!!交叉熵cross_entropy2 = tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=logits)with tf.Session() as sess:    cross_entropy2 = sess.run(cross_entropy2)    cross_entropy1 = sess.run(cross_entropy1)    y_logits = sess.run(y_logits)    print(cross_entropy2 )    print(cross_entropy1)

可以看到 分解动作的cross_entropy和tf中sigmoid_cross_entropy_with_logits的运算结果是一样的,但是y_logits的值不知道如何计算,希望有大婶帮忙解说一下,所以整个sigmoid_cross_entropy_with_logits过程未完全分解成功!


         softmax如下:

         

import tensorflow as tfimport mathy_ = tf.constant([[0.0, 0.0, 1.0], [0.0, 0.0, 1.0], [0.0, 0.0, 1.0]]) #真实标签logits = tf.constant([[1.0, 2.0, 3.0], [1.0, 2.0, 3.0], [1.0, 2.0, 3.0]])#预测值y = tf.nn.softmax(logits)y_softmax = math.e**1/(math.e**1+math.e**2+math.e**3)cross_entropy2 = tf.nn.softmax_cross_entropy_with_logits(logits, y_)cross_entropy = -(y_ * tf.log(y))#!!!!!交叉熵with tf.session() as sess:      softmax = sess.run(y)      cross_entropy2 = sess.run( cross_entropy2 )      cross_entropy = sess.run(cross_entropy)      print(cross_entropy2 )      print(cross_entropy)
可以看到 分解动作的cross_entropy和tf中softmax_cross_entropy_with_logits的运算结果是一样的,注意到y_softmax的值等于cross_entropy[0,0]的值,所以整个softmax_cross_entropy_with_logits过程分解成功!

 
原创粉丝点击