Tensorflow 不是确定性的,它应该在哪里

Posted

技术标签:

【中文标题】Tensorflow 不是确定性的,它应该在哪里【英文标题】:Tensorflow not being deterministic, where it should 【发布时间】:2016-05-02 13:59:20 【问题描述】:

我有一个小型网络。训练 [许多小时] 并保存到检查站。 现在,我想在不同的脚本中从检查点恢复并使用它。 我重新创建会话:构建整个网络,s.t.使用与训练前完全相同的代码再次创建所有操作。 此代码使用 time.time() 为 TF 设置随机种子 [每次运行都不同]。

然后我从检查点恢复。我运行网络,每次运行恢复的网络时都会得到不同的数字[小但有意义的差异]。至关重要的是,输入是固定的。 如果我将随机种子固定为某个值,则非确定性行为就会消失。

我很困惑,因为我认为恢复 [没有提供要保存的变量,所以我假设所有图形都已设置检查点] 会消除此流程中的所有随机行为。初始化等被恢复的检查点覆盖,这只是向前运行。

这可能吗?有道理?有没有办法找出我的图表中的哪些变量或因素不是由恢复的检查点设置的?

【问题讨论】:

这表明你有一个使用随机数的操作(shuffle_batch、dropout、random_contrast)。在施工期间查看您的任何操作是否接受seed。它不应该自动运行任何变量初始化,如果你不运行initialize_all_variables,下次尝试使用变量将触发异常 你使用过dropout吗? “向前运行”是指您仅使用恢复的网络进行预测,对吗?在那种情况下,训练期间是否使用 dropout 是否重要?我认为不会,但我不是专家。 谢谢!!当然是辍学了。事实证明,您必须在预测期间将保持概率显式设置为 1.0;我以为它只在训练期间应用。感谢您提供有关选择性初始化的提示。 @YaroslavBulatov,我遇到了与DropoutWrapper 类似的错误。我设置了keep_prob=0.8。我已将其移至一个新问题***.com/questions/42156296 【参考方案1】:

似乎这个问题已经在 cmets 中得到了回答,但还没有人明确写下答案,所以这里是:

您期望计算图即使使用不同的随机种子也总是返回相同的值,因为您认为图表中不应该有任何依赖于随机种子的 Op。

你忘记了辍学。

无论如何,我都会始终保持随机种子不变。那么这个和任何其他随机操作也是确定性的,你的整个训练也可以是确定性的。如果您在某个时候想知道不同的随机种子有多少方差,您可以明确地尝试其他随机种子。

【讨论】:

以上是关于Tensorflow 不是确定性的,它应该在哪里的主要内容,如果未能解决你的问题,请参考以下文章

使用 TensorFlow 服务为 TF 模型提供服务时,应该在哪里执行预处理和后处理步骤?

在哪里放置不是模型、视图、控制器或助手的 Rails 代码?

我应该在哪里写 .lower() 让它工作? [复制]

Anaconda 安装 TensorFlow 1.15 而不是 2.0

从源代码构建 TensorFlow 时,生成 `gen_io_ops.py` 文件的 bazel 规则在哪里?

TensorFlow的资源