Python Tensorflow tf.size无法使用tf.unique中的动态长度张量

Python Tensorflow tf.size无法使用tf.unique中的动态长度张量,python,tensorflow,Python,Tensorflow,这看起来很简单,但我已经坚持了一段时间了。我有一个列表,希望创建一个变量,该变量等于该列表中唯一项的长度。一个简单的例子如下所示: def unique_zeros_tensor(arr): uniq_items, items_idxs = tf.unique(tf.constant(arr)) return tf.Vector(tf.zeros([tf.size(uniq_items)])) 我得到一个错误,说初始值必须有一个指定的形状 我也试过,tf.shape,tf.zero\u

这看起来很简单,但我已经坚持了一段时间了。我有一个列表,希望创建一个变量,该变量等于该列表中唯一项的长度。一个简单的例子如下所示:

def unique_zeros_tensor(arr):
  uniq_items, items_idxs = tf.unique(tf.constant(arr))
  return tf.Vector(tf.zeros([tf.size(uniq_items)]))
我得到一个错误,说初始值必须有一个指定的形状

我也试过,
tf.shape
tf.zero\u like
,甚至
tf.reduce\u max(item\u idxs)
都没有用。我可以通过创建一个会话,运行tf.unique的结果,并使用其中的值来实现这一点,但这感觉像是一种糟糕的做法,但如果我错了,请告诉我

编辑- 将形状添加到常量没有帮助,
使用占位符而不是tf.constant也没有帮助。

在运行图表之前,变量的大小基本上是静态定义的

但是像tf.zero等都是张量,在你实际运行图表之前,它们并没有真正的值

您要么需要计算出一个大小,以给出不变的变量,要么在每次大小更改时重新生成图形

编辑:为了清楚起见,tf中依赖项的顺序是:

  • 首先构建一个图表。构建图表不需要会话。这是静态定义变量大小的地方
  • 然后从该图创建一个或多个会话。所有这些会话中的变量可能具有不同的值,但所有变量都具有相同的形状/尺寸,因为它们是从同一个图形创建的

因此,澄清一下,方法是使用sess.run您不能更改会话内变量的大小。它是在图中静态分配的。所以tf.unique调用在我使用它的上下文中没有用处?我应该:sess.run(tf.unique(…)并在另一个图中使用结果?