为什么 model.predict() 的输出未定义?

Why the output of model.predict() is undefined?

我有一个用 tensorflowjs 构建的非常基本的模型。它应该可以工作,因为它是直接从 google tensorflow 教程中复制的。我只是将该代码转换为 class 以实现可重用性。每次我传递一些数据进行预测时,它 returns 未定义。

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() {

     }

 }

以上是我的调用方式class

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

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

我认为 train() 没有完成。

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

您的代码有几个问题:

  1. model.fit()的return类型是Promise,但是当Promise解析成功后,没有数据returned。所以这段代码:

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

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

  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()得到预测值并进行下一步。