「细聊」torch.nn.init 初始化
init.uniform从均匀分布 \mathcal{U}(a, b)中生成值,填充输入的张量或变量 Parameters:tensor - n维的torch.Tensor a - 均匀分布的下界 b - 均匀分布的上界 nn.init.normal 从给定均值和标准差的**正态分布** $\mathcal{N}(mean, std)$中生成值,填充输入的张量或变量 Parameters: ten
文章目录
权重初始化如何影响深度学习模型的性能?
答:权重初始化是训练深度学习模型的重要步骤,因为它决定了优化过程的起点。如果用小的随机值初始化权重,模型将很难从数据中学习,因为梯度太小了。
另一方面,如果权重初始化随机值较大,则模型收敛速度较快,但可能无法找到损失函数的全局最小值。选择合适的权值初始化方法,如He初始化或Glorot初始化,有助于提高模型的性能。
1、init.uniform
init.uniform(tensor, a=0, b=1)
>>> w = torch.Tensor(3, 5)
>>> nn.init.uniform(w)
从均匀分布 U ( a , b ) \mathcal{U}(a, b) U(a,b)中生成值,填充输入的张量或变量
Parameters:
- tensor - n维的torch.Tensor
- a - 均匀分布的下界
- b - 均匀分布的上界
2、nn.init.normal
nn.init.normal(tensor, mean=0, std=1)
>>> w = torch.Tensor(3, 5)
>>> nn.init.normal(w)
从给定均值和标准差的正态分布 N ( m e a n , s t d ) \mathcal{N}(mean, std) N(mean,std)中生成值,填充输入的张量或变量
Parameters:
- tensor – n维的torch.Tensor
- mean – 正态分布的均值
- std – 正态分布的标准差
3、nn.init.constant
nn.init.constant(tensor, val)
>>> w = torch.Tensor(3, 5)
>>> nn.init.constant(w)
用val的值填充输入的张量或变量
Parameters:
- tensor – n维的torch.Tensor 或 autograd.Variable
- val – 用来填充张量的值
4、nn.init.eye
nn.init.eye(tensor)
>>> w = torch.Tensor(3, 5)
>>> nn.init.eye(w)
用单位矩阵来填充2维输入张量或变量。在线性层尽可能多的保存输入特性
Parameters:
- tensor – 2维的torch.Tensor 或 autograd.Variable
5、nn.init.dirac
nn.init.dirac(tensor)
>>> w = torch.Tensor(3, 16, 5, 5)
>>> nn.init.dirac(w)
用Dirac δ \delta δ 函数来填充{3, 4, 5}维输入张量或变量。在卷积层尽可能多的保存输入通道特性
Parameters:
- tensor – {3, 4, 5}维的torch.Tensor 或 autograd.Variable
6、nn.init.xavier_uniform
nn.init.xavier_uniform(tensor, gain=1)
>>> w = torch.Tensor(3, 5)
>>> nn.init.xavier_uniform(w, gain=math.sqrt(2.0))
用一个均匀分布生成值,填充输入的张量或变量。结果张量中的值采样自U(-a, a),其中
a
=
g
a
i
n
∗
6
f
a
n
_
i
n
+
f
a
n
_
o
u
t
a= gain * \sqrt{ \frac{6}{fan\_in + fan\_out}}
a=gain∗fan_in+fan_out6,该方法也被称为Glorot initialisation
参考:Glorot, X.和Bengio, Y.等“Understanding the difficulty of training deep feedforward neural networks”
Parameters:
- tensor – n维的torch.Tensor
- gain - 可选的缩放因子
7、nn.init.xavier_normal
nn.init.xavier_normal(tensor, gain=1)
>>> w = torch.Tensor(3, 5)
>>> nn.init.xavier_normal(w)
用一个正态分布生成值,填充输入的张量或变量。结果张量中的值采样自均值为0,标准差为
g
a
i
n
∗
2
f
a
n
_
i
n
+
f
a
n
_
o
u
t
gain * \sqrt{\frac{2}{fan\_in + fan\_out}}
gain∗fan_in+fan_out2 的正态分布。也被称为Glorot initialisation
参考:Glorot, X.和Bengio, Y. 等“Understanding the difficulty of training deep feedforward neural networks”
Parameters:
- tensor – n维的torch.Tensor
- gain - 可选的缩放因子
8、nn.init.kaiming_uniform
nn.init.kaiming_uniform(tensor, a=0, mode='fan_in',nonlinearity='leaky_relu')
>>> w = torch.Tensor(3, 5)
>>> nn.init.kaiming_uniform(w, mode='fan_in')
用一个均匀分布生成值,填充输入的张量或变量。结果张量中的值采样自U(-bound, bound),其中
b
o
u
n
d
=
g
a
i
n
×
3
f
a
n
_
m
o
d
e
bound = gain \times \sqrt{\frac{3}{fan\_mode}}
bound=gain×fan_mode3,也被称为He initialisation
参考:He, K等“Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification”
Parameters:
- tensor – n维的torch.Tensor或autograd.Variable
- a -这层之后使用的rectifier的斜率系数(ReLU的默认值为0)
- mode -可以为“fan_in”(默认)或 “fan_out”
“fan_in”保留前向传播时权值方差的量级
“fan_out”保留反向传播时的量级 - nonlinearity=‘leaky_relu’ - 非线性函数 建议“relu”或“leaky_relu”(默认值)使用。
9、nn.init.kaiming_normal
nn.init.kaiming_normal(tensor, a=0, mode='fan_in')
>>> w = torch.Tensor(3, 5)
>>> nn.init.kaiming_normal(w, mode='fan_out')
用一个正态分布生成值,填充输入的张量或变量。结果张量中的值采样自均值为0,标准差为
s
t
d
=
2
(
1
+
a
2
)
∗
f
a
n
i
n
std=\sqrt{\frac{2}{(1 + a^2) * fan_in}}
std=(1+a2)∗fanin2 的正态分布
参考:He, K 在 “Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification”
Parameters:
- tensor – n维的torch.Tensor或 autograd.Variable
- a -这层之后使用的rectifier的斜率系数(ReLU的默认值为0)
- mode -可以为“fan_in”(默认)或 “fan_out”
“fan_in”保留前向传播时权值方差的量级
“fan_out”保留反向传播时的量级
10、nn.init.orthogonal
nn.init.orthogonal(tensor, gain=1)
>>> w = torch.Tensor(3, 5)
>>> nn.init.orthogonal(w)
用(半)正交矩阵填充输入的张量或变量。输入张量必须至少是2维的,对于更高维度的张量,超出的维度会被展平,视作行等于第一个维度,列等于稀疏矩阵乘积的2维表示
【其中非零元素生成自均值为0,标准差为std的正态分布】
参考:Saxe, A等人(2013)的“Exact solutions to the nonlinear dynamics of learning in deep linear neural networks”
Parameters:
- tensor – n维的torch.Tensor 或 autograd.Variable,其中n>=2
- gain -可选
11、nn.init.sparse
nn.init.sparse(tensor, sparsity, std=0.01)
>>> w = torch.Tensor(3, 5)
>>> nn.init.sparse(w, sparsity=0.1)
将2维的输入张量或变量当做 稀疏矩阵填充,其中非零元素根据一个均值为0,标准差为std的正态分布生成
参考:Martens, J.(2010)的 “Deep learning via Hessian-free optimization”
Parameters:
- tensor – n维的torch.Tensor或autograd.Variable
- sparsity - 每列中需要被设置成零的元素比例
- std - 用于生成非零值的正态分布的标准差
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)