使用MindSpore的initializer生成的Tensor行为不符合预期

1 系统环境

硬件环境(Ascend/GPU/CPU): Ascend/GPU/CPU
MindSpore版本: mindspore=2.3.0rc1
执行模式(PyNative/ Graph):不限
Python版本: Python=3.9
操作系统平台: 不限

2 报错信息

2.1 问题描述

y没有成功复制x而是变成了0。如果把x换成普通的Tensor就没问题。

2.2 脚本信息

from mindspore.common.initializer import initializer
n, m = 5, 3
x = initializer(init='normal', shape=(n, m))
y = x.copy()
print(x)
print(y)

输出如下:

[[-9.8994775e-03 -2.8827513e-05 -1.1877520e-02]
[-2.8584851e-03 -1.4535164e-02 -1.7329855e-02]
[-1.1603085e-03 2.8330029e-04 -8.1528882e-03]
[-1.4099754e-02 -1.1020763e-02 3.4321868e-03]
[ 1.7921604e-02 1.4062168e-02 -4.5925970e-03]]
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]

3 根因分析

查看API文档
mindspore.common.initializer
有一个说明:
说明
Initializer本意是用于在并行模式中延迟Tensor的数据的初始化,而非初始化Tensor。如果必须使用Initializer来初始化Tensor,大多情况下需要在初始化之后使用 mindspore.Tensor.init_data() 。

4 解决方案

调用初始化接口 Tensor.init_data()
mindspore.Tensor.init_data
代码如下:

from mindspore.common.initializer import initializer  
n, m = 5, 3  
x = initializer(init='normal', shape=(n, m))  
x.init_data()  
y = x.copy()  
print(x)  
print(y)

结果如下:

[[ 0.00939345  0.00237236 -0.01005815]  
 [-0.00203028  0.00010801  0.00289919]  
 [ 0.00403657 -0.00706848  0.00969519]  
 [ 0.01585527 -0.01843719 -0.01486818]  
 [ 0.00146939 -0.00700254 -0.00083044]]  
[[ 0.00939345  0.00237236 -0.01005815]  
 [-0.00203028  0.00010801  0.00289919]  
 [ 0.00403657 -0.00706848  0.00969519]  
 [ 0.01585527 -0.01843719 -0.01486818]  
 [ 0.00146939 -0.00700254 -0.00083044]]