存储数据需要用到各种变量,那Theano是如何使用变量的呢?Theano用符号变量TensorVariable来表示变量,又称为张量(Tensor)。张量是Theano的核心元素(也是TensorFlow的核心元素),是Theano表达式和运算操作的基本单位。张量可以是标量(scalar)、向量(vector)、矩阵(matrix)等的统称。具体来说,标量就是我们通常看到的0阶的张量,如12,a等,而向量和矩阵分别为1阶张量和2阶的张量。
如果通过这些概念,你还不很清楚,没有关系,可以结合以下实例来直观感受一下。
首先定义三个标量:一个代表输入x、一个代表权重w、一个代表偏移量b,然后计算这些标量运算结果z=x*w+b,Theano代码实现如下:
#导入需要的库或模块 import theano from theano import tensor as T #初始化张量 x=T.scalar(name='input',dtype='float32') w=T.scalar(name='weight',dtype='float32') b=T.scalar(name='bias',dtype='float32') z=w*x+b #编译程序 net_input=theano.function(inputs=[w,x,b],outputs=z) #执行程序 print('net_input: %2f'% net_input(2.0,3.0,0.5))
打印结果:
net_input: 6.500000
通过以上实例我们不难看出,Theano本身是一个通用的符号计算框架,与非符号架构的框架不同,它先使用tensor variable初始化变量,然后将复杂的符号表达式编译成函数模型,最后运行时传入实际数据进行计算。整个过程涉及三个步骤:定义符号变量,编译代码,执行代码。这节主要介绍第一步如何定义符号变量,其他步骤将在后续小节介绍。
如何定义符号变量?或定义符号变量有哪些方式?在Theano中定义符号变量的方式有三种:使用内置的变量类型、自定义变量类型、转换其他的变量类型。具体如下:
目前Theano支持7种内置的变量类型,分别是标量(scalar)、向量(vector)、行(row)、列(col)、矩阵(matrix)、tensor3、tensor4等。其中标量是0阶张量,向量为1阶张量,矩阵为2阶张量等,以下为创建内置变量的实例:
import theano from theano import tensor as T x=T.scalar(name='input',dtype='float32') data=T.vector(name='data',dtype='float64')
其中,name指定变量名字,dtype指变量的数据类型。
内置的变量类型只能处理4维及以下的变量,如果需要处理更高维的数据时,可以使用Theano的自定义变量类型,具体通过TensorType方法来实现:
import theano from theano import tensor as T mytype=T.TensorType('float64',broadcastable=(),name=None,sparse_grad=False)
其中broadcastable是True或False的布尔类型元组,元组的大小等于变量的维度,如果为True,表示变量在对应维度上的数据可以进行广播,否则数据不能广播。
广播机制(broadcast)是一种重要机制,有了这种机制,就可以方便地对不同维的张量进行运算,否则,就要手工把低维数据变成高维,利用广播机制系统自动复制等方法把低维数据补齐(MumPy也有这种机制)。以下我们通过图2-1所示的一个实例来说明广播机制原理。
图2-1中矩阵与向量相加的具体代码如下:
图2-1 广播机制
import theano import numpy as np import theano.tensor as T r = T.row() r.broadcastable # (True, False) mtr = T.matrix() mtr.broadcastable # (False, False) f_row = theano.function([r, mtr], [r + mtr]) R = np.arange(1,3).reshape(1,2) print(R) #array([[1, 2]]) M = np.arange(1,7).reshape(3, 2) print(M) #array([[1, 2], # [3, 4], # [5, 6]]) f_row(R, M) #[array([[ 2., 4.], # [ 4., 6.], # [ 6., 8.]])]
共享变量是Theano实现变量更新的重要机制,后面我们会详细讲解。要创建一个共享变量,只要把一个Python对象或NumPy对象传递给shared函数即可,如下所示:
import theano import numpy as np import theano.tensor as T data=np.array([[1,2],[3,4]]) shared_data=theano.shared(data) type(shared_data)