昇思——使用Initializer进行网络参数初始化
Initializer类是MindSpore中用于进行网络参数初始化的基本数据结构,其子类包含了几种不同类型的数据分布(Zero,One,XavierUniform,HeUniform,HeNormal,Constant,Uniform,Normal,TruncatedNormal)。下面针对使用initializer对参数进行初始化的方法进行详细介绍。
使用initializer进行参数初始化
-
方法签名:
def initializer(init, shape=None, dtype=mstype.float32):
-
参数
-
init (参数列表)([Tensor, str, Initializer, numbers.Number]) –
值初始化:
- str: init应该是从Initializer继承的类的别名,并将调用相应的类。init的值可以是“normal”、“1”或“0”等。
- Initializer: init应该是从初始化器继承来初始化张量的类。
- numbers.Number: 将调用该常量来初始化张量。
-
-
shape (Union**[tuple, list, int]) – 整数列表、整数元组或作为输出形状的整数。默认值:无。
-
dtype (
mindspore.dtype
) – 初始化张量中的数据类型。默认值:mindspore.float32。
-
返回值
一个并集,返回的是Tensor对象。
1. init参数为Tensor
代码示例如下:
import numpy as np from mindspore import Tensor from mindspore import dtype as mstype from mindspore import set_seed from mindspore.common.initializer import initializer import mindspore.ops as ops # 洒下随机种子 set_seed(1) # 输入数据是形状为[16, 3, 10, 32, 32]的全为1的高维数组 input_data = Tensor(np.ones([16, 3, 10, 32, 32]), dtype=mstype.float32) # weight_init为一个确定的张量对象,将使用它作为参数传给initializer的初始化函数,以得到具体的 # initializer对象 weight_init = Tensor(np.ones([32, 3, 4, 3, 3]), dtype=mstype.float32) weight = initializer(weight_init, shape=[32, 3, 4, 3, 3]) # conv3d为ops模块中定义好的三维卷积层,并通过它的初始化方法设置参数得到一个具体的三位卷积层 conv3d = ops.Conv3D(out_channel=32, kernel_size=(4, 3, 3)) # 这里的weight作为initializer对象,它初始化的是conv3d,即三维卷积层中的网络参数,读者可以利用三维 # 卷积的公式算出上述应该得到的结果,在与后续跑出来的结果图进行对比 output = conv3d(input_data, weight) print(output)
运行结果:
结果没有全部截下,后续都是相同的高维数组,不过有很多个。
2. init参数为str
代码如下所示:
import numpy as np
from mindspore import Tensor
from mindspore import dtype as mstype
from mindspore import set_seed
from mindspore.common.initializer import initializer
import mindspore.ops as ops
set_seed(1)
input_data = Tensor(np.ones([16, 3, 10, 32, 32]), dtype=mstype.float32)
# 直接引用字符串'Normal'作为参数传入到initializer的初始化方法中,实际上也就相当于利用这个字符
# 串创建了一个与张量等价的一个对象
weight = initializer('Normal', shape=[32, 3, 4, 3, 3], dtype=mstype.float32)
conv3d = ops.Conv3D(out_channel=32, kernel_size=(4, 3, 3))
output = conv3d(input_data, weight)
print(output)
运行结果:
3. init参数为initializer子类
代码样例如下所示:
import numpy as np
from mindspore import Tensor
from mindspore import dtype as mstype
from mindspore import set_seed
import mindspore.ops as ops
from mindspore.common.initializer import Normal, initializer
set_seed(1)
input_data = Tensor(np.ones([16, 3, 10, 32, 32]), dtype=mstype.float32)
weight = initializer(Normal(0.2), shape=[32, 3, 4, 3, 3], dtype=mstype.float32)
conv3d = ops.Conv3D(out_channel=32, kernel_size=(4, 3, 3))
# 该weight对象即为initializer子类对象
output = conv3d(input_data, weight)
print(output)