这是网络:
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个隐藏层。
答案 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层中每个神经元的输入:
因此,您需要为两层神经元之间的每个连接分配权重,但在第l层中每个神经元只有一个偏差。
在您的情况下:
最多可包含31个参数。