我想构建一个类似于SketchPad的简单应用,您可以在其中定义一些几何以及这些几何之间的约束。
这是我到目前为止所拥有的:
import * as tf from "@tensorflow/tfjs"
// These four points are variables.
const p1 = tf.variable(tf.tensor1d([0, 0]))
const p2 = tf.variable(tf.tensor1d([0.1, 0.1]))
const p3 = tf.variable(tf.tensor1d([0.1, 0]))
const p4 = tf.variable(tf.tensor1d([0, 0.2]))
// Using SDG because... why not?
const learningRate = 0.001
const optimizer = tf.train.sgd(learningRate)
for (let iter = 0; iter < 75; iter++) {
optimizer.minimize(() => {
// Create some constraints.
const constraints: Array<[tf.Tensor, tf.Tensor]> = []
// distance from p1 -> p2 equal to distance from p2 -> p3
constraints.push([p1.sub(p2).norm(), p2.sub(p3).norm()])
constraints.push([p2.sub(p3).norm(), p3.sub(p4).norm()])
constraints.push([p3.sub(p4).norm(), p4.sub(p1).norm()])
constraints.push([p4.sub(p1).norm(), p1.sub(p2).norm()])
// Compute the mean square error.
const xs = tf.stack(constraints.map(([x, y]) => x))
const ys = tf.stack(constraints.map(([x, y]) => y))
return ys
.sub(xs)
.square()
.mean()
})
}
// Print the results.
p1.print()
p2.print()
p3.print()
p4.print()
鉴于我设置的约束,那么p4 = [0, 0.1]
是一个解决方案。这些点约束不足,因此有无限的解决方案,但是我只想要任何有效的解决方案。
问题在于结果是NaN ...
Tensor
[NaN, NaN]
Tensor
[NaN, NaN]
Tensor
[NaN, NaN]
Tensor
[NaN, NaN]
我不确定为什么...这是我使用TensorFlow.js的第一个程序,我什至不知道如何调试此问题。我尝试登录优化器,第二步之后点变为NaN。我试图降低学习率。我尝试只使用一个约束条件...没有运气。
有什么想法吗?