在某些情况下,tensorflow似乎能够在图形创建时检查张量的值,而在其他情况下,这会失败.
>>> shape = [constant([2])[0], 3]
>>> reshape([1,2,3,4,5,6], shape)
<tf.Tensor 'Reshape_13:0' shape=(2, 3) dtype=int32>
>>> zeros(shape)
<tf.Tensor 'zeros_2:0' shape=(?, 3) dtype=float32>
在上面的例子中,reshape()可以看到传入的张量因为形状的值为2,结果输出的形状为(2,3)但是零()不能,静态形状是(?,3) ).差异的原因是什么?
我的同事发布了Determining tensor shapes at time of graph creation in TensorFlow,这是基于相同的基础问题,但他问的是如何最好地使用tensorflow来解决这类问题的问题,而我的问题是为什么tensorflow会以这种方式运行.这是一个错误吗?
解决方法:
TD; DR:
> tf.reshape可以推断输出的形状但是tf.zeros不能;
> shape支持两个函数的整数(作为静态/确定)和张量(作为动态/不定).
代码更具体,更清晰:
shape = [tf.constant([2])[0], tf.constant([3])[0]]
print(tf.reshape([1,2,3,4,5,6], shape))
# Tensor("Reshape:0", shape=(?, ?), dtype=int32)
print(tf.zeros(shape))
# Tensor("zeros:0", shape=(?, ?), dtype=float32)
还有这个:
shape = [tf.constant([5])[0], 3]
print tf.reshape([1,2,3,4,5,6], shape)
# Tensor("Reshape:0", shape=(2, 3), dtype=int32)
# This will cause an InvalidArgumentError at running time!
当使用Tensor(如tf.constant([2])[0])作为形状来创建另一个Tensor(如tf.zeros(shape))时,形状在图形创建时总是不确定的.但是,tf.reshape()是不同的.它可以使用输入的形状和给定形状(静态部分)推断输出的形状.
在你的代码中,3是一个静态整数,给出了输入的形状([6]);形状(2,3)实际上是通过推断而不是提供来获得的.这可以在代码的第二部分中证明.虽然我给出了一个tf.constant([5]),但形状并没有改变. (图表创建时没有错误,但在运行时出现错误!)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。