12 使用卷積神經網路識別手寫數字

2022-07-05 01:39:13 字數 4045 閱讀 3145

看**:

1

import

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...