TensorFlow 1.8.0中Wide and Deep模型结果不稳定,随机种子失效求助
解决TensorFlow 1.8.0中Wide&Deep模型随机种子不生效的问题
这个问题我之前在TensorFlow 1.x版本里也碰到过,核心原因是你用的Estimator框架(也就是DNNLinearCombinedClassifier)并不会自动继承你提前设置的全局随机种子,得单独给它的配置指定种子才行。
为什么tf.set_random_seed(1234)没生效?
tf.set_random_seed()是设置TensorFlow的图级随机种子,但DNNLinearCombinedClassifier作为Estimator,会自动创建属于自己的独立计算图,它默认不会读取你在外部设置的全局种子。- 从你贴的日志里
_tf_random_seed: None就能看出来,Estimator的配置里根本没拿到你设置的1234,所以每次运行都会生成新的随机初始化参数、dropout(如果启用的话)等,导致结果不一致。
怎么让模型结果稳定?
你需要显式创建一个RunConfig对象,把随机种子传进去,再传给分类器。另外还要固定Python和NumPy的随机种子,避免数据处理环节的随机性影响结果。
修改后的代码示例
import tensorflow as tf import tempfile import random import numpy as np # 固定Python全局随机种子(处理非TensorFlow的随机操作) random.seed(1234) # 固定NumPy随机种子(如果用NumPy做数据处理的话) np.random.seed(1234) # 固定TensorFlow图级种子(保险补充) tf.set_random_seed(1234) # 创建RunConfig,显式设置tf_random_seed给Estimator用 config = tf.contrib.learn.RunConfig(tf_random_seed=1234) model_dir = tempfile.mkdtemp() m = tf.contrib.learn.DNNLinearCombinedClassifier( model_dir=model_dir, linear_feature_columns=wide_columns, dnn_feature_columns=deep_columns, dnn_hidden_units=[100, 50], config=config # 传入自定义配置覆盖默认值 )
验证生效
运行修改后的代码后,再看日志会发现_tf_random_seed已经变成1234了,这时候每次运行的初始化参数、训练过程的随机操作都会固定,模型的准确率结果就能稳定下来。
额外注意点
如果你的数据加载过程中有随机shuffle(比如用tf.data.Dataset的shuffle方法),也要给它设置固定的seed参数,比如:
dataset = dataset.shuffle(buffer_size=1000, seed=1234)
内容的提问来源于stack exchange,提问作者Abdullah Al Imran
相关产品推荐
相关产品推荐

