小编Ami*_*adi的帖子

在 Pytorch 中注册模型参数的正确方法

我尝试在 Pytorch 中定义一个简单的模型。该模型计算高斯分布的负对数概率:

import torch
import torch.nn as nn

class GaussianModel(nn.Module):

    def __init__(self):
        super(GaussianModel, self).__init__()

        self.register_parameter('mean', nn.Parameter(torch.zeros(1),
                                                     requires_grad=True))
        
        self.pdf = torch.distributions.Normal(self.state_dict()['mean'],
                                              torch.tensor([1.0]))
    def forward(self, x):
        return -self.pdf.log_prob(x)

model = GaussianModel()
Run Code Online (Sandbox Code Playgroud)

然后我尝试优化mean参数:

optimizer = torch.optim.SGD(model.parameters(), lr=0.002)
for _ in range(5):
  optimizer.zero_grad()
  nll = model(torch.tensor([3.0], requires_grad=True))
  nll.backward()
  optimizer.step()
  print('mean : ', model.state_dict()['mean'],
                 ' - Negative Loglikelihood : ', nll.item())
Run Code Online (Sandbox Code Playgroud)

但看起来梯度为零并且mean没有改变:

mean :  tensor([0.])  - Negative Loglikelihood :  5.418938636779785
mean :  tensor([0.])  - Negative Loglikelihood :  5.418938636779785
mean : …
Run Code Online (Sandbox Code Playgroud)

python pytorch

7
推荐指数
1
解决办法
1万
查看次数

postfix ++的优先顺序

请考虑以下代码:

int a = 5;
int b = a++;
cout << "b is " << b << endl; // b is 5 
Run Code Online (Sandbox Code Playgroud)

要么:

int get_number(){
    int a = 5;
    return a++;
}
int main(){
    int b = get_number();
    cout << "b is " << b << endl; // b is 5
}
Run Code Online (Sandbox Code Playgroud)

根据此表,后缀++运算符的优先级高于=运算符,因此输出应该是b is 6.但输出是b is 5.我们怎么解释这个?

c++ operators

1
推荐指数
1
解决办法
167
查看次数

标签 统计

c++ ×1

operators ×1

python ×1

pytorch ×1