PyTorch中的卷积神经网络(CNN)权重初始化是一个重要的步骤,它可以帮助网络更快地收敛并提高模型的性能。以下是一些常用的权重初始化方法:
- Xavier初始化:适用于激活函数为ReLU或LeakyReLU的网络。Xavier初始化通过计算输入和输出通道数的乘积来确定权重的标准差,从而使权重在正态分布下均匀分布。
import torch.nn as nn import torch.nn.init as init def xavier_init(module, gain=1): if isinstance(module, nn.Conv2d) or isinstance(module, nn.Linear): init.xavier_uniform_(module.weight, gain=gain) if module.bias is not None: init.constant_(module.bias, 0)
- He初始化:适用于激活函数为ReLU及其变体的网络。He初始化根据输入通道数来确定权重的标准差,使权重在正态分布下均匀分布。
def he_init(module, scale=1): if isinstance(module, nn.Conv2d) or isinstance(module, nn.Linear): init.kaiming_uniform_(module.weight, nonlinearity='relu', scale=scale) if module.bias is not None: init.constant_(module.bias, 0)
- 随机初始化:简单地将权重初始化为随机值。这种方法可能导致网络收敛速度较慢,但有时也能获得不错的性能。
def random_init(module): if isinstance(module, nn.Conv2d) or isinstance(module, nn.Linear): init.normal_(module.weight, mean=0, std=0.05) if module.bias is not None: init.constant_(module.bias, 0)
在定义CNN模型时,可以使用这些初始化方法为权重进行初始化。例如:
class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.conv1 = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, padding=1) self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding=1) self.fc1 = nn.Linear(in_features=64 * 25 * 25, out_features=128) self.fc2 = nn.Linear(in_features=128, out_features=10) xavier_init(self.conv1) xavier_init(self.conv2) he_init(self.fc1) he_init(self.fc2) def forward(self, x): x = F.relu(self.conv1(x)) x = F.max_pool2d(x, 2) x = F.relu(self.conv2(x)) x = F.max_pool2d(x, 2) x = x.view(-1, 64 * 25 * 25) x = F.relu(self.fc1(x)) x = self.fc2(x) return F.log_softmax(x, dim=1)
注意:在实际应用中,可以根据网络结构和任务需求选择合适的权重初始化方法。