while_loop Tensorflow 中的错误
while_loop error in Tensorflow
我尝试在 Tensorflow 中使用 while_loop,但是当我尝试 return 目标 output from callable in while loop,它给了我一个错误,因为形状每次都会增加。
输出应包含(0 或 1)基于 data 值(输入数组)的值。如果 data 值大于 5 return 1 else return 0 . returned 值必须添加到 output
这是代码::
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: The two structures don't have the same number of elements.
First structure (1 elements): [tf.Tensor 'while/Identity:0' shape=()
dtype=int32]
Second structure (2 elements): [tf.Tensor 'while/Add:0' shape=()
dtype=int32, tf.Tensor 'while/ExpandDims:0' shape=unknown
dtype=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(错误)。
tf.while_loop()
函数要求以下四个列表长度相同,且每个元素的类型相同:
cond
函数的参数列表(在本例中为 c
)。
body
函数的参数列表(在本例中为 b
)。
- 来自
body
函数的 return 值的列表。
- 表示循环变量的
loop_vars
列表。
因此,如果你的循环体有两个输出,你必须在b
和c
中添加相应的参数,并在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()
的调用)似乎不正确,该程序无法按原样运行,但希望这足以让您开始了。
我尝试在 Tensorflow 中使用 while_loop,但是当我尝试 return 目标 output from callable in while loop,它给了我一个错误,因为形状每次都会增加。
输出应包含(0 或 1)基于 data 值(输入数组)的值。如果 data 值大于 5 return 1 else return 0 . returned 值必须添加到 output
这是代码::
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: The two structures don't have the same number of elements.
First structure (1 elements): [tf.Tensor 'while/Identity:0' shape=() dtype=int32]
Second structure (2 elements): [tf.Tensor 'while/Add:0' shape=() dtype=int32, tf.Tensor 'while/ExpandDims:0' shape=unknown dtype=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(错误)。
tf.while_loop()
函数要求以下四个列表长度相同,且每个元素的类型相同:
cond
函数的参数列表(在本例中为c
)。body
函数的参数列表(在本例中为b
)。- 来自
body
函数的 return 值的列表。 - 表示循环变量的
loop_vars
列表。
因此,如果你的循环体有两个输出,你必须在b
和c
中添加相应的参数,并在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()
的调用)似乎不正确,该程序无法按原样运行,但希望这足以让您开始了。