制作 while 循环

从 theano 0.9 开始,while 循环可以通过 theano.scan_module.scan_utils.until 完成。要使用,你应该在 scanfn 中返回 until 对象。

在下面的示例中,我们构建了一个函数,用于检查复数是否在 Mandelbrot 集内。如果系列 z_{n+1} = z_{n}^2 + z_0 不收敛,则复数 z_0 在 mandelbrot 集内。

MAX_ITER = 256
BAILOUT = 2.
s_z0 = th.cscalar()
def iterate(s_i_, s_z_, s_z0_):
    return [s_z_*s_z_+s_z0_,s_i_+1], {}, until(T.abs_(s_z_)>BAILOUT)
(_1, s_niter), _2 = theano.scan(
    fn = iterate,
    outputs_info = [0, s_z0],
    non_sequences = [s_z0],
    n_steps = MAX_ITER
)
fn_mandelbrot_iters = theano.function([s_z0], s_niter)
def is_in_mandelbrot(z_):
    return fn_mandelbrot_iters(z_)>=MAX_ITER

is_in_mandelbrot(0.24+0.j) # True
is_in_mandelbrot(1.j) # True
is_in_mandelbrot(0.26+0.j) # False