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

使用pickle反序列化Keras模型时遇Adam无build属性错误

Keras模型pickle加载报错AttributeError: 'Adam' object has no attribute 'build'的解决

问题根源

TensorFlow/Keras的模型及优化器(如Adam)不能直接用pickle序列化保存。这类对象的内部结构依赖TensorFlow底层实现,没有实现pickle所需的完整序列化逻辑,加载时会丢失关键方法与状态,触发上述错误。

正确的模型保存与加载方式

方式1:保存完整模型(推荐)

使用Keras官方提供的model.save()方法,可完整保存模型结构、权重、优化器状态等信息:

from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras.layers import Dense

# 构建并编译模型
model = Sequential()
model.add(Dense(32, activation='relu', input_shape=(3,)))
model.add(Dense(1, activation='linear'))
model.compile(loss='mean_squared_error', optimizer='adam')

# 保存模型(支持.h5格式或SavedModel文件夹格式)
model.save("my_model.h5")
# 或用SavedModel格式:model.save("my_model_directory")

# 加载模型
loaded_model = load_model("my_model.h5")
# SavedModel格式加载:loaded_model = load_model("my_model_directory")

方式2:拆分保存结构与权重

若只需单独保存模型结构和权重,可采用以下方式:

from tensorflow.keras.models import Sequential, model_from_json
from tensorflow.keras.layers import Dense

model = Sequential()
model.add(Dense(32, activation='relu', input_shape=(3,)))
model.add(Dense(1, activation='linear'))
model.compile(loss='mean_squared_error', optimizer='adam')

# 保存模型结构为JSON文件
model_json = model.to_json()
with open("model_structure.json", "w") as f:
    f.write(model_json)

# 保存模型权重
model.save_weights("model_weights.h5")

# 加载流程
# 1. 重建模型结构
with open("model_structure.json", "r") as f:
    loaded_structure = f.read()
loaded_model = model_from_json(loaded_structure)

# 2. 加载权重
loaded_model.load_weights("model_weights.h5")

# 3. 重新编译模型(若需训练或评估)
loaded_model.compile(loss='mean_squared_error', optimizer='adam')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 09:12:45