如何使用我自己的函数在pytorch中初始化权重? (cs231n PyTorch笔记本)

时间:2018-09-17 06:38:22

标签: python deep-learning pytorch

在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%的准确性。 因此,有人知道使用这两个函数初始化权重的正确方法吗?

欢迎所有建议! 非常感谢!

0 个答案:

没有答案