Tensorflow---softmax_cross_entropy_with_logits的用法
Tensorflow—softmax_cross_entropy_with_logits的用法研究人工智能,图像算法也有两三年了,也写过很多代码,但是每次研究dl算法的时候,肯定都会写一句:tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)这其实就是损失函数的构建~今天花了点时间总结了下我对这个api的理解~~计算公
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损失函数,用于标签是回归类型的~
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)