Tensorflow中的while_loop错误

时间:2017-10-16 10:40:18

标签: tensorflow while-loop python-3.5

我尝试在 Tensorflow 中使用 while_loop ,但是当我尝试从while循环中的callable返回目标输出时,它给了我错误,因为每次都会增加形状。

输出应包含基于数据值(输入数组)的值(0或1)。如果数据值大于5,则返回 1 ,否则返回 0 。必须将返回的值添加到输出

这是代码::

import numpy as np
import tensorflow as tf

data = np.random.randint(10, size=(30))
data = tf.constant(data, dtype= tf.float32)

global output
output= tf.constant([], dtype= tf.float32)
i = tf.constant(0)
c = lambda i: tf.less(i, 30)


def b(i):
   i= tf.add(i,1)
   cond= tf.cond(tf.greater(data[i-1], tf.constant(5.)), lambda: tf.constant(1.0), lambda: tf.constant([0.0]))
   output =tf.expand_dims(cond, axis = i-1)
   return i, output

r,out = tf.while_loop(c, b, [i])
print(out)
sess=  tf.Session()
sess.run(out) 

错误::

  

r,out = tf.while_loop(c,b,[i])

     

ValueError:这两个结构的元素数量不同。

     

第一个结构(1个元素):[tf.Tensor'while / Identity:0'shape =()   D型= INT32]

     

第二个结构(2个元素):[tf.Tensor'while / Add:0'shape =()   dtype = int32,tf.Tensor'while / ExpandDims:0'shape = unknown   D型= FLOAT32>]

我使用 tensorflow-1.1.3 python-3.5

如何更改代码以显示目标结果?

修改::

我根据@mrry回答编辑代码,但我仍然有输出错误答案的问题 输出是数字总和

a = tf.ones([10,4])
print(a)
a = tf.reduce_sum(a, axis = 1)
i =tf.constant(0)
c = lambda i, _:tf.less(i,10)

def Smooth(x):
   return tf.add(x,2)

summ = tf.constant(0.)
def b(i,_):
   global summ
   summ = tf.add(summ, tf.cast(Smooth(a[i]), tf.float32))
   i= tf.add(i,1)
   return i, summ

r, smooth_l1 = tf.while_loop(c, b, [i, smooth_l1])

print(smooth_l1)

sess = tf.Session()
print(sess.run(smooth_l1))

输出 6.0 (错误)。

1 个答案:

答案 0 :(得分:4)

tf.while_loop()函数要求以下四个列表具有相同的长度,并且每个元素的类型相同:

  • cond函数的参数列表(本例中为c)。
  • body函数的参数列表(本例中为b)。
  • body函数的返回值列表。
  • 表示循环变量的loop_vars列表。

因此,如果您的循环体有两个输出,则必须将相应的参数添加到bc,并将相应的元素添加到loop_vars

c = lambda i, _: tf.less(i, 30)

def b(i, _):
  i = tf.add(i, 1)
  cond = tf.cond(tf.greater(data[i-1], tf.constant(5.)),
                 lambda: tf.constant(1.0),
                 lambda: tf.constant([0.0]))

  # NOTE: This line fails with a shape error, because the output of `cond` has
  # a rank of either 0 or 1, but axis may be as large as 28.
  output = tf.expand_dims(cond, axis=i-1)
  return i, output

# NOTE: Use a shapeless `tf.placeholder_with_default()` because the shape
# of the output will vary from one iteration to the next.
r, out = tf.while_loop(c, b, [i, tf.placeholder_with_default(0., None)])

正如评论中所指出的,循环体(特别是对tf.expand_dims()的调用)似乎是不正确的,而且这个程序不会按原样运行,但希望这足以让你开始。