美文网首页神经网络
pytorch模型参数的初始化、访问

pytorch模型参数的初始化、访问

作者: Co酱_秋乏术 | 来源:发表于2022-11-20 17:12 被阅读0次

    模型参数的访问

        通过Module类的parameters()或者named_parameters()方法来访问所有参数(以迭代器的形式返回),后者除了返回参数Tensor外还会返回其名字。

        对于使用Sequential类构造的神经网络,我们可以通过方括号[]来访问网络的任一层。

        param的类型为torch.nn.parameter.Parameter,其实这是Tensor的子类,和Tensor不同的是如果一个Tensor是Parameter,那么它会自动被添加到模型的参数列表里

    初始化模型参数

    PyTorch中nn.Module的模块参数都采取了较为合理的初始化策略,PyTorch的init模块里提供了多种预设的初始化方法。也可以自定义初始化方法。

    PyTorch中参数的默认初始化在各个层的 reset_parameters() 方法中。例如:nn.Linear 和 nn.Conv2D,都是在 [-limit, limit] 之间的均匀分布(Uniform distribution),其中 limit 是 1. / sqrt(fan_in) ,fan_in 是指参数张量(tensor)的输入单元的数量。

    Xavier Initialization

    Xavier初始化的基本思想是保持输入和输出的方差一致,这样就避免了所有输出值都趋向于0。这是通用的方法,适用于任何激活函数。

    # 默认方法

    for m in model.modules():

        if isinstance(m, (nn.Conv2d, nn.Linear)):

            nn.init.xavier_uniform_(m.weight)

    也可以使用gain参数来自定义初始化的标准差来匹配特定的激活函数:

    for m in model.modules():

        if isinstance(m, (nn.Conv2d, nn.Linear)):

            nn.init.xavier_uniform_(m.weight(), gain=nn.init.calculate_gain('relu'))

    参考链接:https://www.pytorchtutorial.com/goto/http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf

    正交初始化(Orthogonal Initialization)

    在RNN中经常使用的参数初始化方法。主要用以解决深度网络下的梯度消失、梯度爆炸问题。

    for m in model.modules():

        if isinstance(m, (nn.Conv2d, nn.Linear)):

            nn.init.orthogonal(m.weight)


    Batchnorm Initialization

    在非线性激活函数之前,我们想让输出值有比较好的分布(例如高斯分布),以便于计算梯度和更新参数。

    Batch Normalization 将输出值强行做一次 Gaussian Normalization 和线性变换:

    for m in model:

        if isinstance(m, nn.BatchNorm2d):

            nn.init.constant(m.weight, 1)

            nn.init.constant(m.bias, 0)


    单层初始化

    conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3)

    nn.init.xavier_uniform(conv1.weight)

    nn.init.constant(conv1.bias, 0.1)

    各种初始化方法:

    import torch

    import torch.nn as nn

    w = torch.empty(2, 3)

    # 1. 均匀分布 - u(a,b)

    # torch.nn.init.uniform_(tensor, a=0, b=1)

    nn.init.uniform_(w)

    # tensor([[ 0.0578,  0.3402,  0.5034],

    #        [ 0.7865,  0.7280,  0.6269]])

    # 2. 正态分布 - N(mean, std)

    # torch.nn.init.normal_(tensor, mean=0, std=1)

    nn.init.normal_(w)

    # tensor([[ 0.3326,  0.0171, -0.6745],

    #        [ 0.1669,  0.1747,  0.0472]])

    # 3. 常数 - 固定值 val

    # torch.nn.init.constant_(tensor, val)

    nn.init.constant_(w, 0.3)

    # tensor([[ 0.3000,  0.3000,  0.3000],

    #        [ 0.3000,  0.3000,  0.3000]])

    # 4. 对角线为 1,其它为 0

    # torch.nn.init.eye_(tensor)

    nn.init.eye_(w)

    # tensor([[ 1.,  0.,  0.],

    #        [ 0.,  1.,  0.]])

    # 5. Dirac delta 函数初始化,仅适用于 {3, 4, 5}-维的 torch.Tensor

    # torch.nn.init.dirac_(tensor)

    w1 = torch.empty(3, 16, 5, 5)

    nn.init.dirac_(w1)

    # 6. xavier_uniform 初始化

    # torch.nn.init.xavier_uniform_(tensor, gain=1)

    # From - Understanding the difficulty of training deep feedforward neural networks - Bengio 2010

    nn.init.xavier_uniform_(w, gain=nn.init.calculate_gain('relu'))

    # tensor([[ 1.3374,  0.7932, -0.0891],

    #        [-1.3363, -0.0206, -0.9346]])

    # 7. xavier_normal 初始化

    # torch.nn.init.xavier_normal_(tensor, gain=1)

    nn.init.xavier_normal_(w)

    # tensor([[-0.1777,  0.6740,  0.1139],

    #        [ 0.3018, -0.2443,  0.6824]])

    # 8. kaiming_uniform 初始化

    # From - Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification - HeKaiming 2015

    # torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

    nn.init.kaiming_uniform_(w, mode='fan_in', nonlinearity='relu')

    # tensor([[ 0.6426, -0.9582, -1.1783],

    #        [-0.0515, -0.4975,  1.3237]])

    # 9. kaiming_normal 初始化

    # torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

    nn.init.kaiming_normal_(w, mode='fan_out', nonlinearity='relu')

    # tensor([[ 0.2530, -0.4382,  1.5995],

    #        [ 0.0544,  1.6392, -2.0752]])

    # 10. 正交矩阵 - (semi)orthogonal matrix

    # From - Exact solutions to the nonlinear dynamics of learning in deep linear neural networks - Saxe 2013

    # torch.nn.init.orthogonal_(tensor, gain=1)

    nn.init.orthogonal_(w)

    # tensor([[ 0.5786, -0.5642, -0.5890],

    #        [-0.7517, -0.0886, -0.6536]])

    # 11. 稀疏矩阵 - sparse matrix

    # 非零元素采用正态分布 N(0, 0.01) 初始化.

    # From - Deep learning via Hessian-free optimization - Martens 2010

    # torch.nn.init.sparse_(tensor, sparsity, std=0.01)

    nn.init.sparse_(w, sparsity=0.1)

    # tensor(1.00000e-03 *

    #        [[-0.3382,  1.9501, -1.7761],

    #        [ 0.0000,  0.0000,  0.0000]])

    相关文章

      网友评论

        本文标题:pytorch模型参数的初始化、访问

        本文链接:https://www.haomeiwen.com/subject/gpywxdtx.html