一、TensorFLow完整樣例
在MNIST數據集上,搭建一個簡單神經網絡結構,一個包含ReLU單元的非線性化處理的兩層神經網絡。在訓練神經網絡的時候,使用帶指數衰減的學習率設置、使用正則化來避免過擬合、使用滑動平均模型來使得最終的模型更加健壯。
程序將計算神經網絡前向傳播的部分單獨定義一個函數inference,訓練部分定義一個train函數,再定義一個主函數main。
完整程序:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Thu May 25 08:56:30 2017 @author: marsjhao """ 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_RETE_BASE = 0.8 # 基學習率 LEARNING_RETE_DECAY = 0.99 # 學習率的衰減率 REGULARIZATION_RATE = 0.0001 # 正則化項的權重系數 TRAINING_STEPS = 10000 # 迭代訓練次數 MOVING_AVERAGE_DECAY = 0.99 # 滑動平均的衰減系數 # 傳入神經網絡的權重和偏置,計算神經網絡前向傳播的結果 def inference(input_tensor, avg_class, weights1, biases1, weights2, biases2): # 判斷是否傳入ExponentialMovingAverage類對象 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) # 定義存儲當前迭代訓練輪數的變量 # 定義ExponentialMovingAverage類對象 variable_averages = tf.train.ExponentialMovingAverage( MOVING_AVERAGE_DECAY, global_step) # 傳入當前迭代輪數參數 # 定義對所有可訓練變量trainable_variables進行更新滑動平均值的操作op 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) # 定義L2正則化器并對weights1和weights2正則化 regularizer = tf.contrib.layers.l2_regularizer(REGULARIZATION_RATE) regularization = regularizer(weights1) + regularizer(weights2) loss = cross_entropy_mean + regularization # 總損失值 # 定義指數衰減學習率 learning_rate = tf.train.exponential_decay(LEARNING_RETE_BASE, global_step, mnist.train.num_examples / BATCH_SIZE, LEARNING_RETE_DECAY) # 定義梯度下降操作op,global_step參數可實現自加1運算 train_step = tf.train.GradientDescentOptimizer(learning_rate)/ .minimize(loss, global_step=global_step) # 組合兩個操作op train_op = tf.group(train_step, variables_averages_op) ''''' # 與tf.group()等價的語句 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)) # 初始化回話sess并開始迭代訓練 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) # 驗證集待喂入數據 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): if i % 1000 == 0: validate_acc = sess.run(accuracy, feed_dict=validate_feed) print('After %d training steps, validation accuracy' ' using average model is %f' % (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('After %d training steps, test accuracy' ' using average model is %f' % (TRAINING_STEPS, test_acc)) # 主函數 def main(argv=None): mnist = input_data.read_data_sets("MNIST_data", one_hot=True) train(mnist) # 當前的python文件是shell文件執行的入口文件,而非當做import的python module。 if __name__ == '__main__': # 在模塊內部執行 tf.app.run() # 調用main函數并傳入所需的參數list
新聞熱點
疑難解答