tf.loadLayersModel加载模型报错:JSON无拓扑或权重清单
问题场景
用tf.keras训练分类器后,通过tensorflowjs_converter将.h5模型转换为TFJS格式,执行命令:
!tensorflowjs_converter --input_format=keras '/content/ver1.h5' '/content/json'
使用tf.loadLayersModel("http://127.0.0.1:8080/model.json")加载模型,已用带--cors参数的http-server处理跨域,但控制台持续报错:
http.ts:175 Uncaught (in promise) Error: The JSON from HTTP path http://127.0.0.1:8080/model.json contains neither model topology nor manifest for weights.
报错触发代码段:
const modelTopology = modelJSON.modelTopology; const weightsManifest = modelJSON.weightsManifest; if (modelTopology == null && weightsManifest == null) { throw new Error(`The JSON from HTTP path ${this.path} contains neither model ` + `topology or manifest for weights.`); }
但直接打开http://127.0.0.1:8080/model.json可看到modelTopology和weightsManifest字段均存在,需排查解决。
解决方案
校验HTTP响应的真实内容
浏览器直接打开的内容可能是本地缓存,打开开发者工具(F12)→ 切换到Network标签,刷新页面后找到model.json请求,查看Response标签下的内容,确认返回的JSON结构是否完整,是否被HTML错误页、多余空格、BOM头等字符污染。对齐tensorflowjs_converter与TFJS版本
转换器和前端TFJS版本不兼容会导致解析失败,执行以下命令检查版本:# 查看转换器版本 tensorflowjs_converter --version # 查看前端TFJS版本(npm环境) npm list @tensorflow/tfjs确保两者主版本一致(如均为4.x或3.x),版本差异过大易引发模型结构不兼容问题。
重新转换模型并指定输出格式
尝试添加明确的输出格式参数重新转换:tensorflowjs_converter --input_format=keras --output_format=tfjs_layers_model '/content/ver1.h5' '/content/json'转换完成后检查输出目录,确保存在
model.json及对应权重文件(如group1-shard1ofN.bin),且权重文件路径在model.json的weightsManifest中配置正确。确认http-server服务目录
启动http-server时需进入包含model.json和权重文件的目录,避免路径错误:cd /content/json http-server --cors若服务目录错误,请求可能返回404页面等无效内容,导致解析失败。
清除浏览器缓存
按Ctrl+Shift+R强制刷新页面,或在开发者工具中勾选“Disable cache”选项后重新加载,避免浏览器缓存旧的错误响应。
内容的提问来源于stack exchange,提问作者rjacko

