maistai
maistai

Reputation: 35

Learning XOR using Tensorflow.js

Hello I am creating my first neural network using Tensorflow.js.

I want to use the points (0,0), (0,1), (1,0), (1,1) and the labels 0, 1, 1, 0 as inputs to my NN. I tried it the following way:

async function runModel() {

  // Build and compile model.
  const model = tf.sequential();
  model.add(tf.layers.dense({units: 2, inputShape: [2]}));
  model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});

  // Generate some synthetic data for training.
  const xs = tf.tensor2d([[1], [0]], [2,1]);
  const ys = tf.tensor2d([[1]], [1, 1]);

  // Train model with fit().
  await model.fit(xs, ys, {epochs: 10});

  // Run inference with predict().
  model.predict(tf.tensor2d([[0], [1]], [2, 1])).print();
}

runModel()

I end up with the error:

Uncaught (in promise) Error: Error when checking input: expected dense_Dense1_input to have shape [,2], but got array with shape [2,1].

and I tried to play with all the parameters but I don't get it (even with documentation) how to succeed.

Upvotes: 0

Views: 271

Answers (1)

edkeveked
edkeveked

Reputation: 18381

As already explained here and there, this error is thrown when there is a mismatch of the shape expected by the model and the shape of the training data.

expected dense_Dense1_input to have shape [,2], but got array with shape [2,1]

The error thrown is meaningful enough to help solve the issue. The first layer is expecting a tensor of shape [,2] since the inputShape is [2]. But xs has the shape [2, 1], it should rather have the shape [1, 2].

In the model, the last layer will return 2 values whereas in reality it should be only one ( an xor operation outputs only a single value). Therefore instead of units: 2, it should be units: 1. That means that ys should have the shape [,1]. The shape of ys is already what the model is supposed to have - so no changes there.

The shape of the tensor used for prediction should match the model input shape ie [, 2]

By making the above changes, it becomes the following:

  const model = tf.sequential();
  model.add(tf.layers.dense({units: 1, inputShape: [2]}));
  model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});

  // Generate some synthetic data for training.
  const xs = tf.tensor2d([[1, 0]]);
  const ys = tf.tensor2d([[1]], [1, 1]);

  // Train model with fit().
  await model.fit(xs, ys, {epochs: 10});

  // Run inference with predict().
  model.predict(tf.tensor([[0, 1]], [1, 2])).print() 

Upvotes: 1

Related Questions