Python學習記錄-FIFOQueue ...

Tensorflow

  1. tf.FIFOQueue

    FIFOQueue類基於基類QueueBase.QueueBase主要包含入列(enqueue)和出列(dequeue)兩個操作.enqueue操作返回計算圖中的一個Operation節點,dequeue操作返回一個Tensor值.Tensor在創建時同樣只是一個定義,需要放在Session中運行才能獲得真正的數值.
    引用來源

    #!/usr/bin/python
    # coding:utf-8
    
    # 隊列與多線程
    import tensorflow as tf
    
    # 創建一個先入先出的隊列,指定隊列最多可以保存3個元素,並指定類型爲整數
    q = tf.FIFOQueue(3, 'int32')
    # 初始化隊列中的元素,將[0,10,20]3個元素排入此隊列
    init = q.enqueue_many(([0, 10, 20], ))
    # 將隊列中的第1個元素出隊列,並存入變量x中
    x = q.dequeue()
    # 將得到的值加1
    y = x + 1
    # 將加1後的值重新加入隊列
    q_inc = q.enqueue([y])
    
    with tf.Session() as sess:
        # 隊列初始化
        init.run()
        for _ in range(5):
            # 執行數據出隊列/出隊元素+1/重新加入隊列的過程
            v, _ = sess.run([x, q_inc])
            print v
    
  2. tf.RunOptions
    TensorBoard 默認是不會記錄每個節點的用時、耗費的內存大小等這些信息的,那麼如何才能在圖上顯示這些信息呢?關鍵就是如下這些代碼,主要就是在 sess.run() 中加入 options 和 run_metadata 參數。
    更多引用

    #定義TensorFlow運行選項,設置trace_lever FULL_TRACE
    run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
    #定義TensorFlow運行元信息,記錄訓練運算時間和內存佔用等信息
    run_metadata = tf.RunMetadata()
    summary, _ = sess.run([merged, train_step],feed_dict=feed_dict(True),options=run_options,run_metadata=run_metadata)
    train_writer.add_run_metadata(run_metadata, 'step%03d' % i)
    train_writer.add_summary(summary, i)
    
  3. tf.train.Coordinator()

    更多引用

    # 使用 coord.should_stop()來查詢是否應該終止所有線程,當文件隊列(queue)中的所有文件都已經讀取出列的時候,會拋出一個 OutofRangeError 的異常,這時候就應該停止Sesson中的所有線程了;
    def enqueue(sess, coord):
        with coord.stop_on_exception():
            while not coord.should_stop():
                sess.run(enqueue_op)
                # enqueue_op = q.enqueue([vars])
                # q ~ tf.FIFOQueue()
    
    coord = tf.train.Coordinator()
    enq_threads = []
    for _ in range(thread_number):
        eqth = threading.Thread(target=enqueue, args=[sess, coord])
        eqth.start()
        enq_threads.append(eth)
        
    try:
        # some training
    except Exception, e:
        # 使用coord.request_stop()來發出終止所有線程的命令
        coord.request_stop(e)
    finally:
        # 使用coord.request_stop()來發出終止所有線程的命令,使用coord.join(threads)把線程加入主線程,等待threads結束。 
        coord.request_stop()
        sess.run(q.close(cancel_pending_enqueues=True))
        coord.join(enq_threads)
    
  4. tf.control_dependencies()

    def _add_train_graph(self):
        """Define the training operation."""
        mc = self.mc
        
        self.global_step = tf.Variable(0, name='global_step', trainable=False)
        lr = tf.train.exponential_decay(mc.LEARNING_RATE,
                                        self.global_step,
                                        mc.DECAY_STEPS,
                                        mc.LR_DECAY_FACTOR,
                                        staircase=True)
        
        tf.summary.scalar('learning_rate', lr)
        
        opt = tf.train.MomentumOptimizer(learning_rate=lr, momentum=mc.MOMENTUM)
        grads_vars = opt.compute_gradients(self.loss, tf.trainable_variables())
        
        with tf.variable_scope('clip_gradient') as scope:
            for i, (grad, var) in enumerate(grads_vars):
                grads_vars[i] = (tf.clip_by_norm(grad, mc.MAX_GRAD_NORM), var)
        
        apply_gradient_op = opt.apply_gradients(grads_vars, global_step=self.global_step)
        
        with tf.control_dependencies([apply_gradient_op]):
            self.train_op = tf.no_op(name='train')
    

    如上:

    • tf.train.exponential_decay
      在Tensorflow中,通過tf.train.exponential_decay函數實現指數衰減學習率。

      decayed_learning_rate = \
      learining_rate * decay_rate ^ \
      (global_step / decay_steps) 
      
      1. decayed_learning_rate爲每一輪優化時使用的學習率;
      2. learning_rate爲事先設定的初始學習率;
      3. decay_rate爲衰減係數;
      4. decay_steps爲衰減速度。
      

      通常初始學習率,衰減係數,衰減速度的設定具有主觀性(即經驗設置),而損失函數下降的速度與迭代結束之後損失的大小沒有必然聯繫,

    • tf.trainable_variables返回的是需要訓練的變量列表,tf.all_variables返回的是所有變量的列表

      import tensorflow as tf;  
      import numpy as np;  
      import matplotlib.pyplot as plt;  
       
      v = tf.Variable(tf.constant(0.0, shape=[1], dtype=tf.float32), name='v')
      v1 = tf.Variable(tf.constant(5, shape=[1], dtype=tf.float32), name='v1')
       
      global_step = tf.Variable(tf.constant(5, shape=[1], dtype=tf.float32), name='global_step', trainable=False)
      ema = tf.train.ExponentialMovingAverage(0.99, global_step)
       
      for ele1 in tf.trainable_variables():
      	print ele1.name
      for ele2 in tf.all_variables():
      	print ele2.name
      

      輸出:
      v:0
      v1:0

      v:0
      v1:0
      global_step:0

      分析:

      上面得到兩個變量,後面的一個得到上三個變量,因爲global_step在聲明的時候說明不是訓練變量,用來關鍵字trainable=False。

    • tf.clip_by_norm
      梯度裁剪的最直接目的就是防止梯度爆炸,手段就是控制梯度的最大範式。

    • tf.control_dependencies
      在執行某些op,tensor之前,某些op,tensor得首先被運行。

    • tf.no_op
      什麼都不做,僅做爲點位符使用控制邊界。

  5. tf.device

    使用多個GPU訓練模型, 引用鏈接
    參考官方鏈接, cifar10_multi_gpu_train.py

備註知識點

  • tensorflow 新版取消了tf.train.SummaryWriter(),換成使用tf.summary.FileWriter()
  • tf裏面提供模型保存的是**tf.train.Saver()**模塊;
  • 訓練過程中,主要用到了**tf.summary()**的各類方法,能夠保存訓練過程以及參數分佈圖並在tensorboard顯示;
  • tf.Variable設定trainable=False 可以防止該變量被數據流圖的 GraphKeys.TRAINABLE_VARIABLES 收集,
    這樣我們就不會在訓練的時候嘗試更新它的值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章