You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决ModuleNotFoundError: No module named 'keras.legacy_tf_layers'错误

解决视频帧特征提取代码中的keras.legacy_tf_layers和tensorflow.keras.python.datautils导入错误

问题根源

你遇到的两个导入错误本质是依赖库版本不兼容:

  • keras.legacy_tf_layers是TensorFlow 1.x时代的旧模块,在TensorFlow 2.x中已被移除或重构,而你使用的tensornets库是针对TF1.x开发的,无法适配新的TF2.x架构。
  • tensorflow.keras.python.datautils是旧的内部路径,TF2.x中已统一调整为tensorflow.keras.utils,移除了中间的.python层级。

你更新TensorFlow和Keras后问题仍存在,是因为tensornets本身没有适配TF2.x的版本,更新TF只会让旧库的兼容性问题更突出。

解决方案

1. 修复tensorflow.keras.python.datautils导入问题

找到代码中所有导入from tensorflow.keras.python.datautils的语句,直接替换为:

from tensorflow.keras.utils import [你需要的工具类,比如get_file]

如果是第三方库(比如tensornets)内部使用了这个路径,需要找到库的对应源码文件,把导入路径中的.python去掉。

2. 解决keras.legacy_tf_layers缺失问题(三选一)

方案一:降级到兼容的TensorFlow版本

直接安装tensornets支持的TF1.x版本,这是最省心的方式:

pip uninstall tensorflow keras
pip install tensorflow==1.15.5 keras==2.3.1

注意:TF1.15.x是最后一个兼容旧Keras架构的版本,和Keras 2.3.1完全匹配。

方案二:修改tensornets源码适配TF2.x

找到报错路径中的tensornets/contrib_layers/layers.py文件,找到引用normalization_layers.BatchNormalization的部分,替换为TF2.x的原生实现:

# 替换原来的导入和调用
from tensorflow.keras.layers import BatchNormalization

# 把原来的layer初始化代码改成:
layer = BatchNormalization(
    axis=axis,
    momentum=decay,
    epsilon=epsilon,
    center=center,
    scale=scale,
    beta_initializer=beta_initializer,
    gamma_initializer=gamma_initializer,
    moving_mean_initializer=moving_mean_initializer,
    moving_variance_initializer=moving_variance_initializer,
    beta_regularizer=beta_regularizer,
    gamma_regularizer=gamma_regularizer,
    renorm=renorm,
    renorm_clipping=renorm_clipping,
    renorm_momentum=renorm_decay,
    fused=fused,
    trainable=trainable,
    name=scope,
    dtype=inputs.dtype.base_dtype,
    adjustment=adjustment
)

同时修改tensorflow/python/layers/normalization.py中的__getattr__方法,直接返回TF2的BatchNormalization:

def __getattr__(name):
  if name in ['BatchNormalization', 'BatchNorm']:
    from tensorflow.keras.layers import BatchNormalization
    return BatchNormalization
  elif name in ['batch_normalization', 'batch_norm']:
    from tensorflow.keras.layers import batch_normalization
    return batch_normalization

方案三:替换tensornets为TF2原生模型(推荐长期方案)

放弃依赖老旧的tensornets,改用TensorFlow 2.x原生的ResNeXt实现,完全避免版本兼容问题。修改后的核心代码如下:

# 替换原来的tensornets相关导入
import tensorflow as tf
from tensorflow.keras.applications import ResNeXt101
from tensorflow.keras.applications.resnet import preprocess_input
from tensorflow.keras.preprocessing.image import load_img

# 模型初始化部分替换为:
inputx = tf.keras.Input(shape=(224, 224, 3))
# 加载预训练的ResNeXt101,去掉顶层分类层
base_model = ResNeXt101(weights='imagenet', include_top=False, input_tensor=inputx)
# 获取倒数第三层的输出作为特征
out_feats = base_model.layers[-3].output
# 构建模型
model = tf.keras.Model(inputs=inputx, outputs=out_feats)

# 图像预处理替换为TF原生的preprocess_input
img = load_img(img_path, target_size=(224, 224))
input_imgs[idx2,:,:,:] = preprocess_input(np.array(img))

# 会话部分改用TF2的方式,不需要手动初始化会话
feats = model.predict(input_imgs, batch_size=batch_size)

这样修改后,代码完全适配TF2.x,不需要禁用Eager Execution,也不会出现旧模块缺失的问题。

验证步骤

  1. 根据选择的方案修改代码或依赖版本
  2. 运行代码前,先检查所有导入语句是否正确
  3. 测试单张图像的特征提取,确认模型能正常运行

内容的提问来源于stack exchange,提问作者shaad akhtar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:00:53