tensorflow 程序挂起的原因,即整个进程不报错又不执行的原因

在测试集上对训练好的模型实验时,代码无报错却卡在session.run()处。原因是tf数据线程未启动,导致数据流图无法计算。因tensorflow计算和数据读入异步,无数据时会一直等待。解决办法有两种,一是启动线程并做同步,二是使用Supervisor简化操作。
部署运行你感兴趣的模型镜像

在测试集上对训练好的模型进行实验的时候,发现写好的代码没有报错但是会卡在session.run()那里不动。查了好久终于明白是开启线程的问题。

tf的数据线程没有启动,导致数据流图没办法计算,整个程序就卡在那里。

更深层次的原因是tensorflow的计算和数据读入是异步的,合理的方式是主线程进行模型的训练,然后开一个数据读入线程异步读入数据.tensorflow会在内存中维护一个队列,然后数据线程异步从磁盘中将样本推入队列当中。并且,因为tensorflow的训练和读数据是异步的,故即使当前没有数据进来,tensorflow也没办法报错,因为可能接下来会有数据进队列,所以,tensorflow就一直处于等待的状态
下面以别人的例子说明:

错误情况:

在Session当中,没有启动数据读入线程。所以,sess.run(train_input.input_data)就是无数据可取,程序就处于一种挂起的状态。

#-*- coding:utf-8 -*-
import numpy as np
import tensorflow as tf
 
from tensorflow.models.rnn.ptb import reader
 
class PTBInput(object):
  """The input data."""
  def __init__(self, config, data, name=None):
    self.batch_size = batch_size = config.batch_size
    self.num_steps = num_steps = config.num_steps
    #为何要进行-1操作
    self.epoch_size = ((len(data) // batch_size) - 1) // num_steps
    self.input_data, self.targets = reader.ptb_producer(
        data, batch_size, num_steps, name=name)
 
class SmallConfig(object):
  """Small config."""
  init_scale = 0.1
  learning_rate = 1.0
  max_grad_norm = 5
  num_layers = 2
  num_steps = 20
  hidden_size = 200
  max_epoch = 4
  max_max_epoch = 13
  keep_prob = 1.0
  lr_decay = 0.5
  batch_size = 20
  vocab_size = 10000
 
if __name__ == '__main__':
	config = SmallConfig()
        data_path = '/home/jdlu/jdluTensor/data/simple-examples/data'       
	raw_data = reader.ptb_raw_data(data_path)
	train_data, valid_data, test_data, _ = raw_data
	train_input = PTBInput(config=config, data=train_data, name="TrainInput")
        print "end--------------------------------"
        
	#wrong,使用session就会出现读不出数据的错误,读不出数据,整个数据流图就无法计算,整个程序就处于挂起的状态
	#使用session会出错
	with tf.Session() as sess:
		for step in range(1):
			print sess.run(train_input.input_data)	

解决方法:

有两种办法:

  1. 使用tf.train.range_input_producer(epoch_size, shuffle=False),会默认将QueueRunner添加到全局图中,我们必须使用tf.train.start_queue_runners(sess=sess),去启动该线程。然后使用coord = tf.train.Coordinator()去做一些线程的同步工作。
  2. 第二种方法比较简单,使用sv = tf.train.Supervisor(),文档上说,The Supervisor is a small wrapper around a Coordinator, a Saver, and a SessionManager
    也即使用了Supervisor(),那么保存模型,线程同步的事情都不用我们去干涉了。
     
#-*- coding:utf-8 -*-
import numpy as np
import tensorflow as tf
 
from tensorflow.models.rnn.ptb import reader
 
class PTBInput(object):
  """The input data."""
  def __init__(self, config, data, name=None):
    self.batch_size = batch_size = config.batch_size
    self.num_steps = num_steps = config.num_steps
    #为何要进行-1操作
    self.epoch_size = ((len(data) // batch_size) - 1) // num_steps
    self.input_data, self.targets = reader.ptb_producer(
        data, batch_size, num_steps, name=name)
 
class SmallConfig(object):
  """Small config."""
  init_scale = 0.1
  learning_rate = 1.0
  max_grad_norm = 5
  num_layers = 2
  num_steps = 20
  hidden_size = 200
  max_epoch = 4
  max_max_epoch = 13
  keep_prob = 1.0
  lr_decay = 0.5
  batch_size = 20
  vocab_size = 10000
 
if __name__ == '__main__':
	config = SmallConfig()
        data_path = '/home/jdlu/jdluTensor/data/simple-examples/data'       
	raw_data = reader.ptb_raw_data(data_path)
	train_data, valid_data, test_data, _ = raw_data
	train_input = PTBInput(config=config, data=train_data, name="TrainInput")
        print "end--------------------------------"
        
 
	#right,使用Supervisor() 方法二
	#sv = tf.train.Supervisor()
        #with sv.managed_session() as sess:
	#	for step in range(1):
	#		print sess.run(train_input.input_data)	
        
	#right 方法一
	# Create a session for running operations in the Graph.
	sess = tf.Session()
	# Start input enqueue threads.
	coord = tf.train.Coordinator()
	threads = tf.train.start_queue_runners(sess=sess, coord=coord)
	# Run training steps or whatever
	try:
		for step in range(2):
			print sess.run(train_input.input_data)
	except Exception,e:
		#Report exceptions to the coordinator
		coord.request_stop(e)
	coord.request_stop()
	# Terminate as usual.  It is innocuous to request stop twice.
	coord.join(threads)
	sess.close()

 

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

### TensorFlow Keras 模块报错解决方案 当遇到 `tensorflow.keras` 或者 `tensorflow.python.keras` 的使用过程中出现问题时,通常可以从以下几个方面来排查并解决问题。 #### 1. 版本兼容性问题 确保所使用的 TensorFlow 和其他依赖库版本相互兼容是非常重要的。同版本之间可能存在 API 变化或弃用的情况[^1]。建议查看官方文档中的安装指南部分,确认当前环境下的 Python、TensorFlow以及其他相关包的版本是否匹配。 ```bash pip install --upgrade tensorflow==2.x.x # 替换为具体稳定版号 ``` #### 2. 导入路径一致引发错误 有时开发者可能会混淆 `tf.keras` 和独立安装的 Keras 库之间的区别。实际上,在 TensorFlow 2.x 中推荐直接通过 `import tensorflow as tf; from tensorflow import keras` 来引入 Keras 接口[^2]。如果之前有单独安装过 standalone Keras,则可能引起冲突,应考虑卸载后者以避免潜在的问题。 #### 3. 配置文件设置当 对于某些特定场景下(比如分布式训练),还需要注意检查配置项是否正确设定。例如 GPU 设备可见性、内存增长选项等都可以影响到程序运行状态[^3]: ```python import tensorflow as tf gpus = tf.config.experimental.list_physical_devices('GPU') if gpus: try: for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True) except RuntimeError as e: print(e) ``` #### 4. 数据集加载与预处理环节 数据读取方式以及格式转换过程也是常见的故障点之一。确保输入给模型的数据形状、类型均符合预期要求,并且批次大小合理分配可以有效减少很多必要的麻烦[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值