本篇主要是總結(jié)一下我們常用的計(jì)算loss的方法和使用技巧缅叠。
1汗洒、tf.nn.sigmoid_cross_entropy_with_logits
sigmoid_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
name=None
)
說明:labels和logits必須有相同的type和shape粟判,該方法可以用于多目標(biāo)問題虱而,如判斷一張圖片中是否包含人痹筛、狗氨肌、樹等鸿秆,即對(duì)應(yīng)的label包含多個(gè)1。但是output不是一個(gè)數(shù)怎囚,而是一個(gè)batch中每個(gè)樣本的loss,所以一般配合tf.reduce_mean(loss)使用卿叽。
#coding=utf8
import tensorflow as tf
a = tf.constant([[1,2,3],[4,5,6]],tf.float32)
y3 = tf.constant([[1,0,0],[0,1,1]],tf.float32)
loss3 = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=y3,logits=a))
with tf.Session() as sess:
print('loss3',sess.run(loss3))
2、tf.nn.softmax_cross_entropy_with_logits
softmax_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
dim=-1,
name=None
)
說明:labels和logits有相同的shape恳守,適用于單目標(biāo)問題考婴,如判斷一張圖片是貓、狗還是人催烘,即label中只有一個(gè)位置對(duì)應(yīng)的是1沥阱,其余全為0。
#coding=utf8
import tensorflow as tf
a = tf.constant([[1,2,3],[4,5,6]],tf.float32)
y1 = tf.constant([[0,0,1],[0,1,0]],tf.int32)
loss1 = tf.nn.softmax_cross_entropy_with_logits(labels=y1,logits=a)
with tf.Session() as sess:
print('loss1',sess.run(loss1))
3伊群、tf.nn.sparse_softmax_cross_entropy_with_logits
sparse_softmax_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
name=None
)
說明:labels的shape為[batch_size],且labels的值不能超過n_classes考杉,logits的shape為[batch_size,n_classes],它和tf.nn.softmax_cross_entropy_with_logits的實(shí)現(xiàn)原理基本一樣舰始,只是后者在額外的做了one_hot編碼崇棠,前者把這一過程寫在了內(nèi)部,有更優(yōu)的方式丸卷。
#coding=utf8
import tensorflow as tf
a = tf.constant([[1,2,3],[4,5,6]],tf.float32)
y2 = tf.constant([0,1],tf.int32)
loss2 = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y2,logits=a)
with tf.Session() as sess:
print('loss2',sess.run(loss2))
4枕稀、tf.nn.weighted_cross_entropy_with_logits
weighted_cross_entropy_with_logits(
targets,
logits,
pos_weight,
name=None
)
說明:這個(gè)loss我還沒有用過,是sigmoid_cross_entropy_with_logits的拓展版,輸入?yún)?shù)和實(shí)現(xiàn)和后者差不多萎坷,可以多支持一個(gè)pos_weight參數(shù)凹联,目的是可以增加或者減小正樣本在算Cross Entropy時(shí)的Loss。
除上面的一些計(jì)算loss的方法外哆档,還有一些專門處理loss的方法蔽挠,自己還沒有這么用過,具體功能和用法后面再補(bǔ)起來虐呻,先列出來象泵。
tf.losses.add_loss ##添加一個(gè)計(jì)算出來的loss到總的loss集合中
tf.losses.get_regularization_loss ##計(jì)算正則化loss
tf.losses.get_total_loss ##計(jì)算所有的loss寞秃,以包含上面的regular損失
參考文章:
https://weibo.com/ttarticle/p/show?id=2309404047468714166594
http://blog.csdn.net/QW_sunny/article/details/72885403