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)

np就目前而言,这很好,但是当我尝试通过在和中播种随机数生成器来使其具有确定性时tf

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

每次的结果仍然略有不同。我错过了什么?

4

1 回答 1

3

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

不幸的是,tf.estimator.inputs.numpy_input_fn没有提供seed参数以及shuffle将它们传递给底层操作(源代码)。结果,_enqueue_data函数总是得到seed=None,这将重置您预先设置的任何种子。顺便说一句,有趣的是,许多底层 feed 函数使用标准 pythonrandom.seed进行随机播放,而不是 tensorflow random(请参阅_ArrayFeedFn_OrderedDictNumpyFeedFn等)。

摘要:目前没有办法保证稳定的执行shuffle=True,至少在当前的 API 中是这样。您唯一的选择是自己洗牌数据并通过shuffle=False.

于 2017-12-06T16:36:20.980 回答