【发布时间】:2016-06-19 18:55:49
【问题描述】:
我对他们一无所知,我是从http://deeplearning.net/software/theano/tutorial/conditions.html 读到的。我想它们的功能与我们的 ifelse 类似,但无法理解如何使用它们。请对此进行一些指导。谢谢
【问题讨论】:
标签: neural-network theano deep-learning
我对他们一无所知,我是从http://deeplearning.net/software/theano/tutorial/conditions.html 读到的。我想它们的功能与我们的 ifelse 类似,但无法理解如何使用它们。请对此进行一些指导。谢谢
【问题讨论】:
标签: neural-network theano deep-learning
我认为它只是另一个作用于三个符号变量的运算符,如果第一个为真,则返回第二个,否则返回第三个。
但是对于许多运算符(例如- 和+),theano 已经为符号变量重载了它们,所以您可能感觉不到区别。
例如,如果a 和b 是数字,则c=a+b 创建一个变量c,其值为a+b。如果a 和b 是符号变量,那么c=a+b 创建另一个符号变量c,当对应的函数被调用/评估时,它将应用(元素方式)添加到a 和b。
这里是theano算子和图的介绍。 http://deeplearning.net/software/theano/extending/graphstructures.html
在某种意义上,ternary operator 是 python 的原生等同于 theano 的 ifelse 或 switch,用于符号变量。
【讨论】:
代码是从链接中复制的,以便于解释: 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 为“小于”val2,则返回 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”的两倍。
【讨论】: