Relay 变量

目录

Relay 变量#

Relay 明显地区分了 AST 和文本格式之间的局部变量(Var 使用 % 标识)和全局变量(GlobalVar 使用 @ 标识)。

  • 全局标识符总是引用在全局可见环境中包含的全局可见定义,称为 模块 (module)。全局标识符必须是唯一的。

  • 局部标识符总是引用函数参数或被 letLet) 表达式绑定的变量,并将作用于它出现的函数或被 let 表达式绑定之处。

局部变量#

局部变量可用于声明函数的输入参数或中间变量。可由 Var(name_hint, type_annotation=None) 创建。其中

  • name_hint 指定了局部变量的名字。

  • type_annotation 用于局部变量的类型注解。

from tvm import relay

x = relay.Var("x") # 创建局部变量 x
x
Var(x)

可以查看文本表示:

print(x)
free_var %x;
%x

如果想要声明给定 dtype 和形状已知的张量的类型,可以指定 type_annotation 参数创建:

type_annotation = relay.TensorType(shape=(5, 5),
                                   dtype="float32")
x = relay.Var("x", type_annotation)
x
Var(x, ty=TensorType([5, 5], float32))

查看文本格式:

print(x)
free_var %x: Tensor[(5, 5), float32];
%x

也可以使用便捷函数:tvm.relay.expr.var(name_hint, type_annotation=None, shape=None, dtype="float32")

创建变量的四种等效方式:

x = relay.Var("x", relay.TensorType([1, 2]))
x = relay.var("x", relay.TensorType([1, 2]))
x = relay.var("x", shape=[1, 2])
x = relay.var("x", shape=[1, 2], dtype="float32")

同样,下面两列也是等效的:

y = relay.var("x", "float32")
y = relay.var("x", shape=(), dtype="float32")