【问题标题】:What is purpose of ifelse and switch in theano?ifelse 和 switch 在 theano 中的目的是什么?
【发布时间】:2016-06-19 18:55:49
【问题描述】:

我对他们一无所知,我是从http://deeplearning.net/software/theano/tutorial/conditions.html 读到的。我想它们的功能与我们的 ifelse 类似,但无法理解如何使用它们。请对此进行一些指导。谢谢

【问题讨论】:

    标签: neural-network theano deep-learning


    【解决方案1】:

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

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

    例如,如果ab 是数字,则c=a+b 创建一个变量c,其值为a+b。如果ab 是符号变量,那么c=a+b 创建另一个符号变量c,当对应的函数被调用/评估时,它将应用(元素方式)添加到ab

    这里是theano算子和图的介绍。 http://deeplearning.net/software/theano/extending/graphstructures.html

    在某种意义上,ternary operator 是 python 的原生等同于 theano 的 ifelseswitch,用于符号变量。

    【讨论】:

      【解决方案2】:

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

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

      在示例中,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 不会被评估。

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

      【讨论】:

      • 比文档更好的解释,谢谢@user4557429
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      相关资源
      最近更新 更多