张量流量权重约束

时间:2018-04-16 13:48:41

标签: python tensorflow

我有一个巨大的数据集,实际上是通过使用一个包含四个未知数的方程式创建的。这意味着:

A*x_1 + B*x_2 + C*x_3 + D*x_4 = y  

我的值为x = [x_1, x_2, x_3, x_4]y 我需要使用神经网络找到A,B,C,D的值。

我使用

创建了一个(4,1)随机权重矩阵
W = tf.random_uniform((4,1), minval=0, maxval=1, dtype=tf.float64, seed=None, name=None)

现在,权重的所有元素都在0和1之间。但是,我需要的是,无论哪个迭代都是这样,这些权重的总和等于1。

例如,重量在开始时可以是0.25,0.45,0.15,0.15。 1000次迭代后,权重可以更新为0.33,0.25,0.42,0.00或1.00,0,0,0。

据我所知,softmax功能适合操作。然而,我无法将softmax函数集成为约束。

第二个问题:

我尝试通过修改这个模型来构建模型。 https://medium.com/@liccowee/tensorflow-to-solve-simple-math-equation-27f42a44f0f1

x = tf.Variable(X_train)
y = tf.Variable(y_train[0])

yy = tf.matmul(x, W)
deviation = tf.square (y-yy)
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(deviation)

init = tf.global_variables_initializer()
with tf.Session() as sess:

    sess.run(init)

    for i in range(50000):
        sess.run(train_step)

    print(sess.run(W))

然而,每次结果都不同而且结果不成立。差远了。 例如:

y = 0.680084169  
x = [(0.764845252)      (0.68613559) (0.358461678) (0.680084169)] 

两个不同模型的结果有权重

(0.63843704)    (0.12227005)    (0.42270223)    (0.05195979)  
(0.45886127)    (0.88964135)    (0.59473092)    (0.19037153)  

并且第一个的估计是0.759058953
估计第二个是1.304029364。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

要实现sum( X ) = 1的约束,您可以执行以下两种操作之一。您可以训练三个x和第四次使用1 - sum( X )。或者,您可以在进行乘法之前将X除以sum( X )。 (这类似于tf.nn.softmax()所做的,但它是为特定目的而设计的(用于处理logit输入),它在操作之前采用X exponent 。所以如果你想使用softmax,你必须首先使用log X,这只是增加了复杂性(你说你的X是0到1之间,你也有0s的问题。)那就是:

X = X / tf.reduce_sum( X )

将通过缩放所有值将X的总和设置为1。 (从您的问题中不清楚您要将XW设置为总和为1,更改上面的行以符合您的意图。)

我认为“结果不成立”意味着你的“网络”没有收敛。这有两个原因。首先,您可能希望降低学习率。

不幸的是,第二个是你原始问题的理论问题。您将采用4个数字的线性组合并尝试找到系数以获得特定结果。问题是问题不严重。基本上你可以随意修复4个数字中的2个,你可以找到第三个和第四个来满足平等;好吧,至少有很多价值观。 (由于您希望X介于0和1之间,因此Y可能超出可能的范围,或者位于边缘。)根据您的具体需求,您可能希望添加L2正则化约束(又称权重衰减),如下所示:

deviation = tf.reduce_sum( tf.square ( y - yy ) ) + 0.004 * tf.reduce_sum( tf.square( x ) )

其中0.004是体重衰减的系数,你需要尝试找到最佳值。

此外,实施问题是

y = tf.Variable(y_train[0])

看起来您将y设置为tf.Variable()的可训练变量,因此培训过程也会更改您的y,这可能不是您想要的。你可能想要像

这样的东西
t = tf.Variable( y_train[ 0 ], trainable = False )