Python递归张量流Fibonacci数计算

2024-10-04 05:20:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我是tensorflow的新手,我试图编写一个tensorflow程序,它递归地计算斐波纳契数。下面的程序是我最后得到的,但是它失败了,有很多我不明白的错误。有人能帮我理解我做错了什么,以及如何解决它吗。这是我的计划:

import tensorflow as tf
tf.logging.set_verbosity(tf.logging.ERROR)

with tf.Graph().as_default() as g:
    fib_seed_0 = tf.Variable(0, name = "fib_seed_0")
    fib_seed_1 = tf.Variable(1, name = "fib_seed_1")

    def fib(n):
        return tf.cond(tf.equal(n, fib_seed_0), lambda: tf.identity(n),
       lambda: tf.cond(tf.equal(n, fib_seed_1), lambda: tf.identity(n),
       lambda: tf.add(fib(tf.subtract(n, 1)), fib(tf.subtract(n, 2)))))

    fib_to_calc = tf.Variable(5, name = "fib_to_calc")

    init = tf.global_variables_initializer()

    with tf.Session() as sess:
        sess.run(init)
        print(sess.run(fib(fib_to_calc)))

下面是上述tensorflow程序在python翻译中要做的事情:

^{pr2}$

下面是一个错误日志示例。它一直在说:

Traceback (most recent call last):
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 1775, in cond
    return merges[0] if len(merges) == 1 else merges
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 4169, in name_scope
    yield scope
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 3625, in get_controller
    yield default
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 4169, in name_scope
    yield scope
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 2860, in name_scope
    yield "" if new_stack is None else new_stack + "/"
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 4169, in name_scope
    yield scope
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 1748, in cond
    _, res_f = context_f.BuildCondBranch(fn2)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 1642, in BuildCondBranch
    r = fn()
  File "fib.py", line 13, in <lambda>
    lambda: tf.add(fib(tf.subtract(n, 1)), fib(tf.subtract(n, 2)))))
  File "fib.py", line 12, in fib
    lambda: tf.cond(tf.equal(n, fib_seed_1), lambda: tf.identity(n),
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 1775, in cond
    return merges[0] if len(merges) == 1 else merges
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 4169, in name_scope
    yield scope
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 3625, in get_controller
    yield default
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 4169, in name_scope
    yield scope
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 2860, in name_scope
    yield "" if new_stack is None else new_stack + "/"
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 4169, in name_scope
    yield scope
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 1748, in cond
    _, res_f = context_f.BuildCondBranch(fn2)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 1642, in BuildCondBranch

。。。 上述错误重复多次,然后出现以下错误 ... 在

    r = fn()
  File "fib.py", line 12, in <lambda>
    lambda: tf.cond(tf.equal(n, fib_seed_1), lambda: tf.identity(n),
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\ops\gen_array_ops.py", line 1343, in identity
    result = _op_def_lib.apply_op("Identity", input=input, name=name)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 777, in apply_op
    return op
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 3625, in get_controller
    yield default
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 777, in apply_op
    return op
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 4169, in name_scope
    yield scope
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 3625, in get_controller
    yield default
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 4169, in name_scope
    yield scope
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 2860, in name_scope
    yield "" if new_stack is None else new_stack + "/"
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 4169, in name_scope
    yield scope
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 777, in apply_op
    return op
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 255, in _MaybeColocateWith
    yield
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 768, in apply_op
    op_def=op_def)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 2336, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 1232, in __init__
    self._control_flow_context.AddOp(self)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 1598, in AddOp
    self._AddOpInternal(op)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 1613, in _AddOpInternal
    real_x = self.AddValue(x)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 1587, in AddValue
    result = _SwitchRefOrTensor(result, self._pred)[self._branch]
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 364, in _SwitchRefOrTensor
    return switch(data, pred, name=name)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 2974, in colocate_with
    yield
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 364, in _SwitchRefOrTensor
    return switch(data, pred, name=name)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 320, in switch
    sparse_tensor.SparseTensor(ind_t, val_t, dense_shape_t))
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 4169, in name_scope
    yield scope
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 3625, in get_controller
    yield default
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 4169, in name_scope
    yield scope
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 2860, in name_scope
    yield "" if new_stack is None else new_stack + "/"
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 4169, in name_scope
    yield scope
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 299, in switch
    return gen_control_flow_ops._switch(data, pred, name=name)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\ops\gen_control_flow_ops.py", line 371, in _switch
    result = _op_def_lib.apply_op("Switch", data=data, pred=pred, name=name)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 777, in apply_op
    return op
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 3625, in get_controller
    yield default
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 777, in apply_op
    return op
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 4169, in name_scope
    yield scope
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 3625, in get_controller
    yield default
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 4169, in name_scope
    yield scope
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 2860, in name_scope
    yield "" if new_stack is None else new_stack + "/"
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 4169, in name_scope
    yield scope
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 777, in apply_op
    return op
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 255, in _MaybeColocateWith
    yield
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 768, in apply_op
    op_def=op_def)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 2336, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 1180, in __init__
    if node_def.ByteSize() >= (1 << 31) or node_def.ByteSize() < 0:
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\google\protobuf\internal\python_message.py", line 1012, in ByteSize
    size += field_descriptor._sizer(field_value)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\google\protobuf\internal\encoder.py", line 359, in FieldSize
    entry_msg = message_type._concrete_class(key=key, value=value)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\google\protobuf\internal\python_message.py", line 511, in init
    copy = field._default_constructor(self)
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\google\protobuf\internal\python_message.py", line 423, in MakeSubMessageDefault
    result = message_type._concrete_class()
  File "C:\IronKey\DeveloperTools\Anaconda3\lib\site-packages\google\protobuf\internal\python_message.py", line 480, in init
    self._listener_for_children = _Listener(self)
RecursionError: maximum recursion depth exceeded

Tags: inpylibpackagestensorflowlinesiteframework
1条回答
网友
1楼 · 发布于 2024-10-04 05:20:55

TensorFlow不支持对^{}的递归调用,因为它的实现急切地调用为这两个分支传递的两个lambda函数中的每一个(以构建符号图),并且在构建图时不知道终止条件,因此它将递归,直到堆栈空间用完为止。在

对于在TensorFlow中定义(可能是递归的)函数有实验支持,使用目前不属于公共API的^{}库。对递归函数的支持是基本的,但是您可以使用显式的forward声明定义一个函数,如下所示:

import tensorflow as tf
from tensorflow.python.framework import function

fib = function.Declare("Fib", [("n", tf.int32)], [("ret", tf.int32)])

@function.Defun(tf.int32, func_name="Fib", out_names=["ret"])
def FibImpl(n):
  return tf.cond(tf.less_equal(n, 1), 
                 lambda: tf.constant(1),
                 lambda: fib(n - 1) + fib(n - 2))

FibImpl.add_to_graph(tf.get_default_graph())

n = tf.placeholder(tf.int32, shape=[])
result = fib(n)

sess = tf.Session()
print(sess.run(result, feed_dict={n: 0}))  # 1
print(sess.run(result, feed_dict={n: 1}))  # 1
print(sess.run(result, feed_dict={n: 2}))  # 2
print(sess.run(result, feed_dict={n: 3}))  # 3
print(sess.run(result, feed_dict={n: 4}))  # 5
print(sess.run(result, feed_dict={n: 5}))  # 8
print(sess.run(result, feed_dict={n: 20}))  # 10946

当然,使用^{}的迭代解决方案会更加有效!在

相关问题 更多 >