我有一个巨大的数据集,实际上是通过使用一个包含四个未知数的方程式创建的。这意味着:
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。
我做错了什么?
答案 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。 (从您的问题中不清楚您要将X
或W
设置为总和为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 )