Tensorflow入門教程-1

詳細參見我的獨立博客 http://shuaizhang.tech/2016/11/29/Tensorflow%E6%95%99%E7%A8%8B1-MNIST/

該教程大部分的材料來自tensorflow官網tensorflow.

MNIST數據描述

MNIST數據是一個非常經典的機器學習的數據集,它是一個圖片數據集,每張有一個手寫的阿拉伯數字從0到9,該數據集地址爲MNIST, 在Python當中,我們可以使用代碼來導入數據,代碼如下:
{% highlight python %}
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(“MNIST_data/”, one_hot=True)
{% endhighlight %}

MNIST數據有三個部分,訓練數據(55000條 mnist.train), 測試數據(10000條 mnist.test)以及驗證數據(5000條 mnist.validation),這個樣的數量分割其實是非常重要的。在做模型訓練和測試的時候,一般會將數據按照一定的比例(比如8-2法則)分割。
MNIST的每張圖片有28×28個像素,相對真實的圖片數據這個已經很簡化了,看圖片示例:
1

mnist.train.images 類型爲tensor數據維度爲[55000,28*28]; mnist.train.labels的維度爲[55000,10],這裏的10意思:假如這個數字代表9,則爲[0,0,0,0,0,0,0,0,0,1]

Softmax迴歸

如果不瞭解softmax,可以先回顧一下sigmoid,sigmoid用在分類結果只有2個的情況下,softmax用在分類結果有很多種的情況下,詳細參見softmax,下圖給出了整個神經網絡的結構:
2

其中W代表權重,b代表bias,softmax對計算出來的結果再進行一次處理,將其映射到0到9不同的標籤上面去

3

計算公式爲:
\(y=softmax(Wx+b)\)

代碼實現

{% highlight python %}
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
import argparse
import sys

FLAGS = None

def main(_):
mnist = input_data.read_data_sets(FLAGS.data_dir,one_hot=True)

x = tf.placeholder(tf.float32,[None, 784])
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
y = tf.matmul(x,W) + b #matmul means matrix multiplication

#defince the loss and optimizer
y_ = tf.placeholder(tf.float32,[None,10])

cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y,y_))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)#o.5  is learning rate

sess = tf.InteractiveSession()

#train
tf.global_variables_initializer().run()

for _ in range(1000): # we will run the train step 1000 times
    batch_xs, batch_ys = mnist.train.next_batch(100) # batch size, for each iteration, we only use 100 points of the dataset
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})


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

if name == ‘main‘:
parser = argparse.ArgumentParser()
parser.add_argument(‘–data_dir’, type=str, default=’dataset’, help=”Directory for storing data”)
FLAGS, unparsed = parser.parse_known_args()
tf.app.run(main = main, argv=[sys.argv[0]] + unparsed)

{% endhighlight %}

下面,我們對上面代碼中存在疑問的地方進行解釋

  • placeholder

這個我們可以理解爲佔位符,後面的feed_dict中我們要給他具體的值,否則會報錯,例如上面代碼中我們有x和\(y\_\)兩個placeholder,因此,需要在feed_dict中給出他們的具體值

  • matmul

這個代表矩陣相乘,因爲tensorflow需要適應GPU的運算,所以我們不能再使用python的Numpy的適合CPU的運算方法,因爲tensorflow定義了一套自己的運算

  • Learning rate

代碼中的0.5, learning rate就是梯度下降算法中的,每一步向下走的距離,可以參考梯度下降算法

  • batch size

代碼中的100, batch size是stochastic gradient descent-隨機梯度下降算法中特有的,傳統的梯度下降一次需要訓練非常多的數據,所以運算複雜度非常高,因此我們在訓練的時候每次都只是取其中的一部分來進行訓練,batch size就是取出來的數據量的大小。想想我們總共只有55000條數據,但是我們循環了1000次,每次100條,總共有100000條數據了,所以其中肯定是有重複的訓練的數據。

我的最後的訓練結果爲0.91918,每次訓練都不一樣,將參數換一下訓練的結果也會不一樣,有興趣的可以自己調試一下!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章