Tensorflow 使用tf.set_随机_种子和tf.estimator.estimator

Tensorflow 使用tf.set_随机_种子和tf.estimator.estimator,tensorflow,tensorflow-datasets,tensorflow-estimator,Tensorflow,Tensorflow Datasets,Tensorflow Estimator,我正在使用tf.estimator.estimator来管理代码的培训和测试部分。我正在调整一些超参数,因此我需要确保使用相同的随机种子初始化权重。是否仍然可以为tf.estimator创建的会话设置_random_seed 您应该在传递给估计器的配置中定义随机种子: seed=2018 config=tf.estimator.RunConfigmodel\u dir=model\u dir,tf\u random\u seed=seed estimator=tf.estimator.estim

我正在使用tf.estimator.estimator来管理代码的培训和测试部分。我正在调整一些超参数,因此我需要确保使用相同的随机种子初始化权重。是否仍然可以为tf.estimator创建的会话设置_random_seed

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

seed=2018 config=tf.estimator.RunConfigmodel\u dir=model\u dir,tf\u random\u seed=seed estimator=tf.estimator.estimator模型_fn,config=config,params=params 这是您的文档

需要注意的一点是,每次运行estimator.traintrain\u input\u fn时,都会创建一个新的图形来训练模型,方法是调用train\u input\u fn来创建输入管道,并对train\u input\u fn的输出调用model\u fn

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

实例 让我举例说明。假设您在输入管道中执行数据扩充,并在每个阶段对模型进行评估。这会给你类似的东西:

def序列输入\u fn: 特征=tf.随机均匀[] 标签=tf.随机统一[] dataset=tf.data.dataset.from_tensors特征、标签 返回数据集 def型号功能、标签、模式、参数: 损失=特征 全局步骤=tf.train.get\u全局步骤 列车运行=全局步骤分配添加1 返回tf.estimator.estimateSpecMode,loss=loss,train\u op=train\u op seed=2018 config=tf.estimator.RunConfigmodel\u dir=test,tf\u random\u seed=seed estimator=tf.estimator.estimator模型_fn,config=config num_epochs=10 对于rangenum_历元中的历元: 估算器.train\u输入\u fn,步长=1 估计器。在输入中,步数=1 输入函数可创建随机要素和标签。所发生的是,创建的特征在每个时代都是完全相同的。输出如下所示:

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
...
您可以看到,在每个历元中,等于输入特征的损失是相同的,这意味着在每个历元中使用相同的随机种子

如果您希望在每个历元进行评估并执行数据扩充,这是一个问题,因为您将在每个历元得到相同的数据扩充

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

另一个更好的解决方案是在每个历元使用相同的模型_fn但不同的随机种子创建一个新的估计器:

seed=2018 num_epochs=10 对于rangenum_历元中的历元: config=tf.estimator.RunConfigmodel\u dir=test,tf\u random\u seed=seed+epoch estimator=tf.estimator.estimator模型_fn,config=config 估算器.train\u输入\u fn,步长=1 估计器。在输入中,步数=1 特征将在每个历元正确更改:

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

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

seed=2018 config=tf.estimator.RunConfigmodel\u dir=model\u dir,tf\u random\u seed=seed estimator=tf.estimator.estimator模型_fn,config=config,params=params 这是您的文档

需要注意的一点是,每次运行estimator.traintrain\u input\u fn时,都会创建一个新的图形来训练模型,方法是调用train\u input\u fn来创建输入管道,并对train\u input\u fn的输出调用model\u fn

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

实例 让我举例说明。假设您在输入管道中执行数据扩充,并在每个阶段对模型进行评估。这会给你类似的东西:

def序列输入\u fn: 特征=tf.随机均匀[] 标签=tf.随机统一[] dataset=tf.data.dataset.from_tensors特征、标签 返回数据集 def型号功能、标签、模式、参数: 损失=特征 全局步骤=tf.train.get\u全局步骤 列车运行=全局步骤分配添加1 返回tf.estimator.estimateSpecMode,loss=loss,train\u op=train\u op seed=2018 config=tf.estimator.RunConfigmodel\u dir=test,tf\u random\u seed=seed estimator=tf.estimator.estimator模型_fn,config=config num_epochs=10 对于rangenum_历元中的历元: 估算器.train\u输入\u fn,步长=1 估计器。在输入中,步数=1 输入函数可创建随机要素和标签。所发生的是,创建的特征在每个时代都是完全相同的。输出如下所示:

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
...
您可以看到,在每个历元中,等于输入特征的损失是相同的,这意味着在每个历元中使用相同的随机种子

如果您希望在每个历元进行评估并执行数据扩充,这是一个问题,因为您将在每个历元得到相同的数据扩充

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

另一个更好的解决方案是 s在每个历元使用相同的模型_fn但不同的随机种子创建一个新的估计器:

seed=2018 num_epochs=10 对于rangenum_历元中的历元: config=tf.estimator.RunConfigmodel\u dir=test,tf\u random\u seed=seed+epoch estimator=tf.estimator.estimator模型_fn,config=config 估算器.train\u输入\u fn,步长=1 估计器。在输入中,步数=1 特征将在每个历元正确更改:

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