为什么导入“from tensorflow.train import Feature”不起作用

Vla*_*-HC 6 python-3.x tensorflow

这可能完全是菜鸟问题,与 python 模块导入有关,但我不明白为什么以下内容有效:

> import tensorflow as tf
> f = tf.train.Feature()

> from tensorflow import train
> f = train.Feature()
Run Code Online (Sandbox Code Playgroud)

但是下面的语句会导致错误:

> from tensorflow.train import Feature
ModuleNotFoundError: No module named 'tensorflow.train'
Run Code Online (Sandbox Code Playgroud)

请有人解释一下为什么它不能这样工作?我的目标是在代码中使用更短的符号,如下所示:

> example = Example(
    features=Features(feature={
        'x1': Feature(float_list=FloatList(value=feature_x1.ravel())),
        'x2': Feature(float_list=FloatList(value=feature_x2.ravel())),
        'y': Feature(int64_list=Int64List(value=label))
    })
)
Run Code Online (Sandbox Code Playgroud)

张量流版本是 1.7.0

Tim*_*Tim 5

解决方案

代替

from tensorflow.train import Feature
Run Code Online (Sandbox Code Playgroud)

from tensorflow.core.example.feature_pb2 import Feature
Run Code Online (Sandbox Code Playgroud)

解释

关于 TensorFlow 的 Aliases 的备注

一般来说,你必须记住,例如:

from tensorflow import train
Run Code Online (Sandbox Code Playgroud)

实际上是一个别名

from tensorflow.python.training import training
Run Code Online (Sandbox Code Playgroud)

您可以通过打印模块轻松检查真正的模块名称。对于当前示例,您将获得:

from tensorflow import train
print (train)
<module 'tensorflow.python.training.training' from ....
Run Code Online (Sandbox Code Playgroud)

你的问题

在 Tensorflow 1.7 中,您不能使用from tensorflow.train import Feature,因为该from子句需要一个实际的模块名称(而不是别名)。鉴于train是一个别名,你会得到一个ImportError.

通过做

from tensorflow import train
print (train.Feature)
<class 'tensorflow.core.example.feature_pb2.Feature'>
Run Code Online (Sandbox Code Playgroud)

您将获得train. 现在,您可以使用上面解决方案中所示的导入路径。

笔记

在 TensorFlow 1.9.0 中,from tensorflow.train import Feature会起作用,因为它tensorflow.train是一个实际的,因此您可以导入它。(这是我在已安装的 Tensorflow 1.9.0 以及文档中看到的,但在 Github 存储库中没有看到。它必须在某处生成。)

关于模块路径的信息

您可以在文档中找到完整的模块路径。每个模块都有一个“定义于”部分。见下图(取自模块:tf.train):

在此处输入图片说明