pytorch: 网络权重初始化

构建完网络后, 往往需要初始化权重;其实也可以不需手动初始化,在声明网络时,pytorch有默认的初始化方式,如:

import torch

x = torch.Tensor(2,2)
print(x)

输出为:
tensor([[-2.0363e+09, 4.5914e-41],
[-2.8577e+17, 5.6612e-43]])

上面定义了一个tensor,但没初始化,而pytorch会自动对其进行初始化,只是初始化的参数无规律且相差甚远。如果对于一个没有预训练的网络,有可能难以使网路收敛。因此,在声明网络后,有必要手动对网络进行权重初始化。而一般采用正态分布的方式初始化权重。

在pytorch中,常用的有两种权重初始化的方法:

方法一:

先定义网络,然后加载权重。

import torch,nn as nn

class NET(nn.Module):  # 声明网络
'''
 定义网络层
'''
net = NET()  # 定义网络

def weight_init(m):  #初始化权重
    if isinstance(m, nn.Conv3d):
        n = m.kernel_size[0] * m.kernel_size[1] * m.kernel_size[2] * m.out_channels
        m.weight.data.normal_(0, math.sqrt(2.0 / n))
        m.bias.data.zero_()
    elif isinstance(m, nn.BatchNorm3d):
        m.weight.data.fill_(1)
        m.bias.data.zero_()
    elif isinstance(m, nn.Linear):
        m.weight.data.normal_(0, 0.02)
        m.bias.data.zero_()
        
net.apply(weight_init)  # 加载权重

方法二:

再声明网络时初始化并加载权重

import torch,nn as nn

class NET(nn.Modele):
	def __init__(self):
		super(NET, self).__init__()
		'''
		定义网络层
		'''

		# 初始化权重
        for m in self.modules():
            if isinstance(m, nn.Conv3d):
                nn.init.kaiming_normal_(m.weight.data)
            elif isinstance(m, nn.BatchNorm3d):
                m.weight.data.fill_(1)
                m.bias.data.zero_()
            elif isinstance(m, nn.Linear):
                m.weight.data.normal_(0, 0.02)
                m.bias.data.zero_()
  • 25
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值