(●’◡’●)嘻嘻,整个五一都在摆烂,可后悔死我了。最近在对自己的神经网络模型做最后的优化,之前的网络跑出来效果已经达到了比较满意的结果,也就没有特别在意模块化编程以及对网络参数的调整。在开始跑实验之前,指导老师让我优化一下网络模型,就想着对网络的权重参数进行一个初始化的过程,之前看花树学习Pytorch时,也了解过权重初始化。

一、权重初始化的好处

PyTorch权重初始化的好处包括:

  1. 提高模型的收敛速度:合理的权重初始化可以使模型收敛得更快,因为模型在训练过程中需要从随机权重开始调整参数,如果初始权重太大或太小,可能会导致梯度消失爆炸,从而大大降低收敛速度。

  2. 避免陷入局部最优解:合理的权重初始化可以帮助模型避免陷入局部最优解,因为不同的初始权重可能会导致模型陷入不同的局部最优点,合理的初始化可以使模型更有可能找到全局最优点。

  3. 提高模型的泛化能力:合理的权重初始化可以提高模型的泛化能力,因为初始化会影响模型的初始状态,而泛化能力与模型的初始状态有关。

  4. 使模型更容易训练:合理的权重初始化可以使模型更容易训练,因为合适的初始化方法可以使模型的参数更好地分布在合理的范围内,从而更容易训练。

二、Pytorch中的初始化权重

PyTorch提供了许多不同的权重初始化方法,下面列举一些常用的方法:

  1. 随机初始化:使用torch.nn.init模块中的函数可以进行随机初始化。例如,torch.nn.init.normal_(tensor)可以初始化为均值为0,标准差为1的正态分布随机数。

  2. 预训练模型初始化:如果使用预训练模型,可以使用model.load_state_dict()方法加载预训练模型的权重。

  3. xavier初始化:xavier初始化是一种常用的权重初始化方法,它根据输入和输出神经元的数量来设置权重的标准差。可以使用torch.nn.init.xavier_normal_(tensor)或torch.nn.init.xavier_uniform_(tensor)来进行初始化。

  4. Kaiming初始化:Kaiming初始化是一种用于深度神经网络的特殊初始化方法,它适用于ReLU激活函数。可以使用torch.nn.init.kaiming_normal_(tensor)或torch.nn.init.kaiming_uniform_(tensor)来进行初始化。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import torch.nn as nn

class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 16, 3)
self.conv2 = nn.Conv2d(16, 32, 3)
self.fc1 = nn.Linear(32*6*6, 64)
self.fc2 = nn.Linear(64, 10)

# 随机初始化
nn.init.normal_(self.conv1.weight)
nn.init.normal_(self.conv2.weight)
nn.init.normal_(self.fc1.weight)
nn.init.normal_(self.fc2.weight)

# xavier初始化
nn.init.xavier_normal_(self.conv1.weight)
nn.init.xavier_uniform_(self.conv2.weight)
nn.init.xavier_normal_(self.fc1.weight)
nn.init.xavier_uniform_(self.fc2.weight)

# Kaiming初始化
nn.init.kaiming_normal_(self.conv1.weight, mode='fan_out', nonlinearity='relu')
nn.init.kaiming_uniform_(self.conv2.weight, mode='fan_out', nonlinearity='relu')
nn.init.kaiming_normal_(self.fc1.weight, mode='fan_in', nonlinearity='relu')
nn.init.kaiming_uniform_(self.fc2.weight, mode='fan_in', nonlinearity='relu')