Tensorflow學習筆記:基礎(01)-Mnist手寫集最原始版

# 本篇主要用來認識Tensorflow實現神經網絡的一般流程,最簡單最原始的實現方法,不關注具體提升錯誤率技巧。

## Mnist數據集是![Yann LeCun](http://yann.lecun.com/exdb/mnist/)所提供的一個手寫數據集。

 

## 安裝數據集

可以下載到本地,也可以用Google的![Colaboratory](https://colab.research.google.com),Colaboratory 是免費的 Jupyter 筆記本環境,不需要進行任何設置就可以使用,並且完全在雲端運行。推薦使用它,記得搭梯子。

兩行代碼安裝:

import  tensorflow.examples.tutorials.mnist.input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

這個數據集中,總共有6w行訓練數據集,1w行測試數據集,每張圖片都是28*28的像素點矩陣。把這個二維矩陣展開成一維向量,長度是28*28=784.

在MNIST訓練數據集裏,訓練集圖片(mnist.train.images)是一個形狀爲[60000,784]的張量,第一個維度數字用來索引圖片,第二個維度數字用來索引每張圖片中的像素點。在此張量裏的每一個元素,都表示某張圖片裏的某個像素的強度值,值介於0和1之間。 

## 分類器使用softmax,具體原理見。。。

然後來實現一個最簡單的兩層全連接網絡來完成MNIST數據的分類問題,輸入層784個神經元,對應每張圖片784個像素點;輸出層十個神經元,對應0-9這10個數字,實現分類。

 

## 計算流程

1. 數據準備

2. 準備好placeholder

3. 初始化參數/權重

4. 計算預測結果

5. 計算損失值

6. 初始化優化器optimizer

7. 指定迭代次數,在session執行graph

 

## 代碼

1. 準備數據

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# 載入數據集
mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

# 每個批次送100張圖片
batch_size = 100
# 計算一共有多少個批次
n_batch = mnist.train.num_examples / batch_size

2. 準備好placeholder

x = tf.placeholder(tf.float32, [None, 784])
y = tf.placeholder(tf.float32, [None, 10])

3. 初始化參數、權重

W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

4. 計算預測結果

prediction = tf.nn.softmax(tf.matmul(x, W) + b)

5. 計算損失值

loss = tf.reduce_mean(tf.square(y - prediction))

6. 初始化優化器optimizer

learning_rate = 0.2
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

# 計算結果存在boolean list,argmax()函數返回一維張量中最大值所在的位置
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(prediction, 1))

# 計算準確率
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

7. 指定迭代次數

n_sample = xs.shape[0]
init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for epoch in range(21):
        for batch in range(n_batch):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            sess.run(optimizer, feed_dict={x: batch_xs, y:batch_ys})
        
        acc = sess.run(accuracy, feed_dict={x:mnist.test.images, y:mnist.test.label})
        if epoch % 2 == 0:
            print('Iter ' + str(epoch) + ',Testing Accuracy ' + str(acc))

一些可以優化的方向:

1. 增加神經網絡層數,添加隱層;

2. 將二次代價函數修改成交叉熵函數呢?

3. 嘗試多選幾個梯度下降優化器呢?

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