【问题标题】:Tensorflow model always predict the same wrong valueTensorFlow 模型总是预测相同的错误值
【发布时间】:2019-05-16 21:26:21
【问题描述】:

我实际上正在学习在 nodejs 中构建机器学习:我为此选择了tensorflow API。 这种机器学习的目标是输入 14 个条目并返回一个与 14 个条目相关的数字。 (我无法描述更多的背景,因为我正在实习,我不知道我是否允许谈论这个。) 但是模型总是预测错误的值,我不知道为什么。我尝试了不同的损失/优化器功能,不同的层模型配置,不同的层激活......但模型总是给我一个浮点值。

我尝试将输入/输出值替换为 0.3,预测返回一个介于 0.1 和 0.3 之间的值。 (测试 3 次)。但是在训练期间损失值下降,这似乎效果更好。

我还尝试将训练 epoch 增加到 1000,没有结果:/

首先,我创建一个函数来构建模型网络。我的模型有一个 14 个单元的输入层,然后是 2 个 5 个单元的隐藏层,然后是只有一个单元的输出层。 (所有层都处于'sigmoid'激活状态,并且是密集类型。)

const get_model = async () => {
    const model = tf.sequential();

    const input_layer = tf.layers.dense({
        units: 13,
        inputShape: [14],
        activation: 'sigmoid',
    });
    model.add(input_layer)

    let left = 3;
    while(left >= 2){

        const step_layer = tf.layers.dense({
            units: 5,
            activation: 'sigmoid',
        });
        model.add(step_layer)

        left --;
    }

    const output = tf.layers.dense({
        units: 1,
        activation: 'sigmoid',
    });

    model.add(output)

    model.compile({
        optimizer: tf.train.sgd(0.01),
        loss: tf.losses.absoluteDifference,
        metrics: 'accuracy',
    })

    return model;
}

为了测试模型,在训练过程中,我总是给出一个13个数字的列表(所有值都是100),我总是给出以下值:100。

const get_output = () => {
    return 100;
}
const get_input = () => {
    return [
        100,
        100,
        100,
        100,
        100,
        100,
        100,
        100,
        100,
        100,
        100,
        100,
        100,
        100,
    ];
}

我有两个函数可以将值转换为张量值。

const get_input_tensor = (value) => {
    return tf.tensor([value],[1,14])
}
const get_output_tensor = (value) => {
    return tf.tensor(
        [Math.floor(value)],
        [1,1]
    )
}

然后我得到模型,我训练模型并尝试预测。

(async () => {
    const model = await get_model();

    let left = 20;
    while(left >= 0){
        const input = get_input();
        const output = get_output();

        await model.fit(get_input_tensor(input),get_output_tensor(output),{
            batchSize: 30,
            epochs: 10,
            shuffle: true,
        });

        left--;
    }

    const input = get_input();

    const output = model.predict(get_input_tensor(input));

    output.print();
})();

在训练期间,损失值接近 100。这凸显了模型总是返回接近 1 的值。

这是我在训练期间的控制台:

Epoch 8 / 10
eta=0.0 ====================================================================> 
11ms 10943us/step - loss=99.14 
Epoch 9 / 10
eta=0.0 ====================================================================> 
10ms 10351us/step - loss=99.14 
Epoch 10 / 10
eta=0.0 ====================================================================> 
12ms 12482us/step - loss=99.14

然后当我尝试预测时,模型返回一个接近 1 的值。

这是预测的打印张量。

Tensor
     [[0.8586583],]

你能帮帮我吗?我不知道出了什么问题。预测值是否可能超过 1 ?

【问题讨论】:

    标签: node.js tensorflow machine-learning tensorflow.js


    【解决方案1】:

    这是一个简单的模型,它可以根据输入的 14 个值预测 100。通常将输入值采样到 0 到 1 之间是很常见的。它提高了最速下降算法的收敛性。

    至于模型预测错误值的原因;有一般答案here

    (async () => {
      const model = tf.sequential({
        layers: [tf.layers.dense({units: 1, inputShape: [14], activation: 'relu', kernelInitializer: 'ones'})]
      });
      model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});
      await model.fit(tf.ones([1, 14]), tf.tensor([100], [1, 1]), {epochs: 100})
      model.predict(tf.ones([1, 14])).print();
     })()
    <html>
      <head>
        <!-- Load TensorFlow.js -->
        <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"> </script>
      </head>
    
      <body>
      </body>
    </html>

    【讨论】:

      【解决方案2】:

      我终于解决了问题!

      我的图层使用以下激活:'sigmoid'。 sigmoid 是一个函数,其中值包含在 0 和 1 之间,这就是我得到相同值的原因。 (激活“relu”并不是我所期望的)

      我将激活设置为“线性”,但此激活在训练期间使损失值变为 NaN,然后​​我将优化器切换为 adam,这解决了问题:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-04
        • 2017-11-07
        • 1970-01-01
        • 2021-12-28
        • 2018-02-19
        • 1970-01-01
        • 2018-06-30
        • 2021-06-13
        相关资源
        最近更新 更多