You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跟随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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 13:15:02