在cs231n pytorch笔记本中,他们定义了 random_weight 函数以返回通过Kaiming归一化初始化的张量对象,以及 zero_weight 函数以返回包含零偏差的张量。 / p>
random_weight实现:
def random_weight(shape):
if len(shape) == 2: # FC weight
fan_in = shape[0]
else:
fan_in = np.prod(shape[1:])
w = torch.randn(shape, device=device, dtype=dtype) * np.sqrt(2. / fan_in)
w.requires_grad = True
return w
zero_weight实现:
def zero_weight(shape):
return torch.zeros(shape, device=device, dtype=dtype, requires_grad=True)
现在的目标是使用pytorch顺序api定义三层ConvNet,我们必须使用上述两个函数来初始化ConvNet中的所有权重。
我发现了这样的实现方式:
model = nn.Sequential(....)
def init_weights(layer):
if type(layer) in [nn.Conv2d, nn.Linear]:
random_weight(layer.weight.size())
zero_weight(layer.bias.size())
model.apply(init_weights)
optimizer = optim.SGD(model.parameters(), lr=learning_rate, momentum=0.9, nesterov=True)
但是我怀疑这两个函数没有初始化权重。 因为我在调用 random_weight 之前和之后打印了 layer.weight.data ,所以我得到了相同的数据。
所以我尝试像这样修改init_weights代码:
def init_weights(layer):
if type(layer) in [nn.Conv2d, nn.Linear]:
layer.weight.data = random_weight(layer.weight.size())
layer.bias.data = zero_weight(layer.bias.size())
但是性能确实糟透了,我在验证集上获得了大约10%的准确性。 因此,有人知道使用这两个函数初始化权重的正确方法吗?
欢迎所有建议! 非常感谢!