小编给大家分享一下Pytorch如何实现权重初始化,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!
在TensorFlow中,权重的初始化主要是在声明张量的时候进行的。而Pytorch则提供了另一种方法:首先应该声明张量,然后修改张量的权重。通过调用torch.nn。init包中的多种方法可以将权重初始化为直接访问张量的属性。
<强> 1,不初始化的效果强>
在Pytorch中,定义一个张量,不进行初始化,打印看看结果:
w =, torch.Tensor (3、4) print (w)
可以看到这时候的初始化的数值都是随机的,而且特别大,这对网络的训练必定不好,最后导致精度提不上,甚至损失无法收敛。
<强> 2,初始化的效果强>
PyTorch提供了多种参数初始化函数:
torch.nn.init.constant(张量,,val) torch.nn.init.normal(张量,意味着=0,,std=1) torch.nn.init.xavier_uniform(张量,,获得=1)
等等。详细请参考:http://pytorch.org/docs/nn.html torch-nn-init
注意上面的初始化函数的参数张量,虽然写的是张量,但是也可以是变量类型的。而神经网络的参数类型参数是可变类的子类,所以初始化函数可以直接作用于神经网络参数。实际上,我们初始化也是直接去初始化神经网络的参数。
让我们试试效果:
w =, torch.Tensor (3、4) torch.nn.init.normal_ (w) print (w)
<强> 3,初始化神经网络的参数强>
对神经网络的初始化往往放在模型的__init__()函数中,如下所示:
类净(nn.Module):
def __init__(自我,,,,,,num_classes=1000): self.inplanes 才能=64 超级才能(净,,自我). __init__ () ,* * * * * *,#才能定义自己的网络层 ,* * * for 才能;m 拷贝self.modules (): ,,,if isinstance (m, nn.Conv2d): ,,,,,n =, m.kernel_size [0], *, m.kernel_size [1], * m.out_channels ,,,,,m.weight.data.normal_ (0,, math.sqrt(2只/,n)) ,,,elif isinstance (m, nn.BatchNorm2d): ,,,,,m.weight.data.fill_ (1) ,,,,,m.bias.data.zero_ () * * * * * *,#定义后续的函数 * * *
也可以采取另一种方式:
<强>定义一个权重初始化函数,如下:强>
def weights_init(米): classname 才能=m.__class__.__name__ if 才能;classname.find (& # 39; Conv2d& # 39;), !=, 1: ,,,init.xavier_normal_ (m.weight.data) ,,,init.constant_ (m.bias.data, 0.0) elif 才能;classname.find(& # 39;线性# 39;),!=,1: ,,,init.xavier_normal_ (m.weight.data) ,,,init.constant_ (m.bias.data, 0.0)
在模型声明时,调用初始化函数,初始化神经网络参数:
model =,净(* * * * *) model.apply (weights_init)
pytorch的优点
1. pytorch是相当简洁且高效快速的框架;2。设计追求最少的封装;3。设计符合人类思维,它让用户尽可能地专注于实现自己的想法;4。与谷歌的Tensorflow类似,公平的支持足以确保pytorch获得持续的开发更新;5。PyTorch作者亲自维护的论坛供用户交流和求教问题6。入门简单
看完了这篇文章,相信你对“Pytorch如何实现权重初始化”有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!