将tf.set_random_seed与tf.estimator.Estimator一起使用

1 tensorflow tensorflow-datasets tensorflow-estimator

我正在使用tf.estimator.Estimator来管理培训和测试我的部分代码。我正在调整一些超参数,因此我需要确保使用相同的随机种子初始化权重。无论如何,对于tf.estimator创建的会话,set_random_seed是否存在?

Oli*_*rot 5

您应该在传递给估算器的配置中定义随机种子:

seed = 2018
config = tf.estimator.RunConfig(model_dir=model_dir, tf_random_seed=seed)

estimator = tf.estimator.Estimator(model_fn, config=config, params=params)
Run Code Online (Sandbox Code Playgroud)

这是的文档RunConfig


要注意的一件事是,每次运行时estimator.train(train_input_fn),都会创建一个新图来训练模型(通过调用train_input_fn创建输入管道并调用model_fn的输出train_input_fn)。

一个问题是,这个新图形还将每次都设置有相同的随机种子。


让我举例说明。假设您在输入管道中执行数据扩充,并在每个时期评估模型。这会给你这样的东西:

def train_input_fn():
    features = tf.random_uniform([])
    labels = tf.random_uniform([])
    dataset = tf.data.Dataset.from_tensors((features, labels))
    return dataset


def model_fn(features, labels, mode, params):
    loss = features
    global_step = tf.train.get_global_step()
    train_op = global_step.assign_add(1)
    return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)


seed = 2018
config = tf.estimator.RunConfig(model_dir="test", tf_random_seed=seed)
estimator = tf.estimator.Estimator(model_fn, config=config)

num_epochs = 10
for epoch in range(num_epochs):
    estimator.train(train_input_fn, steps=1)
    estimator.evaluate(train_input_fn, steps=1)
Run Code Online (Sandbox Code Playgroud)

输入函数创建随机特征(和标签)。发生的情况是,在每个时期创建的功能都将完全相同。输出将类似于:

INFO:tensorflow:loss = 0.17983198, step = 1
INFO:tensorflow:Saving dict for global step 1: global_step = 1, loss = 0.006007552
INFO:tensorflow:loss = 0.17983198, step = 2
INFO:tensorflow:Saving dict for global step 2: global_step = 2, loss = 0.006007552
INFO:tensorflow:loss = 0.17983198, step = 3
INFO:tensorflow:Saving dict for global step 3: global_step = 3, loss = 0.006007552
...
Run Code Online (Sandbox Code Playgroud)

您可以看到,每个时期的损失(等于输入要素)是相同的,这意味着每个时期都使用相同的随机种子。

如果您想在每个时期进行评估并执行数据扩充,这将是一个问题,因为您最终将在每个时期进行相同的数据扩充


一种快速的解决方案是删除随机种子。但是,这会阻止您进行可重复的实验。

另一个更好的解决方案是在每个时期使用相同model_fn但不同的随机种子创建一个新的估算器:

INFO:tensorflow:loss = 0.17983198, step = 1
INFO:tensorflow:Saving dict for global step 1: global_step = 1, loss = 0.006007552
INFO:tensorflow:loss = 0.17983198, step = 2
INFO:tensorflow:Saving dict for global step 2: global_step = 2, loss = 0.006007552
INFO:tensorflow:loss = 0.17983198, step = 3
INFO:tensorflow:Saving dict for global step 3: global_step = 3, loss = 0.006007552
...
Run Code Online (Sandbox Code Playgroud)

功能将在每个时期正确更改:

INFO:tensorflow:loss = 0.17983198, step = 1
INFO:tensorflow:Saving dict for global step 1: global_step = 1, loss = 0.006007552
INFO:tensorflow:loss = 0.22154999, step = 2
INFO:tensorflow:Saving dict for global step 2: global_step = 2, loss = 0.70446754
INFO:tensorflow:loss = 0.48594844, step = 3
Run Code Online (Sandbox Code Playgroud)