tf.estimator shuffle - 随机种子?

3
每次运行tf.estimator.LinearRegressor时,结果都会略有不同。我猜测这是由于这里设置了shuffle=True导致的:
input_fn = tf.estimator.inputs.numpy_input_fn(
    {"x": x_train}, y_train, batch_size=4, num_epochs=None, shuffle=True)

这在某种程度上是可以的,但是当我尝试通过在nptf中设置随机数生成器的种子来使其确定性时:

np.random.seed(1)
tf.set_random_seed(1)

结果每次还是稍有不同。我错过了什么吗?
1个回答

3

tf.set_random_seed设置了图层级别的种子,但这并不是唯一的随机源,因为还有一个需要为每个操作提供的操作级别种子。

不幸的是,tf.estimator.inputs.numpy_input_fn不会提供seed参数与shuffle一起传递给底层操作 (源代码)。结果,_enqueue_data函数总是获取seed=None,这将重置您预先设置的任何种子。顺便说一下,有趣的是,许多底层馈送函数使用标准的python random.seed进行洗牌,而不是tensorflow随机 (请参见_ArrayFeedFn_OrderedDictNumpyFeedFn等)。

总结:目前没有办法保证在shuffle=True的情况下稳定执行,至少在当前的API中是这样的。您唯一的选择是自己洗牌并传递shuffle=False


2
在我看来,第一条语句是不正确的。当设置了图级种子而没有设置操作级种子时,操作 ID 将被用作操作级种子。操作 ID 在创建图时从 0 开始,并且每个新操作都会增加它。 因此,我认为这里正在发生的事情是评估器正在创建自己的图形,并且没有设置其随机种子。可能需要仔细检查源代码才能确保 100% 正确。无论如何,我的结论与你的相同:对自身进行洗牌并使用 shuffle=False。 - MiniQuark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接