看**:
1import
tensorflow as tf
2from tensorflow.examples.tutorials.mnist import
input_data34
#5 mnist = input_data.read_data_sets('
mnist_data/
', one_hot =true)67
#建立session
8 sess =tf.session()910
#佔位符
11 x = tf.placeholder(tf.float32, shape=[none, 784]) #
每張28*28,共784個畫素
12 y_ = tf.placeholder(tf.float32, shape=[none, 10]) #
輸出為0-9共10個數字,其實就是把分為10類
1314
#權重初始化
15def
weight_variable(shape):
16 initial = tf.truncated_normal(shape, stddev=0.1) #
使用截尾正態分佈的隨機數初始化權重,標準偏差是0.1(噪音)
17return
tf.variable(initial)
1819
defbias_variable(shape):
20 initial = tf.constant(0.1, shape = shape) #
使用乙個小正數初始化偏置,避免出現偏置總為0的情況
21return
tf.variable(initial)
2223
#卷積和集合
24def conv2d(x, w): #
計算2d卷積
25return tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='
same')
2627
def max_pool_2x2(x): #
計算最大集合
28return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='
same')
2930
#第一層卷積
31 w_conv1 = weight_variable([5, 5, 1, 32]) #
為每個5*5小塊計算32個特徵
32 b_conv1 = bias_variable([32])
3334 x_image = tf.reshape(x, [-1, 28, 28, 1]) #
將畫素轉換為4維tensor,其中二三維是寬高,第四維是畫素
35 h_conv1 = tf.nn.relu(conv2d(x_image, w_conv1) +b_conv1)
36 h_pool1 =max_pool_2x2(h_conv1)
3738
#第二層卷積
39 w_conv2 = weight_variable([5, 5, 32, 64])
40 b_conv2 = bias_variable([64])
4142 h_conv2 = tf.nn.relu(conv2d(h_pool1, w_conv2) +b_conv2)
43 h_pool2 =max_pool_2x2(h_conv2)
4445
#密集層
46 w_fc1 = weight_variable([7 * 7 * 64, 1024]) #
建立1024個神經元對整個進行處理
47 b_fc1 = bias_variable([1024])
4849 h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
50 h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1) +b_fc1)
5152
#退出(為了減少過度擬合,在讀取層前面加退出層,僅訓練時有效)
53 keep_prob =tf.placeholder(tf.float32)
54 h_fc1_drop =tf.nn.dropout(h_fc1, keep_prob)
5556
#讀取層(最後我們加乙個像softmax表示式那樣的層)
57 w_fc2 = weight_variable([1024, 10])
58 b_fc2 = bias_variable([10])
5960 y_conv = tf.matmul(h_fc1_drop, w_fc2) +b_fc2
6162
#**類和損失函式
63 cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv)) #
計算偏差平均值
64 train_step = tf.train.adamoptimizer(1e-4).minimize(cross_entropy) #
每一步訓練
6566#評估
67 correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
68 accuracy =tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
69sess.run(tf.global_variables_initializer())
7071
for i in range(1000):
72 batch = mnist.train.next_batch(50)
73if i%10 ==0:
74 train_accuracy = accuracy.eval(feed_dict=, session = sess) #
每10次訓練計算一次精度
75print("
步數 %d, 精度 %g
"%(i, train_accuracy))
76 train_step.run(feed_dict=, session =sess)
7778#關閉
79 sess.close()
執行上面的**後輸出:
extracting mnist_data/train-images-idx3-ubyte.gz
extracting mnist_data/train-labels-idx1-ubyte.gz
extracting mnist_data/t10k-images-idx3-ubyte.gz
extracting mnist_data/t10k-labels-idx1-ubyte.gz
步數 0, 精度 0.12
步數 10, 精度 0.34
步數 20, 精度 0.52
步數 30, 精度 0.56
步數 40, 精度 0.6
步數 50, 精度 0.74
步數 60, 精度 0.74
步數 70, 精度 0.78
步數 80, 精度 0.82
步數 900, 精度 0.96
步數 910, 精度 0.98
步數 920, 精度 0.96
步數 930, 精度 0.98
步數 940, 精度 0.98
步數 950, 精度 0.9
步數 960, 精度 0.98
步數 970, 精度 0.9
步數 980, 精度 1
步數 990, 精度 0.9
可以看到,使用卷積神經網路訓練1000次可以讓精度達到95%以上,據說訓練20000次精度可以達到99.2%以上。由於cpu不行,太耗時間,就不訓練那麼多了。大家可以跟使用softmax訓練識別手寫數字進行對比。《07 訓練tensorflow識別手寫數字》
參考資料
1、deep mnist for experts:
mnist手寫體識別 卷積神經網路
coding utf 8 通過卷積神經網路進行 author elijah 引入資料集 from tensorflow.examples.tutorials.mnist import input data import tensorflow as tf mnist input data.read d...
使用神經網路識別手寫數字
神經網路和深度學習為影象識別 語音識別 自然語言處理等問題提供了目前最好的解決方案。本書主要會介紹神經網路和深度學習背後關鍵的概念。更多關於本書的細節,請參考這裡。或者您可以直接從第一章開始學習。本專案是neural networks and deep learning的中文翻譯,原文作者 mich...
使用神經網路識別手寫數字
最近在看michael nielsen的 neural network and deep learning 嘗試復現書中的 但這本書的 貌似用的python2.0,所以在執行的時候,報了好多錯誤,在這裡進行記錄一下。1 載入mnist資料集出錯 unicodedecodeerror ascii co...