在theano中ifelse和switch的目的是什么?

时间:2016-03-06 04:37:20

标签: neural-network theano deep-learning

我无法理解他们的任何内容,我是从http://deeplearning.net/software/theano/tutorial/conditions.html读到的。我想他们的功能就像我们的ifelse但不能理解如何使用它们。请指点一下。感谢

2 个答案:

答案 0 :(得分:3)

从链接中复制代码以便于解释: http://deeplearning.net/software/theano/extending/graphstructures.html

private void setMachineTime(){
    Timer timer = new Timer();
    long startTime = new Date().getTime();
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {

            long endTime = new Date().getTime();
            long diffTime = endTime - startTime;
            String diffSeconds = formatTime(diffTime / 1000 % 60);
            String diffMinutes = formatTime(diffTime / (60 * 1000) % 60);
            String diffHours = formatTime(diffTime / (60 * 60 * 1000) % 24);
            System.out.println(diffHours + ":" + diffMinutes + ":" + diffSeconds);
        }
    }, 0, 1000);
}

private String formatTime(long diff){
    long t;
    t = diff;
    if(t < 10){
        return String.valueOf("0"+t);
    } else {
        return String.valueOf(t);
    }
}

在该示例中,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。

另一方面,在“切换”的情况下,无论条件如何,都将评估可能的输出,并且在示例中,在f_switch(val1,val2,big_mat1,big_mat2)中,无论val1和val2如何都是big_mat1将评估big_mat2(这里,对大矩阵的所有元素执行平均函数)。因此,“切换”几乎需要两次“ifelse”才能执行。

答案 1 :(得分:2)

我认为它只是另一个作用于三个符号变量的运算符,如果第一个为真,则返回第二个,否则返回第三个。

但是对于许多运算符(例如-+),theano已经为符号变量重载了它们,所以你可能感觉不到差异。

例如,如果ab是数字,那么c=a+b会创建一个变量c,其值为a+b。如果ab是符号变量,那么c=a+b会创建另一个符号变量c,这将对a和{{应用(逐个元素)添加1}}当相应的函数被调用/评估时。

以下是theano运算符和图表的介绍。 http://deeplearning.net/software/theano/extending/graphstructures.html

在某种意义上,ternary operator是python的本机,相当于theano的bifelse符号变量。