【问题标题】:Why the output of model.predict() is undefined?为什么 model.predict() 的输出未定义?
【发布时间】:2021-06-18 05:32:59
【问题描述】:

我有一个用 tensorflowjs 构建的非常基本的模型。它应该可以工作,因为它是直接从 google tensorflow 教程复制而来的。我只是将该代码转换为一个可重用的类。每次我传递一些数据进行预测时,它都会返回 undefined。

class TFModel {

     constructor() {
         this.xs = tf.randomUniform([10000, 2]);
         this.ys = tf.randomUniform([10000, 1]);
         this.valXs = tf.randomUniform([1000, 2]);
         this.valYs = tf.randomUniform([1000, 1]);
         this.model = tf.sequential();
     }

     init() {
         this.model.add(tf.layers.dense({
             units: 1,
             inputShape: [2]
         }));
         this.model.compile({
             loss: 'meanSquaredError',
             optimizer: 'sgd',
             metrics: ['MAE']
         });
     }

     async train() {
         await this.model.fit(this.xs, this.ys, {
             epochs: 4,
             validationData: [this.valXs, this.valYs]
         });
     }

     predict(data, callback) {
         let transData = tf.tensor(data)
         console.log(transData)
         this.model.predict(transData, result => {
             console.log("Result Predict", result)
             // callback(result)
         })
     }

     dispose() {

     }

 }

这是我如何调用上面的类

model = new TFModel();
model.init()
model.train().then(data => {
    console.log("Resul Predict", data)
})

model.predict([
    [3, 3]
], result => {
    //  console.log("Result Predict", result)
})

【问题讨论】:

    标签: javascript node.js tensorflow tensorflow.js


    【解决方案1】:

    您的代码有几个问题:

    1. model.fit()的返回类型是Promise,但是当Promise解析成功时,没有返回任何数据。所以这段代码:

      model.train().then(data => {
          console.log("Resul Predict", data)
      })
      

      没有意义。你的then() 函数被调用,但data 将是undefined,因为fit() 不返回任何数据。它训练模型,并且模型本身中存在任何更新。

    2. 没有回调函数可以作为参数传递给model.predict() - 如该函数不将回调函数作为参数。所以这段代码:

      this.model.predict(transData, result => {
          console.log("Result Predict", result)
          // callback(result)
      })
      

      也没有任何意义。完整的方法应该是:

      predict(data, callback) {
          let transData = tf.tensor(data)
          console.log(transData)
          callback(this.model.predict(transData))
      }
      

      您正在将model.predict() 的结果传递给回调。当你这样做时,你将得到预测的张量输出。

    如果我取消注释您的回调函数中的语句:

    model.predict([
        [3, 3]
    ], result => {
        console.log("Result Predict", result) // Uncommented this line
    })
    

    然后我得到如下输出:

    Result Predict Tensor {
      kept: false,
      isDisposedInternal: false,
      shape: [ 1, 1 ],
      dtype: 'float32',
      size: 1,
      strides: [ 1 ],
      dataId: {},
      id: 21,
      rankType: '2',
      scopeId: 5
    }
    

    您可以使用Tensor.print()获取预测值并继续进行。

    【讨论】:

    • 首先我犯了一个非常愚蠢的错误。我很高兴你指出。我完全忘记了我的异步等待功能。我不知道我是怎么错过的。那真是让我傻眼了。这实际上解决了所有问题。现在一切都按预期正常工作。我应该去睡觉了。抱歉。如果我可以在这里请求您提供帮助 - stackoverflow.com/questions/67815952/…
    【解决方案2】:

    我认为 train() 没有完成。

    model.train().then(() => {
      model.predict([3, 3])
    });
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    相关资源
    最近更新 更多