以下是PyTorch网络参数weight bias初始化的详细攻略,包括两个示例说明。
1. 网络参数初始化
在PyTorch中,网络参数的初始化是非常重要的,因为它可以影响模型的收敛速度和最终的性能。PyTorch提供了多种初始化方法,包括常见的均匀分布、正态分布、Xavier初始化和Kaiming初始化等。
1.1 均匀分布初始化
均匀分布初始化是一种简单的初始化方法,它将权重初始化为在[-a, a]之间的均匀分布,其中a是一个常数。在PyTorch中,可以使用torch.nn.init.uniform_()
函数来进行均匀分布初始化。
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.fc1 = nn.Linear(128 * 8 * 8, 1024)
self.fc2 = nn.Linear(1024, 10)
# 均匀分布初始化
init.uniform_(self.conv1.weight, a=-0.1, b=0.1)
init.uniform_(self.conv2.weight, a=-0.1, b=0.1)
init.uniform_(self.fc1.weight, a=-0.1, b=0.1)
init.uniform_(self.fc2.weight, a=-0.1, b=0.1)
1.2 正态分布初始化
正态分布初始化是一种常用的初始化方法,它将权重初始化为均值为0、标准差为std的正态分布。在PyTorch中,可以使用torch.nn.init.normal_()
函数来进行正态分布初始化。
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.fc1 = nn.Linear(128 * 8 * 8, 1024)
self.fc2 = nn.Linear(1024, 10)
# 正态分布初始化
init.normal_(self.conv1.weight, mean=0, std=0.01)
init.normal_(self.conv2.weight, mean=0, std=0.01)
init.normal_(self.fc1.weight, mean=0, std=0.01)
init.normal_(self.fc2.weight, mean=0, std=0.01)
1.3 Xavier初始化
Xavier初始化是一种常用的初始化方法,它根据输入和输出的维度自适应地调整权重的初始化范围。在PyTorch中,可以使用torch.nn.init.xavier_uniform_()
函数或torch.nn.init.xavier_normal_()
函数来进行Xavier初始化。
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.fc1 = nn.Linear(128 * 8 * 8, 1024)
self.fc2 = nn.Linear(1024, 10)
# Xavier初始化
init.xavier_uniform_(self.conv1.weight)
init.xavier_uniform_(self.conv2.weight)
init.xavier_uniform_(self.fc1.weight)
init.xavier_uniform_(self.fc2.weight)
1.4 Kaiming初始化
Kaiming初始化是一种针对ReLU激活函数的初始化方法,它根据输入和输出的维度自适应地调整权重的初始化范围。在PyTorch中,可以使用torch.nn.init.kaiming_uniform_()
函数或torch.nn.init.kaiming_normal_()
函数来进行Kaiming初始化。
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.fc1 = nn.Linear(128 * 8 * 8, 1024)
self.fc2 = nn.Linear(1024, 10)
# Kaiming初始化
init.kaiming_uniform_(self.conv1.weight, mode='fan_in', nonlinearity='relu')
init.kaiming_uniform_(self.conv2.weight, mode='fan_in', nonlinearity='relu')
init.kaiming_uniform_(self.fc1.weight, mode='fan_in', nonlinearity='relu')
init.kaiming_uniform_(self.fc2.weight, mode='fan_in', nonlinearity='relu')
2. bias初始化
在PyTorch中,bias的初始化通常使用常数初始化,可以使用torch.nn.init.constant_()
函数来进行常数初始化。
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.fc1 = nn.Linear(128 * 8 * 8, 1024)
self.fc2 = nn.Linear(1024, 10)
# bias初始化
init.constant_(self.conv1.bias, 0)
init.constant_(self.conv2.bias, 0)
init.constant_(self.fc1.bias, 0)
init.constant_(self.fc2.bias, 0)
以上就是PyTorch网络参数weight bias初始化的详细攻略,包括两个示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch 网络参数 weight bias 初始化详解 - Python技术站