1、线性
# in_features 输入结点数
# out_features 输出结点数
# bias 是否要偏置
nn.Linear(in_features,out_features,bias=True)
2、激活函数
2.1 nn.Sigoid
# 输出(0,1)
# 导数[0,0.25],易梯度消失
y = 1/(1+e**(-x))
2.2 nn.tanh
# 输出(-1,1)
# 导数(0,1),易梯度消失
2.3 nn.ReLU
# 导数1时易梯度爆炸
2.4 nn.LeakyReLU(negative_slope)
# negative_slope:负半轴斜率
2.5 nn.PReLU(init)
# init:斜率可学习
2.6 nn.RReLU(lower,upper)
# 负半轴每个点的斜率均从均匀分布中采样
# lower:均匀分布下限
# upper:均匀分布上限
3、利用权值初始化防止梯度消失或爆炸
@不用权值初始化方法
# 使用批标准化
@为何权值初始化
# 数据过大可能权值爆炸(梯度爆炸),过小可能丢失数据(梯度消失)
# 利用合适的初始化方法使每一层方差为1
# 方差一致性:保持数据维持在恰当尺度,通常方差为1
3.1 计算激活函数增益:计算激活函数的方差变化尺度
# nonlinearity:激活函数名称
# param:激活函数参数,如Leaky_ReLU的negative_slope
nn.init.calculate_gain(nonlinearity,param=None)
3.1 Xavier初始化(适合饱和函数:如Sigmoid、Tanh)
3.2 Kaiming初始化(适合ReLU及其变种)
class MLP(nn.Module):
def __init__(self,input_size,hidden_size):
super(lstmT,self).__init__()
def forward(self,X):
# 权值初始化
def initialize(self):
for m in self.modules():
if isinstance(m,nn.Linear):
'''tanh激活函数'''
# 计算激活函数增益
tanh_gain = nn.init.calculate_gain('tanh')
# 权值初始化(xavier_uniform_)
nn.init.xavier_uniform_(m.weight.data,gain=tanh_gain)
'''ReLU激活函数'''
nn.init.kaiming_normal_(m.weight.data)
net = MLP(neural_nums,layer_nums)
# 权值初始化
net.initialize()
权值初始化方法:
# 无论哪种方法都要遵循方差一致原则,即要使每一层方差为1
1、Xavier均匀分布
2、Xavier正态分布
3、Kaiming均匀分布
4、Kaiming正态分布
5、均匀分布
6、正态分布
7、常数分布
8、正交矩阵初始化
9、单位矩阵初始化
10、稀疏矩阵初始化