在深度学习和机器学习的世界中,神经网络是构建智能系统的重要基石,参数初始化是神经网络训练过程中的一个重要步骤。在构建神经网络时,我们需要为权重和偏置等参数赋予初始值。对于偏置,通常可以将其初始化为0或者较小的随机数。然而,对于权重w的初始化,我们通常会采用更加复杂的方法,以确保网络能够更好地学习数据的特征。
我们先给机器一个架构,如下图的两个隐藏层,还有这些神经元,还有给定激活函数,让机器去找w 的取值!就是找出一组参数使得输出效果好,这就是机器学习的意义。
?常见的网络参数初始化方法:
import torch
import torch.nn as nn
import torch.nn.init as init
# 均匀分布初始化
def uniform_init(m):
if isinstance(m, nn.Linear):
init.uniform_(m.weight, -1/(m.in_features**0.5), 1/(m.in_features**0.5))
if m.bias is not None:
init.constant_(m.bias, 0)
# 正态分布初始化
def normal_init(m):
if isinstance(m, nn.Linear):
init.normal_(m.weight, mean=0, std=1)
if m.bias is not None:
init.constant_(m.bias, 0)
# 全零初始化
def zero_init(m):
if isinstance(m, nn.Linear):
init.constant_(m.weight, 0)
if m.bias is not None:
init.constant_(m.bias, 0)
# 全一初始化
def one_init(m):
if isinstance(m, nn.Linear):
init.constant_(m.weight, 1)
if m.bias is not None:
init.constant_(m.bias, 0)
# 固定值初始化
def fixed_value_init(m, value):
if isinstance(m, nn.Linear):
init.constant_(m.weight, value)
if m.bias is not None:
init.constant_(m.bias, 0)
# Kaiming初始化(He初始化)
def kaiming_init(m):
if isinstance(m, nn.Linear):
init.kaiming_normal_(m.weight, mode='fan_in', nonlinearity='relu')
if m.bias is not None:
init.constant_(m.bias, 0)
# Xavier初始化(Glorot初始化)
def xavier_init(m):
if isinstance(m, nn.Linear):
init.xavier_uniform_(m.weight)
if m.bias is not None:
init.constant_(m.bias, 0)
在PyTorch中,一般我们在构建网络模型时,每个网络层的参数都有默认的初始化方法,如果需要自定义参数的初始化,可以使用torch.nn.init
模块中提供的各种初始化方法。例如,使用torch.nn.init.xavier_uniform_
或torch.nn.init.kaiming_normal_
来实现Xavier和Kaiming初始化。?
↓?↓?↓?↓?↓?↓?↓?
简化写法:
def func01():
linear = nn.Linear(5, 3) # 输入和输出维度
# 均匀分布
nn.init.uniform_(linear.weight)
print(linear.weight.data)
def func02():
# 固定值赋值
linear = nn.Linear(5, 3)
nn.init.constant_(linear.weight, 5)
print(linear.weight.data)
??torch.nn.init
是 PyTorch 中用于初始化神经网络层(如线性层、卷积层等)权重和偏置的模块。这个模块提供了多种预定义的初始化方法,用户可以根据需要选择合适的方法来初始化网络参数。
??torch.nn
是PyTorch中用于定义神经网络的模块,它包含了构建神经网络所需的各种层和损失函数。?
torch.nn
提供了多种类型的网络层,包括线性层(Linear
)、卷积层(Conv2d
)、池化层(MaxPool2d
)、循环层(如RNN
)等,这些层是构建神经网络的基本单元。torch.nn
提供了多种损失函数,如交叉熵损失(CrossEntropyLoss
)、均方误差损失(MSELoss
)等。torch.nn
包含了常见的激活函数,如ReLU、Sigmoid、Tanh等。torch.nn
模块中,但PyTorch提供了torch.optim
模块,与torch.nn
紧密集成,用于网络参数的优化。torch.nn
还提供了一些容器类,如Sequential
和ModuleList
,它们帮助用户组织和管理网络中的各层。torch.nn
还提供了一些功能性操作,如functional
子模块中的函数,它们对张量进行逐元素操作,如relu
、softmax
等。