Python快乐编程:人工智能深度学习基础
上QQ阅读APP看书,第一时间看更新

2.8 Theano中的条件表达式

Theano虽然是基于Python的工具包,但它本身属于符号语言,因此无法直接使用Python中的if语句。IfElse和Switch这两种操作都是基于符号变量建立约束条件。IfElse将boolean作为条件,将两个变量作为输入;Switch将tensor作为条件,将两个变量作为输入。Switch是一个逐元素的操作,这一特性使得它比IfElse更加通用。

Switch在两个输出变量上进行评估,而IfElse只对一个关于条件的变量进行评估。

运行结果如下所示:

    python ifelse_switch.py
    time spent evaluating both values 0.234337 sec
    time spent evaluating one value 0.134876 sec

在这个例子中,IfElse操作比Switch花费的时间更少,从结果看,这次操作中IfElse节省了大约一半的时间。这是因为IfElse只计算了两个变量中的一个。

只有在使用linker='vm'或者linker='cvm'的情况下,IfElse才会计算两个变量,计算时间与Switch相同。综上所述,IfElse与Switch主要区别有以下两点:

· IfElse的条件表达式condition只支持标量值,而Switch的条件表达式可以是任意形式的符号变量。在实际使用Theano的过程中,Switch的应用更为广泛。

· IfElse的运算具有惰性,从上面的例子中可以看出,IfElse的执行过程采用了“短路”策略,只会执行其中一个分支,而Switch会执行全部的分支,当全部分支执行完成后才根据条件表达式condition的值返回执行结果。