Python 使用Pytorch中的nn.参数定义标量的最佳方法

Python 使用Pytorch中的nn.参数定义标量的最佳方法,python,neural-network,pytorch,Python,Neural Network,Pytorch,在我的CNN中,在某个阶段,我想用网络应该学习的标量乘以一个特征图。以下哪项是最好的方法,或者所有方法都是一样的?标量必须初始化为5 # Method 1 def __init__(self): super(..., self).__init__() ... ... alpha = nn.Parameter(5) ... def forward(self, x): ... x = x * alpha return x 如果都是相

在我的CNN中,在某个阶段,我想用网络应该学习的标量乘以一个特征图。以下哪项是最好的方法,或者所有方法都是一样的?标量必须初始化为5

# Method 1
def __init__(self):
    super(..., self).__init__()
    ...
    ...
    alpha = nn.Parameter(5)
    ...

def forward(self, x):
    ...
    x = x * alpha
    return x
如果都是相同的,我更喜欢方法1,让CNN学习特征图
x
的适当乘数
alpha
。我希望在所有情况下,alpha都是一个初始值为5的float32张量。我正在使用PyTorch 1.3.1

你诚挚的


Mohit

第三个选项将起作用,因为参数构造函数需要一个浮点。参数是用优化器更新的,所以除了缓冲区之外,它们还需要有梯度

缓冲区由您自己管理,而不是使用优化器

您可以使用此实验代码

BS=2
class M(nn.Module):
    def __init__(self):
        super().__init__()
        self.weights = nn.Parameter(torch.randn(BS, 2))
        self.bias = nn.Parameter(torch.zeros(BS))
        self.alpha = nn.Parameter(torch.tensor(5.))

    def forward(self, x):
        return x @ self.weights + self.bias

m=M()
m.parameters()
list(m.parameters())
输出:

在这里,我直接将值
5.
设置为参数alpha,为了好玩,我又添加了几个参数

正如Shai所解释的,你可以:

self.register_parameter(name='alpha', param=torch.nn.Parameter(torch.tensor(5.)))
你可能会问为什么我们有,为什么我们不直接使用
nn.Parameter()
方法


nn.Module.register\u参数
采用
名称
和张量,首先检查
名称
是否在模块的字典中。而
nn.Parameter()
没有这样的检查。

从您的实验代码来看,方法2似乎也应该起作用,只是
5
必须替换为
5。
。这是正确的吗?我已经排除了方法1。感谢您指出
注册缓冲区
。但即使我只使用了
nn.Parameter
,代码还能工作吗?@Shai指向寄存器缓冲区是的,
nn.Parameter()
的工作方式与
register\u Parameter
相同。如果你把你的例子改成5。你就是我的榜样;)
BS=2
class M(nn.Module):
    def __init__(self):
        super().__init__()
        self.weights = nn.Parameter(torch.randn(BS, 2))
        self.bias = nn.Parameter(torch.zeros(BS))
        self.alpha = nn.Parameter(torch.tensor(5.))

    def forward(self, x):
        return x @ self.weights + self.bias

m=M()
m.parameters()
list(m.parameters())
[Parameter containing:
 tensor([[-0.5627,  2.3067],
         [ 1.3821, -0.1893]], requires_grad=True), Parameter containing:
 tensor([0., 0.], requires_grad=True), Parameter containing:
 tensor(5., requires_grad=True)]
self.register_parameter(name='alpha', param=torch.nn.Parameter(torch.tensor(5.)))