theano中ifelse和switch的目的是什么?
What is purpose of ifelse and switch in theano?
我对他们一无所知,我是从http://deeplearning.net/software/theano/tutorial/conditions.html读到的。我想它们的功能类似于我们的 ifelse,但无法理解如何使用它们。请一些指导。谢谢
我会认为它只是作用于三个符号变量的另一个运算符,如果第一个为真,return 第二个,否则 return 第三个。
但是对于许多运算符(如-
和+
)theano已经为符号变量重载了它们,所以你可能感觉不到区别。
例如,如果 a
和 b
是数字,则 c=a+b
创建一个变量 c
,其值为 a+b
。如果 a
和 b
是符号变量,那么 c=a+b
会创建另一个符号变量 c
,它将(按元素)应用于 a
和 b
当对应的函数得到 called/evaluated.
这里介绍一下theano算子和图。
http://deeplearning.net/software/theano/extending/graphstructures.html
在某种意义上,ternary operator 是 python 的原生等价于 theano 的 ifelse
或 switch
的符号变量。
代码是从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" 的两倍。
我对他们一无所知,我是从http://deeplearning.net/software/theano/tutorial/conditions.html读到的。我想它们的功能类似于我们的 ifelse,但无法理解如何使用它们。请一些指导。谢谢
我会认为它只是作用于三个符号变量的另一个运算符,如果第一个为真,return 第二个,否则 return 第三个。
但是对于许多运算符(如-
和+
)theano已经为符号变量重载了它们,所以你可能感觉不到区别。
例如,如果 a
和 b
是数字,则 c=a+b
创建一个变量 c
,其值为 a+b
。如果 a
和 b
是符号变量,那么 c=a+b
会创建另一个符号变量 c
,它将(按元素)应用于 a
和 b
当对应的函数得到 called/evaluated.
这里介绍一下theano算子和图。 http://deeplearning.net/software/theano/extending/graphstructures.html
在某种意义上,ternary operator 是 python 的原生等价于 theano 的 ifelse
或 switch
的符号变量。
代码是从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" 的两倍。