Python 使用Pytorch中的nn.参数定义标量的最佳方法
在我的CNN中,在某个阶段,我想用网络应该学习的标量乘以一个特征图。以下哪项是最好的方法,或者所有方法都是一样的?标量必须初始化为5Python 使用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 如果都是相
# 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.)))