【发布时间】:2018-08-15 22:03:06
【问题描述】:
例如,我可以定义一个递归 Python lambda 函数来计算斐波那契数列,如下所示:
fn = lambda z: fn(z-1)+fn(z-2) if z > 1 else z
但是,如果我尝试将其转换为 Theano 函数,Theano 将不接受 fn,因为 fn 调用布尔操作“>”。所以这段代码崩溃了:
z = T.scalar('z')
fn = lambda z: fn(z-1)+fn(z-2) if z > 1 else z
fibby = theano.function([z], fn(z))
但是,如果我用 theano.tensor.gt(z,1) 替换布尔运算符,代码会进入无限递归,因此 theano.tensor.gt(z,1) 不会起到 "> 的作用":
z = T.scalar('z')
fn = lambda z: fn(z-1)+fn(z-2) if theano.tensor.gt(z,1) else z
lappy = theano.function([z], fn(z))
print(lappy(4))
运行此命令会导致“超出最大递归深度”。怎么了?如果我将 fn 的定义替换为
,我会得到相同的“超出最大递归深度”错误fn = lambda z: theano.ifelse(theano.tensor.gt(z,1),fn(z-1)+fn(z-2),z)
PS 我不希望使用 theano.scan 来执行此操作...因为我想学习递归地执行此计算而不诉诸显式循环。
--肯
【问题讨论】:
-
在递归 python 函数上使用
theano.as_op装饰器是一种不折不扣的方式。但这并没有得到任何优化。