Machine learning pytorch问题:如何添加偏差项并提取其值?类与序列模型?和softmax

Machine learning pytorch问题:如何添加偏差项并提取其值?类与序列模型?和softmax,machine-learning,deep-learning,pytorch,torch,Machine Learning,Deep Learning,Pytorch,Torch,我在pytorch中有一个基本的神经网络模型,如下所示: import torch import torch.nn as nn import torch.nn.functional as F class Net(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim): super(Net, self).__init__() self.fc1 = nn.Linear(input_d

我在pytorch中有一个基本的神经网络模型,如下所示:

import torch
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(input_dim, hidden_dim)
        self.sigmoid = nn.Sigmoid()
        self.fc2 = nn.Linear(hidden_dim, output_dim)

    def forward(self, x):
        out = self.fc1(x)
        out = self.sigmoid(out)
        out = self.fc2(out)
        return out
net = Net(400, 512,10)
如何从net.parameters()中提取偏差/截距项? 这个模型等同于使用sequential()吗

对于多类分类,在两种模型的末尾nn.Softmax()是可选的吗?如果我理解正确的话,有了软件,它会输出某个类的概率,但没有它,它会返回预测的输出吗


提前感谢您回答我的新手问题。

您可以声明模型中每个层或函数的提取偏差

您网络中的两个存在是相同的,但是如果您想扩展netwrok,我建议使用Net one而不是Sequential one

如果没有softmax,它只会输出一个最小值为-1最大值为1的张量,如果使用sigmoid,则无法预测


无论如何,你应该分开回答你的问题,而不是一篇文章回答三个问题。祝你好运,让我们逐一回答问题
此模型是否等同于使用sequential()
简短回答:没有。您可以看到您添加了两个S形和两个线性层。您可以打印网络并查看结果:

net = Net(400, 512,10)

print(net.parameters())
print(net)
input_dim = 400
hidden_dim = 512
output_dim = 10

model = Net(400, 512,10)

net = nn.Sequential(nn.Linear(input_dim, hidden_dim),
                      nn.Sigmoid(),
                      nn.Linear(hidden_dim, hidden_dim),
                      nn.Sigmoid(),
                      nn.Linear(hidden_dim, output_dim))

print(net)
输出为:

Net(
  (fc1): Linear(in_features=400, out_features=512, bias=True)
  (sigmoid): Sigmoid()
  (fc2): Linear(in_features=512, out_features=10, bias=True)
)

Sequential(
  (0): Linear(in_features=400, out_features=512, bias=True)
  (1): Sigmoid()
  (2): Linear(in_features=512, out_features=512, bias=True)
  (3): Sigmoid()
  (4): Linear(in_features=512, out_features=10, bias=True)
)

tensor([ 3.4078e-02,  3.1537e-02,  3.0819e-02,  2.6163e-03,  2.1002e-03,
         4.6842e-05, -1.6454e-02, -2.9456e-02,  2.0646e-02, -3.7626e-02,
         3.5531e-02,  4.7748e-02, -4.6566e-02, -1.3317e-02, -4.6593e-02,
        -8.9996e-03, -2.6568e-02, -2.8191e-02, -1.9806e-02,  4.9720e-02,
        ---------------------------------------------------------------
        -4.6214e-02, -3.2799e-02, -3.3605e-02, -4.9720e-02, -1.0293e-02,
         3.2559e-03, -6.6590e-03, -1.2456e-02, -4.4547e-02,  4.2101e-02,
        -2.4981e-02, -3.6840e-03], requires_grad=True)
我希望你能看到他们的不同之处

您的第一个问题:
如何从net.parameters()中提取偏差/截距项

答案是:

model = Net(400, 512,10)

bias = model.fc1.bias

print(bias)
输出为:

Net(
  (fc1): Linear(in_features=400, out_features=512, bias=True)
  (sigmoid): Sigmoid()
  (fc2): Linear(in_features=512, out_features=10, bias=True)
)

Sequential(
  (0): Linear(in_features=400, out_features=512, bias=True)
  (1): Sigmoid()
  (2): Linear(in_features=512, out_features=512, bias=True)
  (3): Sigmoid()
  (4): Linear(in_features=512, out_features=10, bias=True)
)

tensor([ 3.4078e-02,  3.1537e-02,  3.0819e-02,  2.6163e-03,  2.1002e-03,
         4.6842e-05, -1.6454e-02, -2.9456e-02,  2.0646e-02, -3.7626e-02,
         3.5531e-02,  4.7748e-02, -4.6566e-02, -1.3317e-02, -4.6593e-02,
        -8.9996e-03, -2.6568e-02, -2.8191e-02, -1.9806e-02,  4.9720e-02,
        ---------------------------------------------------------------
        -4.6214e-02, -3.2799e-02, -3.3605e-02, -4.9720e-02, -1.0293e-02,
         3.2559e-03, -6.6590e-03, -1.2456e-02, -4.4547e-02,  4.2101e-02,
        -2.4981e-02, -3.6840e-03], requires_grad=True)

谢谢你的回答。如果我在类中添加另一个sigmoid。这是不是也一样?我的意思是,如果有相同数量的隐藏节点/层和相同的激活函数设置,那么nn.sequential()和类Net(nn.Module)在功能上是否做了相同的事情?是的,这是正确的。如果在sequential和自定义的Net(nn.Module)类中添加相同的层,则它们具有相同的网络体系结构。