theano中的一些备忘

上个学期一直想用theano,但是苦于当时文档读的不是很懂,并且很多东西感觉不到咋弄的,同时时间比较紧急,就没怎么弄。这个学习来,发现文档大部分都看懂了,并且的确这玩意很好,单不说可以利用GPU,就是自动求导我就很喜欢的很。


昨天在写function的时候,结合共享变量来写遇到点问题,今天早上结合错误信息,搞了一下,发现还是有一些规律的,先举个例子吧

如果存在以下代码:

import numpy,theano,theano.tensor as T

x = T.dmatrix('x')
w = T.dmatrix('w')

init_x = numpy.asarray([1], theano.config.floatX)
init_w = numpy.asarray([2], theano.config.floatX)
y = x*w

f = theano.function([w,x], y)



对于上述代码,需要注意的地方是使用符号变量对x和w的定义中的类型以及对x和w的值的初始化的类型。

定义的时候是一个matrix,此时对应的初始化的值就应该是个matrix的类型,而在初始化中,传入的是一个vector,如果使用

init_x = numpy.asarray(1)
来定义,那么这个数就是scalar了,所以会出错的,报错的信息就是类似于shape()出来的值和定义的不一样。所以这个地方务必注意下,如果定义符号变量是矩阵就按照矩阵来初始化他们的值,这个地方应该用这样的公式来初始化:

init_x = numpy.asarray([[1]], theano.config.floatX)
init_y = numpy.asarray([[2]], theano.config.floatX)
注意下中括号的个数,就理解意思了。



接下来再说的是,如果w是共享变量怎么办。

在theano.function的输入参数中,共享变量是不能作为它的输入的。但是可以参与运算,是什么意思呢?就是先看下面的代码吧

x = T.dmatrix('x)
init_w = numpy.asarray([[2]], theano.config.floatX)
w = theano.shared(init_w, theano.config.floatX, 'w')
init_x = numpy.asarray([[1]], theano.config.floatX)
y = x*w
f = theano.function([x], y)
此时输入参数只有x,此时就是对的了,因为x不是共享变量,但是y的计算是有共享变量x的参与的。


再说一个此时的 updates参数干啥用


接着上面的代码补充一下下面几句代码

y_val = y.mean() # 此时也可以用T.mean(y)
gw = T.cost(y_val, [w])
f = theano.function([x], y, updates=[(w, w-gw)])
可以看出来多个个updates参数,意思就是在计算出来y的时候,同时也进行一下updates里面的操作,让w=w-gw。而gw此时尽管不被显式的计算,但是既然有这个操作在,系统也会去计算gw,进而操作下updates里面的含义。


再补充一个地方就是求导的时候,记得一定是标量对其它的求导,也就是y求出来之后来个平均值或者直接求和,这样就是个标量了


数据类型的地方一定注意好,否则一大堆错误,看懂错误信息还好,看不懂就无从下手了。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值