【问题标题】:How to add a learnable bias to one of the network output channel in pytorch如何向 pytorch 中的一个网络输出通道添加可学习的偏差
【发布时间】:2020-06-20 14:20:21
【问题描述】:
class pu_fc(nn.Module):

    def __init__(self, input_dim):
        super(pu_fc, self).__init__()
        self.input_dim = input_dim
        
        self.fc1 = nn.Linear(input_dim, 50)
        self.fc2 = nn.Linear(50, 2) 

        self.loss_fn = custom_NLL()

        device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
        self.bias = torch.autograd.Variable(torch.rand(1,1), requires_grad=True).to(device)

    def forward(self, x):
        out = self.fc1(x)
        out = F.relu(out, inplace=True)
        out = self.fc2(out)
        out[..., 1] = out[..., 1] + self.bias
        print('bias: ', self.bias)

        return out

从代码中可以看出,我想在第二个输出通道中添加一个偏置项。但是,我的实现不起作用。偏置项根本不更新。它在训练期间保持不变,我认为它在训练期间是不可学习的。所以问题是我怎样才能让偏差项变得可学习?是否有可能做到这一点?下面是训练期间偏差的一些输出。任何提示不胜感激,在此先感谢!

bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
Current Epoch: 1
Epoch loss:  0.4424589276313782
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
Current Epoch: 2
Epoch loss:  0.3476297199726105
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)
bias:  tensor([[0.0930]], device='cuda:0', grad_fn=<CopyBackwards>)

【问题讨论】:

    标签: python machine-learning pytorch bias-neuron


    【解决方案1】:

    bias 应该是 nn.Parameter。作为参数意味着它会显示在model.parameters()中,并且在调用model.to(device)时也会自动传输到指定的设备上。

    self.bias = nn.Parameter(torch.rand(1,1))
    

    注意:不要使用Variable,它已被 2 年前发布的 PyTorch 0.4.0 弃用,其所有功能都已合并到张量中。

    【讨论】:

    • 感谢您的解释。你知道我怎样才能找到与偏差项对应的权重吗?我使用 model.parameters() 进行了调试,但我发现了很多层参数
    • 嗯,这只是model.bias。但是你可以使用model.named_parameters(),所以你会得到一个(name, param)的元组,其中偏差的名字应该是bias
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 2018-02-18
    • 2018-06-16
    • 2014-06-24
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多