softmax函數的作用 對於分類方面,softmax函數的作用是從樣本值計算得到該樣本屬於各個類別的概率大小。例如手寫數字識別,softmax模型從給定的手寫體圖片像素值得出這張圖片為數字0~9的概率值,這些概率值之和為1。預測的結果取最大的概率表示的數字作為這張圖片的分類。 可以從下麵這張圖理解 ...
softmax函數的作用
對於分類方面,softmax函數的作用是從樣本值計算得到該樣本屬於各個類別的概率大小。例如手寫數字識別,softmax模型從給定的手寫體圖片像素值得出這張圖片為數字0~9的概率值,這些概率值之和為1。預測的結果取最大的概率表示的數字作為這張圖片的分類。
\[ \left[\begin{matrix}temp_1\\temp_2\\temp_3\end{matrix}\right] =\left(\begin{matrix}W_{1,1}x_1+W_{1,2}x_2+W_{1,3}x_3+b_1\\ W_{2,1}x_1+W_{2,2}x_2+W_{2,3}x_3+b_2\\ W_{3,1}x_1+W_{3,2}x_2+W_{3,3}x_3+b_3\end{matrix}\right)\\ \left[\begin{matrix}y_1\\y_2\\y_3\end{matrix}\right] =softmax\left(\begin{matrix}temp_1\\ temp_2\\ temp_3\end{matrix}\right)\\ 其中y_i = softmax(temp_i) = \frac{exp(temp_i)}{\sum_{j=0}^{n}exp(temp_j)}\\ y_1,y_2,y_3分別表示該樣本屬於類別1,2,3的概率值。 \]
在神經網路中,通過訓練集訓練模型中的權重值W和偏置值b,來提高分類的準確性。
(訓練方法是定義一個損失函數(代表預測值與真實值之間的差異),然後採用梯度下降法(通過對W,b求偏導)來最小化這個損失函數,具體過程有點複雜,下麵只是直接拿tensorflow的函數來實現,後面有空的話再來補充原理)
用Tensorflow實現手寫數字識別
首先從tensorflow導入mnist數據集,裡面包含了手寫數字圖片的像素矩陣,以及這些圖片所對應的數字類別:
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
說明一下圖片的像素矩陣是將28x28壓平為[1x784]大小的向量;標簽是[1x10]的向量,其中某一個數是1,其餘全為0,比如說如果標簽表示的是數字5,那麼這個標簽向量為[0,0,0,0,1,0,0,0,0,0]。
構建模型:
x = tf.placeholder("float",[None,784])
#一個二維向量的占位符,None表示第一位可以是任意長度,784表示一張圖片壓平後的長度
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
#temp = x*W + b
#softmax(temp)得到一個[None,10]的向量,表示None個圖片可能代表0~9的概率。
y = tf.nn.softmax(tf.matmul(x,W)+b)
構建模型訓練過程:定義損失函數,最小化這個損失函數,從而得到W,b
y_ = tf.placeholder("float",[None,10])
#這裡用占位符來代表y_(每個圖片的真實類別),後面運行時會將真實類別填給占位符。
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
#y是模型的預測類別,y_是真實類別,用交叉熵來代表損失函數(說明預測值和真實值之間的差異)
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
#用梯度下降法來最小化損失函數
運行之前構造的模型:
init = tf.initialize_all_variables()#init表示初始化所有變數
sess = tf.Session()#啟動會話,用於運行模型
sess.run(init)#運行init才真正的使所有變數初始化
for i in range(1000):#訓練模型1000遍
batch_xs,batch_ys = mnist.train.next_batch(100)
#從數據集中取出100個樣本
sess.run(train_step, feed_dict={x:batch_xs, y_:batch_ys})
#將樣本填入之前定義的占位符,然後運行剛纔構建的訓練過程
評估模型:
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
#逐個判斷預測值和真實值是否相等,返回一個矩陣。
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
#tf.cast將bool型轉化為float型,reduce_mean計算平均值(即正確率)
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
#將測試集填入之前的占位符,運行之前的模型,得到正確率
輸出結果為:
0.9181
總結
tensorflow讓用戶先從更大的層面上構建模型,其中需要的數據先由占位符代替,然後在運行模型時再填入對應的數據。用戶不需要對具體運算過程一步步編程實現,使得神經網路的構建簡便了許多。
正在學習tensorflows時寫的筆記,歡迎評論探討!
參考網址:tensorflow中文社區