假设我有一个张量流张量列表,我想在特定条件下动态地将额外的张量附加到此列表中。例如,如果列表中每个张量与该额外张量之间的最大点积大于0,则此额外张量会附加到列表中。这是代码:
lists = []
for i in xrange(10):
a = tf.get_variable(name=str(i), shape=[3], dtype=tf.float32)
lists.append(a)
所以现在我们有一个10张量的列表,每个张量具有形状[3]。
for j in xrange(11, 30):
b = tf.get_variable(name=str(j), shape=[3, 1], dtype=tf.float32)
c = tf.stack(lists)
e = tf.cond(tf.reduce_max(tf.reshape(lists, shape=[-1]), axis=0)>0.00, lambda: tf.stack(lists.append(tf.reshape(b, [-1]))), lambda: c)
lists = tf.unstack(e)
但是此代码首先存在几个问题
TypeError: 'NoneType' object has no attribute '__getitem__'
这是因为tf.stack(lists.append(tf.reshape(b, [-1])))
,lists.append(tf.reshape(b, [-1]))
是'NoneType'。
第二个问题是,即使这部分工作正常,lists = tf.unstack(e)
还是有一个错误,因为ValueError: Cannot infer num from shape (?, 3)
是因为tf.unstack()
无法在不可推断的尺寸上工作。
请您教我如何实现此功能?谢谢
答案 0 :(得分:1)
因此,您在这里至少有两个不同的问题。
第一个问题:我不知道您正在使用哪种reshape
。我会改用tensordot
。如果不需要,我将不将张量转换回列表。
例如:
c = tf.stack(lists) # shape [10,3]
for j in range(11, 30):
b = tf.get_variable(name=str(j), shape=[1, 3], dtype=tf.float32)
d = tf.tensordot(b, c, axes=[1,1]) # shape [1,10]
c = tf.cond(tf.reduce_max(d) > 0.00, lambda: tf.concat([c, b], 0), lambda: c) # shape [?,3]
第二个问题:将具有不可推断尺寸的张量转换为列表。关于此主题有很多问题和答案:
http://www.google.com/search?q=tensorflow+unstack+can+not+work+on+non-inferrable+dimensions
希望有帮助。