如何使用TensorFlow.js进行基本约束解决?

时间:2018-07-07 08:17:04

标签: javascript tensorflow constraint-programming

我想构建一个类似于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。我试图降低学习率。我尝试只使用一个约束条件...没有运气。

有什么想法吗?

0 个答案:

没有答案