我正在尝试使用tensorflow.js将指数数据拟合为指数回归,例如:
y(x)= c0 e ^(k x)
我遵循了一些示例,在这些示例中,它们仅用几个纪元就拟合了线性回归,例如此处。
问题是,当我将张量方程式更改为指数函数时,即使我增加到500-5000个历元并提供接近的初始值,也无法正确拟合。学习率高时,变量会达到很高的值,而学习率低时,变量不会发生实质性变化。
我在代码中做错了什么吗?是因为优化不适用于指数函数吗?在不使用tf.js的情况下,还有其他方法可以在浏览器中实现吗?
我使用的代码是:
const x = tf.tensor1d([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]);
const y = tf.tensor1d([2.5879,3.1153,3.7041,4.6216,5.2307,5.6205,6.9904,7.8416,9.0201,10.5586,12.1638,14.1438,16.5961,19.2497,22.3430]);
const c0 = tf.scalar(2).variable();
const k = tf.scalar(0.10).variable();
// y = c0*e^(k*x)
const fun = (x) => x.mul(k).exp().mul(c0);
const cost = (pred, label) => pred.sub(label).square().mean();
const learning_rate = 0.001;
const optimizer = tf.train.sgd(learning_rate);
// Train the model.
for (let i = 0; i < 20; i++) {
optimizer.minimize(() => cost(fun(x), y));
}
console.log(`c0: ${c0.dataSync()}, k: ${k.dataSync()}`);
const preds = fun(x).dataSync();
preds.forEach((pred, i) => {
console.log(`x: ${i}, pred: ${pred}`);
});
它与所使用的优化程序以及可能未收敛的初始值集有关。如果它们设置不正确,模型可能会发散。
const x = tf.tensor1d([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]);
const y = tf.tensor1d([2.5879,3.1153,3.7041,4.6216,5.2307,5.6205,6.9904,7.8416,9.0201,10.5586,12.1638,14.1438,16.5961,19.2497,22.3430]);
const c0 = tf.scalar(2).variable();
const k = tf.scalar(0.10).variable();
// y = c0*e^(k*x)
const fun = (x) => x.mul(k).exp().mul(c0);
const cost = (pred, label) => pred.sub(label).square().mean();
const learning_rate = 0.1;
const optimizer = tf.train.adagrad(learning_rate);
// Train the model.
for (let i = 0; i < 500; i++) {
optimizer.minimize(() => cost(fun(x), y));
}
console.log(`c0: ${c0.dataSync()}, k: ${k.dataSync()}`);
fun(x).print()
// [2.4752154, 2.899802, 3.3972201, 3.9799631, 4.6626663, 5.4624777, 6.3994851, 7.4972224, 8.7832594, 10.289897, 12.0549774, 14.1228304, 16.545393, 19.3835087, 22.7084637]
使用tf.train.adagrad
,似乎我们具有良好的收敛性。对于初始化值,我们还可以Math.Random()
仅将其用于随机值,并多次进行类似操作,直到找到导致更好预测的值集。同样,可以learning_rate
对已epochs
使用的和的数量进行微调
另外,可能要使用几个优化器,看看哪个在整体上表现最好
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句