升级到TensorFlow 2.8.0后,无法解析"tensorflow.keras"的导入。

29
最近发布了TensorFlow 2.8,我一发现就立刻安装了它。我确实需要它来支持更高的NumPy版本和一些新功能。然而,通过以下命令在我的conda环境中安装后:python3 -m pip install --upgrade tensorflow,无论是PyCharm还是VSCode都无法解决from tensorflow.keras import ...的导入问题。这些导入本身似乎在运行时可以工作,但由于无法解析导入,因此我无法使用代码完成、可视化函数签名等功能。有人遇到过类似的问题吗?在TF 2.7下一切正常-那是我之前使用的版本。注意:我正在使用Python 3.8。

VS Code enter image description here

PyCharm enter image description here

我尝试通过PyCharm解释器选项卡检查版本,看到了这个。由于某种原因,PyCharm不知道2.0之后还有其他版本(在该环境中我安装了最新版本的pip)。我猜这与问题有关,但不确定该怎么办。

在此输入图片描述

该段内容为HTML代码,其中包含一张图片的链接。
10个回答

31

我遇到了同样的问题,通过导入它来解决了它

from tensorflow.python.keras.layers import Dense

5
只有少数语句能够按照这种方式工作。我尝试了 from tensorflow.keras.preprocessing.image import ImageDataGeneratorfrom tensorflow.python.keras.preprocessing.image import ImageDataGenerator,但它们都对我无效。 - user9113784
你使用哪个 Python 解释器? 我使用 Python 3.8。 - Filip BRSJAK
对我有用!你怎么知道要做这个*t?!从tensorflow.python.keras导入层 - David
1
你是指评论的格式吗?评论使用迷你Markdown格式:链接 斜体 加粗 代码。帖子作者将始终收到您的评论通知。为了也通知之前的评论者,请提及他们的用户名:@peter或@PeterSmith都可以。了解更多关于格式的信息... - Filip BRSJAK
我已经从本地机器切换到Google Collab,并使用以下导入:import mlflow\ import mlflow.keras\ import mlflow.tracking\ from mlflow import pyfunc\ from mlflow.models import Model\ import numpy as np\ import pandas as pd\ from matplotlib import pyplot as plt\ from keras.layers import LSTM\ from keras.layers import Dense\ from keras.models import Sequential\ from sklearn.preprocessing import MinMaxScaler\ - Filip BRSJAK

18

这是当前版本的tensorflow中存在的一个bug,正如在该问题中所讨论的。

你可以通过以下方式解决:

  1. 按照引用问题中此答案描述的方法修改文件site-packages/tensorflow/__init__.py;或者
  2. 使用import keras.api._v2.keras as keras,因为这似乎是tensorflow加载自身的确切包。 (尽管您需要引用保护成员_v2,这违反了python惯例.)

原因在于tensorflow试图以一种懒惰的方式加载keras模块,这意味着它仅保留对模块的引用,直到使用该模块时才会实际加载keras模块。 因此,IDE只知道tensorflow对keras模块的引用,而不知道其内容。


1
似乎是一个不同的问题。在IDE中,import tensorflow; tensorflow.kerasimport tensorflow.keras(或者from tensorflow.keras import ...)的解析方式不同。第二种方式基于tensorflow.__path__,而第一种方式则基于tensorflow.keras - YouJiacheng
请见 https://github.com/tensorflow/tensorflow/pull/54104#issuecomment-1067102133 - YouJiacheng

10
我也在Google Colab中发现了这个问题。虽然代码运行正常,但它只是一个IDE的投诉,声称无法找到导入的模块。非常奇怪。我希望TensorFlow团队的某个人能尽快给出反馈。 Could not be resolved error

2
您可以在 tensorflow 目录中创建一个符号链接,指向 keras 源,如下所示:
cd ./virtualenvs/myenv/lib/python3.x/site-packages/tensorflow
ln -s ../keras/api/_v2/keras/ keras

2
这在我的tensorflow-macos 2.10.0版本中发生。

2

解决

import tensorflow
foo = tenstorflow.keras.foo
# if foo is a submodule but not an attribute, this will fail

并且

from tensorflow.keras import foo
# if foo is an attribute, this is (roughly) equivalent to
import tensorflow.keras
foo = tenstorflow.keras.foo
# if foo is a submodule but not an attribute, this is (roughly) equivalent to
import tensorflow.keras.foo as foo

第一个需要在类型检查期间,tensorflow 拥有正确类型的 keras 属性,而第二个需要在类型检查期间,tensorflow.__path__ 包含 keras 模块。顺便提一下,对于 from tensorflow import keras,如果 tensorflow 拥有 keras 属性,则使用该属性,否则将其作为子模块导入。理论上,第二种方法仅适用于 2.2.0 <= TF < 2.6.0,因为根据 TF 2.6 发布日志tensorflow/keras 应该在 TF 2.6 中被移除,否则 from tensorflow import keras(由 keras PIP 包支持的 tensorflow.keras)将与 import tensorflow.keras as keras(由 tensorflow/python/keras 支持的 tensorflow/keras)不同。然而,事实上第二种方法适用于 2.2.0 <= TF < 2.8.0,因为直到 TF 2.8 才删除了 tensorflow/keras。有趣的是,tensorflow/python/keras 目前仍未删除(Release 2.9.1),违反了 TF 2.6 发布日志中的声明“将在未来版本(2.7)中删除”。第一个方法在 TF >= 2.5.0 中已经失效,因为在 TF 2.5 中引入了 keras 惰性加载,并且尚未修复(Release 2.9.1),尽管相关提交已合并到主分支。请参见 https://github.com/tensorflow/tensorflow/pull/54104https://github.com/tensorflow/tensorflow/commit/e65b68a0914408118995d2f8b55c4286859362f8。另请参见 https://github.com/tensorflow/tensorflow/pull/54104#issuecomment-1067102133

0
这是一个模式,如在GitHub上的这篇文章所示。我也遇到了同样的问题。我选择忽略它,因为代码仍然可以运行,但我宁愿不要有黄色。希望有来自tensorflow的人可以支持一下。 :)

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0

这个对我有用:

from keras.utils.np_utils import to_categorical

0

当尝试导入Keras时,通常会发生此错误,原因是在TensorFlow中存在命名冲突。可以通过修改TensorFlow软件包中的__init__.py文件来解决。请按照以下步骤解决该问题:

  1. 在您的TensorFlow安装中找到__init__.py文件。文件路径通常为site-packages/tensorflow/__init__.py

    或者,您可以通过点击导入语句中的单词"tensorflow"并同时按下CTRL(或Mac上的CMD)快速打开该文件。这将直接导航到__init__.py文件。

  2. 用文本编辑器打开__init__.py文件。

  3. 查找大约在第387行附近提到keras模块的代码部分。

  4. 用以下修改后的代码替换现有代码块:

    import typing as _typing
    if _typing.TYPE_CHECKING:
      from keras.api._v2 import keras
    else:
      _keras_module = "keras.api._v2.keras"
      keras = _LazyLoader("keras", globals(), _keras_module)
      _module_dir = _module_util.get_parent_dir_for_name(_keras_module)
      if _module_dir:
        _current_module.__path__ = [_module_dir] + _current_module.__path__
      setattr(_current_module, "keras", keras)
    
  5. 保���对__init__.py文件的更改。

现在,当你从TensorFlow中导入Keras时,命名冲突应该已经解决了。这个修改允许在TensorFlow中正确地导入Keras模块。
对我来说,这个方法有效。

0
import tensorflow as tf
keras = tf.keras
models = tf.keras.models
...

它对于自动完成功能非常有效。

from keras import ...适用于当前版本(2.13) - CHIYOI

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接