theano库中function函数output和updates执行的先后顺序

        使用theano库,使用最多的theano.function函数,有两组输出一组是通过output,而且通过函数调用可以返回,还有一组是updates,因为updates只能更新shared变量,所以显得这个输出是隐含的,即使很多人明白这个再变化,也不能立刻说出这个就是输出。

       theano.function 这样的两组输出 往往是相互关联的,既然关联的,那他们的执行顺序是直接影响值的变化的,output往往在计算中使用了updates中的更新的sahred变量,因此updates执行顺序会直接影响output,本文从例子来说明这个先后顺序,去直接找源码显得大材小用了。

  下面是python代码:

# -*- coding: utf-8 -*-
# Date :  2014/8/12
# 如转载引用请注明出处,即使拙劣,也是心血
# 说明 : 
# theano function 函数 其实有两组输出值
# 通过output的输出,在updates中更新的值,虽然updates更新的是shared变量 
# 在 machine learning 时 随即梯度下降SGD 就会用到output 和 updates 来计算
# 一直很好奇,updates是在output计算之前 还是计算之后执行的
# 去看源码很麻烦 所以写了个简单的例子看看结果
# 从结果可以看出 output 执行之后 才会更新updates 里面的值  
import theano
import numpy as np
import theano.tensor as T 

# theano vector variable 
x = T.ivector('x')
# shared variable to check update
y = theano.shared(np.array([2,2]),name='y_shared')
# the update increment variable
inc = theano.shared(np.array([1,1],dtype=np.int32))
# the symbolic expression to calculate output
output = x + y
test = theano.function([x],output,updates=[(y,y+inc)])

# 设置 x = 0 这样其实output 的值就是 output 计算时的Y值
# 如果 updates 先执行 这样 应该是 output == y
# 如果 output 先计算 这样 updates != output
# 借用这样的一组简单的例子说明 output 和 updates 计算时机

input_x = np.array([0,0])
# input_x (0,0) + y (2,2) = output (2,2)
print 'Output value is : ',test(input_x)
# update: y (2,2) --> y (3,3)
print 'The shared variable : ',y.get_value()
print '------------------------------------'
input_x = np.array([0,0])
# input_x (0,0) + y (3,3) --> output (3,3)
print 'Output value is : ',test(input_x)
# update: y (3,3) --> y (4,4)
print 'The shared variable : ',y.get_value()

代码注释里面说的很详细了,值的假设,以及输出怎么计算的,因此不再详细说明,中英混杂,是为了让里面的某些专业词汇不被我翻译错了

上面代码的结论是:先执行output 然后执行 updates ,即updates的执行是滞后的,感觉像是副产品,其实如果output本事是一个callback 函数那最好了,感觉这个updates

完全可以自己实现,但是theano.function是为了计算符号(symbolic)表达式而设计的,所以自然不能用callback函数,除非theano.Tensor里面重新设计出这样的符号化的函数。目前的设计的好处是,你明白输出和更新有这么回事很清楚的业务逻辑,而且有助于规范,如果是callback 就没有太严格的规范了!

以上纯属个人观点,如有谬误,还请提醒修正!



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值