我在张量流中拟合一个非常简单的模型时遇到了麻烦。如果我有一列输入数据是常量,我的输出总是收敛以产生所有行的相同值,这是我的输出数据y_的平均值,即使x_中有另一列有足够的信息来重现y_完全正确。这是一个小例子。
import tensorflow as tf
def weight_variable(shape):
"""Initialize the weights with random weights"""
initial = tf.truncated_normal(shape, stddev=0.1, dtype=tf.float64)
return tf.Variable(initial)
#Initialize my data
x = tf.constant([[1.0,1.0],[1.0,2.0],[1.0,3.0]], dtype=tf.float64)
y_ = tf.constant([1.0,2.0,3.0], dtype=tf.float64)
w = weight_variable((2,1))
y = tf.matmul(x,w)
error = tf.reduce_mean(tf.square(y_ - y))
train_step = tf.train.AdamOptimizer(1e-5).minimize(error)
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
#Train the model and output every 1000 iterations
for i in range(1000000):
sess.run(train_step)
err = sess.run(error)
if i % 1000 == 0:
print "\nerr:", err
print "x: ", sess.run(x)
print "w: ", sess.run(w)
print "y_: ", sess.run(y_)
print "y: ", sess.run(y)
此示例始终收敛于w = [2,0],y = [2,2,2]。这是一个平滑函数,在w = [0,1]和y = [1,2,3]时最小,其中误差函数为零。为什么它不会收敛到这个?我也试过使用梯度下降,我尝试改变训练率。
答案 0 :(得分:3)
您的定位a=["a", "b", "c"];
x=["x", "y", "z"];
var ax = [];
for (var i = 0; i < a.length; i++) {
ax.push(a[i] + ":" + x[i]);
}
console.log(ax);
// Output:
// [ 'a:x', 'b:y', 'c:z' ]
的形状为y_ = tf.constant([1.0,2.0,3.0], dtype=tf.float64)
。 (1, 3)
的输出形状为tf.matmul(x, w)
。因此(3, 1)
根据numpy广播规则具有y_ - y
形状。所以你真的没有优化你认为你正在优化的功能。将您的(3, 3)
更改为以下内容并尝试一下:
y_
即使学习率很高,这也应该很快收敛到您的预期答案。