IfElse vs Switch
IfElse接收布尔型条件和两个变量作为输入。
Switch接收一个张量(Tensor)以及两个变量作为输入。
Switch进行元素级运算,因此比IfElse更常用。
IfElse比较懒惰,只计算满足条件的相应输出变量, 而Switch计算所有的输出变量。
即:
ifelse(condition, output1, output2): 如果condition:1(0),那么ifelse只计算output1(output2)并输出。
switch(condition, output1, output2): 如果condition:1(0),那么switch计算output1和output2,并输出output1(output2)
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_ifelse = 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_ifelse = theano.function([a, b, x, y], z_ifelse, 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 j in range(n_times):
f_ifelse(val1, val2, big_mat1, big_mat2)
print('time spent evaluating one value %f sec' % (time.clock() - tic))
在这个例子中,IfElse比Switch花费更少的时间,因为他只计算输出变量中的一个。
如果不使用linker='vm'或linker='cvm',那么ifelse将会和switch一样计算两个输出变量,而且花费的时间和switch一样多。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。