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
相关产品推荐
相关产品推荐

