当我反复运行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)
每次结果仍然略有不同。我错过了什么?
答案 0 :(得分:3)
tf.set_random_seed
设置图级种子,但它不是随机性的唯一来源,因为还有操作级种子,需要为每个操作提供。
不幸的是,tf.estimator.inputs.numpy_input_fn
没有提供seed
参数和shuffle
来将它们传递给基础操作(source code)。因此,_enqueue_data
函数始终获取seed=None
,这将重置您提前设置的任何种子。顺便说一下,有趣的是要注意许多底层feed函数使用标准python random.seed
进行随机播放,而不是tensorflow random(参见_ArrayFeedFn
,_OrderedDictNumpyFeedFn
等)。
摘要:目前无法保证shuffle=True
的稳定执行,至少使用当前的API。您唯一的选择是自己洗牌并传递shuffle=False
。