theano tutorial(六)IfElse vs Switch

1.IfElse 和 Switch都用于判定公式是否满足某种条件

2.IfElse用boolean作为条件,输入为两个变量

3.Swich用tensor作为条件,输入也为两个变量,Switch是一种elementwise操作符,因此比ifelse更加通用

4.switch对每个输出变量进行操作,ifelse只对一个满足条件的变量操作,意思就是说

switch(cond, ift, iff):
    """if cond then ift else iff"""

如果满足条件,则switch既执行ift也执行iff

而ifelse只执行ift或者只执行iff


#coding=utf-8

# IfElse vs 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))#li:a < b?
z_lazy=ifelse(T.lt(a,b),T.mean(x),T.mean(y))
#The Mode represents a way to optimize and then link a computation graph.
#def __init__(self, linker=None, optimizer='default'):
#optimizer:optimizer的类型结构(可以简化计算,增加计算的稳定性)
#linker:决定使用哪种方式进行编译(C/Python),怎么把他们联系到一起来进行运算
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))

time spent evaluating both values 0.358457 sec
time spent evaluating one value 0.188870 sec


如果不使用inker='vm' 或者 linker='cvm' ,ifelse 的执行时间将会和switch一样

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值