Theano(6):Theano条件语句,IfElse vs Switch

本文探讨了Theano库中用于条件控制的IfElse和Switch操作。IfElse是一个布尔条件操作,而Switch是张量条件操作,更通用。IfElse会计算两个变量,而Switch则根据条件惰性评估。尽管目前不默认使用优化的linker,但未来可能会改变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


http://deeplearning.net/software/theano/tutorial/conditions.html


IfElse vs Switch

  • Both ops build a condition over symbolic variables.
  • IfElse takes a boolean condition and two variables as inputs.
  • Switch takes a tensor as condition and two variables as inputs. switch is an elementwise operation and is thus more general thanifelse.
  • Whereas switch evaluates both output variables, ifelse is lazy and only evaluates one variable with respect to the condition.




ifelse的使用:

>>> from theano.ifelse import ifelse
>>> a,b=T.dscalars('a','b')
>>> x=T.dscalar('x')
>>> y=T.dscalar('y')
>>> z=ifelse(T.lt(a,b),x+y,x-y)
>>> ifelseFun=theano.function([a,b,x,y],z,mode=theano.Mode(linker='vm'))
>>> AltB=ifelseFun(1,2,3,4)
>>> print AltB
7.0
>>> BltA=ifelseFun(2,1,3,4)
>>> print BltA
-1.0




ifelse和switch比较:

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))

IfElse  op (只需要计算一个变量)花费的时间大约是  Switch  op (两个都需要)的一半。


注意:Unless linker='vm' or linker='cvm' are used, ifelse will compute both variables and take the same computation time as switch. Although the linker is not currently set by default to cvm, it will be in the near future.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值