[翻譯4.5] Softmax classification

在邏輯回歸問題中我們可以讓模型回答yes-no的問題?,F(xiàn)在如果是要回答多選擇性問題呢話要怎樣呢,比如:“你出生在哪里?波士頓?倫敦?還是悉尼?”

對于這一類問題,需要使用softMax函數(shù),它可以由邏輯回歸生成C類不同的值。


這個函數(shù)會返回它返回一個C成分的概率向量,填充著每個類別的輸出。由于是概率,所以C個元素相加以后的結果是1。這是因為公式是這樣構成的:每個可能的輸入數(shù)據(jù)示例必須屬于一個輸出類,覆蓋了100%個可能的例子。如果相加之后小于1,那就意味著可能有一些隱藏的類別;如果是大于1,那就意味著每個樣本不僅僅屬于一個類別。

我們可以去證明,當分類的數(shù)目是2個的話,輸出結果的概率和邏輯回歸模型的輸出一樣的。

現(xiàn)在,看看模型的代碼。你會發(fā)現(xiàn)和之前的模型在初始化的時候有很明顯的區(qū)別。由于我們的模型計算C個輸出,而不是一個,所以我們需要有C個不同的權重組,每組分配有一個。因此,我們會使用一個權重矩陣來代替權重向量。矩陣中的每一行代表每次輸入的特征值,同時會有一列代表輸出的類別。

我們準備使用softmax對鳶尾花(Iris flower)分類。你可以從https://archive.ics.uci.edu/ml/datasets/Iris中下載數(shù)據(jù)。該數(shù)據(jù)集合中包含了4個特征值,和三個可能的輸出類別結果。這三種結果分別對應著每一種花卉類型。所以,我們的矩陣應該是4*3大小的。

變量的初始化代碼如下:



當然,和你期待的一樣,Tensorflow中已經(jīng)內(nèi)嵌(embedded)了softmax函數(shù)的實現(xiàn):




關于(Regarding)loss的計算,和邏輯回歸(logistic regression)的一樣,同樣需要考慮擬合(fit)的候選loss function,因為這里輸出的也是概率。我們準備再次使用交叉熵(cross-entropy)來用于多分類的計算。

對于計算單個樣本i ,交叉熵應該是:







在訓練集合上,需要將每個樣本輸出類別對應的loss相加。注意Yc中等于1的元素應該是所期望的類別,而其余的應該是0.所以其實只有一個loss值被加上,這個loss是用來衡量模型中預測的分類和真事分類的距離。

現(xiàn)在需要根據(jù)訓練集合來計算所有的loss,我們需要對每次訓練樣本的loss求和:


在代碼的書寫上,Tensorflow有兩種版本來實現(xiàn)softMax的交叉熵:一種是優(yōu)化訓練集,使得每個樣本對應一個類別。例如,我們的訓練數(shù)據(jù)可能只有一個值“人”、“狗”、”樹”之類的值。我們用的是tf.nn.sparse_softmax_cross_entropy_with_logits.



另一個版本是允許你的數(shù)據(jù)集合中每個類別都有概率值?;蛘呃纾梢允褂糜柧殧?shù)據(jù),如“60%的被問及的人認為這張照片是關于狗,25%關于樹木,其余的人認為是“人””

這個時候需要用tf.nn.softmax_cross_entropy_with_logits.在真實生活中可能會用到這個函數(shù),但是我們不會在簡單的案例上使用它。稀疏(spare)版本也是可以用的,因為它的計算速度更快。(P.S.這里的稀疏版本指的就是第一個版本)。注意,模型的最終輸出將始終是一個單一的類值,而此版本只是為了支持更靈活的訓練數(shù)據(jù)。

來讓我們定義輸入方法。我們會再次利用“4.4節(jié)邏輯回歸”中read_csv函數(shù),但是這次調(diào)用的時候,默認值是適合我們的數(shù)據(jù)集的(我們的數(shù)據(jù)集都是數(shù)字,所以默認值也是數(shù)字):



我們不需要使用sparse_softmax_cross_entropy_with_logits來將每個類別轉換成新的變量(上一節(jié)的邏輯回歸是需要轉換的),但是我們需要將類別的值控制在0到2之間,因為我們只有三種可能性。在這個數(shù)據(jù)集合中,類別是字符串的值:“Iris-setosa”, “Iris-versicolor”, or “Iris-virginica”。 為了轉換他,我們用tf,pack來創(chuàng)建tensor,同時用tf.equal來對比。然后我們使用tf.argmax到tensor中找到真實值的位置,并且將其有效的轉化為0到2的整數(shù)。

訓練函數(shù)和之前的一樣,不必多說。

為了評估精確度,我們需要一種有明顯變化的sigmoid version:



預測模型會計算測試樣本中每個類別的概率。我們會使用tf.argmax函數(shù)來選擇一個最大可能性的類別作為預測的輸出值; 最后,我們會用tf.equal來和期望類別進行比較,并且與sigmoid實例一樣使用tf.reduce_mean。

代碼運行的準確率是96%;

PS:還有一小節(jié)就會結束,等把第四章翻譯完畢以后,我會把完整的代碼粘貼過來。如果有問題,請評論。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容