为什么 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])
});
您的代码有几个问题:
model.fit()
的return类型是Promise,但是当Promise解析成功后,没有数据returned。所以这段代码:
model.train().then(data => {
console.log("Resul Predict", data)
})
没有意义。您的 then()
函数被调用,但是 data
将是 undefined
因为 fit()
没有 return 任何数据。它训练模型并且模型本身存在任何更新。
没有回调函数作为参数传递给 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()
得到预测值并进行下一步。
我有一个用 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])
});
您的代码有几个问题:
model.fit()
的return类型是Promise,但是当Promise解析成功后,没有数据returned。所以这段代码:model.train().then(data => { console.log("Resul Predict", data) })
没有意义。您的
then()
函数被调用,但是data
将是undefined
因为fit()
没有 return 任何数据。它训练模型并且模型本身存在任何更新。没有回调函数作为参数传递给 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()
得到预测值并进行下一步。