gpt4 book ai didi

python - 在 Pytorch 中使用 nn.Parameter 定义标量的最佳方法

转载 作者:行者123 更新时间:2023-12-05 03:49:22 25 4
gpt4 key购买 nike

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

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

def forward(self, x):
...
x = x * alpha
return x
# Method 2
def __init__(self):
super(..., self).__init__()
...
...
alpha = nn.Parameter(torch.tensor(5))
...

def forward(self, x):
...
x = x * alpha
return x
# Method 3
def __init__(self):
super(..., self).__init__()
...
...
alpha = nn.Parameter(torch.ones(1)*5)
...

def forward(self, x):
...
x = x * alpha
return x

如果一切都相同,我更喜欢方法 1,让 CNN 为特征图 x 学习适当的乘数 alpha。我希望在所有情况下 alpha 都是一个初始化为 5 的 float32 张量。我使用的是 PyTorch 1.3.1

您真诚的,

莫希特

最佳答案

第三个选项将起作用,因为参数构造函数需要一个 float 。参数通过优化器更新,因此除了缓冲区之外,它们还需要具有梯度。

缓冲区由您自己管理,而不是与优化器一起管理。

你可以玩这个实验代码。

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)]

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

你可以 also do正如 Shai 所解释的:

self.register_parameter(name='alpha', param=torch.nn.Parameter(torch.tensor(5.)))

您可能会问为什么我们有 nn.Module.register_parameter ,我们为什么不直接使用 nn.Parameter() 方法呢?

nn.Module.register_parameter 获取 name 和张量,并首先检查 name 是否在模块的字典中。而 nn.Parameter() 没有这样的检查。

关于python - 在 Pytorch 中使用 nn.Parameter 定义标量的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64009286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com