购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 符号变量

存储数据需要用到各种变量,那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中定义符号变量的方式有三种:使用内置的变量类型、自定义变量类型、转换其他的变量类型。具体如下:

1.使用内置的变量类型创建

目前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指变量的数据类型。

2.自定义变量类型

内置的变量类型只能处理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.]])]

3.将Python类型变量或者NumPy类型变量转化为Theano共享变量

共享变量是Theano实现变量更新的重要机制,后面我们会详细讲解。要创建一个共享变量,只要把一个Python对象或NumPy对象传递给shared函数即可,如下所示: I4x1B0Ad54M79EzDB0uXfEfAIcOxKWW8py/bwhnXeP/FTT8fxr+gGn99Ua2GJjge


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)

点击中间区域
呼出菜单
上一章
目录
下一章
×