React Native Expo中TensorFlow.js加载模型报错:modelWeightsID需为数字或数字数组
解决React Native Expo中tfjs加载本地模型报错modelWeightsID的问题
问题重现
在React Native Expo项目中使用@tensorflow/tfjs和@tensorflow/tfjs-react-native加载本地模型时,执行以下代码:
import modelJSON from '../../../assets/model/model.json' import modelWeights from '../../../assets/model/group1-shard.bin' const model = await tf.loadLayersModel( bundleResourceIO(modelJSON, modelWeights), ).catch((error) => { console.error(error) })
出现错误:
Error: modelWeightsID must be a number or number array. Have you wrapped your asset paths in a require() statements?
尝试用require导入权重后问题依旧。
解决方案
1. 正确配置Expo资产
首先确保模型文件被Expo正确识别打包:
- 在
app.json或app.config.js的assets数组中添加模型所在目录:"assets": [ "./assets/model/" ] - 执行
expo start -c清除缓存并重启项目,让Expo重新打包资产。
2. 修正资源导入方式
bundleResourceIO的第二个参数需要的是资源的ID(require返回的数字),而非文件内容,正确写法如下:
// 导入model.json作为JSON对象 import modelJSON from '../../../assets/model/model.json'; // 用require获取权重文件的资源ID const modelWeights = require('../../../assets/model/group1-shard.bin'); // 先确保tfjs初始化完成 await tf.ready(); // 加载模型 const model = await tf.loadLayersModel( bundleResourceIO(modelJSON, modelWeights) ).catch(error => { console.error(error); });
3. 检查模型文件有效性
- 打开
model.json,确认weightsManifest中的分片文件名(如group1-shard.bin)和实际文件完全一致,包括大小写。 - 确保模型是通过官方
tfjs-converter工具转换的,符合TensorFlow.js的格式规范。
4. 适配Expo高版本(SDK 49+)
如果使用Expo SDK 49及以上版本,资产路径需严格对应,避免相对路径层级错误,可尝试使用绝对路径或者调整导入路径的层级。
内容的提问来源于stack exchange,提问作者Jonathan Stevens
相关产品推荐
相关产品推荐

