這里給出的代碼是來自《Tensorflow實戰Google深度學習框架》,以供參考和學習。
首先這個示例應用了幾個基本的方法:
使用隨機梯度下降(batch) 使用Relu激活函數去線性化 使用正則化避免過擬合 使用帶指數衰減的學習率 使用滑動平均模型來使模型更健壯 使用交叉熵損失函數來刻畫預測值和真實值之間的差距的損失函數
import tensorflow
as tf
from tensorflow.examples.tutorials.mnist
import input_data
"""
設置輸入和輸出節點的個數,配置神經網絡的參數
"""
INPUT_NODE =
784
OUTPUT_NODE =
10
LAYER1_NODE =
500
BATCH_SIZE =
100
LEARNING_RATE_BASE =
0.8
LEARNING_RATE_DECAY =
0.99
REGULARAZTION_RATE =
0.0001
TRAINING_STEPS =
5000
MOVING_AVERAGE_DECAY =
0.99 """
定義輔助函數來計算前向傳播結果,使用ReLU做為激活函數
"""
def inference (input_tensor, avg_class, weights1, biases1, weights2, biases2) :if avg_class ==
None :layer1 = tf.nn.relu(tf.matmul(input_tensor, weights1) + biases1)
return tf.matmul(layer1, weights2) + biases2
else :layer1 = tf.nn.relu(tf.matmul(input_tensor, avg_class.average(weights1)) + avg_class.average(biases1))
return tf.matmul(layer1, avg_class.average(weights2)) + avg_class.average(biases2)
"""
定義訓練過程
""" def train (mnist) :x = tf.placeholder(tf.float32, [
None , INPUT_NODE], name=
'x-input' )y_ = tf.placeholder(tf.float32, [
None , OUTPUT_NODE], name=
'y-input' )weights1 = tf.Variable(tf.truncated_normal([INPUT_NODE, LAYER1_NODE], stddev=
0.1 )) biases1 = tf.Variable(tf.constant(
0.1 , shape=[LAYER1_NODE])) weights2 = tf.Variable(tf.truncated_normal([LAYER1_NODE, OUTPUT_NODE], stddev=
0.1 )) biases2 = tf.Variable(tf.constant(
0.1 , shape=[OUTPUT_NODE])) y = inference(x,
None , weights1, biases1, weights2, biases2)global_step = tf.Variable(
0 , trainable=
False )variable_averages = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step) variables_averages_op = variable_averages.apply(tf.trainable_variables())average_y = inference(x, variable_averages, weights1, biases1, weights2, biases2)cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_,
1 )) cross_entropy_mean = tf.reduce_mean(cross_entropy) regularizer = tf.contrib.layers.l2_regularizer(REGULARAZTION_RATE) regularaztion = regularizer(weights1) + regularizer(weights2)loss = cross_entropy_mean + regularaztionlearning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE, global_step, mnist.train.num_examples / BATCH_SIZE, LEARNING_RATE_DECAY, staircase=
True ) train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)
with tf.control_dependencies([train_step, variables_averages_op]): train_op = tf.no_op(name=
'train' )correct_prediction = tf.equal(tf.argmax(average_y,
1 ), tf.argmax(y_,
1 )) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
with tf.Session()
as sess:tf.global_variables_initializer().run()validate_feed = {x: mnist.validation.images, y_: mnist.validation.labels}test_feed = {x: mnist.test.images, y_: mnist.test.labels}
for i
in range(TRAINING_STEPS+
1 ):
if i %
1000 ==
0 : validate_acc = sess.run(accuracy, feed_dict=validate_feed)print(
"After %d training step(s), validation accuracy using average model is %g " % (i, validate_acc))xs,ys=mnist.train.next_batch(BATCH_SIZE)sess.run(train_op,feed_dict={x:xs,y_:ys})test_acc=sess.run(accuracy,feed_dict=test_feed)print(
'...................................................' )print((
"After %d training step(s), test accuracy using average model is %g" %(TRAINING_STEPS, test_acc)))summary_writer = tf.summary.FileWriter(
"log_mnist" , sess.graph)summary_writer.close()
"""
主程序入口,這里設定模型訓練次數為5000次""" def main (argv=None) :MNIST_data_folder=
"Mnist/" mnist = input_data.read_data_sets(MNIST_data_folder, one_hot=
True )print(
'...................................................' )
print (
"Training data size: " , mnist.train.num_examples)
print (
"Validating data size: " , mnist.validation.num_examples)
print (
"Testing data size: " , mnist.test.num_examples) train(mnist)
if __name__==
'__main__' :main()
運行結果:
Extracting Mnist/train
-images -idx3 -ubyte . gz
Extracting Mnist/train
-labels -idx1 -ubyte . gz
Extracting Mnist/t10k
-images -idx3 -ubyte . gz
Extracting Mnist/t10k
-labels -idx1 -ubyte . gz
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
Training
data size:
55000
Validating
data size:
5000
Testing
data size:
10000
After
0 training step(s), validation accuracy using
average model is
0.075
After
1000 training step(s), validation accuracy using
average model is
0.9758
After
2000 training step(s), validation accuracy using
average model is
0.9818
After
3000 training step(s), validation accuracy using
average model is
0.9834
After
4000 training step(s), validation accuracy using
average model is
0.9828
After
5000 training step(s), validation accuracy using
average model is
0.9838
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
After
5000 training step(s), test accuracy using
average model is
0.9835
代碼中有每一行的詳細解釋,從運行結果可以看出tensorflow隨著訓練的進行模型在驗證集上的表現越來越好,最后是在測試集上的運行效果。
本代碼有很多地方可以改進:可以參考Tensorflow 改進的MNIST手寫體數字識別
總結
以上是生活随笔 為你收集整理的Tensorflow解决MNIST手写体数字识别 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。