1 系统环境
硬件环境(Ascend/GPU/CPU): Ascend/GPU/CPU
MindSpore版本: mindspore=2.0.0
执行模式(PyNative/ Graph):不限
Python版本: Python=3.7
操作系统平台: 不限
2 报错信息
2.1 问题描述
将pytorch转换成mindspore代码的过程中报错AttributeError: ‘Parameter’ object has no attribute ‘uniform_’,按照官方文档,将其中的self.parameters()改成了mindspore中nn.Cell模块里面的get_parameters()方法,返回的也是迭代器。
2.2 脚本信息
def init_parameters(self):
init_range = 0.1
for param in self.parameters():
param.data.uniform_(-init_range, init_range)
3 根因分析
Parameter是Tensor的子类。 mindspore中的操作会创建一个新的Tensor, 不会修改Tensor原本的值。要想改变 具体看文档 例如:
import mindspore as ms
from mindspore import mint, nn, ops
a = mint.ones((2, 2))
b = a.mean()
print(a)
print(b)
要想改变Parameter的内容必须用赋值
4 解决方案
方案一:
import mindspore as ms
from mindspore import mint, nn, ops
# a = mint.ones((2, 2))
# b = a.mean()
# print(a)
# print(b)
class Net(nn.Cell):
def __init__(self):
super().__init__()
self.dense = nn.Dense(2, 3)
def init_parameters(self):
init_range = ms.Tensor(0.1)
param: ms.Parameter
for param in self.get_parameters():
param = ops.uniform(param.shape, -init_range, init_range)
net = Net()
net.init_parameters()
print(net.dense.weight.asnumpy())
方案二:在mindspore=2.4版本中已提供如对标torch.uniform_接口,接口为:mindspore.ops.uniform,请参考使用。