机器学习:分类器介绍
目錄
文章目錄
- 目錄
- 一 softmax 簡(jiǎn)介
- 二 cross_entropy
- 三 tensorflow中計(jì)算cross_entropy的方式
- (1)自己使用公式計(jì)算
- (2)Softmax交叉熵,label使用one_hot編碼
- (3)Softmax交叉熵,labels不使用one_hot編碼
- (4)sigmoid交叉熵,激活函數(shù)使用sigmoid
一 softmax 簡(jiǎn)介
計(jì)算loss時(shí),預(yù)測(cè)值要與真實(shí)值分布在相同的數(shù)據(jù)區(qū)間內(nèi),例如真實(shí)值在[0,1]區(qū)間內(nèi),那么神經(jīng)網(wǎng)絡(luò)的預(yù)測(cè)值最好也要在相同的區(qū)間(0,1)內(nèi);這樣在計(jì)算loss是才會(huì)有較好的效果。
在做二分類時(shí),可在網(wǎng)絡(luò)的輸出層使用激活函數(shù)sigmoid(),將輸出壓縮在(0,1)區(qū)間,
softmax可看做是對(duì)sigmoid的擴(kuò)展,是用于多分類的激活函數(shù),softmax就是將網(wǎng)絡(luò)的輸出轉(zhuǎn)化成對(duì)應(yīng)類別的概率值;
二 cross_entropy
交叉熵(KL散度)是統(tǒng)計(jì)學(xué)中兩個(gè)數(shù)據(jù)分布差異的一直度量;
其中p(x)是labels,q(x)是logits
三 tensorflow中計(jì)算cross_entropy的方式
目前主流的深度學(xué)習(xí)開發(fā)框架為Tensorflow,這一節(jié)將對(duì)如何在tensorflow中使用上述方法作一個(gè)簡(jiǎn)短的介紹。
(1)自己使用公式計(jì)算
soft_max = tf.nn.softmax(logits)
cross_entropy = -tf.reduce_sum(labels*tf.log(soft_max),1)
loss = tf.reduce_mean(cross_entropy)
上面,cross_entropy是一個(gè)shape是[batch_size]的tensor,而loss是shape是1的數(shù)值,需要使用tf.reduce_sum()或者tf.reduce_mean()計(jì)算當(dāng)前batch_size的總交叉熵loss,或者平均交叉熵loss;
或者不指定tf.reduce_sum()的axis,直接求當(dāng)前batch的交叉熵總和作為loss
soft_max = tf.nn.softmax(logits)
loss = -tf.reduce_sum(labels*tf.log(soft_max))
tips:tf.reduce_sum()默認(rèn)是計(jì)算輸入tensor的總和,指定axis時(shí),會(huì)按照指定的軸進(jìn)行求和;(2)Softmax交叉熵,label使用one_hot編碼
使用tf.nn.softmax_cross_entropy_with_logits(logits,onehot_labels,name=None)
適用于每個(gè)類別獨(dú)立并且相互排斥,也就是每張圖片自能屬于一種類別
輸入:logits和labels必須具有相同的shape,和dtype。labels必須是one-hot編碼形式。
輸出:shape=[batch_size]的交叉熵cross_entropy
此函數(shù)會(huì)做兩件事:
對(duì)網(wǎng)絡(luò)輸出使用softmax,轉(zhuǎn)化成總和為1,對(duì)應(yīng)于各個(gè)類別的概率值 使用交叉熵公式計(jì)算cross_entropy,此時(shí)cross_entropy是shape=[batch_size],可以認(rèn)為是batch中每個(gè)圖片的交叉熵的值;同時(shí)要注意與tf.losses.softmax_cross_entropy(logits,onehot_labels)的區(qū)別, tf.losses.softmax_cross_entropy()返回的是平均交叉熵的值,相當(dāng)于在tf.nn.softmax_cross_entropy_with_logits()后加上tf.reduce_mean()對(duì)交叉熵求平均,
此函數(shù)會(huì)做三件事:
對(duì)網(wǎng)絡(luò)輸出使用softmax,轉(zhuǎn)化成總和為1,對(duì)應(yīng)于各個(gè)類別的概率值 使用交叉熵公式計(jì)算cross_entropy,此時(shí)cross_entropy是shape=[batch_size],可以認(rèn)為是batch中每個(gè)圖片的交叉熵的值; 使用tf.reduce_mean(cross_entropy)計(jì)算平均交叉熵(3)Softmax交叉熵,labels不使用one_hot編碼
使用tf.nn.sparse_softmax_cross_entropy_with_logits(logits,labels,name=None)
適用于每個(gè)類別獨(dú)立并且相互排斥
輸入:logits[batch_size,num_classes],label是從0開始代表類別的整形數(shù)組,必須是非one-hot編碼
輸入:shape=[batch_size]的交叉熵cross_entropy
tf.losses.sparse_softmax_cross_entropy()也是相當(dāng)于在tf.nn.sparse_softmax_cross_entropy_with_logits后加上tf.reduce_mean對(duì)列表求均值;
(4)sigmoid交叉熵,激活函數(shù)使用sigmoid
使用tf.nn.sigmoid_cross_entropy_with_logits(logits,labels,name=None)
適用于每個(gè)類別相互獨(dú)立,并且不相互排斥,也就是說每個(gè)圖片可以屬于多個(gè)類別;
輸入:logits,labels 必須具有相同的shape和type
輸出:shape=[batch_size,num_classes]當(dāng)前batch中網(wǎng)絡(luò)輸出節(jié)點(diǎn)每個(gè)節(jié)點(diǎn)的cross_entropy
用sigmoid做分類原本只能用于二分類,例如,網(wǎng)絡(luò)輸出節(jié)點(diǎn)1個(gè),使用sigmoid函數(shù)將網(wǎng)絡(luò)輸出壓縮至(0,1)范圍內(nèi),用0和1代表兩個(gè)類別;
將sigmoid擴(kuò)展至多分類,例如假設(shè)num_classes=10,對(duì)一張圖片中包含的數(shù)字(0~9)做分類(一張圖片可能包含多種數(shù)字),標(biāo)簽label可能是(1,0,1,1,0,0,1,0,1,0)(圖片包含0,2,3,6,8,數(shù)字),那么將網(wǎng)絡(luò)的輸出節(jié)點(diǎn)設(shè)置為10,對(duì)于每個(gè)節(jié)點(diǎn)使用都sigmoid激活函數(shù)來做二分類,判斷是/不是當(dāng)前類別;如第一個(gè)輸出節(jié)點(diǎn)判別是否包含數(shù)字1,第二個(gè)判別是否包含數(shù)字2…
loss使用交叉熵cross_entropy=-labels(tf.log(sigmoid(logits)))-(1-labels(tf.log(1-sigmoid(logits))))
或者使用tf.nn.sigmoid_cross_entropy_with_logits(logits,labels,name=None)
loss = tf.reduce_mean(cross_entropy)
或者使用tf.losses.sigmoid_cross_entropy()直接求平均交叉熵loss。
tips:softmax激活函數(shù)會(huì)使用所用的輸出節(jié)點(diǎn)一起來計(jì)算屬于每個(gè)類別的概率,而sigmoid激活函數(shù)只針對(duì)當(dāng)前節(jié)點(diǎn),返回包含當(dāng)前節(jié)點(diǎn)類別的概率,此函數(shù)會(huì)做兩件事:
對(duì)網(wǎng)絡(luò)輸出使用sigmoid, 使用交叉熵公式計(jì)算cross_entropy總結(jié)
以上是生活随笔為你收集整理的机器学习:分类器介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell与python的优劣_论pyt
- 下一篇: Kaggle问题总结1