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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:42:06