我如何初始化网络的权重和偏差(通过例如He或Xavier初始化)?
当前回答
要初始化层,通常不需要做任何事情。
PyTorch会为你做这件事。仔细想想,这就说得通了。为什么我们要初始化层,当PyTorch可以遵循最新的趋势时?
例如,线性层的__init__方法将进行开明河初始化:
init.kaiming_uniform_(self.weight, a=math.sqrt(5))
if self.bias is not None:
fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight)
bound = 1 / math.sqrt(fan_in) if fan_in > 0 else 0
init.uniform_(self.bias, -bound, bound)
类似地,这也适用于其他层类型。例如,Conv2d,检查这里。
注意:适当的初始化的好处是更快的训练速度。如果您的问题需要特殊的初始化,您仍然可以在之后进行初始化。
其他回答
单层
要初始化单个图层的权重,请使用torch.nn.init中的函数。例如:
conv1 = torch.nn.Conv2d(...)
torch.nn.init.xavier_uniform(conv1.weight)
或者,您可以通过写入conv1.weight来修改参数。data(它是torch.Tensor)。例子:
conv1.weight.data.fill_(0.01)
这同样适用于偏见:
conv1.bias.data.fill_(0.01)
神经网络。顺序或自定义nn。模块
将初始化函数传递给torch.nn.Module.apply。它将初始化整个nn中的权重。递归地模块。
apply(fn):将fn递归应用到每个子模块(由.children()返回)和self。典型的用法包括初始化模型的参数(参见torch-nn-init)。
例子:
def init_weights(m):
if isinstance(m, nn.Linear):
torch.nn.init.xavier_uniform(m.weight)
m.bias.data.fill_(0.01)
net = nn.Sequential(nn.Linear(2, 2), nn.Linear(2, 2))
net.apply(init_weights)
抱歉这么晚才来,希望我的回答能有所帮助。
用正态分布初始化权重:
torch.nn.init.normal_(tensor, mean=0, std=1)
或者使用常数分布:
torch.nn.init.constant_(tensor, value)
或者使用均匀分布:
torch.nn.init.uniform_(tensor, a=0, b=1) # a: lower_bound, b: upper_bound
你可以用其他方法来初始化张量
import torch.nn as nn
# a simple network
rand_net = nn.Sequential(nn.Linear(in_features, h_size),
nn.BatchNorm1d(h_size),
nn.ReLU(),
nn.Linear(h_size, h_size),
nn.BatchNorm1d(h_size),
nn.ReLU(),
nn.Linear(h_size, 1),
nn.ReLU())
# initialization function, first checks the module type,
# then applies the desired changes to the weights
def init_normal(m):
if type(m) == nn.Linear:
nn.init.uniform_(m.weight)
# use the modules apply function to recursively apply the initialization
rand_net.apply(init_normal)
要初始化层,通常不需要做任何事情。
PyTorch会为你做这件事。仔细想想,这就说得通了。为什么我们要初始化层,当PyTorch可以遵循最新的趋势时?
例如,线性层的__init__方法将进行开明河初始化:
init.kaiming_uniform_(self.weight, a=math.sqrt(5))
if self.bias is not None:
fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight)
bound = 1 / math.sqrt(fan_in) if fan_in > 0 else 0
init.uniform_(self.bias, -bound, bound)
类似地,这也适用于其他层类型。例如,Conv2d,检查这里。
注意:适当的初始化的好处是更快的训练速度。如果您的问题需要特殊的初始化,您仍然可以在之后进行初始化。
因为到目前为止我还没有足够的声誉,我不能在下面添加评论
prosti在19年6月26日13:16发布的答案。
def reset_parameters(self):
init.kaiming_uniform_(self.weight, a=math.sqrt(3))
if self.bias is not None:
fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight)
bound = 1 / math.sqrt(fan_in)
init.uniform_(self.bias, -bound, bound)
但我想指出的是,实际上我们知道何开明的论文《深入研究整流器:在ImageNet分类上超越人类的性能》中的一些假设是不合适的,尽管看起来刻意设计的初始化方法在实践中取得了成功。
例如,在反向传播案例的分段中,它们假设$w_l$和$\delta y_l$是相互独立的。但我们都知道,以分数映射$\delta y^L_i$为例,如果我们使用典型的交叉熵损失函数目标,它通常是$y_i-softmax(y^L_i)=y_i-softmax(w^L_ix^L_i)$。
所以我认为,为什么他的初始化工作得很好,真正的潜在原因还有待解开。因为每个人都见证了它在促进深度学习训练方面的力量。
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 数据挖掘中分类和聚类的区别?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if