如何在 TensorflowJS 中构建非线性网络?

How to build a nonlinear network in TensorflowJS?

如何在 TensorflowJS 中构建一个接受一个输入和一个标签的模型?

以下示例演示了该场景:

x=1, y=1;

x=2, y=4;

x=3, y=9;

x=4, y=16;

到目前为止我只能使用线性模型。

您需要添加与 linear 不同的内容作为 activation。可能的激活函数的完整列表 here

(async() => {
const model = tf.sequential();
 model.add(tf.layers.dense({units: 8, inputShape: [1]}));
 model.add(tf.layers.dense({units: 4, activation: 'relu'}));
 model.add(tf.layers.dense({units: 1, activation: 'relu'}));
 // Note that the untrained model is random at this point.
 const x = tf.tensor([[1], [2], [3]])
 const y = tf.tensor([[1], [4], [9]])
 model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});
 const h = await model.fit(x, y, {epochs: 100})
 
 const t = model.predict(x);
 t.print()
})()
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"> </script>

tensorflow 标签上有相同的问题 ("Neural Network to predict nth square"),有两个很好的答案。我将尝试使代码适应 Tensorflow.js 并重复最重要的部分作为简短答案。请阅读那边的答案以获得完整的图片。

简短回答:这个任务对于神经网络来说并不容易,你也需要一个复杂的神经网络来完成这项工作。另外,你需要一个像ReLU这样的激活函数,这样输出的范围就不会被限制在一个特定的范围内(比如sigmoid在-1和1之间)。

在下面的网络中,我调整了 answer of Miriam Farber 中的代码,创建了一个神经网络,其中包含三个包含 50 个单元的密集层和一个包含一个单元的输出层。所有层都使用 ReLU 激活函数。

(async () => {
  // 1000 random values between -10 and 10
  const xArray = (new Array(1000)).fill(0).map(() => [20 * (Math.random() - 0.5)]);
  const yArray = xArray.map(x => x[0] * x[0]);
  const x = tf.tensor(xArray);
  const y = tf.tensor(yArray);

  const model = tf.sequential();
  model.add(tf.layers.dense({ units: 50, activation: 'relu', inputShape: [1] }));
  model.add(tf.layers.dense({ units: 50, activation: 'relu' }));
  model.add(tf.layers.dense({ units: 50, activation: 'relu' }));
  model.add(tf.layers.dense({ units: 1, activation: 'relu' }));

  model.compile({
      optimizer: tf.train.adam(0.01),
      loss: tf.losses.meanSquaredError,
  });
  await model.fit(x, y, {
    epochs: 10,
    callbacks: {
        onEpochEnd: (epoch, logs) => console.log(`Epoch ${epoch}, loss: ${logs.loss}`),
    }
  });
  const prediction = model.predict(tf.tensor2d([[-5], [0], [5], [9], [20]]));
  console.log('Results for: -5, 0, 5, 9, 20');
  prediction.print();
})();
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.2.7/dist/tf.min.js"></script>

该代码能够以合理的准确度预测 (-10; 10) 范围内的结果(请记住,该网络训练了 10 个具有 1000 个值的时期)。但是,网络无法预测训练数据之外的值(如示例中的 20)。