『TensorFlow』线程控制器类&变量作用域
线程控制器类
线程控制器原理:
监视tensorflow所有后台线程,有异常出现(主要是越界,资源循环完了)时,其should_stop方法就会返回True,而它的request_stop方法则用于要求各个线程安全退出。需要使用local变量,初始化时注意。
coord = tf.train.Coordinator() # 线程控制器 threads = tf.train.start_queue_runners(coord=coord) # 启动队列 try: while not coord.should_stop(): # 定义训练状态报告即可,轮数等信息会在数据生成流程中规定 pass except tf.errors.OutOfRangeError: saver.save(sess, os.path.join(model_path, 'fast_style_model')) tf.logging.info('Epoch limit reached') finally: coord.request_stop() coord.join(threads)
变量作用域
『cs231n』通过代码理解gan网络&tensorflow共享变量机制
同一个变量如果有不同的数据流(计算图中不同的节点在不同的时刻去给同一个节点的同一个输入位置提供数据),
- Variable变量会创建两个不同的变量节点去接收不同的数据流
- get_variable变量在reuse为True时会使用同一个变量应付不同的数据流
tf.get_variable()初始化较为繁琐,所以tf.variable_scope有initializer方法为域下变量添加默认初始化方式。
tf.Variable() # 声明变量 tf.get_variable() # 声明变量 tf.global_variables_initializer() # 激活变量
变量作用域的复用对RNN和GAN网络都很重要
加深理解变量作用域
1.上下文仅在命名时用以区分,不影响调用,所以下面的变量在上下文外引用依然不报错(此时名称已经生成)
2.可以通过引用上下文代号载入/重用作用域!?
3.存在载入关系时,忽略当前域位置的上层域(细想的话也理应如此)
4.可以通过变量域为域内初始化添加默认参数
5.get函数得到的变量名只继承变量域,不继承名称域