本文實例為大家分享了基于Tensorflow的MNIST手寫數字識別分類的具體實現代碼,供大家參考,具體內容如下
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
import tensorflow as tf import numpy as np from tensorflow.examples.tutorials.mnist import input_data from tensorflow.contrib.tensorboard.plugins import projector import time IMAGE_PIXELS = 28 hidden_unit = 100 output_nums = 10 learning_rate = 0.001 train_steps = 50000 batch_size = 500 test_data_size = 10000 #日志目錄(這里根據自己的目錄修改) logdir = 'D:/Develop_Software/Anaconda3/WorkDirectory/summary/mnist' #導入mnist數據 mnist = input_data.read_data_sets( 'MNIST_data' , one_hot = True ) #全局訓練步數 global_step = tf.Variable( 0 , name = 'global_step' , trainable = False ) with tf.name_scope( 'input' ): #輸入數據 with tf.name_scope( 'x' ): x = tf.placeholder( dtype = tf.float32, shape = ( None , IMAGE_PIXELS * IMAGE_PIXELS)) #收集x圖像的會總數據 with tf.name_scope( 'x_summary' ): shaped_image_batch = tf.reshape( tensor = x, shape = ( - 1 , IMAGE_PIXELS, IMAGE_PIXELS, 1 ), name = 'shaped_image_batch' ) tf.summary.image(name = 'image_summary' , tensor = shaped_image_batch, max_outputs = 10 ) with tf.name_scope( 'y_' ): y_ = tf.placeholder(dtype = tf.float32, shape = ( None , 10 )) with tf.name_scope( 'hidden_layer' ): with tf.name_scope( 'hidden_arg' ): #隱層模型參數 with tf.name_scope( 'hid_w' ): hid_w = tf.Variable( tf.truncated_normal(shape = (IMAGE_PIXELS * IMAGE_PIXELS, hidden_unit)), name = 'hidden_w' ) #添加獲取隱層權重統計值匯總數據的匯總操作 tf.summary.histogram(name = 'weights' , values = hid_w) with tf.name_scope( 'hid_b' ): hid_b = tf.Variable(tf.zeros(shape = ( 1 , hidden_unit), dtype = tf.float32), name = 'hidden_b' ) #隱層輸出 with tf.name_scope( 'relu' ): hid_out = tf.nn.relu(tf.matmul(x, hid_w) + hid_b) with tf.name_scope( 'softmax_layer' ): with tf.name_scope( 'softmax_arg' ): #softmax層參數 with tf.name_scope( 'sm_w' ): sm_w = tf.Variable( tf.truncated_normal(shape = (hidden_unit, output_nums)), name = 'softmax_w' ) #添加獲取softmax層權重統計值匯總數據的匯總操作 tf.summary.histogram(name = 'weights' , values = sm_w) with tf.name_scope( 'sm_b' ): sm_b = tf.Variable(tf.zeros(shape = ( 1 , output_nums), dtype = tf.float32), name = 'softmax_b' ) #softmax層的輸出 with tf.name_scope( 'softmax' ): y = tf.nn.softmax(tf.matmul(hid_out, sm_w) + sm_b) #梯度裁剪,因為概率取值為[0, 1]為避免出現無意義的log(0),故將y值裁剪到[1e-10, 1] y_clip = tf.clip_by_value(y, 1.0e - 10 , 1 - 1.0e - 5 ) with tf.name_scope( 'cross_entropy' ): #使用交叉熵代價函數 cross_entropy = - tf.reduce_sum(y_ * tf.log(y_clip) + ( 1 - y_) * tf.log( 1 - y_clip)) #添加獲取交叉熵的匯總操作 tf.summary.scalar(name = 'cross_entropy' , tensor = cross_entropy) with tf.name_scope( 'train' ): #若不使用同步訓練機制,使用Adam優化器 optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate) #單步訓練操作, train_op = optimizer.minimize(cross_entropy, global_step = global_step) #加載測試數據 test_image = mnist.test.images test_label = mnist.test.labels test_feed = {x:test_image, y_:test_label} with tf.name_scope( 'accuracy' ): prediction = tf.equal(tf.argmax( input = y, axis = 1 ), tf.argmax( input = y_, axis = 1 )) accuracy = tf.reduce_mean( input_tensor = tf.cast(x = prediction, dtype = tf.float32)) #創建嵌入變量 embedding_var = tf.Variable(test_image, trainable = False , name = 'embedding' ) saver = tf.train.Saver({ 'embedding' :embedding_var}) #創建元數據文件,將MNIST圖像測試集對應的標簽寫入文件 def CreateMedaDataFile(): with open (logdir + '/metadata.tsv' , 'w' ) as f: label = np.nonzero(test_label)[ 1 ] for i in range (test_data_size): f.write( '%d\n' % label[i]) #創建投影配置參數 def CreateProjectorConfig(): config = projector.ProjectorConfig() embeddings = config.embeddings.add() embeddings.tensor_name = 'embedding:0' embeddings.metadata_path = logdir + '/metadata.tsv' projector.visualize_embeddings(writer, config) #聚集匯總操作 merged = tf.summary.merge_all() #創建會話的配置參數 sess_config = tf.ConfigProto( allow_soft_placement = True , log_device_placement = False ) #創建會話 with tf.Session(config = sess_config) as sess: #創建FileWriter實例 writer = tf.summary.FileWriter(logdir = logdir, graph = sess.graph) #初始化全局變量 sess.run(tf.global_variables_initializer()) time_begin = time.time() print ( 'Training begin time: %f' % time_begin) while True : #加載訓練批數據 batch_x, batch_y = mnist.train.next_batch(batch_size) train_feed = {x:batch_x, y_:batch_y} loss, _, summary = sess.run([cross_entropy, train_op, merged], feed_dict = train_feed) step = global_step. eval () #如果step為100的整數倍 if step % 100 = = 0 : now = time.time() print ( '%f: global_step = %d, loss = %f' % ( now, step, loss)) #向事件文件中添加匯總數據 writer.add_summary(summary = summary, global_step = step) #若大于等于訓練總步數,退出訓練 if step > = train_steps: break time_end = time.time() print ( 'Training end time: %f' % time_end) print ( 'Training time: %f' % (time_end - time_begin)) #測試模型精度 test_accuracy = sess.run(accuracy, feed_dict = test_feed) print ( 'accuracy: %f' % test_accuracy) saver.save(sess = sess, save_path = logdir + '/embedding_var.ckpt' ) CreateMedaDataFile() CreateProjectorConfig() #關閉FileWriter writer.close() |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/qq_40579095/article/details/88804019