昇思——使用Initializer进行网络参数初始化

Initializer类是MindSpore中用于进行网络参数初始化的基本数据结构,其子类包含了几种不同类型的数据分布(Zero,One,XavierUniform,HeUniform,HeNormal,Constant,Uniform,Normal,TruncatedNormal)。下面针对使用initializer对参数进行初始化的方法进行详细介绍。

使用initializer进行参数初始化

  1. 方法签名:def initializer(init, shape=None, dtype=mstype.float32):

  2. 参数

    • 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。

  1. 返回值

    一个并集,返回的是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)
    

    运行结果:

    image.png

结果没有全部截下,后续都是相同的高维数组,不过有很多个。

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)

运行结果:

image.png

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)
posted @ 2021-12-27 16:34  MS小白  阅读(102)  评论(0)    收藏  举报