求助:深度学习建筑提取代码导入时出现tensorflow.keras模块缺失错误
解决导入
tensorflow.keras报错及segmentation_models兼容问题 我在编写建筑提取的深度学习代码时,导入库文件出现No module named 'tensorflow.keras'错误,无法自行解决。当前环境TensorFlow版本为2.9.1,Keras版本为2.2.0。
我的代码
import os import cv2 import numpy as np import random from matplotlib import pyplot as plt from patchify import patchify from PIL import Image import segmentation_models as sm from sklearn.model_selection import train_test_split from tensorflow.keras.utils import to_categorical from tensorflow.keras.metrics import MeanIoU
完整报错信息
ImportError Traceback (most recent call last) File ~\anaconda3\envs\tensorflow\lib\site-packages\segmentation_models\__init__.py:98, in <module> 97 try: ---> 98 set_framework(_framework) 99 except ImportError: File ~\anaconda3\envs\tensorflow\lib\site-packages\segmentation_models\__init__.py:67, in set_framework(name) 66 if name == _KERAS_FRAMEWORK_NAME: ---> 67 import keras 68 import efficientnet.keras # init custom objects File ~\anaconda3\envs\tensorflow\lib\site-packages\keras\__init__.py:3, in <module> 1 from __future__ import absolute_import ----> 3 from . import utils 4 from . import activations File ~\anaconda3\envs\tensorflow\lib\site-packages\keras\utils\__init__.py:25, in <module> 24 from .np_utils import normalize ---> 25 from .multi_gpu_utils import multi_gpu_model File ~\anaconda3\envs\tensorflow\lib\site-packages\keras\utils\multi_gpu_utils.py:7, in <module> 5 from __future__ import print_function ----> 7 from ..layers.merge import concatenate 8 from .. import backend as K File ~\anaconda3\envs\tensorflow\lib\site-packages\keras\layers\__init__.py:4, in <module> 3 from ..utils.generic_utils import deserialize_keras_object ----> 4 from ..engine.base_layer import Layer 5 from ..engine import Input File ~\anaconda3\envs\tensorflow\lib\site-packages\keras\engine\__init__.py:8, in <module> 7 from .network import get_source_inputs ----> 8 from .training import Model File ~\anaconda3\envs\tensorflow\lib\site-packages\keras\engine\training.py:21, in <module> 20 from .training_utils import weighted_masked_objective ---> 21 from . import training_arrays 22 from . import training_generator File ~\anaconda3\envs\tensorflow\lib\site-packages\keras\engine\training_arrays.py:14, in <module> 13 from .. import backend as K ---> 14 from .. import callbacks as cbks 15 from ..utils.generic_utils import Progbar File ~\anaconda3\envs\tensorflow\lib\site-packages\keras\callbacks.py:18, in <module> 17 from collections import OrderedDict ---> 18 from collections import Iterable 19 from .utils.generic_utils import Progbar ImportError: cannot import name 'Iterable' from 'collections' (C:\Users\DOLONCHAPA\anaconda3\envs\tensorflow\lib\collections\__init__.py) During handling of the above exception, another exception occurred: ModuleNotFoundError Traceback (most recent call last) Input In [1], in <cell line: 8>() 6 from patchify import patchify 7 from PIL import Image ----> 8 import segmentation_models as sm 9 from sklearn.model_selection import train_test_split 11 from tensorflow.keras.utils import to_categorical File ~\anaconda3\envs\tensorflow\lib\site-packages\segmentation_models\__init__.py:101, in <module> 99 except ImportError: 100 other = _TF_KERAS_FRAMEWORK_NAME if _framework == _KERAS_FRAMEWORK_NAME else _KERAS_FRAMEWORK_NAME ---> 101 set_framework(other) 103 print('Segmentation Models: using `{}` framework.'.format(_KERAS_FRAMEWORK)) 105 # import helper modules File ~\anaconda3\envs\tensorflow\lib\site-packages\segmentation_models\__init__.py:71, in set_framework(name) 69 elif name == _TF_KERAS_FRAMEWORK_NAME: 70 from tensorflow import keras ---> 71 import efficientnet.tfkeras # init custom objects 72 else: 73 raise ValueError('Not correct module name `{}`, use `{}` or `{}`'.format( 74 name, _KERAS_FRAMEWORK_NAME, _TF_KERAS_FRAMEWORK_NAME)) File ~\anaconda3\envs\tensorflow\lib\site-packages\efficientnet\tfkeras.py:6, in <module> 2 from . import model 4 from .preprocessing import center_crop_and_resize ----> 6 EfficientNetB0 = inject_tfkeras_modules(model.EfficientNetB0) 7 EfficientNetB1 = inject_tfkeras_modules(model.EfficientNetB1) 8 EfficientNetB2 = inject_tfkeras_modules(model.EfficientNetB2) File ~\anaconda3\envs\tensorflow\lib\site-packages\efficientnet\__init__.py:50, in inject_tfkeras_modules(func) 49 def inject_tfkeras_modules(func): ---> 50 import tensorflow.keras as tfkeras 51 @functools.wraps(func) 52 def wrapper(*args, **kwargs): 53 kwargs['backend'] = tfkeras.backend ModuleNotFoundError: No module named 'tensorflow.keras'
问题根源
- Keras版本过旧且不兼容:独立安装的Keras 2.2.0与Python 3.10+版本冲突,
collections.Iterable在高版本Python中已迁移至collections.abc,导致老Keras导入失败。 - TensorFlow与独立Keras冲突:TensorFlow 2.x自带整合版Keras,单独安装的Keras会干扰框架检测,导致
segmentation_models无法找到正确的tensorflow.keras路径。
解决步骤
- 卸载独立Keras:
打开终端执行:pip uninstall keras -y - 安装适配版本的依赖库:
安装与TensorFlow 2.9.1兼容的segmentation_models和efficientnet:pip install segmentation-models==1.0.1 efficientnet==1.1.1 - 验证导入:
在终端测试导入命令,确认无报错后再运行代码:import tensorflow.keras import segmentation_models as sm
额外说明
TensorFlow 2.x版本中,Keras已完全整合到框架内部,直接使用from tensorflow.keras import ...即可,无需单独安装独立Keras,避免后续版本冲突。
内容的提问来源于stack exchange,提问作者DolonPrabhakar
相关产品推荐
相关产品推荐

