python - 动态地将张量附加到张量流中的列表
问题描述
假设我有一个张量流张量列表,我想在特定条件下动态地将额外的张量附加到这个列表中。例如,如果列表中每个张量与这个额外张量之间的最大点积大于 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()
无法在不可推断的维度上工作。
请各位大神教教我如何实现这个功能?谢谢
解决方案
所以,你在这里至少有两个不同的问题。
第一个问题:我不明白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
希望有帮助。
推荐阅读
- windows - vmcompute 进程使用高 CPU/内存
- javascript - 反应:道具`savehere`的值无效标签。从元素中删除它,或者传递一个字符串或数字值以将其保留在 DOM 中
- typescript - Conditional types for nullable in Typescript
- parameters - 如何使用 ti-basic 83 使用参数创建程序
- android - 材料按钮未在android中显示
- cypress - 赛普拉斯没有打开窗口弹出以进行附件测试
- quarkus - 如何在 Quarkus 中自动注册所有可用的接口实现?
- java - 龙目岛的@SuperBuilder - 错误java:找不到符号
- reactjs - 邮递员以不同的顺序响应来自请求的控制台日志响应
- javascript - Array.prototype.includes() 通配符选项?