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

TensorFlow双向LSTM模型保存正常但加载失败报错ValueError

TensorFlow LSTM模型保存后加载报错的解决方案

问题概述

训练的LSTM模型运行正常,但使用.keras格式保存后加载时抛出ValueError,提示LSTMCell未加载到变量。其他模型的保存加载功能正常,推测问题与Bidirectional层相关,需要实现单文件加载模型的方案。

模型创建代码

model1 = Sequential()
model1.add(int_vectorize_layer)
model1.add(Embedding(vocab_size, embedding_dim))
model1.add(SpatialDropout1D(drop_lstm))
model1.add(tf.keras.layers.Bidirectional(LSTM(units=32)))
model1.add(Dropout(drop_lstm))
model1.add(Dense(128, activation='relu'))
model1.add(Dense(64, activation='relu'))
model1.add(Dense(32, activation='relu'))
model1.add(Dense(1, activation='sigmoid'))
model1.compile(loss = 'binary_crossentropy',optimizer = 'adam',metrics = ['accuracy'])

保存与加载代码

# 保存正常
model1.save("model.keras")
# 加载时报错
loaded_model1 = tf.keras.models.load_model("model.keras")

报错信息

ValueError: A total of 1 objects could not be loaded. Example error message for object <LSTMCell name=lstm_cell, built=True>:

Layer 'lstm_cell' expected 3 variables, but received 0 variables during loading. Expected: ['kernel', 'recurrent_kernel', 'bias']

List of objects that could not be loaded:
[<LSTMCell name=lstm_cell, built=True>]

完整报错堆栈

ValueError                                Traceback (most recent call last)
Cell In[141], line 1
----> 1 loaded_model1 = tf.keras.models.load_model("model.keras")

File ~/Desktop/projects/SPARK-STREAMING-PFA/Model/my-env/lib/python3.10/site-packages/keras/src/saving/saving_api.py:176, in load_model(filepath, custom_objects, compile, safe_mode)
    173         is_keras_zip = True
    175 if is_keras_zip:
--> 176     return saving_lib.load_model(
    177         filepath,
    178         custom_objects=custom_objects,
    179         compile=compile,
    180         safe_mode=safe_mode,
    181     )
    182 if str(filepath).endswith((".h5", ".hdf5")):
    183     return legacy_h5_format.load_model_from_hdf5(filepath)

File ~/Desktop/projects/SPARK-STREAMING-PFA/Model/my-env/lib/python3.10/site-packages/keras/src/saving/saving_lib.py:152, in load_model(filepath, custom_objects, compile, safe_mode)
    147     raise ValueError(
    148         "Invalid filename: expected a `.keras` extension. "
    149         f"Received: filepath={filepath}"
    150     )
    151 with open(filepath, "rb") as f:
--> 152     return _load_model_from_fileobj(
    153         f, custom_objects, compile, safe_mode
    154     )

File ~/Desktop/projects/SPARK-STREAMING-PFA/Model/my-env/lib/python3.10/site-packages/keras/src/saving/saving_lib.py:207, in _load_model_from_fileobj(fileobj, custom_objects, compile, safe_mode)
    204         asset_store.close()
    206     if failed_trackables:
--> 207         _raise_loading_failure(error_msgs)
    208 return model

File ~/Desktop/projects/SPARK-STREAMING-PFA/Model/my-env/lib/python3.10/site-packages/keras/src/saving/saving_lib.py:295, in _raise_loading_failure(error_msgs, warn_only)
    293     warnings.warn(msg)
    294 else:
--> 295     raise ValueError(msg)

ValueError: A total of 1 objects could not be loaded. Example error message for object <LSTMCell name=lstm_cell, built=True>:

Layer 'lstm_cell' expected 3 variables, but received 0 variables during loading. Expected: ['kernel', 'recurrent_kernel', 'bias']

List of objects that could not be loaded:
[<LSTMCell name=lstm_cell, built=True>]

运行环境依赖

absl-py==2.1.0
asttokens==2.4.1
astunparse==1.6.3
certifi==2024.2.2
charset-normalizer==3.3.2
click==8.1.7
comm==0.2.2
contourpy==1.2.1
cycler==0.12.1
debugpy==1.8.1
decorator==5.1.1
exceptiongroup==1.2.1
executing==2.0.1
flatbuffers==24.3.25
fonttools==4.51.0
gast==0.5.4
gensim==4.3.2
google-pasta==0.2.0
grpcio==1.62.2
h5py==3.11.0
idna==3.7
ipykernel==6.29.4
ipython==8.23.0
jedi==0.19.1
joblib==1.4.0
jupyter_client==8.6.1
jupyter_core==5.7.2
keras==3.2.1
kiwisolver==1.4.5
libclang==18.1.1
Markdown==3.6
markdown-it-py==3.0.0
MarkupSafe==2.1.5
matplotlib==3.8.4
matplotlib-inline==0.1.7
mdurl==0.1.2
ml-dtypes==0.3.2
namex==0.0.8
nest-asyncio==1.6.0
nltk==3.8.1
numpy==1.26.4
opt-einsum==3.3.0
optree==0.11.0
packaging==24.0
pandas==2.2.2
parso==0.8.4
pexpect==4.9.0
pillow==10.3.0
platformdirs==4.2.0
prompt-toolkit==3.0.43
protobuf==4.25.3
psutil==5.9.8
ptyprocess==0.7.0
pure-eval==0.2.2
Pygments==2.17.2
pyparsing==3.1.2
python-dateutil==2.9.0.post0
pytz==2024.1
pyzmq==26.0.2
regex==2024.4.16
requests==2.31.0
rich==13.7.1
scikit-learn==1.4.2
scipy==1.13.0
seaborn==0.13.2
six==1.16.0
smart-open==7.0.4
stack-data==0.6.3
tensorboard==2.16.2
tensorboard-data-server==0.7.2
tensorflow==2.16.1
tensorflow-io-gcs-filesystem==0.36.0
termcolor==2.4.0
threadpoolctl==3.4.0
tornado==6.4
tqdm==4.66.2
traitlets==5.14.3
tweet-preprocessor==0.6.0
typing_extensions==4.11.0
tzdata==2024.1
urllib3==2.2.1
wcwidth==0.2.13
Werkzeug==3.0.2
wordcloud==1.9.3
wrapt==1.16.0

已尝试的方法

  • 使用h5格式保存:收到弃用警告并报错
  • 单独保存权重后加载到同架构模型:需额外处理TextVectorization层,不符合单文件加载需求

可行解决方案

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

为Bidirectional和内部LSTM层添加唯一名称,避免加载时名称匹配冲突:

model1 = Sequential()
model1.add(int_vectorize_layer)
model1.add(Embedding(vocab_size, embedding_dim))
model1.add(SpatialDropout1D(drop_lstm))
# 为Bidirectional和LSTM层指定名称
model1.add(tf.keras.layers.Bidirectional(LSTM(units=32, name="core_lstm"), name="bidirectional_wrapper"))
model1.add(Dropout(drop_lstm))
model1.add(Dense(128, activation='relu'))
model1.add(Dense(64, activation='relu'))
model1.add(Dense(32, activation='relu'))
model1.add(Dense(1, activation='sigmoid'))
model1.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

2. 使用函数式API重构模型

Sequential API在处理嵌套层(如Bidirectional包裹LSTM)时可能存在序列化缺陷,改用函数式API可解决:

import tensorflow as tf

# 定义输入层
inputs = tf.keras.Input(shape=(1,), dtype=tf.string)
# 依次添加层
x = int_vectorize_layer(inputs)
x = tf.keras.layers.Embedding(vocab_size, embedding_dim)(x)
x = tf.keras.layers.SpatialDropout1D(drop_lstm)(x)
x = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(units=32))(x)
x = tf.keras.layers.Dropout(drop_lstm)(x)
x = tf.keras.layers.Dense(128, activation='relu')(x)
x = tf.keras.layers.Dense(64, activation='relu')(x)
x = tf.keras.layers.Dense(32, activation='relu')(x)
outputs = tf.keras.layers.Dense(1, activation='sigmoid')(x)

# 创建模型
model1 = tf.keras.Model(inputs=inputs, outputs=outputs)
model1.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

3. 确保TextVectorization层已正确构建

如果int_vectorize_layer是TextVectorization层,需确保在保存模型前已调用adapt()完成适配,且其配置可被序列化:

# 适配TextVectorization层(需在模型构建前完成)
int_vectorize_layer.adapt(train_texts)
# 再构建并训练模型

4. 调整TensorFlow/Keras版本

当前使用Keras 3.2.1 + TensorFlow 2.16.1,二者存在兼容性问题,可尝试:

  • 降级到TensorFlow 2.15.0(对应Keras 2.15.0)
  • 升级到最新稳定版TensorFlow/Keras

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:54:55