1. 程式人生 > >87、使用TensorBoard進行可視化學習

87、使用TensorBoard進行可視化學習

哈哈哈 tput sco 而在 封裝 結果 average 實現 machine

1、還是以手寫識別為類,至於為什麽一直用手寫識別這個例子,原因很簡單,因為書上只給出了這個類子呀,哈哈哈,好神奇

下面是可視化學習的標準函數

‘‘‘
Created on 2017年5月23日

@author: weizhen
‘‘‘
import os
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#minist_inference中定義的常量和前向傳播的函數不需要改變,
#因為前向傳播已經通過tf.variable_scope實現了計算節點按照網絡結構的劃分
import
mnist_inference from mnist_train import MOVING_AVERAGE_DECAY, REGULARAZTION_RATE, LEARNING_RATE_BASE, BATCH_SIZE, LEARNING_RATE_DECAY,TRAINING_STEPS,MODEL_SAVE_PATH,MODEL_NAME INPUT_NODE = 784 OUTPUT_NODE =10 LAYER1_NODE = 500 def train(mnist): #將處理輸入數據集的計算都放在名子為"input"的命名空間下 with tf.name_scope("
input"): x=tf.placeholder(tf.float32, [None,mnist_inference.INPUT_NODE], name=x-input) y_=tf.placeholder(tf.float32,[None,mnist_inference.OUTPUT_NODE],name=y-cinput) regularizer = tf.contrib.layers.l2_regularizer(REGULARAZTION_RATE) y=mnist_inference.inference(x, regularizer) global_step
= tf.Variable(0,trainable=False) #將滑動平均相關的計算都放在名為moving_average的命名空間下 with tf.name_scope("moving_average"): variable_averages= tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step) variable_averages_op=variable_averages.apply(tf.trainable_variables()) #將計算損失函數相關的計算都放在名為loss_function的命名空間下 with tf.name_scope("loss_function"): 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) loss = cross_entropy_mean+tf.add_n(tf.get_collection(losses)) #將定義學習率、優化方法以及每一輪訓練需要執行的操作都放在名子為"train_step"的命名空間下 with tf.name_scope("train_step"): learning_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,variable_averages_op]): train_op=tf.no_op(name=train) # 初始化Tensorflow持久化類 saver = tf.train.Saver() with tf.Session() as sess: tf.global_variables_initializer().run() # 在訓練過程中不再測試模型在驗證數據上的表現,驗證和測試的過程將會有一個獨立的程序來完成 for i in range(TRAINING_STEPS): xs, ys = mnist.train.next_batch(BATCH_SIZE) _, loss_value, step = sess.run([train_op, loss, global_step], feed_dict={x:xs, y_:ys}) # 每1000輪保存一次模型 if i % 1000 == 0: # 輸出當前訓練情況。這裏只輸出了模型在當前訓練batch上的損失函數大小 # 通過損失函數的大小可以大概了解訓練的情況。在驗證數據集上的正確率信息 # 會有一個單獨的程序來生成 print("After %d training step(s),loss on training batch is %g" % (step, loss_value)) # 保存當前的模型。註意這裏給出了global_step參數,這樣可以讓每個被保存模型的文件末尾加上訓練的輪數 # 比如"model.ckpt-1000"表示訓練1000輪之後得到的模型 saver.save(sess, os.path.join(MODEL_SAVE_PATH, MODEL_NAME), global_step=global_step) #將當前的計算圖輸出到TensorBoard日誌文件 writer=tf.summary.FileWriter("/path/to/log",tf.get_default_graph()) writer.close() def main(argv=None): mnist = input_data.read_data_sets("/tmp/data",one_hot=True) train(mnist) if __name__==__main__: tf.app.run()

下面是封裝mnist_inference和mnist_train的函數

‘‘‘
Created on Apr 21, 2017

@author: P0079482
‘‘‘
#-*- coding:utf-8 -*-
import tensorflow as tf
#定義神經網絡結構相關的參數
INPUT_NODE=784
OUTPUT_NODE=10
LAYER1_NODE=500

#通過tf.get_variable函數來獲取變量。在訓練神經網絡時會創建這些變量:
#在測試時會通過保存的模型加載這些變量的取值。而且更加方便的是,因為可以在變量加載時
#將滑動平均變量重命名,所以可以直接通過同樣的名字在訓練時使用變量自身,
#而在測試時使用變量的滑動平均值。在這個函數中也會將變量的正則化損失加入損失集合
def get_weight_variable(shape,regularizer):
    weights =tf.get_variable("weights",shape,initializer=tf.truncated_normal_initializer(stddev=0.1))
    #當給出了正則化生成函數時,將當前變量的正則化損失加入名字為losses的集合。
    #在這裏使用了add_to_collection函數將一個張量加入一個集合,而這個集合的名稱為losses
    #這是自定義的集合,不在Tensorflow自動管理的集合列表中
    if regularizer!=None:
        tf.add_to_collection(losses,regularizer(weights))
    return weights

#定義神經網絡的前向傳播過程
def inference(input_tensor,regularizer):
    #聲明第一層神經網絡的變量並完成前向傳播過程
    with tf.variable_scope(layer1):
        #這裏通過tf.get_variable或tf.Variable沒有本質區別,
        #因為在訓練或是測試中沒有在同一個程序中多次調用這個函數,如果在同一個程序中多次調用,在第一次調用之後
        #需要將reuse參數設置為True
        weights=get_weight_variable([INPUT_NODE,LAYER1_NODE], regularizer)
        biases = tf.get_variable("biases", [LAYER1_NODE], initializer=tf.constant_initializer(0.0))
        layer1=tf.nn.relu(tf.matmul(input_tensor,weights)+biases)
    #類似地聲明第二層神經網絡的變量並完成前向傳播過程
    with tf.variable_scope(layer2):
        weights=get_weight_variable([LAYER1_NODE,OUTPUT_NODE], regularizer)
        biases=tf.get_variable("biases",[OUTPUT_NODE],initializer=tf.constant_initializer(0.0))
        layer2=tf.matmul(layer1,weights)+biases
    #返回最後前向傳播的結果
    return layer2

#在上面這段代碼中定義了神經網絡的前向傳播算法。無論是訓練還是測試時
#都可以直接調用inference這個函數,而不用關心具體的神經網絡結構
#使用定義好的前行傳播過程,以下代碼給出了神經網絡的訓練程序mnist_train.py

mnist_train

‘‘‘
Created on 2017年4月21日

@author: weizhen
‘‘‘
import os
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# 加載mnist_inference.py中定義的常量和前向傳播的函數
import mnist_inference

# 配置神經網絡的參數
BATCH_SIZE = 100
LEARNING_RATE_BASE = 0.8
LEARNING_RATE_DECAY = 0.99
REGULARAZTION_RATE = 0.0001
TRAINING_STEPS = 30000
MOVING_AVERAGE_DECAY = 0.99

# 模型保存的路徑和文件名
MODEL_SAVE_PATH = "/path/to/model/"
MODEL_NAME = "model.ckpt"

def train(mnist):
    # 定義輸入輸出placeholder
    x = tf.placeholder(tf.float32, [None, mnist_inference.INPUT_NODE], name=x-input)
    y_ = tf.placeholder(tf.float32, [None, mnist_inference.OUTPUT_NODE], name=y-input)
    
    regularizer = tf.contrib.layers.l2_regularizer(REGULARAZTION_RATE)
    # 直接使用mnist_inference.py中定義的前向傳播過程
    y = mnist_inference.inference(x, regularizer)
    global_step = tf.Variable(0, trainable=False)
    
    # 和5.2.1小節樣例中類似地定義損失函數、學習率、滑動平均操作以及訓練過程
    variable_averages = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)
    variable_averages_op = variable_averages.apply(tf.trainable_variables())
    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)
    loss = cross_entropy_mean + tf.add_n(tf.get_collection(losses))
    learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE, global_step, mnist.train.num_examples / BATCH_SIZE, LEARNING_RATE_DECAY)
    train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step);
    with tf.control_dependencies([train_step, variable_averages_op]):
        train_op = tf.no_op(name=train)
    
    # 初始化Tensorflow持久化類
    saver = tf.train.Saver()
    with tf.Session() as sess:
        tf.initialize_all_variables().run()
        
        # 在訓練過程中不再測試模型在驗證數據上的表現,驗證和測試的過程將會有一個獨立的程序來完成
        for i in range(TRAINING_STEPS):
            xs, ys = mnist.train.next_batch(BATCH_SIZE)
            _, loss_value, step = sess.run([train_op, loss, global_step], feed_dict={x:xs, y_:ys})
            
            # 每1000輪保存一次模型
            if i % 1000 == 0:
                # 輸出當前訓練情況。這裏只輸出了模型在當前訓練batch上的損失函數大小
                # 通過損失函數的大小可以大概了解訓練的情況。在驗證數據集上的正確率信息
                # 會有一個單獨的程序來生成
                print("After %d training step(s),loss on training batch is %g" % (step, loss_value))
                
                # 保存當前的模型。註意這裏給出了global_step參數,這樣可以讓每個被保存模型的文件末尾加上訓練的輪數
                # 比如"model.ckpt-1000"表示訓練1000輪之後得到的模型
                saver.save(sess, os.path.join(MODEL_SAVE_PATH, MODEL_NAME), global_step=global_step)
    
    

def main(argv=None):
    mnist = input_data.read_data_sets("/tmp/data", one_hot=True)
    train(mnist)

if __name__ == __main__:
    tf.app.run()
    

最後train的結果如下所示

Extracting /tmp/data\train-images-idx3-ubyte.gz
Extracting /tmp/data\train-labels-idx1-ubyte.gz
Extracting /tmp/data\t10k-images-idx3-ubyte.gz
Extracting /tmp/data\t10k-labels-idx1-ubyte.gz
2017-05-24 07:40:30.908053: W c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasnt compiled to use SSE instructions, but these are available on your machine and could speed up CPU computations.
2017-05-24 07:40:30.908344: W c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasnt compiled to use SSE2 instructions, but these are available on your machine and could speed up CPU computations.
2017-05-24 07:40:30.908752: W c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasnt compiled to use SSE3 instructions, but these are available on your machine and could speed up CPU computations.
2017-05-24 07:40:30.909048: W c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasnt compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
2017-05-24 07:40:30.909327: W c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasnt compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
2017-05-24 07:40:30.909607: W c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasnt compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
2017-05-24 07:40:30.910437: W c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasnt compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.
2017-05-24 07:40:30.910691: W c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasnt compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.
After 1 training step(s),loss on training batch is 3.28252
After 1001 training step(s),loss on training batch is 0.186328
After 2001 training step(s),loss on training batch is 0.159306
After 3001 training step(s),loss on training batch is 0.137241
After 4001 training step(s),loss on training batch is 0.116301
After 5001 training step(s),loss on training batch is 0.114999
After 6001 training step(s),loss on training batch is 0.0968591
After 7001 training step(s),loss on training batch is 0.0888067
After 8001 training step(s),loss on training batch is 0.0787699
After 9001 training step(s),loss on training batch is 0.0755315
After 10001 training step(s),loss on training batch is 0.0674159
After 11001 training step(s),loss on training batch is 0.0618796
After 12001 training step(s),loss on training batch is 0.0608711
After 13001 training step(s),loss on training batch is 0.0582478
After 14001 training step(s),loss on training batch is 0.0588126
After 15001 training step(s),loss on training batch is 0.0474006
After 16001 training step(s),loss on training batch is 0.0472533
After 17001 training step(s),loss on training batch is 0.0463238
After 18001 training step(s),loss on training batch is 0.0504166
After 19001 training step(s),loss on training batch is 0.0397931
After 20001 training step(s),loss on training batch is 0.041655
After 21001 training step(s),loss on training batch is 0.0377509
After 22001 training step(s),loss on training batch is 0.0416359
After 23001 training step(s),loss on training batch is 0.0402487
After 24001 training step(s),loss on training batch is 0.0356911
After 25001 training step(s),loss on training batch is 0.0344556
After 26001 training step(s),loss on training batch is 0.0394917
After 27001 training step(s),loss on training batch is 0.0356403
After 28001 training step(s),loss on training batch is 0.0413135
After 29001 training step(s),loss on training batch is 0.0347861

可視化學習的過程,將log寫在/path/to/log 文件夾下面,然後tensorboard去讀取這個log

C:\Users\weizhen>tensorboard --logdir=/path/to/log

技術分享

上面是layer1

技術分享

上面是layer2

技術分享

上面是loss_function

技術分享

上面是moving_average

技術分享

上面是train_step

技術分享

上面是整體的結構tensorBoard

87、使用TensorBoard進行可視化學習