我尝试在Tensorflow中使用while_loop,但是当我尝试从while循环中的可调用对象返回目标output时,它会给我一个错误,因为形状每次都会增加。
输出应包含(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)
错误:
循环中的每个元素都是一个循环,循环的每个元素都是一个循环,循环的每个元素都是一个循环。
ValueError:两个结构的元素数目不同。
第一结构(1个元件):[tf.Tensor'while/恒等式:0'形状=()dtype= int 32]
第二结构(2个元件):[tf.Tensor'while/加法:0'形状=()dtype= int 32,tf.Tensor'while/展开尺寸:0'形状=未知dtype= float 32〉]
我使用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(错误)。
2条答案
按热度按时间u3r8eeie1#
tf.while_loop()
函数要求以下四个列表的每个元素具有相同的长度和类型:cond
函数的参数列表(在本例中为c
)。body
函数的参数列表(在本例中为b
)。body
函数的返回值列表。loop_vars
列表。因此,如果循环体有两个输出,则必须向
b
和c
添加相应的参数,并向loop_vars
添加相应的元素:正如注解中所指出的,循环的主体(特别是对
tf.expand_dims()
的调用)似乎是不正确的,这个程序不会按原样工作,但希望这足以让您开始。nlejzf6q2#
如果您看到此错误:值错误:这两个结构的元素数不同。
如果你在while_loop中看到它,那就意味着while循环的输入和输出有不同的形状。
我通过确保从while循环函数返回相同结构的loop_vars来解决这个问题,条件函数也必须接受相同的循环变量。
下面是一个示例代码
主体函数必须返回循环变量,条件函数必须接受循环变量