首页 > 解决方案 > 动态地将张量附加到张量流中的列表

问题描述

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

请各位大神教教我如何实现这个功能?谢谢

标签: pythontensorflow

解决方案


所以,你在这里至少有两个不同的问题。

第一个问题:我不明白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

希望有帮助。


推荐阅读