跟随CodeTrain《Nature of Code》开发XOR神经网络遇TypeError报错求助
报错定位
直接对应你的代码和堆栈信息反推问题链路:
- Matrix.js里
fromArray方法的第19行代码是let m = new Matrix(arr.length, 1),这里报TypeError的原因只有一个:传进来的arr是undefined,对undefined读length属性直接触发类型错误 - 顺着调用链往上找:
fromArray是在NeuralNetwork的train方法里被调用的,作用是把训练用的目标值数组转成矩阵 - 再往上追到sketch.js的draw函数:你调
nn.train()的时候,第二个参数传的是data.outputs,但你定义的训练样本里,每条的目标值字段叫targets,根本没有outputs这个字段,自然取到undefined直接触发报错
修复方法
打开sketch.js,找到draw里的训练循环段,把字段名改对:
原错误代码:
for (let i = 0; i < 1000; i++) { let data = random(training_data); nn.train(data.inputs, data.outputs); }
修正后代码:
for (let i = 0; i < 1000; i++) { let data = random(training_data); nn.train(data.inputs, data.targets); }
额外提示
- 现在draw里的网格填充是全随机取灰度值,不是你预期的XOR可视化效果,等训练通了之后,把随机填色的逻辑换成:把每个网格的x、y坐标归一化到[0,1]作为网络输入,根据网络输出的值填黑色或白色,就能看到训练收敛后的清晰分块效果
- 可以给
fromArray加个简单的参数校验,以后再碰到同类传参错误,能直接看到明确的报错提示,不用费劲反查堆栈:
static fromArray(arr) { if (!Array.isArray(arr)) { throw new Error(`fromArray需要传数组,当前收到的是${typeof arr}`); } let m = new Matrix(arr.length, 1); for (let i = 0; i < arr.length; i++) { m.data[i][0] = arr[i]; } return m; }
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

