小编很久都没有更博啦,今天在做C3framework的时候碰到了一些问题,关于权重的,学的稀里糊涂滴,所以小编今天花费半天的时间总结了深度学习所有初始化的知识点快快收藏起来叭!
如果觉得有帮助记得关注,点赞,欢迎评论区各位大佬评论哟~
话不多说,上干货啦~
模型定义三要素:1.必须继承nn.Moudle这个类;
2.在__init__ __(self)中设置好需要的组件(例如:conv,pooling,linear,batchnorm等)
3.最后在forward中对定义好的组件进行搭积木
*权重初始化注意点:*1】先设定什么层用什么初始化方法,初始化方法在torch.nn,init中给出;{重点!!!!}
2】实例化一个模型后,执行该函数,即可完成初始化;
初始化架构【大饼一张】:
def initialize_weight(self):
for m in self.moudles(): #self.moudles是系统里自带的函数{m的表示:依此返回各层}
if isinstance(m,nn.Conv2d):#若该层是卷积层,则采用xavier方法
torch.nn.init.xavier_normal(m.weight.data)
if m.bias is not None: #判断是否存在偏置
m.bias.data.zero_() #若存在偏置将偏置初始化为零
elif isinstance(m,nn.BatchNorm2d):#若该层是批归一化层,则......
m.weight.data.fill_(1)
m.bias.data.zero_()
elif isinstance(m,nn.Linear):#若......
torch.nn.init.normal(m.weight.data,0,0.01)
m.bias.data.zero_()
该方法初始化的分布分为正态分布与均匀分布两个;
表达形式:torch.nn.init.xavier_unifrom_(tensor,gain =1)
或者 torch.nn.init.xavier_unifrom_(w,gain=nn.init.calculate_gain(“relu”)) #由激活函数的类型决定
服从均匀分布U(-a,a),分布的参数为:a=gain*sqrt(6/fan_in+fan_out)
表达形式:torch.nn.init.xaier_normal_(tensor,gain=1)
或者 torch.nn.init.xavier_normal_(w,gain=nn.init.calculate_gain(“relu”)) #由激活函数的类型决定gain
表达形式:torch.nn.init.kaming_unifrom_(tensor,a=0,mode=“fan_in”,nonlinearity=‘leaky Relu’)
a: 激活函数在负半轴的斜率;
mode:可选择fan_in/fan_out【fan_in:正向传输过程中方差一致;fan_out:反向传输过程中方差一致】
nonlinearity: 默认LRelu 【可选:Relu和LRelu】
表达式:torch.nn.init.kaming_normal_(tensor,mode=’’,nonlinearity=’’)
a:激活函数负半轴的斜率
表达形式:torch.nn.init.unifrom_(tensor,a,b=1)
使值服从(a,b)上的均匀分布
表达形式:torch.nn.init.normal_(tensor,mean=0,std=1)
使值服从正态分布,N(mean,std),默认值为0,1.
表达式:torch.nn.init.constant_(tensor,val)
使值为val
表达式:torch.nn.init.eye_(tensor)
将二维tensor转化为单位矩阵
表达式:torch.nn.init.orthogonal_(tensor,gain=1)
使得tensor正交
表达式:torch.nn.init.sparse_(tensor,sparsity,std=0.01)
sparsity: 设置每一列的稀疏比例,即为0的比例;