Tensorflow TFJS预测与Python预测
我在Python中使用Keras训练了我的模型,并将我的模型转换为tfjs模型,以便在我的webapp中使用它。我还用python编写了一个小的预测脚本,在看不见的数据上验证我的模型。在python中,它工作得很好,但当我试图在我的webapp中预测时,它出错了 这是我在Python中用于创建张量并基于这些创建的张量进行预测的代码:Tensorflow TFJS预测与Python预测,tensorflow,keras,prediction,tensorflow-datasets,tensorflow.js,Tensorflow,Keras,Prediction,Tensorflow Datasets,Tensorflow.js,我在Python中使用Keras训练了我的模型,并将我的模型转换为tfjs模型,以便在我的webapp中使用它。我还用python编写了一个小的预测脚本,在看不见的数据上验证我的模型。在python中,它工作得很好,但当我试图在我的webapp中预测时,它出错了 这是我在Python中用于创建张量并基于这些创建的张量进行预测的代码: input_dict = {name: tf.convert_to_tensor([value]) for name, value in sample_v.item
input_dict = {name: tf.convert_to_tensor([value]) for name, value in sample_v.items()}
predictions = model.predict(input_dict)
classes = predictions.argmax(axis=-1)
然而,在TFJS中,我似乎无法将dict(或object)传递给predict函数,但如果我编写代码将其转换为张量数组(就像我在网上的一些地方发现的那样),它似乎仍然不起作用
Object.keys(input).forEach((k) => {
input[k] = tensor1d([input[k]]);
});
console.log(Object.values(input));
const prediction = await model.executeAsync(Object.values(input));
console.log(prediction);
如果我执行上述操作,我会得到以下错误:model.execute(dict)中提供的dict['key_1']的形状必须是[-1,1],但它是[1]
如果我将其转换为以下代码:
const input = { ...track.audioFeatures };
Object.keys(input).forEach((k) => {
input[k] = tensor2d([input[k]], [1, 1]);
});
console.log(Object.values(input));
我得到一个错误,一些数据类型必须是int32,但却是float32。没问题,我可以手动设置数据类型:
const input = { ...track.audioFeatures };
Object.keys(input).forEach((k) => {
if (k === 'int_key') {
input[k] = tensor2d([input[k]], [1, 1], 'int32');
} else {
input[k] = tensor2d([input[k]], [1, 1]);
}
});
console.log(Object.values(input));
我仍然得到相同的错误,但是如果我打印它,我可以看到数据类型被设置为int32
我真的很困惑为什么会这样,为什么我不能像python那样在TFJS中放一个dict(或object),以及如何解决我遇到的问题
编辑1:完成预测片段
const model = await loadModel();
const input = { ...track.audioFeatures };
Object.keys(input).forEach((k) => {
if (k === 'time_signature') {
input[k] = tensor2d([parseInt(input[k], 10)], [1, 1], 'int32');
} else {
input[k] = tensor2d([input[k]], [1, 1]);
}
});
console.log(Object.values(input));
const prediction = model.predict(Object.values(input));
console.log(prediction);
编辑2:添加完整的错误消息
如果您得到的错误是数据不是
int32
,则可能是您没有将所有数据强制转换到int32
。您的代码中甚至有一个错误。不能重新分配给常量。它将抛出一个错误,我从未分配给常量,而是分配给常量的键。如果您const一个对象,您仍然可以为其分配属性/值:)我确实强制转换了一个有错误的对象,并且在错误中它表示它仍然是一个float32,但是如果I console.log,我可以看到它被转换为int32抱歉,您是对的。您正在重新指定道具/值。你能出示你的完整代码和完整错误吗?我所说的完整代码指的是在铸造后如何使用输入进行预测。完成!将其添加到问题中。如果我将输入[k]记录在If中,它将以dtype int32打印,所以我很确定它设置正确?我甚至添加了一个parseInt以确保它是作为输入数据传递的整数。。。这个模型是一个图形模型。我发现另一件奇怪的事情是它要求形状[-1,1],但我不能在tensor2d()中设置负形状