• Theano教程


    让我们开始一个交互式会话(例如使用pythonipython)并导入Theano。

    from theano import *

    你需要使用Theano的tensor子包中的几个符号。让我们以一个方便的名字,例如T导入这个子包(教程将经常使用这个约定)。

    import theano.tensor as T

    Numpy

    机器学习的矩阵惯例

    行是水平的,列是垂直的。每一行都是一个样本。因此,inputs[10,5]是10个样本的矩阵,其中每个样本具有维度5。如果这是神经网络的输入,则从输入到第一个隐藏层的权重将表示大小(5, #hid)的矩阵。

    import numpy as np
    a=np.asarray([[1,2],[3,4],[5,6]])
    print a
    print a.shape
    
    [[1 2]
     [3 4]
     [5 6]]
    
    (3, 2)

    这是3×2矩阵,即有3行和2列。

    要访问第3行(#2行)和第1列(#0列)中的元素:

    print a[2,0]

    记住这一点,我们从左到右、从上到下读取,所以连续的元素是一行。也就是说,有3行和2列。

    Broadcasting

    Numpy在算术运算期间对不同形状的数组进行broadcasting。这通常意味着较小的数组(或标量)被broadcasted到较大的数组,以让它们具有兼容的形状。下面的示例演示broadcastaing的一个实例:

    a=np.asarray([1,2,3])
    b=3
    print a*b
    
    [3 6 9]

    在这种情况下,这里较小的数组b(实际上是标量,其工作原理类似于一个0维数组)在乘法过程中被broadcasted到与a相同的大小。这个技巧通常用于简化表达式的写法。

    代数

    两个标量相加

    为了让我们开始使用Theano并获得我们正在使用的感觉,让我们做一个简单的函数:将两个数字加在一起。这里是你怎么做:

    import theano.tensor as T
    from theano import function
    x=T.dscalar('x')
    y=T.dscalar('y')
    z=x+y
    f=function([x,y],z)

    现在我们已经创建了我们的函数,我们可以使用它:

    f=function([x,y],z)
    print f(2,3)

    5.0

    让我们分成几个步骤。第一步是定义两个符号(变量),表示要相加的数量。注意,从现在起,我们将使用术语变量来表示“符号”(换句话说,xyz都是变量对象)。函数f的输出是零维度的numpy.ndarray

    如果你正在跟着输入解释器,你可能已经注意到执行function指令有一点点延迟。在幕后,f正在被编译成C代码。

    步骤1

    x=T.dscalar('x')
    y=T.dscalar('y')

    在Theano中,所有的符号必须具有类型。特别地,T.dscalar是我们分配给“0维数组(双精度浮点数(d)的标量)”的类型。它是Theano的Type类型。

    dscalar不是类。因此,xy都不是dscalar的实例。它们是TensorVariable的实例。然而,xytype字段赋值为theano的dscalar类型,正如你在下面看到的:

    print type(x)
    print x.type
    print T.dscalar
    print x.type is T.dscalar
    
    <class 'theano.tensor.var.TensorVariable'>
    TensorType(float64, scalar)
    TensorType(float64, scalar)
    True

    通过使用字符串参数调用T.dscalar,你将创建一个给定名称的变量,表示一个浮点数标量。如果你不提供参数,符号将不会命名。名称不是必需的,但它们可以帮助调试。

    步骤2

    第二步是将xy组合到它们的和z中:

    z=x*y

    z是另一个变量,表示xy相加。你可以使用pp函数精确打印与z相关的计算。

    from theano import pp
    print pp(z)
    
    (x+y)

    步骤3

    最后一步是创建一个以xy作为输入并将z作为输出的函数:

    f=function([x,y],z)

    function的第一个参数是一个变量列表,它们将作为函数的输入。第二个参数是单个变量一个变量的列表。不管哪一种情况,第二个参数是当我们应用函数时我们想要看到它的输出。f可以像普通的Python函数一样使用。

    注意

    作为一个捷径,你可以跳过第3步,只需使用变量的eval方法。eval()方法不像function()一样灵活,但它可以完成我们在本教程中介绍的所有内容。它有额外的好处,不需要你导入function()。下面是eval()的工作原理:

    x=T.dscalar('x')
    y=T.dscalar('y')
    z=x+y
    print z.eval({x:1,y:2})
    
    3.0

    我们传递给eval()一个字典,将theano的符号变量映射到值来替换它们,然后它返回表达式的数值。

    eval()在第一次调用变量时会变慢 - 需要调用function()来编译后台表达式。在同一变量上对eval()的后续调用将很快,因为变量缓存编译的函数。

    两个矩阵相加

    x=T.dmatrix('x')
    y=T.dmatrix('y')
    z=x+y
    f=function([x,y],z)

    dmatrix是双精度(double)矩阵的类型。然后我们可以在二维数组上使用我们的新函数:

    f=function([x,y],z)
    print f([[1,1],[1,1]],[[1,2],[3,4]])
    
    [[ 2.  3.]
     [ 4.  5.]]

    变量是NumPy数组。我们也可以直接使用NumPy数组作为输入:

    print f(np.asarray([[1,1],[1,1]]),np.asarray([[1,2],[3,4]]))

    [[ 2.  3.]
     [ 4.  5.]]

    可以标量与矩阵相加,向量与矩阵相加,标量与向量相加等。这些操作的行为由broadcasting定义。

    以下类型可以使用:

    • byte: bscalar, bvector, bmatrix, brow, bcol, btensor3, btensor4, btensor5
    • 16-bit integers: wscalar, wvector, wmatrix, wrow, wcol, wtensor3, wtensor4, wtensor5
    • 32-bit integers: iscalar, ivector, imatrix, irow, icol, itensor3, itensor4, itensor5
    • 64-bit integers: lscalar, lvector, lmatrix, lrow, lcol, ltensor3, ltensor4, ltensor5
    • float: fscalar, fvector, fmatrix, frow, fcol, ftensor3, ftensor4, ftensor5
    • double: dscalar, dvector, dmatrix, drow, dcol, dtensor3, dtensor4, dtensor5
    • complex: cscalar, cvector, cmatrix, crow, ccol, ctensor3, ctensor4, ctensor5
  • 相关阅读:
    Spring MVC中@ControllerAdvice注解实现全局异常拦截
    IDEA一个窗口打开多个项目
    IntelliJ IDEA中Spring Boot项目使用spring-boot-devtools无法实现热部署/热更新的问题解决
    Java中String/StringBuffer/StringBuilder区别(转)
    IDEA查看源码时提示:Library source does not match the bytecode for class的问题分析
    忙的一天的复盘
    Apollo专题
    使用Spring JPA中Page、Pageable接口和Sort类完成分页排序【专题】
    公众号开发之wx-tools+springboot应用实战-音乐爬虫推送[JAVA]
    [LeetCode] 152. Maximum Product Subarray 求最大子数组乘积
  • 原文地址:https://www.cnblogs.com/qniguoym/p/7661146.html
Copyright © 2020-2023  润新知