模型预测 NaN
model predicts NaN
我正在尝试在 Tensorflow.js 上学习和练习。
因此,我尝试在 [2] 形数组上训练一个神经网络作为 x(据我所知,这将模拟一个问题,其中我有 x 个样本,每个样本都有 2 个变量)和一个 [1] 数组作为 y (如果我是正确的,我的 2 个变量的组合会产生 1 个输出,这意味着什么)。
然后我尝试对其进行编码:
const model = tf.sequential();
model.add(tf.layers.dense({ units: 2, inputShape: [2] }));
model.add(tf.layers.dense({ units: 64, inputShape: [2] }));
model.add(tf.layers.dense({ units: 1, inputShape: [64] }));
// Prepare the model for training: Specify the loss and the optimizer.
model.compile({ loss: 'meanSquaredError', optimizer: 'sgd' });
// Generate some synthetic data for training.
const xs = tf.tensor([[1,5], [2,10], [3,15], [4,20], [5,25], [6,30], [7,35], [8,40]], [8, 2]);
const ys = tf.tensor([1, 2, 3, 4, 5, 6, 7, 8], [8, 1]);
// Train the model using the data.
model.fit(xs, ys, { epochs: 100 }).then(() => {
// Use the model to do inference on a data point the model hasn't seen before:
// Open the browser devtools to see the output
model.predict(tf.tensor([10, 50], [1, 2])).print();
});
但是,我面临的是,当我尝试预测 [10,50] 输入时,我有以下控制台输出:
Tensor
[[NaN],]
所以,我认为我的问题可能非常简单,但我真的被这个问题困住了,可能是我缺少一些背景知识的问题。
谢谢!
第一层采用输入数据的形状
model.add(tf.layers.dense({ units: 2, inputShape: [2] }))
inputShape是[2],也就是说你输入的x的形状是[2]。
最后一层unit
值给出了输出y的维度。
model.add(tf.layers.dense({ units: 1, inputShape: [64] }));
所以y的形状应该是[1]
在这种情况下,NaN
预测与训练的轮数有关。如果将它减少到 2 或 3,它将 return 一个数值。实际上,该错误与您的优化器如何更新权重有关。或者,您可以将优化器更改为 adam
就可以了。
我想我迟到了,但我希望这对某人有所帮助。
我曾经遇到过同样的问题,这是因为我正在使用“fs”依赖项从文件中获取训练和测试数据,我通过在将返回的变量返回到主函数开始训练之前对返回的变量执行此操作来解决问题:
JSON.parse(JSON.stringify(data))
我不知道原因,但出于某种原因,tensorflow 模型只接受 JSON 数组而不接受任何 JavaScript 数组,所以只需这样做,您就可以将数组转换为 json 数组而不是将其保留为 JavaScript 数组。
希望这可以节省一些人的时间。
我在过去 2 天处理了同样的问题,问题是我用 GPU 训练了我的模型(使用 Google Colab)并在 CPU 上进行了推理。将 Google Colab 的设置更改为不使用硬件加速后,我的问题得到解决!
希望这对以后的人有所帮助。
我正在尝试在 Tensorflow.js 上学习和练习。 因此,我尝试在 [2] 形数组上训练一个神经网络作为 x(据我所知,这将模拟一个问题,其中我有 x 个样本,每个样本都有 2 个变量)和一个 [1] 数组作为 y (如果我是正确的,我的 2 个变量的组合会产生 1 个输出,这意味着什么)。
然后我尝试对其进行编码:
const model = tf.sequential();
model.add(tf.layers.dense({ units: 2, inputShape: [2] }));
model.add(tf.layers.dense({ units: 64, inputShape: [2] }));
model.add(tf.layers.dense({ units: 1, inputShape: [64] }));
// Prepare the model for training: Specify the loss and the optimizer.
model.compile({ loss: 'meanSquaredError', optimizer: 'sgd' });
// Generate some synthetic data for training.
const xs = tf.tensor([[1,5], [2,10], [3,15], [4,20], [5,25], [6,30], [7,35], [8,40]], [8, 2]);
const ys = tf.tensor([1, 2, 3, 4, 5, 6, 7, 8], [8, 1]);
// Train the model using the data.
model.fit(xs, ys, { epochs: 100 }).then(() => {
// Use the model to do inference on a data point the model hasn't seen before:
// Open the browser devtools to see the output
model.predict(tf.tensor([10, 50], [1, 2])).print();
});
但是,我面临的是,当我尝试预测 [10,50] 输入时,我有以下控制台输出:
Tensor [[NaN],]
所以,我认为我的问题可能非常简单,但我真的被这个问题困住了,可能是我缺少一些背景知识的问题。
谢谢!
第一层采用输入数据的形状
model.add(tf.layers.dense({ units: 2, inputShape: [2] }))
inputShape是[2],也就是说你输入的x的形状是[2]。
最后一层unit
值给出了输出y的维度。
model.add(tf.layers.dense({ units: 1, inputShape: [64] }));
所以y的形状应该是[1]
在这种情况下,NaN
预测与训练的轮数有关。如果将它减少到 2 或 3,它将 return 一个数值。实际上,该错误与您的优化器如何更新权重有关。或者,您可以将优化器更改为 adam
就可以了。
我想我迟到了,但我希望这对某人有所帮助。 我曾经遇到过同样的问题,这是因为我正在使用“fs”依赖项从文件中获取训练和测试数据,我通过在将返回的变量返回到主函数开始训练之前对返回的变量执行此操作来解决问题:
JSON.parse(JSON.stringify(data))
我不知道原因,但出于某种原因,tensorflow 模型只接受 JSON 数组而不接受任何 JavaScript 数组,所以只需这样做,您就可以将数组转换为 json 数组而不是将其保留为 JavaScript 数组。
希望这可以节省一些人的时间。
我在过去 2 天处理了同样的问题,问题是我用 GPU 训练了我的模型(使用 Google Colab)并在 CPU 上进行了推理。将 Google Colab 的设置更改为不使用硬件加速后,我的问题得到解决!
希望这对以后的人有所帮助。