Tensorflow TFJS预测与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

我在Python中使用Keras训练了我的模型,并将我的模型转换为tfjs模型,以便在我的webapp中使用它。我还用python编写了一个小的预测脚本,在看不见的数据上验证我的模型。在python中,它工作得很好,但当我试图在我的webapp中预测时,它出错了

这是我在Python中用于创建张量并基于这些创建的张量进行预测的代码:

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()中设置负形状