美文网首页tensflow
tensorflow使用笔记

tensorflow使用笔记

作者: 井底蛙蛙呱呱呱 | 来源:发表于2019-01-09 10:14 被阅读15次
1、tf.app.flag.FLAGS

tf.app.flag.FLAGS是一个传参方法,起作用及用法与argparse库类似,可在命令行中指定参数,若不指定参数则使用脚本中设置的默认参数。

# test.py
if __name__ == '__main__':
    tf.app.flags.DEFINE_integer('num_shards', 1,'Number of shards in training TFRecord files.')
    tf.app.flags.DEFINE_integer('num_threads', 5,'Number of threads to preprocess the images.')
    FLAGS = tf.app.flags.FLAGS

运行:

$ python test.py --num_threads 10
# 上面脚本运行时由于指定了num_threads参数(10),因此不使用默认参数,而 num_shards由于未指定则使用默认参数(1)
2、tf.app.run()

在很多TensorFlow代码demo中,都会出现tf.app.run()方法,而且这个函数常与tf.app.flag.FLAGS一起出现,要了解它的作用可以先看看他的源码:

"""Generic entry point script."""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
 
import sys
 
from tensorflow.python.platform import flags
 
 
def run(main=None):
  f = flags.FLAGS
  f._parse_flags()
  main = main or sys.modules['__main__'].main
  sys.exit(main(sys.argv))

从上面的代码可以看到,run函数先进行FLAGS参数解析,然后运行main()函数。当然,如果,你的main函数命名不是main,你也可以传入他的名称,如tf.app.run('main_main'),这里将主函数命名为'main_main'。

3、TensorFlow中的多线程

TensorFlow的Session对象是支持多线程的,可以在同一个会话(Session)中创建多个线程,并行执行。在Session中的所有线程都必须能被同步终止,异常必须能被正确捕获并报告,会话终止的时候, 队列必须能被正确地关闭。

TensorFlow提供了两个类来实现对Session中多线程的管理:tf.Coordinatortf.QueueRunner,这两个类往往一起使用。

Coordinator类用来管理在Session中的多个线程,可以用来同时停止多个工作线程并且向那个在等待所有工作线程终止的程序报告异常,该线程捕获到这个异常之后就会终止所有线程。使用 tf.train.Coordinator()来创建一个线程管理器(协调器)对象。

QueueRunner类用来启动tensor的入队线程,可以用来启动多个工作线程同时将多个tensor(训练数据)推送入文件名称队列中,具体执行函数是 tf.train.start_queue_runners , 只有调用 tf.train.start_queue_runners 之后,才会真正把tensor推入内存序列中,供计算单元调用,否则会由于内存序列为空,数据流图会处于一直等待状态。

tf中的数据读取机制如下图: 数据读取.gif
  • 调用 tf.train.slice_input_producer,从 本地文件里抽取tensor,准备放入Filename Queue(文件名队列)中;
  • 调用 tf.train.batch,从文件名队列中提取tensor,使用单个或多个线程,准备放入文件队列;
  • 调用 tf.train.Coordinator() 来创建一个线程协调器,用来管理之后在Session中启动的所有线程;
  • 调用tf.train.start_queue_runners, 启动入队线程,由多个或单个线程,按照设定规则,把文件读入Filename Queue中。函数返回线程ID的列表,一般情况下,系统有多少个核,就会启动多少个入队线程(入队具体使用多少个线程在tf.train.batch中定义);
  • 文件从 Filename Queue中读入内存队列的操作不用手动执行,由tf自动完成;
  • 调用sess.run 来启动数据出列和执行计算;
  • 使用 coord.should_stop()来查询是否应该终止所有线程,当文件队列(queue)中的所有文件都已经读取出列的时候,会抛出一个 OutofRangeError 的异常,这时候就应该停止Sesson中的所有线程了;
  • 使用coord.request_stop()来发出终止所有线程的命令,使用coord.join(threads)把线程加入主线程,等待threads结束。

参考:https://blog.csdn.net/dcrmg/article/details/79780331

相关文章

网友评论

    本文标题:tensorflow使用笔记

    本文链接:https://www.haomeiwen.com/subject/kdgvrqtx.html