现在的位置: 首页 > 综合 > 正文

Theano学习1 Theano学习笔记(三)——图结构

2018年11月02日 ⁄ 综合 ⁄ 共 3543字 ⁄ 字号 评论关闭

Theano学习笔记(三)——图结构

(http://blog.csdn.net/ycheng_sjtu/article/details/38920473)

图结构(Graph Structures)是了解Theano内在工作原理的基础。

Theano编程的核心是用符号占位符把数学关系表示出来。

 

图结构的组成部分

如图实现了这段代码:

[python] view
plain
copy

  1. importtheano.tensor as T  
  2. x= T.matrix('x')  
  3. y= T.matrix('y')  
  4. z= x + y  

变量节点(variable nodes)

红色表示。变量节点都有owner,其中x与y的owner为none。z的owner为apply。

 

操作节点(op nodes)

绿色表示。表示各个变量之间的运算(例如+, -, **, sum(),tanh()等等)。

 

应用节点(apply nodes)

蓝色表示。其他节点都连在上面。

 

 

分析nodes对应属性

对于以下代码,分析其节点属性。

[python] view
plain
copy

  1. importtheano.tensor as T  
  2. x= T.dmatrix('x')  
  3. y= x * 2.  
  4. >>>y.owner.op.name  
  5. 'Elemwise{mul,no_inplace}'#y的owner是apply而apply的op是'Elemwise{mul,no_inplace}'  
  6. >>>len(y.owner.inputs)  
  7. 2#两个输入  
  8. >>>y.owner.inputs[0]  
  9. x#第一个输入是x矩阵  
  10. >>>y.owner.inputs[1]  
  11. InplaceDimShuffle{x,x}.0  

#注意这里第二个输入并不是2,而是和x同样大小的矩阵框架,因为等会要广播才能相乘

[python] view
plain
copy

  1. >>>type(y.owner.inputs[1])  
  2. <class'theano.tensor.basic.TensorVariable'>  
  3. >>>type(y.owner.inputs[1].owner)  
  4. <class'theano.gof.graph.Apply'>  
  5. >>>y.owner.inputs[1].owner.op  
  6. <class'theano.tensor.elemwise.DimShuffle object at 0x14675f0'>#用DimShuffle把2广播出来  
  7. >>>y.owner.inputs[1].owner.inputs  
  8. [2.0]#矩阵框架的owner才是2  

自动优化

编译Theano其实是编译了一张图。这张图从输入变量开始贯穿全图直到输出变量。Theano可以检测关键子图,来进行替换,防止重复,以达到优化的目的。比如用x替换xy/y。

举个例子

[python] view
plain
copy

  1. >>>import theano  
  2. >>>a = theano.tensor.vector("a")     # declare symbolic variable  
  3. >>>b = a + a ** 10                    #build symbolic expression  
  4. >>>f = theano.function([a], b)        #compile function  
  5. >>>print f([012])                 #prints `array([0,2,1026])`  

优化前

Theano 学习笔记

Theano 是一个python类库。他基于表示矩阵向量的numpy和包含大量数学功能的scipy,提供一种符号表示的数学公式。符号表示的数学公式的主要不同就是, 在建立公式的时候,你不需要知道公式里的自变量的值是什么。

比如传统的式子:

y= ax+b  在程序执行这一句的时候,必须知道 a,x,和b的值 ,不然就会报错或者得到非正常的结果。

而作为符号表示,则只是建立这个公式。

我们看个例子:

>>> x = T.dmatrix('x')
>>> s = 1 / (1 + T.exp(-x))
>>> logistic = function([x], s)
>>> logistic([[0, 1], [-1, -2]])
array([[ 0.5       ,  0.73105858],
       [ 0.26894142,  0.11920292]])

这个例子中首先,定义了x是一个矩阵。 然后给出了s这个符号变量(这个时候,没有赋值),根据这个公式,建立了一个函数logistic 。
将具体值代入这个函数,得到结果。 前面全部是符号运算。

具体实现方法是:建立一个运算树。
声明第一行x的时候,建立一个值节点。 第二行建立一颗树, 包括值的节点和运算节点。 代入值的时候,在这个数上做运算。

需要注意的事,这种符号表示的函数有一个无法替代的又是,就是可以求导。 每个运算节点都知道如何求导。比如:

y = a + b  , 对这个公式求导,那么 d(y) = d(a)+d(b),求导就可以递归来解决。 

引用:
[1]  http://deeplearning.net/software/theano/tutorial/printing_drawing.html#pretty-printing

################################################################
Q1:softmax 函数

总结为:   将一组数变换为  总和为1,各个数为0~1之间的软性归一化结果。 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

关于logistic regression中的softmax 函数

是用来柔化输出值,减小值之间的差。

用来归一化一组值到0~1之间,  总和为1. 

步骤为: 

    1. 求出最大值max
    2. 由exp表达式将各个值转化为0~1之间的数  x[i] =  exp(x[i] - max)
    3. 求sum,归一化。 

    1. void LogisticRegression::softmax(double *x) {                                     
    2.                                                            
    3.   double max = 0.0;                                                                
    4.   double sum = 0.0;                                                                
    5.                                                                                    
    6.   for(int i=0; i<n_out; i++) if(max < x[i]) max = x[i];                            
    7.   for(int i=0; i<n_out; i++) {                                                     
    8.     x[i] = exp(x[i] - max);                                                        
    9.     sum += x[i];                                                                   
    10.   }                                                                                
    11.                                                                                    
    12.   for(int i=0; i<n_out; i++) x[i] /= sum;    
    13. }                  
【上篇】
【下篇】

抱歉!评论已关闭.