Pytorch 实现权重初始化
在TensorFlow中,权重的初始化主要是在声明张量的时候进行的。而PyTorch则提供了另一种方法:首先应该声明张量,然后修改张量的权重。通过调用torch.nn.init包中的多种方法可以将权重初始化为直接访问张量的属性。
1、不初始化的效果
在Pytorch中,定义一个tensor,不进行初始化,打印看看结果:
w=torch.Tensor(3,4) print(w)
可以看到这时候的初始化的数值都是随机的,而且特别大,这对网络的训练必定不好,最后导致精度提不上,甚至损失无法收敛。
2、初始化的效果
PyTorch提供了多种参数初始化函数:
torch.nn.init.constant(tensor,val) torch.nn.init.normal(tensor,mean=0,std=1) torch.nn.init.xavier_uniform(tensor,gain=1)
等等。详细请参考:http://pytorch.org/docs/nn.html#torch-nn-init
注意上面的初始化函数的参数tensor,虽然写的是tensor,但是也可以是Variable类型的。而神经网络的参数类型Parameter是Variable类的子类,所以初始化函数可以直接作用于神经网络参数。实际上,我们初始化也是直接去初始化神经网络的参数。
让我们试试效果:
w=torch.Tensor(3,4) torch.nn.init.normal_(w) print(w)
3、初始化神经网络的参数
对神经网络的初始化往往放在模型的__init__()函数中,如下所示:
classNet(nn.Module):
def__init__(self,block,layers,num_classes=1000): self.inplanes=64 super(Net,self).__init__() *** ***#定义自己的网络层 *** forminself.modules(): ifisinstance(m,nn.Conv2d): n=m.kernel_size[0]*m.kernel_size[1]*m.out_channels m.weight.data.normal_(0,math.sqrt(2./n)) elifisinstance(m,nn.BatchNorm2d): m.weight.data.fill_(1) m.bias.data.zero_() *** ***#定义后续的函数 ***
也可以采取另一种方式:
定义一个权重初始化函数,如下:
defweights_init(m): classname=m.__class__.__name__ ifclassname.find('Conv2d')!=-1: init.xavier_normal_(m.weight.data) init.constant_(m.bias.data,0.0) elifclassname.find('Linear')!=-1: init.xavier_normal_(m.weight.data) init.constant_(m.bias.data,0.0)
在模型声明时,调用初始化函数,初始化神经网络参数:
model=Net(*****) model.apply(weights_init)
以上这篇Pytorch实现权重初始化就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。