tensorflow實現MNIST手寫數字識別

2021-10-23 20:03:12 字數 3757 閱讀 9714

mnist資料集是由0-9,10個手寫數字組成。訓練影象有60000張,測試影象有10000張。

from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("mnist_data/", one_hot = true)

one_hot表示獨熱碼,一種類似於二進位制的編碼,例如0-9一共10個數,那麼獨熱碼就為10位:

01 0 0 0 0 0 0 0 0 0

10 1 0 0 0 0 0 0 0 0

20 0 1 0 0 0 0 0 0 0

30 0 0 1 0 0 0 0 0 0

40 0 0 0 1 0 0 0 0 0

50 0 0 0 0 1 0 0 0 0

60 0 0 0 0 0 1 0 0 0

70 0 0 0 0 0 0 1 0 0

80 0 0 0 0 0 0 0 1 0

90 0 0 0 0 0 0 0 0 1

2、定義卷積計算函式

def weight_variable(shape):

initial = tf.truncated_normal(shape, stddev = 0.1)

return tf.variable(initial)

def bias_variable(shape):

initial = tf.constant(0.1, shape = shape)

return tf.variable(initial)

def conv2d(x, w):

return tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='same')

def max_pool_2*2(x):

return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='same')

3、構建第一層卷積

x_image = tf.reshape(x, [-1, 28, 28, 1])
第一層卷積:

w_conv1 = weight_variable([5, 5, 1, 32])

b_conv1 = bias_variable([32])

h_conv1 = tf.nn.relu(conv2d(x_image, w_conv1) + b_conv1)

h_pool1 = max_pool_2*2(h_conv1)

w_conv1中,卷積核大小位5*5, 通道數為1, 個數為32個。因此卷積後得到的output大小為28*28,通道數為32。

4、構建第二層卷積

w_conv2 = weight_variable([5, 5, 32, 64])

b_conv2 = bias_variable([64])

h_conv2 = tf.nn.relu(conv2d(h_pool1, w_conv2) + b_conv2)

h_pool2 = max_pool_2*2(h_conv2)

此時,因為前一層輸出為[-1, 28, 28, 32]的,所以卷積核的通道數應為32。

卷積核的個數等於output的通道數,input的通道數等於卷積核的通道數。

5、構建全連線層

w_fc1 = weight_variable([7, 7, 64, 1024])

b_fc1 = bias_variable([1024])

h_reshape = tf.reshape(h_pool2, [-1, 7, 7, 64])

h_fc1 = tf.nn.relu(tf.matmul(h_reshape, w_fc1) + b_fc1)

keep_prob = tf.placeholder(tf.float32)

h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

tf.placeholder為佔位符,相當於c語言中的變數宣告。

這層全連線層的作用是將上一層卷積層的輸出變成了1024維的列向量。

6、構建第二層全連線層

再新增一層全連線,將h_fc1_drop轉換成10維列向量,對應的就是10個類別的權重。

w_fc2 = weight_variable([1024, 10])

b_fc2 = bias_variable([10])

y_conv = tf.matmul(h_fc1_drop, w_fc2) + b_fc2

此時得到的y_conv就是softmax中的logit。

7、softmax & cross_entropy

輸出的類別的權重應該進行softmax得到其概率,再計算交叉熵。tensorflow中有tf.nn.softmax_cross_entropy_with_logits函式,同時將這兩步進行了。

cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))
8、定義反向傳播

train_step = tf.train.adamoptimizer(1e-4).minimize(cross_entropy)
使用反向傳播演算法不斷調節w和b引數的值,從而使得cross_entropy交叉熵的值最小,即損失最小。

9、計算準確率

predict_correct = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))

accuracy = tf.reduce_mean(tf.cast(predict_correct, tf.float32))

tf.equal()函式用來判斷兩個引數是否相等,tf.argmax()含義是取出陣列中最大值的下標。例如判斷5個樣本是否相等,假如第1,2,3個樣本相等,4,5個樣本不想等,則tf.equal()得到的值為[true, true, true, false, false]。

tf.cast()則是將**的n個樣本對應的true或false值改為float32,即[1.0, 1.0, 1.0, 0.0, 0.0]。

tf.reduce_mean()則是計算陣列中所有元素的平均值,相當於得到了模型的**準確率。

10、訓練

tensorflow需要建立session來進行訓練。

sess = tf.interactivesession()

sess.run(tf.global_variables_initializer()) #初始化

for train_step_num in range(30000):

batch_x, batch_y = mnist.train.next(100) #每次從訓練集中選100個進行訓練,即每次訓練100張,batch=100

train_step.run(feed_dict=)

tensorflow教程學習三深入MNIST

載入資料 from tensorflow.examples.tutorials.mnist import input data mnist input data.read data sets mnist data one hot true 我們使用interactivesession類可以更加靈活地...

Python keras神經網路識別mnist

上次用matlab寫過乙個識別mnist的神經網路,位址在 這次又用keras做了乙個差不多的,畢竟,現在最流行的專案都是python做的,我也跟一下潮流 資料是從本地解析好的影象和標籤載入的。神經網路有兩個隱含層,都有512個節點。import numpy as np from keras.pre...

Python keras神經網路識別mnist

上次用matlab寫過乙個識別mnist的神經網路,位址在 這次又用keras做了乙個差不多的,畢竟,現在最流行的專案都是python做的,我也跟一下潮流 資料是從本地解析好的影象和標籤載入的。神經網路有兩個隱含層,都有512個節點。import numpy as np from keras.pre...