模型预测NaN

时间:2018-09-28 00:59:49

标签: tensorflow tensorflow.js

我正在尝试在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]输入时,我具有以下控制台输出:

  

张量   [[NaN],]

所以,我认为我的问题可能很简单,但是我对此确实很固执,可能与我所缺少的一些背景知识有关。

谢谢!

3 个答案:

答案 0 :(得分:2)

第一层采用输入数据的形状

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,它将返回一个数值。实际上,该错误与优化器如何更新权重有关。另外,您可以将优化器更改为adam,就可以了。

答案 1 :(得分:0)

我想我迟到了,但我希望这对某人有所帮助。 我曾经遇到过同样的问题,这是因为我正在使用“fs”依赖项从文件中获取训练和测试数据,我通过在将其返回到主函数开始训练之前对返回的变量执行此操作来解决问题:

JSON.parse(JSON.stringify(data))

我不知道原因,但由于某种原因,tensorflow 模型只接受 JSON 数组而不接受任何 JavaScript 数组,因此通过这样做,您将数组转换为 json 数组,而不是将其保留为 JavaScript 数组。

希望这可以节省某人的时间。

答案 2 :(得分:0)

过去 2 天我处理了同样的问题,问题是我使用 GPU(使用 Google Colab)训练我的模型并在 CPU 上执行推理。将 Google Colab 上的设置更改为不使用硬件加速后,我的问题得到解决!

希望这对未来的人有所帮助。