# 本篇主要用來認識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. 嘗試多選幾個梯度下降優化器呢?