Skip to main content
 首页 » 编程设计

python之在 Python 中检查 TensorFlow 版本之"tf.__version__"与 "tf.VERSION"

2024年08月16日32mfrbuaa

问题的最短版本:

在 Python 中检查 TensorFlow 版本时,有人可以解释/澄清 tf.__version__ 和 tf.VERSION 之间的区别吗??

稍微长一点的问题:

这似乎可行:

if tf.__version__ < "1.8.0": 
    print("ERROR: currently running TensorFlow version " + tf.__version__ + ", at least version 1.8.0 is required") 
    return 
# end if 

这似乎也有效:

if tf.VERSION < "1.8.0": 
    print("ERROR: currently running TensorFlow version " + tf.VERSION + ", at least version 1.8.0 is required") 
    return 
# end if 

我注意到的一个区别是 PyCharm 编辑器显示了针对 tf.__version__ 方式的警告,但没有针对 tf.VERSION 方式显示警告:

在 PyCharm 中解决这个问题的方法是在每个 tf.__version__ 用法上方添加 # noinspection PyUnresolvedReferences 注释,这解决了警告:

但是,如果没有 #noinspection PyUnresolvedReferences 注释,tf.VERSION 方式不会在 PyCharm 中显示警告:

我在这篇文章中询问了 PyCharm tf.__version__ 警告:

TensorFlow Python warning in PyCharm - Cannot find reference __version__ in __init__.py

唯一的响应者表示 tf.__version__ 是动态生成的。特别是在 Python 的上下文中,我真的不明白这意味着什么。

所以此时我有以下问题:

1) 为什么这两者都存在?

2) 通常推荐其中一种吗?

3) 为什么 PyCharm 对一个显示警告而不对另一个显示警告?

4) tf.__version__ 是动态生成的是什么意思?如果以不同的方式生成 tf.VERSION 是如何生成的?

5) 为避免必须添加 # noinspection PyUnresolvedReferences 注释,我更愿意使用 tf.VERSION,有什么理由不这样做吗?

6) TensorFlow 存储库中的大多数示例 https://github.com/tensorflow/tensorflow和相关的存储库(例如模型 https://github.com/tensorflow/models )使用 tf.__version__ 方式,但有些使用 tf.VERSION 方式,这是有原因的吗?

请您参考如下方法:

答案的最短版本

它们是一样的。

“稍微”更长的答案版本

这两个符号都是 tensorflow.python.framework.versions.VERSION 的别名,并在文件 tools\api\generator\api\__init__.py 中导入为

from tensorflow.python.framework.versions import VERSION 
from tensorflow.python.framework.versions import VERSION as __version__ 

沿着兔子洞走下去,别名最终指向 _pywrap_tensorflow_internal 的 __version__,它基本上是 tensorflow 的 C++ 库,它确实是动态加载的——最后, python的__version__只是TF_VERSION_STRING的一个别名的 C++ API。

现在,为什么 PyCharm 会发出第二个警告,这可能是 PyCharm 解析的一个限制(错误?),无法处理 __all__ 的复杂定义,如在末尾定义的那样同一个文件。在此站点上搜索“PyCharm __all__”,您会发现一些提示。

因此在 tensorflow 的特殊情况下,这两个选项都应该没问题,如果它为您删除了警告,您可以使用 tf.VERSION。然而 __version__ 习语更常见(有些人会说标准),因为它是对 PEP8 的推荐。 ,所以我可能会坚持使用 tf.__version__。