TensorFlow.js model.predict()输出NaN值,新手求问题排查方案
解决TensorFlow.js预测返回NaN的问题
嘿,作为TensorFlow.js新手遇到NaN预测结果真的很常见,我来帮你梳理几个最可能的原因,结合你给出的代码片段逐一分析:
1. 训练数据未做归一化/标准化
这是最常见的诱因!如果你的输入数据(xs)或者标签数据(ys)数值跨度极大(比如有的值是几千,有的是0.001),训练时梯度会直接“爆炸”,导致模型权重变成NaN。
解决办法:把数据缩放到0-1或者-1到1的区间,比如用标准化(减去均值除以标准差):
// 假设xs是你的输入张量 const normalizedXs = xs.sub(xs.mean()).div(xs.std()); // 标签数据也建议做同样处理,预测后再反转换回去
2. 输入数据本身包含无效值
如果你的原始数据(也就是传入myFirstTfjs的arr)里有NaN、null或者无穷大的值,模型训练时直接就会输出NaN结果。
解决办法:先清洗数据,过滤掉无效条目:
// 假设arr是[[特征1, 特征2], ...]的结构,先检查每个值是否有效 const cleanArr = arr.filter(item => !isNaN(item[0]) && !isNaN(item[1])); // 再转换成张量 const xs = tf.tensor2d(cleanArr, [cleanArr.length, 2]);
3. SGD优化器的学习率过高
你用的是sgd(随机梯度下降)优化器,默认的学习率可能太大,导致权重更新时直接跳过合理范围,变成NaN。
解决办法:手动设置更小的学习率试试:
model.compile({ loss: 'meanSquaredError', optimizer: tf.train.sgd(0.001) // 把学习率调到0.001或者更小,根据数据调整 });
4. 输入形状与模型不匹配
你的模型定义了inputShape: [2],意味着每个输入样本必须是2维的。如果你的xs张量形状不对(比如是1维或者3维),训练过程也会出问题。
解决办法:检查张量形状,确保xs是[样本数量, 2]的2D张量:
// 比如arr是包含10个2维样本的数组,转换时指定形状 const xs = tf.tensor2d(arr, [arr.length, 2]); // 可以用print()查看形状和数据 xs.print();
另外,你的代码里const xs =...没写完,记得要把输入数据正确转换成TensorFlow.js的张量,同时确保标签数据ys的形状和模型输出(1维)匹配哦。
内容的提问来源于stack exchange,提问作者Pratik Khadtale
相关产品推荐
相关产品推荐

