如何在TF2.x中临时转off/oneager_execution?
How to temporarily turn off/on eager_execution in TF2.x?
基本上我有两个模型要按顺序运行。然而,第一个是在 TF2 中训练的 object-based 模型,第二个是在 TF1.x 中训练的保存为 name-based ckpt
.
这里的根本冲突是,在 tf.compat.v1
模式下,我必须 disable_eager_execution
到 运行 模式,而另一个模型需要 Eager 执行(否则慢 ~2.5 倍)。
我试图找到一种方法将 TF1 ckpt 转换为基于对象的 TF2 模型,但我认为这不是一种简单的方法...也许我必须重建模型并复制 weights
根据变量一个一个(噩梦)
所以有人知道是否有办法暂时关闭 eager_excution
?这将解决这里的所有问题...我将不胜感激!
很遗憾地通知您,根据我的经验,这是不可能的。我遇到过同样的问题。我相信 tensorflow 文档实际上指出,一旦它被关闭,它就会在会话的剩余部分保持关闭状态。即使您尝试也无法将其重新打开。任何时候关闭急切执行都是一个问题,只要 Tensorflow 模块加载到特定的 python 实例中,状态就会保持不变。
我关于转移模型权重和偏差的建议是将它们作为 numpy 数组转储到 pickle 文件中。我知道这是可能的,因为我使用的 Tensorflow 1.X 模型在其代码中做到了这一点(我没有编写该模型)。我最终加载了那个 pickle 文件并通过 for
循环重建了一个新的 Tensorflow 2.X 模型。这适用于顺序模型。如果发生任何分支,循环方法将无法很好地工作,或者很难成功实施。
请注意,除非您想进一步训练模型,否则加载初始化这些权重的最佳方法是使用 tf.constant_initializer(或类似的东西)。当我将模型转换为 Tensorflow 2.X 时,我最终创建了一个自定义初始化程序,但显然您可以只使用常规初始化程序,然后通过模型或图层属性或函数设置权重和偏差。
我最终不得不将 Tensorflow 1.x + compat 代码转换为 Tensorflow 2.X,这样我就可以在 Tensorflow 2.X.
中本地训练模型
我希望我能提供更好的新闻和信息,但这是我对同一问题的经验和解决方案。
基本上我有两个模型要按顺序运行。然而,第一个是在 TF2 中训练的 object-based 模型,第二个是在 TF1.x 中训练的保存为 name-based ckpt
.
这里的根本冲突是,在 tf.compat.v1
模式下,我必须 disable_eager_execution
到 运行 模式,而另一个模型需要 Eager 执行(否则慢 ~2.5 倍)。
我试图找到一种方法将 TF1 ckpt 转换为基于对象的 TF2 模型,但我认为这不是一种简单的方法...也许我必须重建模型并复制 weights
根据变量一个一个(噩梦)
所以有人知道是否有办法暂时关闭 eager_excution
?这将解决这里的所有问题...我将不胜感激!
很遗憾地通知您,根据我的经验,这是不可能的。我遇到过同样的问题。我相信 tensorflow 文档实际上指出,一旦它被关闭,它就会在会话的剩余部分保持关闭状态。即使您尝试也无法将其重新打开。任何时候关闭急切执行都是一个问题,只要 Tensorflow 模块加载到特定的 python 实例中,状态就会保持不变。
我关于转移模型权重和偏差的建议是将它们作为 numpy 数组转储到 pickle 文件中。我知道这是可能的,因为我使用的 Tensorflow 1.X 模型在其代码中做到了这一点(我没有编写该模型)。我最终加载了那个 pickle 文件并通过 for
循环重建了一个新的 Tensorflow 2.X 模型。这适用于顺序模型。如果发生任何分支,循环方法将无法很好地工作,或者很难成功实施。
请注意,除非您想进一步训练模型,否则加载初始化这些权重的最佳方法是使用 tf.constant_initializer(或类似的东西)。当我将模型转换为 Tensorflow 2.X 时,我最终创建了一个自定义初始化程序,但显然您可以只使用常规初始化程序,然后通过模型或图层属性或函数设置权重和偏差。
我最终不得不将 Tensorflow 1.x + compat 代码转换为 Tensorflow 2.X,这样我就可以在 Tensorflow 2.X.
中本地训练模型我希望我能提供更好的新闻和信息,但这是我对同一问题的经验和解决方案。