首页 » python机器学习 » python机器学习全文在线阅读

《python机器学习》13.1.4 使用数组结构

关灯直达底部

在本节,我们将讨论如何通过Theano中的tensor模块使用数组结构。执行下列代码,我们可以创建一个简单的2×3矩阵,并使用优化过的Theano张量表达式计算数组中各列之和:

如前所述,使用Theano只需遵循3个基本步骤:定义变量、编译以及执行代码。上例显示Theano可以处理Python和NumPy的数据格式:列表(list)和数组(numpy.ndarry)

注意:在创建TensorVariable的fmatrix变量时,我们使用了可选的名称参数(在此为x),这对调试代码或者输出Theano图来说非常有用。例如,若未使用此名称参数,则输出变量名为x的fmatrix时,实际显示结果是其类型TesnsorType:

但如果在初始化TensorVariable时,像示例代码那样指定了名称参数x,则会显示此参数:

此时可通过type方法获取TensorType:

Theano还拥有一个非常智能的内存管理系统,通过对内存的复用使得系统运行速度更快。具体来说,Theano可以管理散布在多种硬件上的存储空间,如CPU和GPU。通过跟踪内存空间的变化,它可以对缓冲区进行镜像。接下来,我们来看一下shared变量,它允许我们使用大型对象(数组),这些对象可以被多种类型的函数读写,这样我们就可以在编译后对更新这些对象。关于Theano内存处理的更详细介绍超出了本书的范围。读者可通过链接http://deeplearning.net/software/theano/tutorial/aliasing.html获取Theano内存管理的最新信息。

正如我们所见,通过Theano共享内存是很容易的。在上一个例子中,我们定义了一个update变量,并通过此变量声明:在for循环每次迭代后,数组w加1以更新。在定义了要更新的对象,以及如何进行更新之后,我们便可以通过update参数将其传递给theano.function进行编译。

使用Theano的另一个巧妙方法就是:在编译之前通过givens变量在图中加入新的值[1]。使用这种方法,借助于共享变量,我们可以降低通过CPU将数据从内存传输到GPU的次数,从而加速算法的学习速度。如果我们在theano.function中使用了inputs参数,数据将会在CPU和GPU之间多次传输,例如,在梯度下降中,我们需对数据进行多次循环遍历(迭代)。如果数据集能够加载到GPU内存中,使用givens它就可以在训练过程中得以保持(例如,通过子批次进行学习)。代码如下:

由上述示例代码,我们还可发现:givens值的格式是Python字典,它可以将变量名映射到真实的Python对象上。其中,变量名与我们在fmatrix中定义的名字相同。

[1] Theano会将计算过程编译成一个图模型。——译者注