比较与torch.nn.parameter.Parameter的功能差异

torch.nn.parameter.Parameter

torch.nn.parameter.Parameter(data=None, requires_grad=True)

更多内容详见torch.nn.parameter.Parameter

mindspore.Parameter

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

更多内容详见mindspore.Parameter

差异对比

PyTorch:PyTorch中一种特殊的Tensor,是Tensor的一个子类,与普通Tensor不同,Parameter会被自动的注册为模型参数,从而被优化器更新。

MindSpore:MindSpore的Parameter也是一种特殊的Tensor,与PyTorch不同,MindSpore的Parameter与Tensor均继承与C接口的Tensor_。

其次,MindSpore的 requires_grad 参数与PyTorch也有差异,该参数在PyTorch中为一个后端级别的参数,该参数设为 False 时,代表不需要对该张量计算梯度,构建计算图时不会包含该张量,也不会记录每个操作的梯度信息,在推理阶段等场景可以提高计算效率;而MindSpore的该参数则为一个前端级别的参数,参数设为 False 时,MindSpore的自动微分机制在后端依旧会对该张量进行梯度计算,只会在前端侧对该参数以属性的形式进行展示并使用,例如,MindSpore中的 trainable_params 方法则会屏蔽掉Parameter中 requires_gradFalse 的属性。

此外,MindSpore的Parameter相比PyTorch多了一个name参数,该参数会作为一个属性与Parameter进行强绑定,在后端执行图编译时或者执行ckpt保存时均会使用此参数,该参数可以手动指定,若不指定,则会触发MindSpore的Parameter自动命名机制对Parameter进行命名。

最后,MindSpore的Parameter直接打印时无法查看到里面实际包含的值,需要使用Parameter.asnumpy()方法来查看实际的值。

分类

子类

PyTorch

MindSpore

差异

参数

参数1

data

default_input

一致

参数2

-

name

差异见上文

参数3

requires_grad

requires_grad

差异见上文

参数4

layerwise_parallel

MindSpore并行相关特有参数,torch无此参数

参数5

parallel_optimizer

MindSpore并行相关特有参数,torch无此参数

代码示例

import numpy as np
from mindspore import Parameter, Tensor

a = Parameter(Tensor(np.ones((1, 2), dtype=np.float32)))
print(a)
# Parameter (name=Parameter, shape=(1, 2), dtype=Float32, requires_grad=True)
print(a.value())
# [[1. 1.]]

import torch

b = torch.nn.parameter.Parameter(torch.tensor(np.ones((1, 2), dtype=np.float32)))
print(b.data)
# tensor([[1., 1.]])