這里給出的代碼是來自《Tensorflow實(shí)戰(zhàn)Google深度學(xué)習(xí)框架》,以供參考和學(xué)習(xí)。
首先這個示例應(yīng)用了幾個基本的方法:
使用隨機(jī)梯度下降(batch) 使用Relu激活函數(shù)去線性化 使用正則化避免過擬合 使用帶指數(shù)衰減的學(xué)習(xí)率 使用滑動平均模型來使模型更健壯 使用交叉熵?fù)p失函數(shù)來刻畫預(yù)測值和真實(shí)值之間的差距的損失函數(shù)
import tensorflow
as tf
from tensorflow.examples.tutorials.mnist
import input_data
"""
設(shè)置輸入和輸出節(jié)點(diǎn)的個數(shù),配置神經(jīng)網(wǎng)絡(luò)的參數(shù)
"""
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 """
定義輔助函數(shù)來計(jì)算前向傳播結(jié)果,使用ReLU做為激活函數(shù)
"""
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)
"""
定義訓(xùn)練過程
""" 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()
"""
主程序入口,這里設(shè)定模型訓(xùn)練次數(shù)為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()
運(yùn)行結(jié)果:
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
代碼中有每一行的詳細(xì)解釋,從運(yùn)行結(jié)果可以看出tensorflow隨著訓(xùn)練的進(jìn)行模型在驗(yàn)證集上的表現(xiàn)越來越好,最后是在測試集上的運(yùn)行效果。
本代碼有很多地方可以改進(jìn):可以參考Tensorflow 改進(jìn)的MNIST手寫體數(shù)字識別
總結(jié)
以上是生活随笔 為你收集整理的Tensorflow解决MNIST手写体数字识别 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。