手寫數字識別———Softmax回歸


參考教程:http://www.tensorfly.cn/tfdoc/tutorials/mnist_pros.html

安裝要求:

Spyder(Python3.5)

Anaconda

下載MNIST數據集

在網上下載數據集,放在"MNIST_data"文件下

from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
print("Download Done!") 

回歸模型

權重衰減

我們通過添加一個權重衰減項 \textstyle \frac{\lambda}{2} \sum_{i=1}^k \sum_{j=0}^{n} \theta_{ij}^2 來修改代價函數,這個衰減項會懲罰過大的參數值,現在我們的代價函數變為:


\begin{align}
J(\theta) = - \frac{1}{m} \left[ \sum_{i=1}^{m} \sum_{j=1}^{k} 1\left\{y^{(i)} = j\right\} \log \frac{e^{\theta_j^T x^{(i)}}}{\sum_{l=1}^k e^{ \theta_l^T x^{(i)} }}  \right]
              + \frac{\lambda}{2} \sum_{i=1}^k \sum_{j=0}^n \theta_{ij}^2
\end{align}


有了這個權重衰減項以后 (\textstyle \lambda > 0),代價函數就變成了嚴格的凸函數,這樣就可以保證得到唯一的解了。 此時的 Hessian矩陣變為可逆矩陣,並且因為\textstyle J(\theta)是凸函數,梯度下降法和 L-BFGS 等算法可以保證收斂到全局最優解。


為了使用優化算法,我們需要求得這個新函數 \textstyle J(\theta) 的導數,如下:


\begin{align}
\nabla_{\theta_j} J(\theta) = - \frac{1}{m} \sum_{i=1}^{m}{ \left[ x^{(i)} ( 1\{ y^{(i)} = j\}  - p(y^{(i)} = j | x^{(i)}; \theta) ) \right]  } + \lambda \theta_j
\end{align}


通過最小化 \textstyle J(\theta),我們就能實現一個可用的 softmax 回歸模型。

 

Softmax回歸與Logistic 回歸的關系

當類別數 \textstyle k = 2 時,softmax 回歸退化為 logistic 回歸。這表明 softmax 回歸是 logistic 回歸的一般形式。具體地說,當 \textstyle k = 2 時,softmax 回歸的假設函數為:


\begin{align}
h_\theta(x) &=

\frac{1}{ e^{\theta_1^Tx}  + e^{ \theta_2^T x^{(i)} } }
\begin{bmatrix}
e^{ \theta_1^T x } \\
e^{ \theta_2^T x }
\end{bmatrix}
\end{align}


利用softmax回歸參數冗余的特點,我們令 \textstyle \psi = \theta_1,並且從兩個參數向量中都減去向量 \textstyle \theta_1,得到:


\begin{align}
h(x) &=

\frac{1}{ e^{\vec{0}^Tx}  + e^{ (\theta_2-\theta_1)^T x^{(i)} } }
\begin{bmatrix}
e^{ \vec{0}^T x } \\
e^{ (\theta_2-\theta_1)^T x }
\end{bmatrix} \\


&=
\begin{bmatrix}
\frac{1}{ 1 + e^{ (\theta_2-\theta_1)^T x^{(i)} } } \\
\frac{e^{ (\theta_2-\theta_1)^T x }}{ 1 + e^{ (\theta_2-\theta_1)^T x^{(i)} } }
\end{bmatrix} \\

&=
\begin{bmatrix}
\frac{1}{ 1  + e^{ (\theta_2-\theta_1)^T x^{(i)} } } \\
1 - \frac{1}{ 1  + e^{ (\theta_2-\theta_1)^T x^{(i)} } } \\
\end{bmatrix}
\end{align}


因此,用 \textstyle \theta'來表示\textstyle \theta_2-\theta_1,我們就會發現 softmax 回歸器預測其中一個類別的概率為 \textstyle \frac{1}{ 1  + e^{ (\theta')^T x^{(i)} } },另一個類別概率的為 \textstyle 1 - \frac{1}{ 1 + e^{ (\theta')^T x^{(i)} } },這與 logistic回歸是一致的。

Softmax 回歸有一個不尋常的特點:它有一個“冗余”的參數集。為了便於闡述這一特點,假設我們從參數向量 \textstyle \theta_j 中減去了向量 \textstyle \psi,這時,每一個 \textstyle \theta_j 都變成了 \textstyle \theta_j - \psi(\textstyle j=1, \ldots, k)。此時假設函數變成了以下的式子:


\begin{align}
p(y^{(i)} = j | x^{(i)} ; \theta)
&= \frac{e^{(\theta_j-\psi)^T x^{(i)}}}{\sum_{l=1}^k e^{ (\theta_l-\psi)^T x^{(i)}}}  \\
&= \frac{e^{\theta_j^T x^{(i)}} e^{-\psi^Tx^{(i)}}}{\sum_{l=1}^k e^{\theta_l^T x^{(i)}} e^{-\psi^Tx^{(i)}}} \\
&= \frac{e^{\theta_j^T x^{(i)}}}{\sum_{l=1}^k e^{ \theta_l^T x^{(i)}}}.
\end{align}


換句話說,從 \textstyle \theta_j 中減去 \textstyle \psi 完全不影響假設函數的預測結果!這表明前面的 softmax 回歸模型中存在冗余的參數。更正式一點來說, Softmax 模型被過度參數化了。對於任意一個用於擬合數據的假設函數,可以求出多組參數值,這些參數得到的是完全相同的假設函數 \textstyle h_\theta


進一步而言,如果參數 \textstyle (\theta_1, \theta_2,\ldots, \theta_k) 是代價函數 \textstyle J(\theta) 的極小值點,那么 \textstyle (\theta_1 - \psi, \theta_2 - \psi,\ldots,
\theta_k - \psi) 同樣也是它的極小值點,其中 \textstyle \psi 可以為任意向量。因此使 \textstyle J(\theta) 最小化的解不是唯一的。(有趣的是,由於 \textstyle J(\theta) 仍然是一個凸函數,因此梯度下降時不會遇到局部最優解的問題。但是 Hessian 矩陣是奇異的/不可逆的,這會直接導致采用牛頓法優化就遇到數值計算的問題)


注意,當 \textstyle \psi = \theta_1 時,我們總是可以將 \textstyle \theta_1替換為\textstyle \theta_1 - \psi = \vec{0}(即替換為全零向量),並且這種變換不會影響假設函數。因此我們可以去掉參數向量 \textstyle \theta_1 (或者其他 \textstyle \theta_j 中的任意一個)而不影響假設函數的表達能力。實際上,與其優化全部的 \textstyle k\times(n+1) 個參數 \textstyle (\theta_1, \theta_2,\ldots, \theta_k) (其中 \textstyle \theta_j \in \Re^{n+1}),我們可以令 \textstyle \theta_1 =
\vec{0},只優化剩余的 \textstyle (k-1)\times(n+1) 個參數,這樣算法依然能夠正常工作。


在實際應用中,為了使算法實現更簡單清楚,往往保留所有參數 \textstyle (\theta_1, \theta_2,\ldots, \theta_n),而不任意地將某一參數設置為 0。但此時我們需要對代價函數做一個改動:加入權重衰減。權重衰減可以解決 softmax 回歸的參數冗余所帶來的數值問題。

Softmax 回歸 vs. k 個二元分類器

如果你在開發一個音樂分類的應用,需要對k種類型的音樂進行識別,那么是選擇使用 softmax 分類器呢,還是使用 logistic 回歸算法建立 k 個獨立的二元分類器呢?

這一選擇取決於你的類別之間是否互斥,例如,如果你有四個類別的音樂,分別為:古典音樂、鄉村音樂、搖滾樂和爵士樂,那么你可以假設每個訓練樣本只會被打上一個標簽(即:一首歌只能屬於這四種音樂類型的其中一種),此時你應該使用類別數 k = 4 的softmax回歸。(如果在你的數據集中,有的歌曲不屬於以上四類的其中任何一類,那么你可以添加一個“其他類”,並將類別數 k 設為5。)

如果你的四個類別如下:人聲音樂、舞曲、影視原聲、流行歌曲,那么這些類別之間並不是互斥的。例如:一首歌曲可以來源於影視原聲,同時也包含人聲 。這種情況下,使用4個二分類的 logistic 回歸分類器更為合適。這樣,對於每個新的音樂作品 ,我們的算法可以分別判斷它是否屬於各個類別。

現在我們來看一個計算視覺領域的例子,你的任務是將圖像分到三個不同類別中。(i) 假設這三個類別分別是:室內場景、戶外城區場景、戶外荒野場景。你會使用sofmax回歸還是 3個logistic 回歸分類器呢? (ii) 現在假設這三個類別分別是室內場景、黑白圖片、包含人物的圖片,你又會選擇 softmax 回歸還是多個 logistic 回歸分類器呢?

在第一個例子中,三個類別是互斥的,因此更適於選擇softmax回歸分類器 。而在第二個例子中,建立三個獨立的 logistic回歸分類器更加合適。

代碼實現

# -*- coding: utf-8 -*-
"""
Created on Wed Nov 29 19:40:50 2017

@author: 702
"""
#softmax 數字識別
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
print("Download Done!")

x = tf.placeholder(tf.float32, [None, 784])#784輸入圖片維度

# paras
W = tf.Variable(tf.zeros([784, 10]))       #權重 
b = tf.Variable(tf.zeros([10]))            #偏置

y = tf.nn.softmax(tf.matmul(x, W) + b)    #回歸模型計算每個分類概率值
y_ = tf.placeholder(tf.float32, [None, 10])

# loss func
#損失函數-目標類別和預測類別之間的交叉熵
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

# init
init = tf.initialize_all_variables()

sess = tf.Session()
sess.run(init)

# train
for i in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

correct_prediction = tf.equal(tf.arg_max(y, 1), tf.arg_max(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print (sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

  希望再學習下tensorflow中有tensorboard工具,進行網絡可視化。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM