是tf.变量张量与否?



我已经在这里和这里阅读了一些关于这个问题的答案,但是我仍然对tf.Variable是和/或不是tf.Tensor感到有些困惑。 链接的答案处理tf.Variable的可变性,并提到tf.Variable保持其状态(当使用默认参数trainable=True实例化时)。

让我仍然有点困惑的是我在使用 tf.test.TestCase 编写简单的单元测试时遇到的一个测试用例

请考虑以下代码片段。我们有一个名为Foo的简单类,它只有一个属性,一个初始化为wtf.Variable

import tensorflow as tf
import numpy as np
class Foo:
def __init__(self, w):
self.w = tf.Variable(w)

现在,假设您要测试Foo的实例是否使用与通过w传入的相同维度的张量初始化了 w。最简单的测试用例可以编写如下:

import tensorflow as tf
import numpy as np
from foo import Foo
class TestFoo(tf.test.TestCase):
def test_init(self):
w = np.random.rand(3,2)
foo = Foo(w)
init = tf.global_variables_initializer()
with self.test_session() as sess:
sess.run(init)
self.assertShapeEqual(w, foo.w)
if __name__ == '__main__':
tf.test.main()

现在,当您运行测试时,将收到以下错误:

======================================================================
ERROR: test_init (__main__.TestFoo)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_foo.py", line 12, in test_init
self.assertShapeEqual(w, foo.w)
File "/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/test_util.py", line 1100, in assertShapeEqual
raise TypeError("tf_tensor must be a Tensor")
TypeError: tf_tensor must be a Tensor
----------------------------------------------------------------------
Ran 2 tests in 0.027s
FAILED (errors=1)

您可以通过执行以下操作来"绕过"此单元测试错误(即注意assertShapeEqual已替换为assertEqual):

self.assertEqual(list(w.shape), foo.w.get_shape().as_list())

不过,我感兴趣的是tf.Variabletf.Tensor的关系。 测试错误似乎表明foo.w不是tf.Tensor,这意味着您可能无法在其上使用tf.TensorAPI。但是,请考虑以下交互式 python 会话:

$ python3
Python 3.6.3 (default, Oct  4 2017, 06:09:15)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.37)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> import numpy as np
>>> w = np.random.rand(3,2)
>>> var = tf.Variable(w)
>>> var.get_shape().as_list()
[3, 2]
>>> list(w.shape)
[3, 2]
>>>

在上面的会话中,我们创建一个变量并对其运行get_shape()方法以检索其形状尺寸。现在,get_shape()方法是一种tf.TensorAPI 方法,您可以在此处看到。

因此,回到我的问题,tf.Variable实现tf.TensorAPI 的哪些部分。如果答案是所有这些,为什么上面的测试用例失败了?

self.assertShapeEqual(w, foo.w)

raise TypeError("tf_tensor must be a Tensor")

我很确定我在这里错过了一些基本的东西,或者可能是断言形状平等中的一个错误?如果有人能对此有所了解,我将不胜感激。

我在 macOS 上使用以下版本的tensorflowpython3

tensorflow (1.4.1)

该测试实用程序函数正在检查变量是否实现了tf.Tensor

>>> import tensorflow as tf
>>> v = tf.Variable('v')
>>> v
<tf.Variable 'Variable:0' shape=() dtype=string_ref>
>>> isinstance(v, tf.Tensor)
False

答案似乎是"不"。

更新:

根据正确的文档:

https://www.tensorflow.org/programmers_guide/variables

不像 tf。张量对象,一个 tf。变量存在于上下文之外 单个会话运行调用。

虽然:

一个 tf.变量表示一个张量,其值可以通过以下方式更改 在其上运行操作。

(不太确定"表示张量"是什么意思 - 听起来像一个设计"特征")

最新更新