Tensorflow 中的 while_loop 错误

2023-12-25

我尝试使用while_循环 in 张量流,但是当我尝试返回目标时output从 while 循环中可调用,它给了我一个错误,因为形状每次都会增加。

输出应包含(0 或 1)值,基于data值(输入数组)。如果data值大于5返回1否则返回0。返回值必须添加到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:两个结构体的元素数量不同。

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

第二个结构(2个元素):[tf.Tensor 'while/Add:0' shape=() dtype=int32,tf.Tensor 'while/ExpandDims:0' 形状=未知 dtype=float32>]

I use 张量流-1.1.3 and python-3.5

如何更改我的代码以获得目标结果?

EDIT::

我根据 @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(错误的)。


The tf.while_loop() https://www.tensorflow.org/api_docs/python/tf/while_loop函数要求以下四个列表具有相同的长度,并且每个元素的类型相同:

  • 的参数列表cond功能 (c在这种情况下)。
  • 的参数列表body功能 (b在这种情况下)。
  • 返回值列表body功能。
  • 名单loop_vars代表循环变量。

因此,如果你的循环体有两个输出,你必须添加一个相应的参数b and 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())似乎不正确,并且该程序无法按原样运行,但希望这足以帮助您入门。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tensorflow 中的 while_loop 错误 的相关文章

随机推荐