pytorch默认初始化_pytorch---初始化

本文介绍了PyTorch中参数初始化的重要性以及默认策略。详细解析了如何利用nn.init模块进行初始化,包括Xavier均匀分布和高斯分布的初始化,并列举了torch.Tensor下的一些in-place初始化函数,如Cauchy、指数、几何、对数正太和均匀分布。
摘要由CSDN通过智能技术生成

pytorch---初始化

在深度学习中参数的初始化十分重要,良好的初始化能让模型更快收敛,并达到更高水平,而糟糕的初始化则可能使得模型迅速瘫痪。PyTorch中nn.Module的模块参数都采取了较为合理的初始化策略,因此一般不用我们考虑,当然我们也可以用自定义初始化去代替系统的默认初始化。而当我们在使用Parameter时,自定义初始化则尤为重要,因t.Tensor()返回的是内存中的随机数,很可能会有极大值,这在实际训练网络中会造成溢出或者梯度消失。PyTorch中nn.init模块就是专门为初始化而设计,如果某种初始化策略nn.init不提供,用户也可以自己直接初始化。

# 利用nn.init初始化

from torch.nn import init

linear = nn.Linear(3, 4)

t.manual_seed(1)

# 等价于 linear.weight.data.normal_(0, std)

init.xavier_normal_(linear.weight)

# 直接初始化

import math

t.manual_seed(1)

# xavier初始化的计算公式

std = math.sqrt(2)/math.sqrt(7.)

linear.weight.data.normal_(0,std)

# 对模型的所有参数进行初始化

for name, params in net.named_parameters():

if name.find('linear') != -1:

# init linear

params[0] # weight

params[1] # bias

elif name.find('conv') != -1:

pass

elif name.find('norm') != -1:

pass

补充

xavier初始化

torch.nn.init.xavier_uniform(tensor, gain=1)

对于输入的tensor或者变量,通过论文Understanding the difficulty of training deep feedforward neural networks” - Glorot, X. & Bengio, Y. (2010)的方法初始化数据。

初始化服从均匀分布U(−a,a)U(−a,a),其中a=gain×2/(fan_in+fan_out)−−−−−−−−−−−−−−−−−−√×3–√a=gain×2/(fan_in+fan_out)×3,该初始化方法也称Glorot initialisation。

参数:

tensor:n维的 torch.Tensor 或者 autograd.Variable类型的数据

a:可选择的缩放参数

例如:

w = torch.Tensor(3, 5)

nn.init.xavier_uniform(w, gain=nn.init.calculate_gain('relu'))

torch.nn.init.xavier_normal(tensor, gain=1)

对于输入的tensor或者变量,通过论文Understanding the difficulty of training deep feedforward neural networks” - Glorot, X. & Bengio, Y. (2010)的方法初始化数据。初始化服从高斯分布N(0,std)N(0,std),其中std=gain×2/(fan_in+fan_out)−−−−−−−−−−−−−−−−−−√std=gain×2/(fan_in+fan_out),该初始化方法也称Glorot initialisation。

参数:

tensor:n维的 torch.Tensor 或者 autograd.Variable类型的数据

a:可选择的缩放参数

例如:

w = torch.Tensor(3, 5)

nn.init.xavier_normal(w)

另外在torch.Tensor下还定义了一些in-place的函数:

torch.Tensor.cauchy_()- numbers drawn from the Cauchy distribution,柯西分布

torch.Tensor.exponential_()- numbers drawn from the exponential distribution,指数分布

torch.Tensor.geometric_()- elements drawn from the geometric distribution,几何分布

torch.Tensor.log_normal_()- samples from the log-normal distribution,对数正太分布

torch.Tensor.random_()- numbers sampled from the discrete uniform distribution,均匀分布

torch.Tensor.uniform_()- numbers sampled from the continuous uniform distribution,连续均匀分布

每个的参数不同,像均匀分布等有均值和方差。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch 自定义初始化可以使得我们初始化参数时更加灵活和个性化。在使用 PyTorch 进行深度学习任务时,初始值设置是非常重要的。参数初始值一定程度上影响了算法的收敛速度和精度。因此,自定义初始化是非常有必要的。 PyTorch的torch.nn.init模块提供了一些常用的初始化方式,包括常见的随机初始化(uniform,normal等),常数初始化(zeros,ones等),以及一些比较有名的网络模型特定的初始化方式,如Xavier初始化,Kaiming初始化等。但有时候我们需要自定义的初始化方法,此时就需要自定义初始化。 我们可以使用register_parameter方法为模型中的每一个参数自定义初始化方法,如下所示: ``` class CustomModel(nn.Module): def __init__(self): super(CustomModel, self).__init__() self.weight = nn.Parameter(torch.Tensor(1, 100)) self.register_parameter('bias', None) self.reset_parameters() def reset_parameters(self): stdv = 1. / math.sqrt(self.weight.size(1)) self.weight.data.uniform_(-stdv, stdv) model = CustomModel() ``` 在以上的代码中,我们可以看到,在模型内部通过register_parameter方法给bias参数设置值为None,表明bias参数不需要在初始化时使用模型默认初始化方式。然后在通过重载reset_parameters方法,我们自己进行参数初始化。 通过这种自定义初始化方式,我们可以方便地对网络模型中的参数进行初始化,从而达到优化模型的目的,提高算法的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值