将张量动态追加到张量流中的列表

时间:2019-04-01 08:34:19

标签: python tensorflow

假设我有一个张量流张量列表,我想在特定条件下动态地将额外的张量附加到此列表中。例如,如果列表中每个张量与该额外张量之间的最大点积大于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()无法在不可推断的尺寸上工作。

请您教我如何实现此功能?谢谢

1 个答案:

答案 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

希望有帮助。