PyTorch模型权重初始化全攻略

参考博客:

pytorch系列10 — 如何自定义参数初始化方式 ,apply()

PyTorch中model.modules(), model.named_modules(), model.children(), model.named_children()的详解

pytroch——网络参数初始化

torch中manual_seed的作用

Pytroch常见的模型参数初始化方法有apply和model.modules()。Pytroch会自动给模型进行初始化,当需要自己定义模型初始化时才需要这两个方法。

一、 使用apply函数进行初始化

举一个包含自己命名层名称和利用nn.Sequential实现的网络。

from torch import nn
import torch

class Net(nn.Module):
       
    def __init__(self):
        super().__init__()
        self.layer1 = nn.Linear(2, 4)
        self.relu1 = nn.ReLU()
        self.layer2 = nn.Sequential(
            nn.Linear(4, 2),
            nn.ReLU(),
            nn.Linear(2, 2),
        )
        
    def forward(x):
        output = self.layer2(self.relu1(self.layer1(x)))
        return output
    
a = Net()

首先简单介绍一下model.modules()和model.children()。

model.modules()迭代遍历模型的所有子层,所有子层即指nn.Module子类,下面输出一下model.modules()

for i in a.modules():
    print(i, '\n')
########输出结果
Net(
  (layer1): Linear(in_features=2, out_features=4, bias=True)
  (relu1): ReLU()
  (layer2): Sequential(
    (0): Linear(in_features=4, out_features=2, bias=True)
    (1): ReLU()
    (2): Linear(in_features=2, out_features=2, bias=True)
  )
) 

Linear(in_features=2, out_features=4, bias=True) 

ReLU() 

Sequential(
  (0): Linear(in_features=4, out_features=2, bias=True)
  (1): ReLU()
  (2): Linear(in_features=2, out_features=2, bias=True)
) 

Linear(in_features=4, out_features=2, bias=True) 

ReLU() 

Linear(in_features=2, out_features=2, bias=True) 

model.children()只会遍历模型的子层,这里即是layer1、relu1、layer2。

for i in a.children():
    print(i, '\n')
#########输出结果
Linear(in_features=2, out_features=4, bias=True) 

ReLU() 

Sequential(
  (0): Linear(in_features=4, out_features=2, bias=True)
  (1): ReLU()
  (2): Linear(in_features=2, out_features=2, bias=True)
) 

接下来看一下apply函数在官方文档上的解释
(官方文档)

将函数fn递归的运用在每个子模块上,这些子模块由self.children()返回.

接下来我们便可以利用apply进行参数初始化。

## 进行模型参数初始化
def init_weights1(model):
    if isinstance(model, nn.Linear):
        torch.nn.init.xavier_uniform(model.weight)
        model.bias.data.fill_(1)

a.apply(init_weights1)

二、 利用model.modules()实现参数初始化

for layer in a.modules():
        if isinstance(layer, nn.Linear):
            torch.nn.init.xavier_uniform(layer.weight)
            layer.bias.data.fill_(2)

这个和利用apply等价。

三、Pytroch常用的初始化函数

Pytroch常用的初始化函数

ps:手动设置种子一般可用于固定随机初始化的权重值,这样就可以让每次重新从头训练网络时的权重的初始值虽然是随机生成的但却是固定的。

这篇博客我参考了很多人的文章,主要想把几篇博客的内容进行总结方便我日后使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值