當前位置 主頁 > 網站技術 > 代碼類 > 最大化 縮小

    Pytorch 實現權重初始化

    欄目:代碼類 時間:2019-12-31 18:10

    在TensorFlow中,權重的初始化主要是在聲明張量的時候進行的。 而PyTorch則提供了另一種方法:首先應該聲明張量,然后修改張量的權重。通過調用torch.nn.init包中的多種方法可以將權重初始化為直接訪問張量的屬性。

    1、不初始化的效果

    在Pytorch中,定義一個tensor,不進行初始化,打印看看結果:

    w = torch.Tensor(3,4)
    print (w)

    可以看到這時候的初始化的數值都是隨機的,而且特別大,這對網絡的訓練必定不好,最后導致精度提不上,甚至損失無法收斂。

    2、初始化的效果

    PyTorch提供了多種參數初始化函數:

    torch.nn.init.constant(tensor, val)
    torch.nn.init.normal(tensor, mean=0, std=1)
    torch.nn.init.xavier_uniform(tensor, gain=1)

    等等。詳細請參考:http://pytorch.org/docs/nn.html#torch-nn-init

    注意上面的初始化函數的參數tensor,雖然寫的是tensor,但是也可以是Variable類型的。而神經網絡的參數類型Parameter是Variable類的子類,所以初始化函數可以直接作用于神經網絡參數。實際上,我們初始化也是直接去初始化神經網絡的參數。

    讓我們試試效果:

    w = torch.Tensor(3,4)
    torch.nn.init.normal_(w)
    print (w)

    3、初始化神經網絡的參數

    對神經網絡的初始化往往放在模型的__init__()函數中,如下所示:

    class Net(nn.Module):

    def __init__(self, block, layers, num_classes=1000):
      self.inplanes = 64
      super(Net, self).__init__()
      ***
      *** #定義自己的網絡層
      ***
    
      for m in self.modules():
        if isinstance(m, nn.Conv2d):
          n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
          m.weight.data.normal_(0, math.sqrt(2. / n))
        elif isinstance(m, nn.BatchNorm2d):
          m.weight.data.fill_(1)
          m.bias.data.zero_()
    
    ***
    *** #定義后續的函數
    ***
    

    也可以采取另一種方式:

    定義一個權重初始化函數,如下:

    def weights_init(m):
      classname = m.__class__.__name__
      if classname.find('Conv2d') != -1:
        init.xavier_normal_(m.weight.data)
        init.constant_(m.bias.data, 0.0)
      elif classname.find('Linear') != -1:
        init.xavier_normal_(m.weight.data)
        init.constant_(m.bias.data, 0.0)

    在模型聲明時,調用初始化函數,初始化神經網絡參數:

    model = Net(*****)
    model.apply(weights_init)

    以上這篇Pytorch 實現權重初始化就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持IIS7站長之家。

    下一篇:沒有了
青海十一选五开奖数据 网赚游戏平台 捕鱼微信群 股票涨跌的最大规律 平特肖怎么玩 山水云南麻将昆明麻将 重庆幸运农场今天开奖号 湖北11选5计划 澳洲幸运8是正规彩票吗 金控配资 广西快乐十分app