Tensorflow模型总是产生均值

时间:2016-07-19 00:45:18

标签: tensorflow

我在张量流中拟合一个非常简单的模型时遇到了麻烦。如果我有一列输入数据是常量,我的输出总是收敛以产生所有行的相同值,这是我的输出数据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]时最小,其中误差函数为零。为什么它不会收敛到这个?我也试过使用梯度下降,我尝试改变训练率。

1 个答案:

答案 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_

即使学习率很高,这也应该很快收敛到您的预期答案。