我更改了问题以更好地解释我的问题:
我有一个函数:output_image = my_dunc(x),x应该像(1、4、4、1)
请帮助我修复此部分中的错误:
out = tf.Variable(tf.zeros([1, 4, 4, 3]))
index = tf.constant(0)
def condition(index):
return tf.less(index, tf.subtract(tf.shape(x)[3], 1))
def body(index):
out[:, :, :, index].assign(my_func(x[:, :, :, index]))
return tf.add(index, 1), out
out = tf.while_loop(condition, body, [index])
ValueError:这两个结构没有相同的嵌套结构。
第一个结构:type = list str = []
第二个结构:type = list str=[<tf.Tensor 'while_10/Add_3:0' shape=() dtype=int32>, <tf.Variable 'Variable_2:0' shape=(1, 4, 4, 3) dtype=float32_ref>]
更具体地说:两个结构没有相同数量的元素。第一个结构:type=list str=[<tf.Tensor 'while_10/Identity:0' shape=() dtype=int32>]
。第二个结构:type=list str=[<tf.Tensor 'while_10/Add_3:0' shape=() dtype=int32>, <tf.Variable 'Variable_2:0' shape=(1, 4, 4, 3) dtype=float32_ref>]
我测试了代码,可以从out = my_func(x[:, :, :, i])
中获得不同的i值,并且当我注释out[:, :, :, index].assign(my_func(x[:, :, :, index]))
行时,while_loop也可以工作。那条线有些问题。
答案 0 :(得分:0)
我知道没有for循环等等,为什么呢?
控制结构很难正确使用,也难以优化。在您的情况下,如果同一批次中的下一个示例具有5个通道,该怎么办。对于只有3个通道的第一个示例,您将需要运行5次循环迭代并弄乱或浪费计算资源。
您需要考虑自己到底想实现什么。通常,每个通道的权重都不同,因此系统不能仅仅凭空创建它们,还需要对其进行适当的培训。
如果您只想应用3次相同的逻辑,只需将张量重新设置为(3,4,4,1)。您会得到3个结果,然后对它们进行所需的操作。
通常,当您实际需要循环时(处理序列时),请填充示例,以使它们都具有相同的长度,并生成一个模型,其中展开的循环(您将有3种不同的操作,每次迭代需进行一次操作)环)。寻找dynamic_rnn或static_rnn(第一个批次可以处理不同的长度)。
答案 1 :(得分:0)
我知道没有for循环等等,为什么呢?
根据Implementation of Control Flow in TensorFlow
它们应该与TensorFlow的数据流模型非常吻合,并且应该能够并行和分布式执行以及自动区分。
我认为跨设备的分布式数据流图和自动区分可能是导致引入极少数此类循环原语的约束。
此文档中有一些图表。分布式计算专家可以更好地理解。我无法获得更详尽的解释。