文档反馈

问题文档片段

问题文档片段包含公式时,显示为空格。

提交类型
issue

有点复杂...

找人问问吧。

请选择提交类型

问题类型
规范和低错类

- 规范和低错类:

- 错别字或拼写错误,标点符号使用错误、公式错误或显示异常。

- 链接错误、空单元格、格式错误。

- 英文中包含中文字符。

- 界面和描述不一致,但不影响操作。

- 表述不通顺,但不影响理解。

- 版本号不匹配:如软件包名称、界面版本号。

易用性

- 易用性:

- 关键步骤错误或缺失,无法指导用户完成任务。

- 缺少主要功能描述、关键词解释、必要前提条件、注意事项等。

- 描述内容存在歧义指代不明、上下文矛盾。

- 逻辑不清晰,该分类、分项、分步骤的没有给出。

正确性

- 正确性:

- 技术原理、功能、支持平台、参数类型、异常报错等描述和软件实现不一致。

- 原理图、架构图等存在错误。

- 命令、命令参数等错误。

- 代码片段错误。

- 命令无法完成对应功能。

- 界面错误,无法指导操作。

- 代码样例运行报错、运行结果不符。

风险提示

- 风险提示:

- 对重要数据或系统存在风险的操作,缺少安全提示。

内容合规

- 内容合规:

- 违反法律法规,涉及政治、领土主权等敏感词。

- 内容侵权。

请选择问题类型

问题描述

点击输入详细问题描述,以帮助我们快速定位问题。

网络参数的更新

image0image1image2

概述

Parameter是变量张量,代表在训练网络时,需要被更新的参数。本章主要介绍了Parameter的初始化以及属性和方法的使用,同时介绍了ParameterTuple

初始化

mindspore.Parameter(default_input, name, requires_grad=True, layerwise_parallel=False)

初始化一个Parameter对象,传入的数据支持TensorInitializerintfloat四种类型。

Initializer是初始化器,可调用initializer接口生成Initializer对象。

当使用init去初始化Tensor时,Tensor仅保存张量的形状和类型,而不保存实际数据,所以不会占用任何内存,可调用init_data接口将Parameter里保存的Tensor转化为数据。

可为每个Parameter指定一个名称,便于后续操作和更新。如果在Cell里初始化一个Parameter作为Cell的属性时,建议使用默认值None,否则可能会出现Parameter的name与预期的不一致的情况。

当参数需要被更新时,需要将requires_grad设置为True

layerwise_parallel(混合并行)配置为True时,参数广播和参数梯度聚合时会过滤掉该参数。

有关分布式并行的相关配置,可以参考文档:https://www.mindspore.cn/docs/programming_guide/zh-CN/r1.3/auto_parallel.html

下例通过三种不同的数据类型构造了Parameter,三个Parameter都需要更新,都不采用layerwise并行。如下:

[1]:
import numpy as np
from mindspore import Tensor, Parameter
from mindspore import dtype as mstype
from mindspore.common.initializer import initializer

x = Parameter(default_input=Tensor(np.arange(2*3).reshape((2, 3))), name="x")
y = Parameter(default_input=initializer('ones', [1, 2, 3], mstype.float32), name='y')
z = Parameter(default_input=2.0, name='z')

print(x, "\n\n", y, "\n\n", z)
Parameter (name=x, shape=(2, 3), dtype=Int64, requires_grad=True)

 Parameter (name=y, shape=(1, 2, 3), dtype=Float32, requires_grad=True)

 Parameter (name=z, shape=(), dtype=Float32, requires_grad=True)

属性

  • inited_param:返回保存了实际数据的Parameter

  • name:实例化Parameter时,为其指定的名字。

  • sliced:用在自动并行场景下,表示Parameter里保存的数据是否是分片数据。

    如果是,就不再对其进行切分,如果不是,需要根据网络并行策略确认是否对其进行切分。

  • is_initParameter的初始化状态。在GE后端,Parameter需要一个init graph来从主机同步数据到设备侧,该标志表示数据是否已同步到设备。 此标志仅在GE后端起作用,其他后端将被设置为False。

  • layerwise_parallelParameter是否支持layerwise并行。如果支持,参数就不会进行广播和梯度聚合,反之则需要。

  • requires_grad:是否需要计算参数梯度。如果参数需要被训练,则需要计算参数梯度,否则不需要。

  • dataParameter本身。

下例通过Tensor初始化一个Parameter,获取了Parameter的相关属性。如下:

[2]:
import numpy as np

from mindspore import Tensor, Parameter

x = Parameter(default_input=Tensor(np.arange(2*3).reshape((2, 3))), name="x")

print("name: ", x.name, "\n",
      "sliced: ", x.sliced, "\n",
      "is_init: ", x.is_init, "\n",
      "inited_param: ", x.inited_param, "\n",
      "requires_grad: ", x.requires_grad, "\n",
      "layerwise_parallel: ", x.layerwise_parallel, "\n",
      "data: ", x.data)
name:  x
 sliced:  False
 is_init:  False
 inited_param:  None
 requires_grad:  True
 layerwise_parallel:  False
 data:  Parameter (name=x, shape=(2, 3), dtype=Int64, requires_grad=True)

方法

  • init_data:在网络采用半自动或者全自动并行策略的场景下, 当初始化Parameter传入的数据是Initializer时,可调用该接口将Parameter保存的数据转换为Tensor

  • set_data:设置Parameter保存的数据,支持传入TensorInitializerintfloat进行设置, 将方法的入参slice_shape设置为True时,可改变Parameter的shape,反之,设置的数据shape必须与Parameter原来的shape保持一致。

  • set_param_ps:控制训练参数是否通过Parameter Server进行训练。

  • clone:克隆Parameter,克隆完成后可以给新Parameter指定新的名字。

下例通过Initializer来初始化Tensor,调用了Parameter的相关方法。如下:

[3]:
import numpy as np
from mindspore import Tensor, Parameter
from mindspore import dtype as mstype
from mindspore.common.initializer import initializer

x = Parameter(default_input=initializer('ones', [1, 2, 3], mstype.float32))

print(x)
x_clone = x.clone()
x_clone.name = "x_clone"
print(x_clone)

print(x.init_data())
print(x.set_data(data=Tensor(np.arange(2*3).reshape((1, 2, 3)))))
Parameter (name=Parameter, shape=(1, 2, 3), dtype=Float32, requires_grad=True)
Parameter (name=x_clone, shape=(1, 2, 3), dtype=Float32, requires_grad=True)
Parameter (name=Parameter, shape=(1, 2, 3), dtype=Float32, requires_grad=True)
Parameter (name=Parameter, shape=(1, 2, 3), dtype=Float32, requires_grad=True)

ParameterTuple

继承于tuple,用于保存多个Parameter,通过__new__(cls, iterable)传入一个存放Parameter的迭代器进行构造,提供clone接口进行克隆。

下例构造了一个ParameterTuple对象,并进行了克隆。如下:

[4]:
import numpy as np
from mindspore import Tensor, Parameter, ParameterTuple
from mindspore import dtype as mstype
from mindspore.common.initializer import initializer

x = Parameter(default_input=Tensor(np.arange(2*3).reshape((2, 3))), name="x")
y = Parameter(default_input=initializer('ones', [1, 2, 3], mstype.float32), name='y')
z = Parameter(default_input=2.0, name='z')
params = ParameterTuple((x, y, z))
params_copy = params.clone("params_copy")
print(params, "\n")
print(params_copy)
(Parameter (name=x, shape=(2, 3), dtype=Int64, requires_grad=True), Parameter (name=y, shape=(1, 2, 3), dtype=Float32, requires_grad=True), Parameter (name=z, shape=(), dtype=Float32, requires_grad=True))

(Parameter (name=params_copy.x, shape=(2, 3), dtype=Int64, requires_grad=True), Parameter (name=params_copy.y, shape=(1, 2, 3), dtype=Float32, requires_grad=True), Parameter (name=params_copy.z, shape=(), dtype=Float32, requires_grad=True))