theano中ifelse和switch的目的是什么?

What is purpose of ifelse and switch in theano?

我对他们一无所知,我是从http://deeplearning.net/software/theano/tutorial/conditions.html读到的。我想它们的功能类似于我们的 ifelse,但无法理解如何使用它们。请一些指导。谢谢

我会认为它只是作用于三个符号变量的另一个运算符,如果第一个为真,return 第二个,否则 return 第三个。

但是对于许多运算符(如-+)theano已经为符号变量重载了它们,所以你可能感觉不到区别。

例如,如果 ab 是数字,则 c=a+b 创建一个变量 c,其值为 a+b。如果 ab 是符号变量,那么 c=a+b 会创建另一个符号变量 c,它将(按元素)应用于 ab 当对应的函数得到 called/evaluated.

这里介绍一下theano算子和图。 http://deeplearning.net/software/theano/extending/graphstructures.html

在某种意义上,ternary operator 是 python 的原生等价于 theano 的 ifelseswitch 的符号变量。

代码是从link复制过来的,解释起来更容易: http://deeplearning.net/software/theano/extending/graphstructures.html

from theano import tensor as T
from theano.ifelse import ifelse
import theano, time, numpy

a,b = T.scalars('a','b')
x,y = T.matrices('x','y')

z_switch = T.switch(T.lt(a,b), T.mean(x), T.mean(y))
z_lazy = ifelse(T.lt(a,b), T.mean(x), T.mean(y))

f_switch = theano.function([a,b,x,y], z_switch,
                           mode=theano.Mode(linker='vm'))
f_lazyifelse = theano.function([a,b,x,y], z_lazy,
                               mode=theano.Mode(linker='vm'))

val1 = 0.
val2 = 1.
big_mat1 = numpy.ones((10000,1000))
big_mat2 = numpy.ones((10000,1000))

n_times = 10

tic = time.clock()
for i in range(n_times):
    f_switch(val1, val2, big_mat1, big_mat2)
print('time spent evaluating both values %f sec' % (time.clock()-tic))

tic = time.clock()
for i in range(n_times):
    f_lazyifelse(val1, val2, big_mat1, big_mat2)
print('time spent evaluating one value %f sec' % (time.clock()-tic))

在示例中,f_switch(val1, val2, big_mat1, big_mat2) 和 f_lazyifelse(val1, val2, big_mat1, big_mat2) 正在做同样的事情。如果 val1 是 "Less Than" val2,则它 returns big_mat1 否则 big_mat2.

但是 "switch" 和 "ifelse" 在性能上存在差异。在 "ifelse" 中,根据条件,将仅评估可能的输出之一。在此示例中,在 f_lazyifelse(val1, val2, big_mat1, big_mat2) 中,如果 val1 小于 val2,则将仅评估 big_mat1 执行均值函数大矩阵的所有元素,并且 big_mat2 将不会被评估。

另一方面,在 "switch" 的情况下,无论条件如何,都将评估可能的输出,在示例中,在 f_switch(val1, val2, big_mat1, big_mat2), 无论 val1 和 val2 都将计算 big_mat1 和 big_mat2(此处,对大矩阵的所有元素执行均值函数)。因此 "switch" 几乎是 "ifelse" 的两倍。