Google Colab TPU加载训练模型失败:batch_shape相关报错求助
Google Colab TPU加载训练模型失败:batch_shape相关报错求助
看起来你遇到的是Keras版本与环境兼容性的坑!具体来说,是Kaggle环境里的独立Keras 3.x和Colab TPU环境里的TensorFlow内置tf.keras版本不匹配,导致模型序列化的参数格式冲突了。
问题根源分析
- Kaggle和Colab CPU环境里,你用的是独立的Keras 3.4.1(哪怕你是从
tensorflow导入的,Kaggle默认把tensorflow.keras指向了这个独立版本);而Colab TPU环境里的tf.keras是TensorFlow 2.15.0自带的旧版本(和TF版本绑定,不属于独立Keras生态)。 - 这两个版本对模型层的序列化规则不一样:
batch_shape这个参数在旧版tf.keras的InputLayer配置里已经不被识别了,它更标准的写法是用input_shape来定义输入维度(排除batch维度)。
具体解决方案
我给你三个可行的解决思路,按优先级排序:
方案一:修改训练时的输入层定义,提前兼容
在Kaggle训练模型时,把InputLayer的batch_shape=[None, 191]直接替换成input_shape=(191,)——两者效果完全一致(都是“输入特征维度191,batch大小动态”),但后者是旧版tf.keras支持的标准写法。修改后重新训练并保存模型,再放到TPU环境加载就不会报这个错了。方案二:在Colab TPU环境统一Keras版本
既然Kaggle用的是Keras 3.4.1,那直接在Colab TPU里安装同款版本就能解决格式不兼容问题:!pip install keras==3.4.1安装完成后一定要重启内核,之后再尝试加载模型,两边版本统一了,序列化格式自然就匹配了。
方案三:加载时手动修正模型配置(适合不想重训的情况)
如果不想重新训练模型,可以手动修改模型的配置文件,把batch_shape替换成input_shape:- 假设你之前把模型的配置和权重分开保存了(如果是整模型文件,建议先拆成配置+权重):
import json from tensorflow.keras.models import model_from_json # 读取模型配置文件 with open('model_config.json', 'r') as f: config = json.load(f) # 遍历所有层,修正InputLayer的配置 for layer in config['config']['layers']: if layer['class_name'] == 'InputLayer' and 'batch_shape' in layer['config']: # 提取除batch维度外的输入形状 input_shape = layer['config']['batch_shape'][1:] layer['config']['input_shape'] = input_shape # 删除不被识别的batch_shape参数 del layer['config']['batch_shape'] # 用修正后的配置重建模型,再加载权重 model = model_from_json(json.dumps(config)) model.load_weights('model_weights.h5')
- 假设你之前把模型的配置和权重分开保存了(如果是整模型文件,建议先拆成配置+权重):
额外提醒
在Colab TPU环境加载模型时,别忘了先初始化TPU环境,否则模型可能无法正确分配到TPU上:
import tensorflow as tf # 初始化TPU resolver = tf.distribute.cluster_resolver.TPUClusterResolver() tf.config.experimental_connect_to_cluster(resolver) tf.tpu.experimental.initialize_tpu_system(resolver) strategy = tf.distribute.TPUStrategy(resolver) # 在TPU策略作用域内加载模型 with strategy.scope(): model = tf.keras.models.load_model('你的模型路径')
备注:内容来源于stack exchange,提问作者Radek
相关产品推荐
相关产品推荐

