Tensorflow,更新变量使其具有任意形状

Tensorflow,更新变量使其具有任意形状,tensorflow,Tensorflow,因此,根据,我们可以使用tf.assign和validate_shape=False来更改形状。它确实会更改变量内容的形状,但是您可以从get_shape()获得的形状不会得到更新。例如: >>> 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

因此,根据,我们可以使用tf.assign和validate_shape=False来更改形状。它确实会更改变量内容的形状,但是您可以从get_shape()获得的形状不会得到更新。例如:

>>> 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也会抱怨尺寸不匹配。那么,关于如何更新每个变量的“可信”形状有什么想法吗?

简而言之:用于更新变量的静态形状


通过阅读以下内容,您可以了解发生了什么:

在TensorFlow中,张量既有静态(推断)形状,也有静态形状 动态(真实)形状。可以使用
tf.Tensor.get_shape
方法:此形状是从操作中推断出来的 用于创建张量的,可能是部分完整的。如果 静态形状没有完全定义,张量t的动态形状 可通过计算
tf.shape(t)
来确定

因此,静态形状没有正确推断,您应该给TF一个提示。幸运的是,同一常见问题解答的下面几行告诉您该怎么做:

tf.Tensor.set_shape方法更新张量的静态形状 对象,它通常用于提供附加形状 无法直接推断时的信息。它不会改变 张量的动态形状


由于
validate\u shape
设置为false,变量的静态形状不会在图形中自动更新。扭转是用新形状(已知)手动设置


是否设置形状?
set\u shape
将尝试根据现有形状信息进行验证。我会在创建变量时设置
validate\u shape=False
,在这种情况下,静态形状信息将完全未知(如果愿意,您可以使用
set\u shape
对其进行优化)。我会尝试一下。谢谢
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)])