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 收集,
    这样我们就不会在训练的时候尝试更新它的值。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • 这篇文章是针对有tensorflow基础但是记不住复杂变量函数的读者,文章列举了从输入变量到前向传播,反向优化,数...
    horsetif阅读 1,169评论 0 1
  • with tf.Session() as sess:sess.run(result) #得到关心的运算的结果 训练...
    tekiiiiiiii阅读 277评论 0 0
  • 以前还小的时候,被身边大人们的思想影响,觉得女孩子一定要努力,才能配得上自己想要的东西。 被那些无神论者影响后,到...
    羥羊阅读 478评论 0 2
  • 何谓旅行的意义 莫过于遇见一个全新的自己 比如说 请把旅行和出差的滤镜去掉 来面对现实吧 督察院一句话报告:为什么...
    夜猫菌阅读 378评论 0 0
  • 下周二我们要做QBR,End of this week, Sales 的Henry 要把你的PPT 准备好,我re...
    北京老炮儿阅读 1,382评论 3 1