Как определить вес и уклон в нейронной сети? - PullRequest
0 голосов
/ 04 октября 2018

Это Сеть:

    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 голосов
/ 05 октября 2018

Если вы напечатаете именованные параметры, вы увидите, к какому слою относится параметр.Печать именованных параметров:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...