ml5.js回归模型训练报错:Uncaught (in promise) TypeError: e is not a function
问题分析与解决方案
核心错误原因
你遇到的Uncaught (in promise) TypeError: e is not a function错误,主要源于两个问题:
batchsize拼写错误,ml5.js的配置参数严格遵循驼峰命名,正确写法是batchSize,拼写错误会触发内部逻辑异常。brain.train()方法需要回调函数(或通过Promise处理异步),未提供回调时,内部尝试调用不存在的函数会抛出该错误。
代码修复步骤
1. 修正训练逻辑与参数
将训练代码修改为以下两种方式之一:
方式一:使用回调函数
if (key == 't') { // 先校验输入输出数据长度是否匹配 if (poses1.length !== poses2.length) { console.error('输入数据集与输出数据集长度不一致,无法训练'); return; } for (let i = 0; i < poses1.length; i++){ let input = poses1[i]; let output = poses2[i]; debugArIn.push(input); debugArOut.push(output); brain.addData(input, output); }; brain.normalizeData(); // 修正batchSize拼写,添加训练完成回调 brain.train({epochs:34, batchSize:68}, () => { console.log('模型训练完成'); // 训练完成后的业务逻辑可在此编写 }); }
方式二:使用async/await处理异步
// 定义异步训练函数 async function trainBrain() { if (poses1.length !== poses2.length) { console.error('输入数据集与输出数据集长度不一致,无法训练'); return; } for (let i = 0; i < poses1.length; i++){ let input = poses1[i]; let output = poses2[i]; debugArIn.push(input); debugArOut.push(output); brain.addData(input, output); }; brain.normalizeData(); await brain.train({epochs:34, batchSize:68}); console.log('模型训练完成'); } // 触发训练 if (key == 't') { trainBrain(); }
2. 其他潜在问题修复
- 给
input和output添加let声明,避免全局变量污染。 - 若需要重复训练,每次训练前调用
brain.data.reset()清空旧数据集,防止数据干扰。
额外验证点
- 确认
poses1和poses2中的每个元素都是长度为34的数组(对应17个关键点的x、y坐标),保证输入输出维度匹配回归模型要求。 - 可过滤PoseNet低置信度关键点,避免异常数据影响训练:
for (let keypoint of pose.keypoints) { if (keypoint.score > 0.5) { // 只保留置信度高于0.5的关键点 let x = keypoint.position.x; let y = keypoint.position.y; inputs.push(x); inputs.push(y); } }
内容的提问来源于stack exchange,提问作者50NNY1
相关产品推荐
相关产品推荐

