Pytorch如何实现权重初始化

  介绍

小编给大家分享一下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如何实现权重初始化”有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

Pytorch如何实现权重初始化