TensorFlow加载H5模型报错TypeError:int()参数为NoneType的解决求助
TensorFlow 2.9.2模型加载错误:解决Checkpoint输入形状空值问题
问题场景
使用TensorFlow 2.9.2训练模型,模型定义如下:
import tensorflow as tf encoder_layers = 1 encoder_bidirectional = False def get_model(): model = tf.keras.Sequential(name='model') model.add(tf.keras.layers.Dropout(0.5)) for _ in range(encoder_layers): rnn = tf.keras.layers.LSTM(2**6, return_sequences=True) if encoder_bidirectional: rnn = tf.keras.layers.Bidirectional(rnn) model.add(rnn) model.add(tf.keras.layers.Dense(2, activation='softmax')) return model def build_model(): model = get_model() model.build(input_shape=(None, None, 25)) model.compile( loss='sparse_categorical_crossentropy', optimizer=tf.keras.optimizers.Adam(0.001), metrics=['accuracy'] ) model.summary() return model
训练代码:
# train model train, dev, test = get_datasets() model = build_model() es = EarlyStopping( monitor='val_accuracy', mode='max', verbose=1, patience=10) mc = ModelCheckpoint( 'model.h5', monitor='val_accuracy', mode='max', verbose=1, save_best_only=True) with tf.device("/GPU:0"): model.fit( train, epochs=500, steps_per_epoch=32, validation_data=dev, callbacks=[es, mc]) best_model = load_model('model.h5') best_model.evaluate(test)
执行best_model = load_model('model.h5')时触发错误:
Traceback (most recent call last): File "/usr/lib/python3.8/runpy.py", line 194, in _run_module_as_main return _run_code(code, main_globals, None, File "/usr/lib/python3.8/runpy.py", line 87, in _run_code exec(code, run_globals) File "/experiments/train.py", line 76, in <module> app.run(main) File "/usr/local/lib/python3.8/dist-packages/absl/app.py", line 308, in run _run_main(main, args) File "/usr/local/lib/python3.8/dist-packages/absl/app.py", line 254, in _run_main sys.exit(main(argv)) File "/experiments/train.py", line 70, in main best_model = load_model(FLAGS.model_path) File "/usr/local/lib/python3.8/dist-packages/keras/utils/traceback_utils.py", line 67, in error_handler raise e.with_traceback(filtered_tb) from None File "/usr/local/lib/python3.8/dist-packages/keras/initializers/initializers_v2.py", line 1056, in _compute_fans return int(fan_in), int(fan_out) TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
排查发现model.h5中存在batch_input_shape=[null,null,null]的情况,导致加载时初始化器无法计算参数维度。
原因分析
使用model.build(input_shape=(None, None, 25))手动指定输入形状时,TensorFlow在保存H5格式模型时会将None序列化为null,加载时无法正确解析为合法的维度值,进而触发初始化器的类型错误。
解决方法与避免措施
方法1:改用显式Input层定义模型输入形状
在get_model函数中,先添加Input层明确输入形状,替代后续的model.build调用:
def get_model(): model = tf.keras.Sequential(name='model') # 添加Input层明确输入形状 model.add(tf.keras.layers.Input(shape=(None, 25))) model.add(tf.keras.layers.Dropout(0.5)) for _ in range(encoder_layers): rnn = tf.keras.layers.LSTM(2**6, return_sequences=True) if encoder_bidirectional: rnn = tf.keras.layers.Bidirectional(rnn) model.add(rnn) model.add(tf.keras.layers.Dense(2, activation='softmax')) return model def build_model(): model = get_model() # 无需再调用model.build model.compile( loss='sparse_categorical_crossentropy', optimizer=tf.keras.optimizers.Adam(0.001), metrics=['accuracy'] ) model.summary() return model
方法2:使用SavedModel格式保存模型
TensorFlow的SavedModel格式对动态形状的支持更友好,修改ModelCheckpoint的配置,改用SavedModel格式保存:
mc = ModelCheckpoint( 'best_model', # 不带.h5后缀,默认用SavedModel格式 monitor='val_accuracy', mode='max', verbose=1, save_best_only=True)
加载时直接调用:
best_model = tf.keras.models.load_model('best_model')
方法3:加载时手动指定输入形状(临时修复)
如果已经生成了有问题的H5模型,可以通过先加载模型结构、再手动build的方式修复:
# 先重新构建模型结构 model = build_model() # 加载权重,不加载模型配置 model.load_weights('model.h5') # 此时模型已可正常使用 model.evaluate(test)
内容的提问来源于stack exchange,提问作者jessicalfr
相关产品推荐
相关产品推荐

