Skip to content

Theano - 变量

正如在数据类型章节中讨论的,Theano 中的变量通常是符号化的。它们在计算图中充当占位符,定义了将流经计算图的数据的类型和形状,但最初并不持有具体的数值。

你可以使用来自 theano.tensor(通常导入为 tt)的构造函数来声明符号变量。构造函数决定了变量的类型(维度和数据类型)。

import theano
import theano.tensor as tt
# 声明一个符号向量(1D 数组),数据类型为 32 位浮点数
x = tt.fvector('x')
# 'x' 是一个可选名称,有助于调试和图可视化。
# 声明一个符号矩阵(2D 数组),数据类型为 64 位整数
y = tt.lmatrix('y')
# 声明一个符号标量(0D 张量),数据类型为 32 位整数
z = tt.iscalar('z')
# 声明一个符号 3D 张量,数据类型为 64 位浮点数
t3 = tt.dtensor3('t3')

这些语句创建了 TensorVariable 对象。它们代表了计算图中的节点,这些节点稍后在执行 theano.function 时将接收实际数据。

你可以检查符号变量的以下属性:

print(f"Variable x: name={x.name}, type={x.type}, ndim={x.ndim}, dtype={x.dtype}")
# Output: Variable x: name=x, type=TensorType(float32, vector), ndim=1, dtype=float32
print(f"Variable y: name={y.name}, type={y.type}, ndim={y.ndim}, dtype={y.dtype}")
# Output: Variable y: name=y, type=TensorType(int64, matrix), ndim=2, dtype=int64
print(f"Variable t3: name={t3.name}, type={t3.type}, ndim={t3.ndim}, dtype={t3.dtype}")
# Output: Variable t3: name=t3, type=TensorType(float64, tensor3), ndim=3, dtype=float64
  • name:创建时给定的可选字符串名称。
  • type:一个 Theano TensorType 对象,描述数据类型和广播模式(维度)。
  • ndim:维度数量(0 表示标量,1 表示向量,2 表示矩阵等)。
  • dtype:数据类型字符串(例如,‘float32’,‘int64’)。

以下是一些常见张量变量构造函数的快速参考:

构造函数 (theano.tensor.*)默认数据类型维度 (ndim)
scalar(例如,fscalar,dscalar,iscalar)取决于前缀 (f=float32, d=float64, i=int32)0
vector(例如,fvector,dvector,ivector)取决于前缀1
matrix(例如,fmatrix,dmatrix,imatrix)取决于前缀2
tensor3(例如,ftensor3,dtensor3,itensor3)取决于前缀3
tensor4(例如,ftensor4,dtensor4,itensor4)取决于前缀4

你也可以使用通用构造函数(vector,matrix,tensor3 等),并显式指定 dtype,这通常更受欢迎,因为它更清晰:

# 显式创建一个 int32 向量
explicit_vec = tt.vector('explicit_vec', dtype='int32')
print(f"Explicit Vec: type={explicit_vec.type}, dtype={explicit_vec.dtype}")
# Output: Explicit Vec: type=TensorType(int32, vector), dtype=int32
# 显式创建一个 float64 矩阵
explicit_mat = tt.matrix('explicit_mat', dtype='float64')
print(f"Explicit Mat: type={explicit_mat.type}, dtype={explicit_mat.dtype}")
# Output: Explicit Mat: type=TensorType(float64, matrix), dtype=float64

区分它们至关重要:tt.fvector('x') 创建一个符号,代表未来一个 float32 向量。它不像 NumPy 数组 np.array([1.0, 2.0], dtype='float32') 那样持有数据。符号变量定义了计算图的规则和类型,而具体值(通常是 NumPy 数组)只在你执行编译后的 theano.function 时提供。

符号变量是定义 Theano 计算的基本构建块。你声明它们来代表你期望计算的输入、中间结果和输出。通过 Theano 运算符(如 +, *, tt.dot, tt.nnet.relu 等)连接这些变量,你就可以构建 Theano 将进行优化和编译的计算图。

下一章将讨论一种特殊的变量类型,共享变量,它对于在训练过程中持有模型参数等持久状态至关重要。