为什么从Tensorflow.train Import Feature导入不起作用

时间:2018-07-13 16:23:14

标签: python-3.x tensorflow

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

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

> from tensorflow import train
> f = train.Feature()

但是以下语句会导致错误:

> from tensorflow.train import Feature
ModuleNotFoundError: No module named 'tensorflow.train'

能否请人解释一下为什么这种方式不起作用?我的目标是在这样的代码中使用更简短的符号:

> 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))
    })
)

tensorflow版本为1.7.0

2 个答案:

答案 0 :(得分:4)

解决方案

替换

from tensorflow.train import Feature

使用

from tensorflow.core.example.feature_pb2 import Feature

说明

关于TensorFlow别名的评论

通常,您必须记住这一点,例如:

from tensorflow import train

实际上是

的别名
from tensorflow.python.training import training

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

from tensorflow import train
print (train)
<module 'tensorflow.python.training.training' from ....

您的问题

在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'>

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

注意

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

有关模块路径的信息

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

enter image description here

答案 1 :(得分:0)

我建议您不要从非公共API导入Feature(或其他任何对象),这很不方便(您必须弄清楚Feature的实际定义位置),冗长和主题在将来的版本中进行更改。

我建议作为简单定义的替代方法

import tensorflow as tf
Feature = tf.train.Feature