从零学习PyTorch 第6课 权值初始化

课程目录(在更新,喜欢加个关注点个赞呗):
从零学习pytorch 第1课 搭建一个超简单的网络
从零学习pytorch 第1.5课 训练集、验证集和测试集的作用
从零学习pytorch 第2课 Dataset类
从零学习pytorch 第3课 DataLoader类运行过程
从零学习pytorch 第4课 初见transforms
从零学习pytorch 第5课 PyTorch模型搭建三要素
从零学习pytorch 第5.5课 Resnet34为例学习nn.Sequential和模型定义
从零学习PyTorch 第6课 权值初始化
从零学习PyTorch 第7课 模型Finetune与预训练模型
从零学习PyTorch 第8课 PyTorch优化器基类Optimier
上一节介绍了模型定义的方法,没有忘记吧?三个要素。定义完成之后,通常我们还需要对权值进行初始化,才能开始训练。
权值初始化的重要性:初始化的方法会直接影响到模型的收敛与否。

权值初始化的过程

简单地说就两步:

  1. 先设定什么层用什么初始方法,初始化的方法会在torch.nn.init中;
  2. 实例化一个模型之后,执行该函数,即可完成初始化

话不多说,看一个案例:

# 定义权值初始化
def initialize_weights(self):
	for m in self.modules():
		if isinstance(m,nn.Conv2d):
			torch.nn.init.xavier_normal_(m.weight.data)
			if m.bias is not None:
				m.bias.data.zero_()
		elif isinstance(m,nn.BatchNorm2d):
			m.weight.data.fill_(1)
			m.bias.data.zero_()
		elif isinstance(m,nn.Linear):
			torch.nn.init.normal_(m.weight.data,0,0.01)
			# m.weight.data.normal_(0,0.01)
			m.bias.data.zero_()

这段代码的基本流程就是,先从self.modules()中遍历每一层,然后判断更曾属于什么类型,是否是Conv2d,是否是BatchNorm2d,是否是Linear的,然后根据不同类型的曾,设定不同的权值初始化方法,例如Xavier,kaiming,normal_等等。kaiming也是MSRA初始化,是何恺明大佬在微软亚洲研究院的时候,因此得名。

下面我来看具体内容:
self.modules()的源码:

def modules(self):
	for name,module in self.named_modules():
	yield module

功能就是:能依次返回模型中的各层

torch.nn.init.xavier_normal(m.weight.data)
if m.bias is not None:
	m.bias.data.zero_()
上面代码表示用xavier_normal方法对该层的weight初始化,并判断是否存在偏执bias,若存在,将bias初始化为0

第6.5课将会详细介绍torch.nn.init中的常用的初始化方法十余种。

发布了78 篇原创文章 · 获赞 14 · 访问量 9732

猜你喜欢

转载自blog.csdn.net/qq_34107425/article/details/104103970