我是新手。我正在做一些实验来生成可变长度的序列。我从脑海中想到的最简单的事情开始:模拟range()。下面是我写的简单代码:
from theano import scan
from theano import function
from theano import tensor as T
X = T.iscalar('X')
STEP = T.iscalar('STEP')
MAX_LENGTH = 1024 # or any othe very large value
def fstep(i, x, t):
n = i * t
return n, until(n >= x)
t_fwd_range, _ = scan(
fn=fstep,
sequences=T.arange(MAX_LENGTH),
non_sequences=[X, STEP]
)
getRange = function(
inputs=[X, Param(STEP, 1, 'step')],
outputs=t_fwd_range
)
getRange(x, step)
print list(f)
assert list(f[:-1]) == list(range(0, x, step))
所以我必须使用MAX_LENGTH
作为输入fstep
的范围长度scan
。所以,我的主要问题是:有没有办法在没有输入序列的情况下使用scan
?而且,我认为答案是不,下一个问题是:这是我要做的事情的正确(最有效的,ecc)方法吗?在
不需要提供扫描的输入序列。您可以通过scan的
n_steps
参数指定迭代次数。或者,您也可以通过theano.scan_module.until
指定一个扫描应提前停止的条件。在因此,Python的
range
函数可以使用Theano的scan
来模拟,而不需要通过计算构造请求序列所需的迭代次数来指定输入序列。在下面是基于ano的
scan
的range函数的实现。唯一复杂的部分是计算出需要多少步骤。在显然,这是一件愚蠢的事情,因为Theano已经提供了Python的
range
函数的符号版本,即theano.tensor.arange
。内置实现也比我们的scan
版本高效得多,因为它不使用scan
,而是使用自定义操作。在经验法则是:您必须通过
range
或n_steps
参数来设置迭代步骤的最大数目。您可以将其设置为一个非常大的数字,然后使用theano.scan_module.until
在满足停止条件的早期阶段停止迭代。在相关问题 更多 >
编程相关推荐