Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Tensorflow模型总是预测相同的错误值_Node.js_Tensorflow_Machine Learning_Tensorflow.js - Fatal编程技术网

Node.js Tensorflow模型总是预测相同的错误值

Node.js Tensorflow模型总是预测相同的错误值,node.js,tensorflow,machine-learning,tensorflow.js,Node.js,Tensorflow,Machine Learning,Tensorflow.js,实际上,我正在学习在nodejs中构建机器学习:为此我选择API。 机器学习的目标是输入14个条目,并返回与14个条目相关的数字。我无法描述更多的背景,因为我在实习,我不知道我是否允许谈论这个。 但是模型总是预测错误的值,我不知道为什么。我尝试了不同的损失/优化功能,不同的层模型配置,不同的层激活。。。但是模型总是给我一个浮动值 我尝试将输入/输出值替换为0.3,预测返回的值介于0.1和0.3之间。测试了3次。但在训练过程中损失值会下降,这似乎效果更好 我还尝试将训练次数增加到1000次,但没有

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

我尝试将输入/输出值替换为0.3,预测返回的值介于0.1和0.3之间。测试了3次。但在训练过程中损失值会下降,这似乎效果更好

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

首先,我创建了一个函数来构建模型网络。我的模型有14个单元的输入层,然后是5个单元的2个隐藏层,然后是只有一个单元的输出层。所有层均为“乙状”激活,且为致密型

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();
})();
Tensor
     [[0.8586583],]
在训练期间,损失值接近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的值

这是预测的打印张量

(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();
})();
Tensor
     [[0.8586583],]

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

这里有一个简单的模型,可以从14个值的输入中预测100。通常,对输入值进行采样,使其介于0和1之间。它改进了最速下降算法的收敛性

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

异步=>{ 常量模型=tf.sequential{ 层:[tf.layers.dense{units:1,inputShape:[14],激活:'relu',内核初始化器:'ones'}] }; 编译{优化器:'sgd',loss:'meanSquaredError'}; wait model.fittf.one[1,14],tf.tensor[100],[1,1],{epochs:100} model.predictf.ones[1,14].打印; }
我终于解决了问题

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

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