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

无法从.keras文件加载Bidirectional LSTM模型问题求助

问题原因与解决方案

问题根因

你遇到的是Keras 3.2.0与TensorFlow 2.16.1的兼容性bug:当Bidirectional层嵌套LSTM时,模型序列化/反序列化过程中,LSTMCell的变量无法被正确识别和加载。单独使用LSTM时无问题,是因为单层LSTM的变量存储逻辑和嵌套在Bidirectional里的不一样。

可行解决方案

1. 改用函数式API构建模型

Sequential API在处理嵌套层的序列化时容易出现逻辑漏洞,换成函数式API可以规避这个bug:

import tensorflow as tf
from tensorflow.keras import layers, models, optimizers, callbacks

# 函数式API构建模型
inputs = layers.Input(shape=X_train_scaled.shape[1:])  # 替换为你的实际输入形状
x = layers.Bidirectional(layers.LSTM(128, activation='tanh'))(inputs)
x = layers.Dropout(0.2)(x)
x = layers.BatchNormalization()(x)
x = layers.Flatten()(x)
x = layers.Dense(32, activation='relu')(x)
x = layers.Dropout(0.2)(x)
outputs = layers.Dense(1, activation='sigmoid')(x)

model = models.Model(inputs=inputs, outputs=outputs)

# 后续编译、训练、保存加载逻辑不变
optimizer = optimizers.Adam(learning_rate=0.001)
model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])

early_stopping = callbacks.EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
reduce_lr = callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3, verbose=1)

model.fit(X_train_scaled, y_train, batch_size=32, epochs=3, validation_data=(X_test_scaled, y_test), callbacks=[early_stopping, reduce_lr])
model.summary()

model.save('models/sample_model.keras')
model = models.load_model('models/sample_model.keras')

2. 显式为嵌套层指定名称

给LSTM和外层Bidirectional层都设置唯一名称,帮助加载时精准匹配变量:

model = tf.keras.Sequential()
# 显式添加name参数
model.add(layers.Bidirectional(layers.LSTM(128, activation='tanh', name='core_lstm'), name='bidirectional_wrapper'))
model.add(layers.Dropout(0.2))
model.add(layers.BatchNormalization())

# 后续层与训练逻辑保持不变

3. 降级到稳定兼容版本

这个bug是特定版本组合导致的,降级到已验证的稳定版本即可解决:

  • 降级Keras到3.1.1:pip install keras==3.1.1
  • 或降级TensorFlow到2.15.1:pip install tensorflow==2.15.1

4. 拆分保存模型结构与权重

如果上述方案均不适用,可以拆分保存步骤规避序列化问题:

# 保存模型结构为JSON文件
model_json = model.to_json()
with open('models/model_structure.json', 'w') as f:
    f.write(model_json)
# 保存权重文件
model.save_weights('models/model_weights.h5')

# 加载模型时
from tensorflow.keras.models import model_from_json
with open('models/model_structure.json', 'r') as f:
    loaded_model = model_from_json(f.read())
loaded_model.load_weights('models/model_weights.h5')
# 加载后需重新编译模型
loaded_model.compile(loss='binary_crossentropy', optimizer=optimizers.Adam(learning_rate=0.001), metrics=['accuracy'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:32:44