【问题标题】:Learning XOR using Tensorflow.js使用 Tensorflow.js 学习 XOR
【发布时间】:2021-07-05 16:10:55
【问题描述】:

您好,我正在使用 Tensorflow.js 创建我的第一个神经网络。

我想使用点 (0,0)、(0,1)、(1,0)、(1,1) 和标签 0、1、1、0 作为我的 NN 的输入。我尝试了以下方式:

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

我最终得到了错误:

未捕获(承诺中)错误:检查输入时出错:预期 dense_Dense1_input 的形状为 [,2],但得到的数组的形状为 [2,1]。

我尝试使用所有参数,但我不明白(即使有文档)如何成功。

【问题讨论】:

标签: tensorflow tensorflow.js


【解决方案1】:

正如已经解释过的herethere,当模型预期的形状与训练数据的形状不匹配时,会引发此错误。

预计dense_Dense1_input 的形状为[,2],但得到的数组的形状为[2,1]

抛出的错误足以帮助解决问题。第一层需要一个形状为 [,2] 的张量,因为 inputShape 是 [2]。但是xs 的形状是[2, 1],它应该是[1, 2] 的形状。

在模型中,最后一层将返回 2 个值,而实际上它应该只有一个(异或运算只输出一个值)。因此,应该是units: 1,而不是units: 2。这意味着ys 应该具有[,1] 的形状。 ys 的形状已经是模型应该具有的形状 - 所以那里没有变化。

用于预测的张量的形状应该与模型输入的形状相匹配,即[, 2]

通过上面的修改,变成如下:

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

【讨论】: