使用MindSpore报错AttributeError: 'Parameter' object has no attribute 'uniform_'

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,请参考使用。