张量值不正确

时间:2018-07-26 09:55:58

标签: python tensorflow

我有一个10x10的矩阵和一个包含10个元素的向量。 10x10矩阵使用tf.random_uniform随机初始化; 10个向量是一个常数。

我将向量和矩阵与tf.matmul相乘,并将结果称为 logits 。然后,我使用logits.eval()评估并打印logit。

然后,我从对数张量中得到最大值,并用1代替,其他所有值都用0代替。我用.eval()评估此张量,并打印结果张量。

评估的输出不正确,因为最大值索引不是1。

但是,如果我使用logits.eval()的输出并定义一个常量,然后运行相同的代码并求值,结果就可以了。以下是代码:

tf.set_random_seed(1)
beta = tf.random_uniform([100], dtype=tf.float32, name="beta", seed=2)
beta = tf.reshape(beta, [10,10])
res = tf.constant([[0., 1., 2., 3., 4., 3., 2., 1., 0., 0.]], dtype=tf.float32)
logits = tf.Variable(tf.truncated_normal([1, 10]), name='logits')
sess1 = tf.Session()
sess1.run(tf.global_variables_initializer())
logits = tf.matmul(res, beta)
print(logits.eval(session=sess1))
tf.where(
        tf.equal(tf.reduce_max(logits, axis=1, keepdims=True), logits), 
        tf.constant(1, shape=logits.shape), 
        tf.constant(0, shape=logits.shape)
    ).eval(session=sess1)

输出:

[[ 5.64927   11.539942  10.365061   6.367746  10.591797  10.503089
  11.0828085  7.0345297  8.477502   8.649068 ]]
array([[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]], dtype=int32)

我认为我做错了一些事情,但是尽管我花了大量时间调试它,但我无法修复它。我将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:2)

这是Tensorflow中的常见陷阱。问题在于您将beta定义为random_normal而不是变量的方式。这将为每个beta生成一个 new 随机session.run。因此,您首先打印的logit与 不同,然后再进行0-1替换,因为它们是通过将不同的beta与您的常数向量相乘得到的。将beta定义为tf.Variable应该可以解决此问题。