【问题标题】:How to build a tensorflow.js model to predict the square of a number?如何构建 tensorflow.js 模型来预测数字的平方?
【发布时间】:2021-07-29 16:37:58
【问题描述】:

我正在尝试创建一个 tensorflow.js 模型(使用 javascript)来预测数字的平方,所以我有一个函数来创建 xData(x) 和 yData(x² )。

我尝试使用许多具有不同单元的隐藏层并使用数千个 epoch 进行训练,但损失非常高,而且预测一点也不好。

这是我的代码:

const tf=require("@tensorflow/tfjs-node");

let dataX=[
//0, 1, 2, 3, ..., 1000;
];

let dataY=[
//0, 1, 4, 9, ..., 1000000;
]
for (let i = 0; i < 1000; i++) {
    dataX.splice(0,0, i);
    dataY.splice(0,0, i**2);
}
class AI{
    compile(){
        const model=tf.sequential();

        //Input & hidenA layer
        model.add(tf.layers.dense({
            inputShape: [1],
            units: 32,
            activation: 'sigmoid',
            useBias: true
        }));
        //HidenB layer
        model.add(tf.layers.dense({
            units: 32,
            activation: 'sigmoid',
            useBias: true
        }))


        //Output layer

        model.add(tf.layers.dense({
            units: 1,
            activation: 'sigmoid',
            useBias: true
        }))
        let sgdOpt=tf.train.sgd(0.00001)
        model.compile({
            loss: 'meanSquaredError',
            optimizer: sgdOpt
        })

        return model;
    }

    run(){
        const model=this.compile();
        const xs=tf.tensor(dataX)

        const ys=tf.tensor(dataY)
try{
    model.summary();
model.fit(xs, ys, {
            epochs: 1000,
        }).then(()=>{
            const data=tf.tensor([10]);

            const prediction=model.predict(data);

            prediction.print();
        })
}catch(e){

}
        
    }
}

const ai=new AI();

ai.run();

【问题讨论】:

    标签: javascript node.js tensorflow tensorflow.js


    【解决方案1】:

    我知道这听起来很奇怪,但是,我相信您遗漏了一些 AI 可以派生抽象方法的关键功能。

    我将使用https://playground.tensorflow.org/ 来说明我的想法。他们有一个分类问题(我知道你的问题是回归),我认为这确实说明了一些关键点。

    问题 1:Sigmoid

    首先,您在每个隐藏层使用 sigmoid 激活。 Sigmoid 在训练方面也存在一些问题。

    在使用 sigmoid 激活 1,000 个 epoch 之后,您会注意到网络为这个循环问题得出了一个非常线性的解决方案:

    Link to playground

    只需将激活切换到 ReLU,您就可以在 1/10 的 epoch 中看到更好的解决方案。

    问题 2:线性特征

    从上图中可以看出,使用 ReLU 的解决方案非常有针对性。理想情况下,它应该创建一个圆圈。您在直线与数字平方的图中遇到了同样的问题。实际上,我在 Chapter 8 of my book 中涵盖了这个确切的问题,虽然我可以教 AI 为 7**2 === ~~49 得到一个完全可以接受的答案,但它不适用于更大的数字。

    原因,我相信很简单。如果我希望模型能够确定数字的平方,我将需要派生有助于它看到差异的特征。

    让我们回到我们的游乐场示例。看看它有多么锋利的边缘?如果我们给模型输入提供一些额外的特征,比如每个值的平方呢?我们立即(在 40 个 epoch 中)看到它有一个可靠的答案!

    因此,通过创建正方形的特征输入,模型可以得出平滑的非线性分类。但是,当您的模型如此简单以至于将您的输入平方就是答案时,您添加特征的方式就会受到限制。这就是为什么我对我的小例子“有点”准确感到满意的原因。这不是现实世界的问题。但是,如果您真的想创建一个对数字进行平方的模型而不将其添加为特征,则您必须导出特征作为模型可以确定答案的输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      相关资源
      最近更新 更多