TensorFlow.js加载转换后Keras模型报model.execute键错误如何解决
Keras模型转TensorFlow.js后React加载报错解决方案
你遇到的报错内容:
Unhandled Rejection (Error): The dict provided in model.execute(dict) has keys:
错误含义
该报错说明你调用model.predict时传入的参数不符合图模型的输入要求:
- 直接传入DOM图片元素,没有转为符合模型要求的张量格式
- 图模型需要传入和输入签名匹配的键值对对象,你传的是单个元素,没有对应输入key
修复步骤
第一步:确认模型输入签名
加载模型完成后打印输入信息,拿到模型要求的输入key、张量维度、数据格式:const model = await tf.loadGraphModel('model.json') console.log(model.inputs)输出中
name字段就是需要传入的输入key,shape字段就是要求的张量维度。第二步:预处理图片为符合要求的张量
不能直接传入图片DOM元素,需要按训练时的预处理逻辑转换张量:// 请替换代码中尺寸、归一化逻辑为你模型训练时的对应参数 const imgTensor = tf.browser.fromPixels(imageElement) .resizeNearestNeighbor([224, 224]) // 替换为模型训练用的输入宽高 .toFloat() .div(tf.scalar(255)) // 训练时归一化到0-1则保留,归一化到-1~1替换为.div(127.5).sub(1) .expandDims() // 补充batch维度,符合[batch, h, w, c]的输入要求第三步:按输入签名传入参数
调用predict时传入键值对,key为上一步拿到的输入名称:// 把input_1替换为你拿到的实际输入key const predictions = await model.predict({ "input_1": imgTensor }).data()可选优化(Keras模型专用)
如果你是原生Keras导出的SavedModel,建议转换时修改输入格式为keras_saved_model,转换后用loadLayersModel加载,无需手动匹配输入key:
转换命令:tensorflowjs_converter \ --input_format=keras_saved_model \ model_name \ web_model加载代码:
const model = await tf.loadLayersModel('model.json') // 预处理后的张量可直接传入,无需包装为键值对 const predictions = await model.predict(imgTensor).data()
内容的提问来源于stack exchange,提问作者Joseph Adam
相关产品推荐
相关产品推荐

