欢迎访问宙启技术站
智能推送

Python编程中如何使用torch.nn.init模块进行参数初始化

发布时间:2023-12-11 14:23:03

torch.nn.init 模块是 PyTorch 中用来实现参数初始化的模块,它提供了一些常用的参数初始化方法,可以帮助我们在神经网络的训练中更好地初始化参数,以提高训练效果和收敛速度。

首先,我们需要导入 torch.nn.init 模块:

import torch.nn.init as init

torch.nn.init 模块中提供了多种初始化方法,包括常用的均匀分布初始化方法、正态分布初始化方法、常数初始化方法等。

1. 均匀分布初始化(Uniform Initialization)

均匀分布初始化方法将权重初始化为在一定范围内的均匀分布。可以使用 init.uniform_ 方法来实现。

使用例子:

import torch
import torch.nn as nn
import torch.nn.init as init

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc = nn.Linear(10, 5)
        
    def forward(self, x):
        x = self.fc(x)
        return x
        
net = Net()
init.uniform_(net.fc.weight, a=-0.5, b=0.5)
print(net.fc.weight)

这里我们首先定义了一个模型 Net,其中包含一个具有输入维度为10,输出维度为5的全连接层。然后我们使用 init.uniform_ 方法对全连接层的权重进行了均匀分布初始化,范围在 -0.5 到 0.5 之间。最后打印全连接层的权重。

2. 正态分布初始化(Normal Initialization)

正态分布初始化方法将权重初始化为满足正态分布的随机数。可以使用 init.normal_ 方法来实现。

使用例子:

import torch
import torch.nn as nn
import torch.nn.init as init

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc = nn.Linear(10, 5)
        
    def forward(self, x):
        x = self.fc(x)
        return x
        
net = Net()
init.normal_(net.fc.weight, mean=0, std=0.1)
print(net.fc.weight)

和上面的例子类似,这里使用 init.normal_ 方法对全连接层的权重初始化为满足均值为 0,标准差为 0.1 的正态分布随机数。最后打印全连接层的权重。

3. 常数初始化(Constant Initialization)

常数初始化方法将权重初始化为指定的常数。可以使用 init.constant_ 方法来实现。

使用例子:

import torch
import torch.nn as nn
import torch.nn.init as init

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc = nn.Linear(10, 5)
        
    def forward(self, x):
        x = self.fc(x)
        return x
        
net = Net()
init.constant_(net.fc.weight, val=0.5)
print(net.fc.weight)

这里使用 init.constant_ 方法将全连接层的权重初始化为常数 0.5。最后打印全连接层的权重。

除了上述介绍的均匀分布初始化、正态分布初始化和常数初始化方法外,torch.nn.init 还提供了其他一些常用的初始化方法,如 He初始化、Xavier初始化等。

init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')
init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')
init.xavier_uniform_(tensor, gain=1)
init.xavier_normal_(tensor, gain=1)

这些方法是通过调用 nn.init 中的函数来初始化参数的,例如 nn.init.constant_()。

使用这些初始化方法前,需要先导入torch.nn.init。

下面是一个使用这些初始化方法进行参数初始化的例子:

import torch
import torch.nn as nn
import torch.nn.init as init

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)
        self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)
        self.fc = nn.Linear(7*7*128, 10)
        
        init.kaiming_uniform_(self.conv1.weight)
        init.constant_(self.conv1.bias, 0)
        
        init.kaiming_uniform_(self.conv2.weight)
        init.constant_(self.conv2.bias, 0)
        
        init.xavier_uniform_(self.fc.weight)
        init.constant_(self.fc.bias, 0)
        
    def forward(self, x):
        x = self.conv1(x)
        x = nn.ReLU()(x)
        x = nn.MaxPool2d(kernel_size=2, stride=2)(x)
        
        x = self.conv2(x)
        x = nn.ReLU()(x)
        x = nn.MaxPool2d(kernel_size=2, stride=2)(x)
        
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        
        return x
        
net = Net()
print(net)

这里定义了一个简单的卷积神经网络模型,使用了 kaiming_uniform_ 方法对卷积层的权重进行 He 初始化,并使用了 constant_ 方法对权重进行常数初始化。然后使用 xavier_uniform_ 方法对全连接层的权重进行 Xavier 初始化,并使用 constant_ 方法对权重进行常数初始化。

以上就是使用 torch.nn.init 模块进行参数初始化的方法和一些示例。在实际应用中,根据模型的具体结构和需求选择合适的初始化方法,可以帮助提高模型的训练效果和收敛速度。