Tensorflow—softmax_cross_entropy_with_logits的用法

研究人工智能,图像算法也有两三年了,也写过很多代码,但是每次研究dl算法的时候,肯定都会写一句:

tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)

这其实就是损失函数的构建~
今天花了点时间总结了下我对这个api的理解~~

计算公式

先讲下它的计算公式:
在这里插入图片描述
下面举个例子来说明下进行交叉熵损失函数的计算过程~

import tensorflow as tf

#假设有一个3*3的样本,即三个样本,每个样本有三个特征
logits = tf.constant([[2,7,5],[6,3,4],[7,5,6]],dtype=tf.float32)

#同时,设置三个样本的标签,[0,1,2],将其进行one-hot转换
labels = [[0,1,0],[1,0,0],[0,0,1]]

#先对logits进行sotfmax
res1 = tf.nn.softmax(logits)

# 对第一步的结果取log
res2 = tf.log(res1)

# 计算交叉熵损失
res3 = tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=labels)

# 求出交叉熵损失后再对各个样本的交叉熵损失取平均
res4 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=labels))

with tf.Session() as sess:
    res1,res2,res3,res4 = sess.run([res1,res2,res3,res4])
    print(res1)
    print(res2)
    print(res3)
    print(res4)

总结一下计算过程:

# 先对logits进行sotfmax
# 对第一步的结果取log
# 计算交叉熵损失
# 求出交叉熵损失后再对各个样本的交叉熵损失取平均

tf.nn.softmax_cross_entropy_with_logits与tf.nn.sigmoid_cross_entropy_with_logits的区别

在前者中,在计算交叉熵损失函数的时候,是进行softmax,但是在后者中,是针对每个样本的每个特征单独做一个sigmoid.

a = tf.constant([1,2,3],tf.float32)

res_sig = tf.nn.sigmoid(a)
res_soft = tf.nn.softmax(a)

with tf.Session() as sess:
    print('res_sig:',res_sig.eval())
    print('res_soft:',res_soft.eval())
    
'''
运行结果:
res_sig: [0.7310586  0.880797   0.95257413] 对一个样本中三维特征分别做了一个sigmoid函数,转换后的结果相加之和不为0
res_soft: [0.09003057 0.24472848 0.66524094] 对一个样本做了一个softmax函数,转换后相加等于0
'''

总结:
tf.nn.sigmoid_cross_entropy_with_logits:一般用于多标签分类情况的损失函数(一个样本可能属于多个类别)
softmax_cross_entropy_with_logits:一般用于单标签分类情况的损失函数(一个样本仅属于一个类别)

****ps: mean_squared_error:以实际值和预测值之间的差值平方和作为损失函数的值, 也称为L2损失函数,用于标签是回归类型的~
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐