Relay 变量#
Relay 明显地区分了 AST 和文本格式之间的局部变量(Var
使用 %
标识)和全局变量(GlobalVar
使用 @
标识)。
全局标识符总是引用在全局可见环境中包含的全局可见定义,称为 模块 (module)。全局标识符必须是唯一的。
局部标识符总是引用函数参数或被
let
(Let
) 表达式绑定的变量,并将作用于它出现的函数或被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")