【问题标题】:Why the import "from tensorflow.train import Feature" doesn't work为什么导入“来自 tensorflow.train 导入功能”不起作用
【发布时间】:2018-07-13 16:23:13
【问题描述】:

这可能完全是一个与 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

【问题讨论】:

  • 我不知道为什么会抛出这个错误(我不想详细介绍),但我知道实现你想要的“解决方法”。您可以导入train,如您的示例之一,即from tensorflow import train,然后执行Feature = train.Feature(请注意,我将一个类对象分配给一个名为Feature的变量,即创建一个别名)。之后,您可以直接使用Feature(...),而无需在其前面加上train(或任何其他前缀)。
  • 是的,该解决方法将起作用。但是如果我想对 3-6 个以上的类(FloatList、Int64List、BytesList、Example 等)做同样的事情,代码会变得有点混乱 - 必须对每个类重复相同的过程。
  • 有一个未解决的问题:github.com/tensorflow/tensorflow/issues/33289

标签: python-3.x tensorflow


【解决方案1】:

解决方案

替换

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

【讨论】:

    【解决方案2】:

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

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

    import tensorflow as tf
    Feature = tf.train.Feature
    

    【讨论】:

    猜你喜欢
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2011-10-29
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多