如何在神经网络中得出权重和偏见?

时间:2018-10-04 14:26:33

标签: python pytorch

这是网络:

    class Net(torch.nn.Module):
        def __init__(self, n_feature, n_hidden, n_output):  
            super(Net, self).__init__()  
            self.hidden = torch.nn.Linear(n_feature, n_hidden)  
            self.predict = torch.nn.Linear(n_hidden, n_output)   # output layer  
        def forward(self, x): 
            x = F.relu(self.hidden(x))      # activation function for hidden layer 
            x = self.predict(x)             # linear output
            return x

    net = Net(n_feature=1, n_hidden=10, n_output=1)   
    pytorch_total_params = sum(p.numel() for p in net.parameters())
    print(pytorch_total_params)

    w = list(net.parameters())
    print(w)

This is the runnung result:
31
[Parameter containing:
tensor([[ 0.9534],
        [-0.0309],
        [-0.9570],
        [-0.4179],
        [-0.3757],
        [-0.4227],
        [-0.8866],
        [ 0.2107],
        [ 0.0222],
        [ 0.2531]], requires_grad=True), Parameter containing:
tensor([-0.0358, -0.2533,  0.2979,  0.9777,  0.9606,  0.9460,  0.9059,  0.7582,
        -0.5286,  0.3367], requires_grad=True), Parameter containing:
tensor([[-0.2863, -0.3157,  0.2086, -0.0011, -0.0415, -0.2574, -0.0683, -0.0788,
         -0.0339, -0.0195]], requires_grad=True), Parameter containing:
tensor([0.2031], requires_grad=True)]

我不知道为什么参数数量为31? 而且也不了解上面印的数字。(无论是重量还是偏性

因为我认为在Relu函数中,将只有(2个参数* 10),即权重和偏差乘以10个隐藏层。

1 个答案:

答案 0 :(得分:2)

如果打印命名的参数,则可以看到参数属于哪一层。 打印命名参数:

for p in net.named_parameters():
    print(p)

创建以下输出:

('hidden.weight', Parameter containing:
tensor([[ 0.8324],
        [ 0.2166],
        [-0.9786],
        [ 0.3977],
        [ 0.9008],
        [-0.3102],
        [ 0.5052],
        [ 0.6589],
        [ 0.0828],
        [ 0.6505]], requires_grad=True))
('hidden.bias', Parameter containing:
tensor([ 0.6715,  0.5503, -0.6043,  0.1102, -0.2700,  0.7203, -0.6524, -0.6332,
        -0.2513, -0.1316], requires_grad=True))
('predict.weight', Parameter containing:
tensor([[ 0.1486,  0.1528, -0.0835, -0.3050,  0.1184, -0.0422, -0.2786, -0.2549,
         -0.1532, -0.0255]], requires_grad=True))
('predict.bias', Parameter containing:
tensor([0.2878], requires_grad=True))

如您所见,各层按照您的预期通过10个权重相连,但是“连接”右侧的每个神经元存在一个偏差。 因此,在您的输入和隐藏层之间有10个偏差参数,而对于最终预测的计算只有一个。

您正在像这样加权总和那样计算第l层中每个神经元的输入:

weighted sum

因此,您需要为两层神经元之间的每个连接分配权重,但在第l层中每个神经元只有一个偏差。

在您的情况下:

  • 隐藏输入:10个权重和10个偏差,因为您的隐藏层有10个神经元
  • 隐藏输出/预测:10个权重和1个偏差,因为您输出单个值

最多可包含31个参数。

neural network