源地址:http://deeplearning.net/software/theano/library/tensor/basic.html#libdoc-basic-tensor
Basic Tensor Functionality 基础张量功能
Theano支持任何Python的对象,但是他更多关注的是符号矩阵表达。当你输入
x = T.fmatrix()
这里的
x
是一个TensorVariable
的实例。T.fmatrix
对象本身是一个TensorType
的实例。Theano知道变量x
的类型是因为x.type
指向了T.fmatrix
。这张将介绍不同创建张量变量的方法,张量的属性和
TensorVariable
和TensorType
的方法,以及不同的基础数学符号和算法。
Creation 创建
- Theano提供一系列预定义的张量类型可以被用来新建张量变量。变量可以被命名以便调试,所有这些构造器接受一个可选择的参数
name
。例如,下面每个创建的TensorVariable实例都代表一个0维德ndarray的整数,被命名为myvar
:
x = scalar('myvar', dtype='int32')
x = iscalar('myvar')
x = TensorType(dtype='int32', broadcastable=())('myvar')
Constructors with optional dtype 可选择的类型构造器
- 这些都是最简单而且经常被使用来创建符号变量的方法。默认地,他们构建浮点变量(由config.floatX决定,见
floatX
),所以如果你使用这些构造器,转换不同精度是很简单的。
theano.tensor.scalar(name=None, dtype=config.floatX)
返回一个0维的ndarray变量
theano.tensor.vector(name=None, dtype=config.floatX)
返回一个1维的ndarray变量
theano.tensor.row(name=None, dtype=config.floatX)
返回一个2维变量,行数一定为1
theano.tensor.col(name=None, dtype=config.floatX)
返回一个2维变量,列数一定为1
theano.tensor.matrix(name=None, dtype=config.floatX)
返回一个2维的ndarray变量
theano.tensor.tensor3(name=None, dtype=config.floatX)
返回一个3维德ndarray变量
theano.tensor.tensor4(name=None, dtype=config.floatX)
返回一个4维的ndarray变量
All Fully-Typed Constructors 所有全类型构造器
- 下面的Tensor类型是被theano.tensor模板提供的实力。他们都是可以调用,都有一个
name
参数。
from theano.tensor import *
x = dmatrix()
x = dmatrix('x')
xyz = dmatrix('xyz')
前缀 | 含义 |
---|---|
b | int8 |
w | int16 |
i | int32 |
l | int64 |
d | float64 |
f | float32 |
c | complex64 |
z | complex128 |
构造器 | 维数 | 形状 | 广播机制 |
---|---|---|---|
scalar | 0 | () | () |
vector | 1 | (?,) | (False,) |
row | 2 | (1,?) | (True, False) |
col | 2 | (?,1) | (False, True) |
matrix | 2 | (?,?) | (False, False) |
tensor3 | 3 | (?,?,?) | (False, False, False) |
tensor4 | 4 | (?,?,?,?) | (False, False, False, False) |
Plural Constructors 符合构造器
下面的构造器可以一次性构造不同的变量。这些在练习中不经常被使用,但是在本次指导中会被使用来节省空间。
iscalars, lscalars, fscalars, dscalsrs
返回一个或多个标量变量
ivectors, lvectors, fvectors, dvectors
返回一个或多个向量变量
irows, lrows, frows, drows
返回一个或多个行变量
icols, lcols, fcols, dcols
返回一个或多个列变量
imatrixs, lmatrixs, fmatrices, dmatrices
返回一个或多个矩阵变量每一个复合构造器接受一个整数或多个字符串。如果输入一个整数,方法会返回愈多变量;如果输入一个字符串,它会使用变量名为每个字符串创建一个变量。例如:
from theano.tensor import *
x, y, z = dmatrices(3)
x, y, z = dmatrices('x', 'y', 'z')
Custom tensor types 自定义tensor类型
- 如果你想要构建一个张量变量,它没有标准的广播模式,或者维度很高,你需要新建一个你自己的
TensorType
实例。你要新建这样一个实例,通过传入dtype和广播模式来构造。例如,你要新建一个你自己的5维张量:
dtensor5 = TensorType('float64', (False,)*5)
x = dtensor5()
z = dtensor5('z')
- 你也可以重新定义一些已经提供的类型,他们会正确地相互作用:
my_dmatrix = TensorType('float64', (False,)*2)
x = my_dmatrix()
my_dmatrix == dmatrix # True
- 新建新类型的Tensor详情请看:
TensorType
Converting from Python Objects 从python对象转换
另外一个创建TensorVariable就是使用
shared()
。
x = shared(numpy.random.randn(3,4))
这会返回一个共享变量,
.value
属性是numpy的ndarray。变量的维数dtype都是从给定的ndarray参数推算出来的。共享的参数不会被复制,随后的变量改变会影响x.value
更多的信息,请看
shared()
文档。最后,当你在算法表达式的TensorVariable实例中使用numpy的ndarray或者一个Python number,他的结果是一个
TensorVariable
。究竟ndarray或number发生了什么?Theano要求输入所有变量实例的表达式,所以Theano自动地把他们包装成TensorConstant
。
注意:Theano在使用表达式时为每个ndarray创建一个副本,所以随后的ndarray改变不会对Theano的表达式有影响
对于numpy的ndarray,dtype是给定的,但是广播模式一定要被分配。TensorConstant用一个匹配的dtype被赋予一个type,所有形状维度是1的都被赋予广播模式True。
对于python的number, 广播模式是(), 但是dtype一定要被推算。Python的整数被储存在一个最小的dtype,所以小整数像1被储存在bscalar。以此类推,Python的float被储存在fscalar如果fscalar足够完美地储存,否则就用dscalar。
注意:当config.floatX==float32.Python的float会用单精度存储
theano.tensor.as_tensor_variable(x, name=Noen, ndim=None)
- 把参数x转换成 TensorVariable 或 TensorConstant。
- 很多tensor的运算都会使用这个函数做预处理。
- 当x是一个Python的number,dtype像上述描述。
- 当x是一个list或tuple,它会被传到numpy.asarray
- 如果ndim不为空,它必须是个整数,输出会被广播。
TensorType and TensorVariable 张量类型和张量变量
class theano.tensor.TensorType(Type)
Type的类被用来表示numpy.ndarray的值
- broadcastable
一个对于每维True/False的元组。True在i的位置意味着在评估时间里,ndarray在第i维大小为1。
模式 | 含义} |
---|---|
[] | 标量 |
[True] | 1D标量(长度为1的向量) |
[True, True] | 2D标量(1*1矩阵) |
[False] | 向量 |
[False, False] | 矩阵 |
[False]*n | nD张量 |
[True, False] | 行(M*1矩阵) |
[False, True] | 列(1*M矩阵) |
[False, True, False] | 一个M*1*P张量(a) |
[True, False, False] | 一个1*N*P张量(b) |
[False, False, False] | 一个M*N*P张量(a+b的模式) |
维度广播是Flase的,长度可以是1或更多。True的一定要是1。
当两个有不同维度的参数使用元素依次操作(element-wise),广播通过在最左扩展True属性。例如[False]会被扩展成[True, False]。
middle_broadcast = TensorType('complex64', [False, True, False])
ndim
变量值的维度数,在构建表达图前一定要知道dtype
`int8, int16, int32, int64, uint8, uint16, uint32, uint64, float32, float64, complex64, complex128’__init__(se;f, dtype, broadcastable)
TensorVariable
class theano.tensor.TensorVariable(Variable, _tensor_py_operators)
class theano.tensor.TensorConstant(Variable, _tensor_py_operators)
class theano.tensor.TensorSharedVariable(Variable, tensor_py_operators)
class theano.tensor.__tensor_py_operators
这个混杂类有方便的属性,方法并且支持TensorVariable, TensorConstant和TensorSharedVariable。
- type
- ndim
- reshape(shape, ndim=None)
dumshuffe(*pattern)
pattern的一些例子:
(‘x’) -> 令一个0维(标量)变成1为向量
(0,1) -> 2维向量
(1,0) -> 第一第二维反转
(‘x’,0) -> N变成1*N
(0,’x’) -> N变成N*1
(2,0,1) -> A*B*C变成C*A*B
(0,’x’,1) -> A*B变成A*1*B
(1,’x’,0) -> A*B 变成 B*1*A
(1,) -> 1*A 变成 Aflatten(ndim=1)