2017-05-25 75 views
1

所以,根据documentation,我们可以使用tf.assign和validate_shape = False来改变形状。它确实改变了变量内容的形状,但是你可以从get_shape()得到的形状不会被更新。例如:Tensorflow,将变量更新为任意形状

>>> a = tf.Variable([1, 1, 1, 1]) 
>>> sess.run(tf.global_variables_initializer()) 
>>> tf.assign(a, [[1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1]], validate_shape=False).eval() 
array([[1, 1, 1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1, 1, 1]], dtype=int32) 
>>> a.get_shape() 
TensorShape([Dimension(4)]) 

这是很烦人的,该网络的后来层立足于该变量的get_shape()值,它们的形状。所以,即使实际的形状是正确的,Tensorflow会抱怨尺寸不匹配。那么关于如何更新每个变量的“相信”形状的任何想法?

+0

set_shape也许? –

+0

'set_shape'将尝试根据现有的形状信息进行验证。当_creating_变量时,我会设置'validate_shape = False',在这种情况下,静态形状信息将完全未知(如果需要,可以使用'set_shape'对其进行优化)。 –

+0

我会试一试。谢谢! –

回答

1

简而言之:使用set_shape来更新变量的静态形状。


你能理解什么是阅读TF FAQ回事:

在TensorFlow,张量既有静态(推断)的形状和 动态(真)的形状。可以使用方法来读取静态形状:该形状从用于创建张量的操作 推断,并且可能部分完成。如果 静态形状没有完全定义,张量的动态形状可以通过评估tf.shape(t)来确定。

因此,静态形状没有被正确推断,你应该给TF一个提示。幸运的是,从同FAQ接下来的几行告诉你该怎么做:

的tf.Tensor.set_shape方法更新张量 对象的静态形状,它通常用于提供额外的形状,当 信息这不能直接推断。它并不改变张量的动态形状。

0

由于validate_shape设置为false,因此变量的静态形状不会在图形中自动更新。一个方法是将其设置为新的形状(已知)

a = tf.Variable([1, 1, 1, 1], validate_shape=False) 
sess.run(tf.global_variables_initializer()) 
new_arr_assign = np.array([[1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1]]) 
tf.assign(a, new_arr_assign, validate_shape=False).eval(session=sess) 
a.set_shape(new_arr_assign.shape) 
a.get_shape() 
# results: TensorShape([Dimension(2), Dimension(7)])