theano 学习笔记
shared 使用
这个方法可以供你在多个函数中共享某个值,使用方法为
```python
import theato.tensor as T
from theano import function
from theano import shared
inc = T.iscalar('inc')
state = shared(0) #用 0 初始化state
f = function([inc],state,updates=[(state,state+inc)])
ff = function([inc],state,updates=[(state,state+inc)])
f(10) #输出0 这里输出的值数state,因为在这里,是先输出state,然后更新state,因此输出0,然后state变为10
ff(100) #输出10,state变为110
```
Param 使用
这个方式是为函数的输入设置默认值。对于某些函数,比如logistic函数为11+e−1,其中我们一般写成1去加e−1,因此我们想设置param=1,但有时我想改变他,因此我们可以写成这样
```python
pprofix = T.dscalar('pprofix')
x = T.dscalar('x')
y = 1 / ( pprofix + Math.exp(-x))
logistic = function([x,Param(pprofix,efault = 1])
#调用logistic时我可以不为pprofix赋值
logistic(10)
logistic(10,10)
# 我也可以按照下面这个方法写,我在dscalar()中给pprofix设置了个名字,在这里就可以用了,
# 如果想给他改名,在Param设置name值即可
logistic(10,pprofix = 10
```
givens使用
当我们一个公式用的变量是shared时候,我想计算这个公式,但是不想更新shared变量的值时,我就要用givens这个方法,具体使用如下
```python
inc = T.dscalar('inc')
state = shared(0)
foo = T.scalar(dtype = state.dtype)
fn = state**2+inc
skip_share = function([inc,foo],fn,givens=[(state,foo)])
#这里虽然修改state,但这是局部修改,相当于生成了一个局部变量,对我整体的共享变量值是不变的
```
RandomStreams使用
如题,这个也就是产生随机数的函数,调用起来比较麻烦,因为要遵循theano的规则,下面我展示一下
```python
from theano.tensor.randomstreams import RandomStreams
#传给他种子,类似c中的srand()
srng = RandomStreams(seed=234)
#它可以生成两种类型的随机数,每种类型的都要用元组传入矩阵的row和cu
rv_n = srng.normal((2,2)) #生成的随机数有正有负,大小也不确定,不过比较小,最大也是个位数
rv_u = srng.uniform((2,2)) #生成的随机数是大于0的,并且小于1的,非常规则,当然都是生成2*2的矩阵
#调用时要用function,也就是他麻烦的地方
f = function([],rv_u) #不需要参数,所以不用传参
g = function([],rv_u,no_default_update=True) #生成一组随机数以后,就不再重新生随机数,如果一直用这组随机数的时候建议这样写
```
1.seed设置
seed除了可以为全体随机数设置也可以为单个随机数设置,方法略有不同
```python
#全局设置
RandomStreams(seed = 12233)
#局部设置比较麻烦
rvget = rv.rng.get_value(borrow = True)
rvget.seed(1212)
rv.rng.set_value(rvget,borrow=True)
``

浙公网安备 33010602011771号