TensorFlow 1.6中Estimator.evaluate执行时程序挂起问题求助
解决TensorFlow 1.6中Estimator.evaluate挂起的问题
我之前在TensorFlow 1.x版本里也碰到过Estimator评估阶段挂起的情况,结合你用的6×6扁平化矩阵分类任务场景,给你几个最可能的排查方向和解决办法:
1. 先查测试集的输入管道——这是最常见的原因
Estimator.evaluate挂起大概率是输入数据没正常终止,导致程序一直等待下一批数据。
- 检查你的测试集输入函数里有没有用
dataset.repeat()(不带参数),如果有的话赶紧改成dataset.repeat(1)或者直接删掉这个调用。测试集只需要遍历一次,无限重复的话程序会一直循环读取,永远停不下来。 - 举个错误示例和修正后的代码:
# 错误写法:测试集无限重复,导致evaluate挂起 def bad_test_input_fn(): feature_ds = tf.data.TextLineDataset("test_features.csv") label_ds = tf.data.TextLineDataset("test_labels.csv") dataset = tf.data.Dataset.zip((feature_ds, label_ds)) dataset = dataset.batch(32).repeat() # 这里的repeat()是坑! return dataset # 正确写法:限制只遍历一次测试集 def good_test_input_fn(): # 先定义解析函数 def parse_features(line): return tf.decode_csv(line, record_defaults=[[0]]*36) def parse_label(line): return tf.decode_csv(line, record_defaults=[[0]])[0] feature_ds = tf.data.TextLineDataset("test_features.csv").map(parse_features) label_ds = tf.data.TextLineDataset("test_labels.csv").map(parse_label) dataset = tf.data.Dataset.zip(({'x': feature_ds}, label_ds)) dataset = dataset.batch(32).repeat(1) # 明确只重复一次 return dataset - 另外确认测试集的实际记录数是不是500条,如果输入函数读取时出现数据丢失或者格式错误,也可能导致程序卡住等待数据。可以在解析函数里加个打印日志,看看有没有正常加载数据。
2. 检查evaluate的调用参数
调用estimator.evaluate()时,steps参数的设置也可能影响:
- 如果你的测试集batch size是32,500条数据大概需要16个step(500//32=15,余20,所以16个step)。你可以手动设置
steps=16,或者设置steps=None让Estimator自动跑完整个测试集——但前提是输入管道能正常终止(也就是上面说的repeat(1)或者不重复)。 - 示例调用:
eval_results = estimator.evaluate( input_fn=good_test_input_fn, steps=None # 让程序自动处理完所有测试数据 )
3. 考虑TensorFlow 1.6的版本bug
TensorFlow 1.6是比较早期的1.x版本,确实存在一些Estimator相关的死锁bug:
- 建议升级到TensorFlow 1.x的最后稳定版1.15,很多早期版本的bug都被修复了。
- 另外,如果你在输入函数里用了
tf.contrib下的废弃API,也可能触发死锁,尽量换成核心API实现。
4. 排查资源占用问题
如果你的GPU/CPU资源被占满,也可能导致评估阶段无法获取资源而挂起:
- 可以在创建Estimator时设置内存按需分配,避免一次性占满GPU内存:
config = tf.estimator.RunConfig( session_config=tf.ConfigProto( gpu_options=tf.GPUOptions(allow_growth=True) ) ) estimator = tf.estimator.Estimator(model_fn=your_model_fn, config=config)
先从输入管道开始排查,这是Estimator挂起最常见的根源,一般调整完repeat的设置就能解决问题。
内容的提问来源于stack exchange,提问作者Zipper
相关产品推荐
相关产品推荐

