2

I'm very new to tensorflow.js and machine learning in general. I was trying to do a basic tf.js model for the titanic dataset on kaggle, and I got pretty far, but I ran into an error while trying to train my model. Here is my code:

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
  })
}

Here is the error that I am getting:

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.

I found a question very similar to this one: Error in oneHot: depth must be >=2, but it is 1, but it didn't have an answer, so I couldn't get anything from it.

Thanks in advance!

Andrey
  • 5,932
  • 3
  • 17
  • 35

1 Answers1

2

The oneHot error arises from your sparseCategoricalCrossentropy loss function. You are using a categorical loss function that expects a multiple length output, but your model outputs a 1-length vector (final layer is model.add(tf.layers.dense({units: 1}));). You should instead output as many nodes as there are categories you're classifying, so 2 nodes if you're doing the survival/no survival label.

Andy K
  • 151
  • 1
  • 9