一、基础知识
参数初始化是深度学习模型中的重要环节之一,它直接影响到模型的泛化能力和训练效果。在 PyTorch 中给参数赋初值有两种方式,分别是手动设置和自动初始化。在使用手动设置时需要注意参数的大小、含义和初始化方式。同时,PyTorch 提供了一些默认的初始化方式,可以方便地使用。
在 PyTorch 中,模型的参数是存储在 Parameter 类型的变量中,其初始化方式主要包括:
- 常量初始化
- 随机初始化
- 预训练模型初始化
二、常量初始化
常量初始化是最简单的初始化方式,它将参数赋为固定的常量值。这种方式通常不是很常用,但有时候可以用于解决特殊的问题。例如,当我们想固定某些参数的值不变时,可以使用常量初始化。
import torch.nn as nn class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 64, kernel_size=3, padding=1) self.conv2 = nn.Conv2d(64, 128, kernel_size=3, padding=1) self.fc1 = nn.Linear(128*8*8, 1024) self.dropout = nn.Dropout(0.5) self.fc2 = nn.Linear(1024, 10) # 将conv1的权重初始化为0.1 nn.init.constant_(self.conv1.weight, 0.1)
三、随机初始化
随机初始化是最常用的初始化方式之一,它可以使得参数在一定范围内发生变化,增强模型的泛化能力。随机初始化通常包括以下几种方式:
- 均匀分布初始化
- 正态分布初始化
- 截断正态分布初始化
- 自定义初始化
其中,均匀分布初始化和正态分布初始化在 PyTorch 中均有对应的函数,可以直接使用。
import torch.nn as nn class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 64, kernel_size=3, padding=1) self.conv2 = nn.Conv2d(64, 128, kernel_size=3, padding=1) self.fc1 = nn.Linear(128*8*8, 1024) self.dropout = nn.Dropout(0.5) self.fc2 = nn.Linear(1024, 10) # 均匀分布初始化 nn.init.uniform_(self.fc1.weight, -0.1, 0.1) # 正态分布初始化 nn.init.normal_(self.fc2.weight, mean=0, std=0.01)
四、预训练模型初始化
预训练模型初始化是指使用已经预先训练好的模型来初始化当前模型的参数,该方式在迁移学习中应用广泛。在 PyTorch 中,使用预训练模型进行初始化通常有两种方式,分别是从文件中加载和在线下载。
import torchvision.models as models # 从文件中加载预训练模型 resnet18 = models.resnet18(pretrained=True) # 在线下载预训练模型,需要联网 vgg16 = models.vgg16(pretrained=True)
五、自定义初始化
有时候,我们需要使用一些特殊的方式来初始化模型参数,这时就需要自定义初始化函数。在 PyTorch 中,可以使用自定义初始化函数来实现这一点。
import torch.nn as nn def my_init(m): if isinstance(m, nn.Linear): nn.init.xavier_uniform_(m.weight) nn.init.constant_(m.bias, 0.1) class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(128*8*8, 1024) self.fc2 = nn.Linear(1024, 10) # 自定义初始化 self.apply(my_init)
六、小结
在 PyTorch 中,参数初始化是深度学习模型中不可或缺的重要部分。了解各种初始化方式的优缺点,根据不同的网络结构和需求选择合适的初始化方式,是提高模型性能的重要手段。