【问题标题】:Implicitly enable TensorFlow v2 behaviour in TensorFlow v1在 TensorFlow v1 中隐式启用 TensorFlow v2 行为
【发布时间】:2019-10-30 12:36:30
【问题描述】:

作为我们迁移到 TensorFlow 2 的一部分,我想在 TensorFlow v1(特别是 TensorFlow 1.14)中启用 TensorFlow v2 行为。我知道我可以调用 tf.enable_v2_behavior() 来执行此操作,但我想隐式执行此操作(通过环境变量或类似的方法),而不必显式调用此函数。

我想这样做的原因是人们不要忘记这样做,并且不要意外地以 v1 行为结束。我可以确保在运行任何测试之前调用tf.enable_v2_behavior(),但是在测试环境之外我们代码的底层行为可能会有所不同(测试可能会通过,但是在测试环境之外运行时代码会失败)。

任何环境变量都可能有效,因为我几乎可以保证在我们所有的 docker 镜像中都设置了它,但我对替代方案持开放态度。我可以在导入特定模块时执行此操作,但我不能保证始终会导入特定模块(tensorflow! 除外)。

enable_v2_behavior 的文档状态“此函数在主 TensorFlow __init__.py 文件中调用,用户不需要调用它,除非在复杂迁移期间。”,但这似乎不是真的(在至少在 TensorFlow 1.14 中;我猜 TensorFlow 2.0 也是如此)。

【问题讨论】:

  • 您可以编辑安装好的tensorflow __init__文件,或者编辑房间包中的__init__调用该函数。
  • @MadPhysicist 我不会更改 TensorFlow 的 __init__ 文件。假设您的意思是“自己的包”,我不能保证总是会导入特定的包。
  • 这是一个公共项目吗?我很想看到你的代码,或者阅读你的这种转变的经历。另请参阅my related question
  • @Albert 抱歉,不公开

标签: python tensorflow


【解决方案1】:

这确实存在,如果您将环境变量 TF2_BEHAVIOR 设置为 1 它将启用 2.x 行为。我还没有找到关于它的文档,但你可以在the source code 的评论中看到它:

# TF2 behavior is enabled if either 1) enable_v2_behavior() is called or
# 2) the TF2_BEHAVIOR=1 environment variable is set.  In the latter case,
# the modules below independently check if tf2.enabled().

我在 1.15.0 中对其进行了测试,它似乎可以工作:

import os
os.environ['TF2_BEHAVIOR'] = '1'
import tensorflow as tf

print(tf.constant([1, 2, 3]))  # Eager mode is enabled
# tf.Tensor([1 2 3], shape=(3,), dtype=int32)
print(tf.TensorShape([1, 2])[1])  # TensorShape dimensions are int
# 2

【讨论】:

  • 效果很好,谢谢! TF 1.14 中不存在该注释,但设置 TF2_BEHAVIOR 环境变量似乎具有所需的行为
  • 是否也可以将 tensorflow 2 行为全局设置为 tensorflow 1 行为?
  • @Varlor 你的意思是一个环境变量,它使 TF 2.x 表现得像 1.x(或者相当于 tf.compat.v1.disable_v2_behavior)?我不认为这样的事情存在......
  • 是的,这就是我的意思。那很伤心。我需要以某种方式更改 tensorflow 导入的类型。因为我有一个已加载的模块并在其中导入了 tensorflow。我无法更改此代码。所以我必须在导入模块之后或之前以某种方式在上层更改它。类似的东西:如果不是 int(tf.__version__[0])
猜你喜欢
  • 2020-05-07
  • 2020-06-25
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-04
相关资源
最近更新 更多