tensorflow - "Error: Error in oneHot: depth must be >=2, but it is 1"在tensorflow.js中

标签 tensorflow tensorflow.js

我对tensorflow.js 和一般机器学习非常陌生。我试图为 kaggle 上的泰坦尼克号数据集做一个基本的 tf.js 模型,并且已经取得了很大的进展,但在尝试训练模型时遇到了错误。这是我的代码:

function convertToTensor(data, ify) {
  return tf.tidy(() => {
    tf.util.shuffle(data);
    const pc = data.map(d => Number(d.pc))
    const sex = data.map(d => d.sex)
    const age = data.map(d => Number(d.age))
    const sib = data.map(d => Number(d.sib))
    const par = data.map(d => Number(d.par))
    const fare = data.map(d => Number(d.fare))
    const inputs = [pc, sex, age, sib, par, fare]

    let newy = []

    inputs[0].forEach((thing, i) => {
      newy.push([thing, inputs[1][i], inputs[2][i], inputs[3][i], inputs[4][i], inputs[5][i]])
    })

    let inputy = []

    for (arr of newy){
      inputy.push(tf.tensor2d(arr, [1, arr.length]))
    }

    if (ify) {
      const labels = data.map(d => Number(d.sur))
      const labelTensor = tf.tensor2d(labels, [labels.length, 1]);
      return {
        inputs: inputy,
        labels: labelTensor,
      }
    }

    return {
      inputs: inputy
    }
  });
}

function createModel(data) {
  // Create a sequential model
  const model = tf.sequential();

  // Add a single input layer
  model.add(tf.layers.dense({inputShape: [1, 6], units: 100}));
  model.add(tf.layers.dense({units: 100, activation: 'relu'}));
  model.add(tf.layers.dense({units: 100, activation: 'relu'}));
  model.add(tf.layers.flatten())
  model.add(tf.layers.dense({units: 1}));

  return model;
}

async function trainModel(model, inputs, labels) {
  // Prepare the model for training.
  model.compile({
    optimizer: tf.train.adam(),
    loss: 'sparseCategoricalCrossentropy',
    metrics: ['accuracy']
  });

  const batchSize = 32;
  const epochs = 30;

  return await model.fit(tf.stack(inputs), labels, {
    batchSize,
    epochs,
    shuffle: true
  })
}

这是我收到的错误:

rror: Error in oneHot: depth must be >=2, but it is 1
    at oneHot_ (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:7536:15)
    at Object.oneHot__op [as oneHot] (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:4283:29)
    at /home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-layers/dist/tf-layers.node.js:5082:32
    at /home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3337:22
    at Engine.scopedRun (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3347:23)
    at Engine.tidy (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3336:21)
    at Object.tidy (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:8941:19)
    at sparseCategoricalCrossentropy (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-layers/dist/tf-layers.node.js:5078:16)
    at totalLossFunction (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-layers/dist/tf-layers.node.js:9628:32)
    at /home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3337:22
    at Engine.scopedRun (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3347:23)
    at Engine.tidy (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3336:21)
    at /home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3865:143
    at Engine.scopedRun (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3347:23)
    at Engine.gradients (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:3865:22)
    at variableGrads (/home/runner/RobustRepulsiveWebmaster/node_modules/@tensorflow/tfjs-core/dist/tf-core.node.js:13782:21)
(node:157) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:157) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

我发现一个与此非常相似的问题:Error in oneHot: depth must be >=2, but it is 1 ,但它没有答案,所以我无法从中得到任何东西。

提前致谢!

最佳答案

oneHot错误源自您的 sparseCategoricalCrossentropy损失函数。您使用的分类损失函数需要多个长度输出,但您的模型输出一个长度为 1 的向量(最后一层为 model.add(tf.layers.dense({units: 1})); )。相反,您应该输出与您要分类的类别一样多的节点,因此如果您正在执行生存/不生存标签,则输出 2 个节点。

关于tensorflow - "Error: Error in oneHot: depth must be >=2, but it is 1"在tensorflow.js中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65375116/

相关文章:

python - 从卡住模型创建可训练的 Tensorflow 图

c++ - 如何在 Tensorflow 的 C++ API 中解码后获取图像形状

javascript - 将 python TensorFlow Layers 模型加载到 JavaScript 中

javascript - 等待不在 Tensorflow.js 的 model.fit 上工作

javascript - 错误: Mismatch in sampling rate: Expected: 16000; Actual: 48000. Tensorflow js抛出错误

python - 如何从检查点使用 tf.estimator.Estimator 进行预测?

python - 验证 Tensorflow 流中是否存在该文件。使用 tf.gfile.Exists 以字符串张量作为输入

tensorflow - ONNX 模型转换中“未注册架构”

tensorflow - lstm 不同的输入和输出形状

node.js - 无法在node.js中导入@tensorflow-models