Variable

class paddle.static. Variable ( block, type=<VarType.LOD_TENSOR: 7>, name=None, shape=None, dtype=None, lod_level=None, capacity=None, persistable=None, error_clip=None, stop_gradient=False, is_data=False, need_check_feed=False, belong_to_optimizer=False, **kwargs ) [源代码]

注解

  1. 请不要直接调用 Variable 的构造函数,因为这会造成严重的错误发生!

  2. 在静态图形模式下:请使用 Block.create_var 创建一个静态的 Variable,该静态的 Variable 在使用 Executor 执行前是没有实际数据的。

在 Paddle 静态图模式中,OP 的每个输入和输出都是 Variable。多数情况下,Variable 用于保存不同种类的数据或训练标签。

Variable 总是属于某一个 Block。所有 Variable 都有其自己的 name,不同 Block 中的两个 Variable 可以具有相同的名称。如果使用的 不是 Dygraph 模式,那么同一个 Block 中的两个或更多 Variable 拥有相同 name 将意味着他们会共享相同的内容。通常我们使用这种方式来实现 参数共享

Variable 有很多种。它们每种都有自己的属性和用法。请参考 framework.proto 以获得详细信息。Variable 的大多数成员变量可以设置为 None。它的意思是它不可用或稍后指定。

如果您希望创建一个 Variable 那么可以参考如下示例:

代码示例

import paddle

paddle.enable_static()

cur_program = paddle.static.Program()
cur_block = cur_program.current_block()
new_variable = cur_block.create_var(name="X",
                                    shape=[-1, 23, 48],
                                    dtype='float32')

方法

to_string(throw_on_error, with_details=True)

获取该 Variable 的静态描述字符串。

参数:

  • throw_on_error (bool) - 是否在没有设置必需字段时抛出异常。

  • with_details (bool) - 值为 true 时,打印更多关于 Variable 的信息,如 error_clip , stop_gradient 等。

返回

用于静态描述该 Variable 的字符串。

代码示例
import paddle

paddle.enable_static()

cur_program = paddle.static.Program()
cur_block = cur_program.current_block()
new_variable = cur_block.create_var(name="X",
                                    shape=[-1, 23, 48],
                                    dtype='float32')

print(new_variable.to_string(True))
print("\n=============with detail===============\n")
print(new_variable.to_string(True, True))

clone(self)

返回一个新的 Variable,其复制原 Variable 并且新的 Variable 也被保留在计算图中,即复制的新 Variable 也参与反向计算。调用 out = variable.clone()out = assign(variable) 效果一样。

返回

复制的新 Variable

代码示例
import paddle

paddle.enable_static()

# create a static Variable
x = paddle.static.data(name='x', shape=[3, 2, 1])

# create a cloned Variable
y = x.clone()

detach(self)

返回一个新的 Variable,并从当前计算图分离。

返回

与当前计算图分离的 Variable

代码示例

import paddle

paddle.enable_static()

# create a static Variable
x = paddle.static.data(name='x', shape=[3, 2, 1])

# create a detached Variable
y = x.detach()

astype(self, dtype)

将该 Variable 中的数据转换成目标 Dtype

参数:

  • self ( Variable ) - 当前 Variable,用户不需要传入。

  • dtype (int | float | float64) - 希望转换成的 Dtype

返回 一个全新的转换了 DtypeVariable

代码示例
import paddle

paddle.enable_static()

startup_prog = paddle.static.Program()
main_prog = paddle.static.Program()
with paddle.static.program_guard(startup_prog, main_prog):
    original_variable = paddle.static.data(name = "new_variable", shape=[2,2], dtype='float32')
    new_variable = original_variable.astype('int64')
    print("new var's dtype is: {}".format(new_variable.dtype))

get_value(scope=None)

获取 Variable 的值。

参数

  • scope ( Scope,可选 ) - 从指定的 scope 中获取 Variable 的值。如果 scopeNone,通过 paddle.static.global_scope() 获取全局/默认作用域实例,并从中获取 Variable 的值;否则,从指定的 scope 中获取 Variable 的值。

返回

Tensor, Variable 的值。

代码示例

import paddle
import paddle.static as static
import numpy as np

paddle.enable_static()

x = static.data(name="x", shape=[10, 10], dtype='float32')

y = static.nn.fc(x, 10, name='fc')
place = paddle.CPUPlace()
exe = static.Executor(place)
prog = paddle.static.default_main_program()
exe.run(static.default_startup_program())
inputs = np.ones((10, 10), dtype='float32')
exe.run(prog, feed={'x': inputs}, fetch_list=[y, ])
path = 'temp/tensor_'
for var in prog.list_vars():
    if var.persistable:
        t = var.get_value()
        paddle.save(t, path+var.name+'.pdtensor')

for var in prog.list_vars():
    if var.persistable:
        t_load = paddle.load(path+var.name+'.pdtensor')
        var.set_value(t_load)

set_value(value, scope=None)

value 设置为 Variable 的值。

参数

  • value ( Tensor|ndarray ) - Variable 的值。

  • scope ( Scope,可选 ) - 将 Variable 的值设置到指定的 scope 中。如果 scopeNone,通过 paddle.static.global_scope() 获取全局/默认作用域实例,并将 Variable 的值设置到这个用域实例中;否则,将 Variable 的值设置到指定的 scope 中。

返回

无。

代码示例

import paddle
import paddle.static as static
import numpy as np

paddle.enable_static()

x = static.data(name="x", shape=[10, 10], dtype='float32')

y = static.nn.fc(x, 10, name='fc')
place = paddle.CPUPlace()
exe = static.Executor(place)
prog = paddle.static.default_main_program()
exe.run(static.default_startup_program())
inputs = np.ones((10, 10), dtype='float32')
exe.run(prog, feed={'x': inputs}, fetch_list=[y, ])
path = 'temp/tensor_'
for var in prog.list_vars():
    if var.persistable:
        t = var.get_value()
        paddle.save(t, path+var.name+'.pdtensor')

for var in prog.list_vars():
    if var.persistable:
        t_load = paddle.load(path+var.name+'.pdtensor')
        var.set_value(t_load)

size(self)

返回该 Variable 中的数据元素数量,结果是一个 shape 为[1]的 int64 的 Variable

返回

Variable:单元元素数量。

代码示例

import paddle

paddle.enable_static()

# create a static Variable
x = paddle.static.data(name='x', shape=[3, 2, 1])

# get the number of elements of the Variable
y = x.size()

ndimension(self)

返回该 Variable 的维度,也称作 rank。

返回

Variable 的维度。

代码示例
import paddle

paddle.enable_static()

x = paddle.static.data(name="x", shape=[10, 10], dtype='float32')
print("Variable's number of dimension: ", x.ndimension())
# Variable's number of dimension: 2

dim(self)

返回该 Variable 的维度,也称作 rank。

返回 Variable 的维度。

代码示例
import paddle

paddle.enable_static()

x = paddle.static.data(name="x", shape=[10, 10], dtype='float32')
print("Variable's number of dim: ", x.dim())
# Variable's number of dim: 2

属性

persistable

  1. 该属性我们即将废弃,此介绍仅为了帮助用户理解概念,1.6 版本后用户可以不再关心该属性

  2. 该属性除参数以外默认值为 False,而参数的该属性默认值为 True

Variable 是否是长期存活的 Variable

name

静态图模式下,同一个 Block 中的两个或更多 Variable 拥有相同 name 将意味着他们会共享相同的内容。通常我们使用这种方式来实现参数共享。

Variable 的名字(str)。

shape

该属性是只读属性。

Variable 在每个维度上的元素数量。

dtype

该属性是只读属性。

Variable 的实际数据类型。

lod_level

该属性是只读属性。

VariableLoD 信息,关于 LoD 可以参考 api_fluid_LoDTensor 相关内容。

type

该属性是只读属性。

Variable 的内存模型,例如是:api_fluid_LoDTensor,或者 SelectedRows。

ndim

该属性是只读属性。

Variable 的维度,也称作 rank。