检查 Python 中的 TensorFlow 版本 - “tf.__version__”与“tf.VERSION”?

cda*_*hms 2 python tensorflow

问题的最短版本:

tf.__version__在检查 Python 中的 TensorFlow 版本时,有人可以解释/澄清和之间的区别吗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
Run Code Online (Sandbox Code Playgroud)

这似乎也有效:

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
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

在此输入图像描述

然而,如果tf.VERSION没有注释,PyCharm 中不会显示警告# noinspection PyUnresolvedReferences

在此输入图像描述

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

PyCharm 中的 TensorFlow Python 警告 - 在 __init__.py 中找不到引用 __version__

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

所以此时我有以下问题:

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

2) 通常推荐其中一种而不是另一种吗?

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

tf.__version__4)动态生成是什么意思?tf.VERSION如果方式不同又是如何生成的呢?

5)为了避免添加# noinspection PyUnresolvedReferences我更喜欢使用的评论tf.VERSION,有什么理由不这样做?

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

P-G*_*-Gn 5

答案的最短版本

他们是一样的。

答案的“稍微”更长的版本

这两个符号都是别名,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__
Run Code Online (Sandbox Code Playgroud)

深入兔子洞,别名最终指向 of __version___pywrap_tensorflow_internal它基本上是 TensorFlow 的 C++ 库,它确实是动态加载的——最后,python 的只是C++ API 的__version__别名。TF_VERSION_STRING

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

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