R环境Keras通过save_model_tf存模型后load_model_tf加载报错求助
Keras R 环境下加载SavedModel报
AttributeError: 'NoneType' object has no attribute 'get'的排查方向 核心排查点
- 校验版本一致性
R语言的keras包是对Python生态Keras/TensorFlow的封装层,这类反序列化报错最常见的触发原因是保存与加载环节的后端版本不匹配:- 保存模型时、加载模型时分别执行
py_config()$version、keras:::keras_version()比对输出结果,如果你在两次操作之间更新、重装过R的keras包,或是后端Python环境自动升级了TensorFlow/Keras版本,就会触发模型元数据解析失败 - 特别注意:Keras 2.13以上版本对旧版SavedModel格式的兼容逻辑有调整,用Keras <2.13版本保存的模型,在Keras 2.14+版本下加载时,会因为读取序列化元数据的字段缺失,直接抛出NoneType相关的报错
- 保存模型时、加载模型时分别执行
- 校验模型文件完整性
你当前看到的三个目录是SavedModel的标准结构,但仍需确认文件没有损坏:- 检查
variables子目录下是否同时存在variables.data-00000-of-00001权重文件、variables.index索引文件,任意文件丢失都会导致加载器无法读取权重配置,取到空对象触发get方法调用报错 - 可直接在R绑定的Python环境中执行原生加载代码
tf.keras.models.load_model("model"),如果Python层也报相同错误,说明模型文件本身已经损坏,不存在R封装层的兼容问题
- 检查
- 排查序列化兼容边界问题
你当前搭建的是10-30-1结构的全连接ReLU网络,默认是无自定义组件的,但仍需确认建模环节的特殊设置:- 如果建模时使用了
layer_lambda自定义层、或是给全连接层绑定了自定义的正则化、权重约束,save_model_tf默认的SavedModel序列化逻辑无法完整存储这类自定义逻辑,加载时会将对应层对象赋值为空值,后续读取层配置时就会触发NoneType报错 - 这类场景下的替代方案是:分别通过
save_model_tf保存模型结构、save_model_weights_tf保存权重,加载时先重新搭建完全一致的模型结构,再加载对应权重文件
- 如果建模时使用了
快速定位的验证步骤
在保存完模型后不退出当前R会话,立刻执行load_model_tf("model")测试加载:
- 如果当前会话内可正常加载,重启R后加载失败,说明R启动时自动关联的Python后端环境与保存模型时使用的环境不一致,比如保存时调用了虚拟环境内的TensorFlow实例,重启后R默认加载了系统全局安装的另一个版本的TensorFlow
内容的提问来源于stack exchange,提问作者Carmen
相关产品推荐
相关产品推荐

