如何在 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
)。
如何在 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
)。