一,权值初始化
1.方差一致性原则:将每一层的方差都尽量控制在1左右
2.torch中提供了10种权值初始化方法:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/461239db20845f41280ddce7d4e8a611.png)
- 均匀分布
- 正态分布
- 常数分布
- 单位矩阵初始化
- Xavier均匀分布–》Xavier针对的是饱和激活函数
- Xavier正态分布
- 凯明均匀分布–》凯明针对的是非饱和激活函数
- 凯明正态分布
- 正交矩阵初始化
- 系数矩阵初始化
3. nn.init.calculate_gain:计算激活函数的方差变化尺度
- nonlinearity:激活函数名
- param:激活函数的参数,比如Leaky Relu的negative_stop
- 尺度计算方式:输入数据的方差/经过激活函数后的数据的方法
class MLP(nn.Module):
def __init__(self, neural_num, layers):
super(MLP, self).__init__()
self.linears = nn.ModuleList([nn.Linear(neural_num, neural_num, bias=False) for i in range(layers)])
self.neural_num = neural_num
def forward(self, x):
for (i, linear) in enumerate(self.linears):
x = linear(x)
x = torch.tanh(x)
print("layer:{}, std:{}".format(i, x.std()))
if torch.isnan(x.std()):
print("output is nan in {} layers".format(i))
break
return x
def initialize(self):
for m in self.modules():
if isinstance(m, nn.Linear):
tanh_gain = nn.init.calculate_gain('tanh')
nn.init.xavier_uniform_(m.weight.data, gain=tanh_gain)
flag = 1
if flag:
layer_nums = 100
neural_nums = 256
batch_size = 16
net = MLP(neural_nums, layer_nums)
net.initialize()
inputs = torch.randn((batch_size, neural_nums))
output = net(inputs)
print(output)
二,损失函数:衡量模型输出与真实标签的差异
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/05148424096e63f8de1be30d3db92998.png)
nn.CrossEntropyLoss:将NN.Logsoftmax()和nn.NLLLoss()结合,进行交叉熵计算
- weight:各类别的loss设置权限
- ignore_index:忽略某个类别
- reduction:计算模式,默认是mean
- none:逐个元素计算
- sum:所有元素求和返回标量
- mean:加权平均,返回标量
- 交叉熵=信息熵+相对熵
nn.NLLLoss:实现负对数似然函数中负号的功能
- weight:各类别的loss设置权限
- ignore_index:忽略某个类别
- reduction:计算模式,默认是mean
- none:逐个元素计算
- sum:所有元素求和返回标量
- mean:加权平均,返回标量
nn.BCELoss:二分类交叉熵
- weight:各类别的loss设置权限
- ignore_index:忽略某个类别
- reduction:计算模式,默认是mean
- none:逐个元素计算
- sum:所有元素求和返回标量
- mean:加权平均,返回标量
- 注意:输入为【0—1】
nn.BCEWithLogitLoss:集合sigmoid的二分类交叉熵
- weight:各类别的loss设置权限
- ignore_index:忽略某个类别
- reduction:计算模式,默认是mean
- none:逐个元素计算
- sum:所有元素求和返回标量
- mean:加权平均,返回标量
- pos_weight:整样本权值—》正负样本均衡的作用
nn.L1Loss:计算inputs与target之差的绝对值
nn.MSELoss:计算intput与target之差的平方
- reduction:计算模式
- none:逐个元素计算
- sum:所有元素求和返回标量
- mean:加权平均,返回标量
nn.SmoothL1Loss:平滑的L1Loss
- reduction:计算模式
- none:逐个元素计算
- sum:所有元素求和返回标量
- mean:加权平均,返回标量
nn.PoissonNLLLoss:泊松分布的负对数似然损失函数
- log_input:输入是否以对数形式决定计算公式
- full:计算所有的loss,默认为False
- eps:修正项,避免log(input)为nan
nn.KLDivLoss:计算KLD,kl散度,相对熵—》计算两个分布的相似性(距离)
- reuuction:
- none:逐个元素计算
- sum:所有元素求和返回标量
- mean:加权平均,返回标量
- batchmean:维度求平均值
- 需提前输入计算log-probabilities,通过nn.logsoftmax()可以实现
nn.MarginRankingLoss:计算两个向量之间的相似度,用于排序任务
- margin:边界值,x1与x2之间的差异值。
- reduction:
- none:逐个元素计算
- sum:所有元素求和返回标量
- mean:加权平均,返回标量
nn.multiLabelMarginLoss:多标签边界损失函数
- reduction:
- none:逐个元素计算
- sum:所有元素求和返回标量
- mean:加权平均,返回标量
- 不是多分类,是一个样本同时符合多个标签
nn.SoftMarginLoss:计算二分类的Logistic损失
- reduction:
- none:逐个元素计算
- sum:所有元素求和返回标量
- mean:加权平均,返回标量
nn.MultiLabelSoftMarginLoss:softmarginloss
- weight:各类别的loss设置权值
- reduction:
- none:逐个元素计算
- sum:所有元素求和返回标量
- mean:加权平均,返回标量
nn.MultiMarginLoss:计算多分类的折页损失函数
- p:可选1/2
- weight:各类别的loss,设置权值
- margin:边界值
- reduction:
- none:逐个元素计算
- sum:所有元素求和返回标量
- mean:加权平均,返回标量
nn.TripleMarginLoss:计算三元组损失,人脸验证中常用
- p:范数的阶,默认为2
- margin:边界值
- reduction:
- none:逐个元素计算
- sum:所有元素求和返回标量
- mean:加权平均,返回标量
nn.HingeEmbeddingLoss:计算两个输入的相似性,常用于非线性embedding和边监督学习
- margin:边界值
- reduction:
- none:逐个元素计算
- sum:所有元素求和返回标量
- mean:加权平均,返回标量
nn.CosineEmbeddingLoss:采用 余弦相似度计算两个输入的相似性—》主要考虑方向上的差异
- margin:可取值【-1,1】,推荐为【0, 0.5】
- zero_infinity:无穷大的值或梯度置为0
- reduction:
- none:逐个元素计算
- sum:所有元素求和返回标量
- mean:加权平均,返回标量
nn.CTCLoss:计算CTC损失,解决时序类数据的分类
- blank:blank label
- zero_infinity:无穷大的值或梯度置为0
- reduction:
- none:逐个元素计算
- sum:所有元素求和返回标量
- mean:加权平均,返回标量