gpt4 book ai didi

deep-learning - 在 Pytorch 中估计高斯模型的混合

转载 作者:行者123 更新时间:2023-12-04 15:07:49 41 4
gpt4 key购买 nike

我实际上想用高斯混合作为基本分布来估计归一化流,所以我有点被手电筒困住了。但是,您可以通过估计 torch 中高斯模型的混合来重现我的代码中的错误。我的代码如下:

import numpy as np
import matplotlib.pyplot as plt
import sklearn.datasets as datasets

import torch
from torch import nn
from torch import optim
import torch.distributions as D

num_layers = 8
weights = torch.ones(8,requires_grad=True).to(device)
means = torch.tensor(np.random.randn(8,2),requires_grad=True).to(device)#torch.randn(8,2,requires_grad=True).to(device)
stdevs = torch.tensor(np.abs(np.random.randn(8,2)),requires_grad=True).to(device)
mix = D.Categorical(weights)
comp = D.Independent(D.Normal(means,stdevs), 1)
gmm = D.MixtureSameFamily(mix, comp)

num_iter = 10001#30001
num_iter2 = 200001
loss_max1 = 100
for i in range(num_iter):
x = torch.randn(5000,2)#this can be an arbitrary x samples
loss2 = -gmm.log_prob(x).mean()#-densityflow.log_prob(inputs=x).mean()
optimizer1.zero_grad()
loss2.backward()
optimizer1.step()

我得到的错误是:

0
8.089411823514835
Traceback (most recent call last):

File "/home/cameron/AnacondaProjects/gmm.py", line 183, in <module>
loss2.backward()

File "/home/cameron/anaconda3/envs/torch/lib/python3.7/site-packages/torch/tensor.py", line 221, in backward
torch.autograd.backward(self, gradient, retain_graph, create_graph)

File "/home/cameron/anaconda3/envs/torch/lib/python3.7/site-packages/torch/autograd/__init__.py", line 132, in backward
allow_unreachable=True) # allow_unreachable flag

RuntimeError: Trying to backward through the graph a second time, but the saved intermediate results have already been freed. Specify retain_graph=True when calling backward the first time.

如您所见,模型运行 1 次迭代后。

最佳答案

您的代码中存在排序问题,因为您在训练循环之外创建高斯混合模型,然后在计算损失时,高斯混合模型将尝试使用您在定义模型时设置的参数的初始值,但是 optimizer1.step() 已经修改了那个值,所以即使你设置了 loss2.backward(retain_graph=True) 仍然会出现错误:RuntimeError: one梯度计算所需的变量已通过就地操作修改

此问题的解决方案是在更新参数时简单地创建新的高斯混合模型,示例代码按预期运行:

import numpy as np
import matplotlib.pyplot as plt
import sklearn.datasets as datasets

import torch
from torch import nn
from torch import optim
import torch.distributions as D

num_layers = 8
weights = torch.ones(8,requires_grad=True)
means = torch.tensor(np.random.randn(8,2),requires_grad=True)
stdevs = torch.tensor(np.abs(np.random.randn(8,2)),requires_grad=True)

parameters = [weights, means, stdevs]
optimizer1 = optim.SGD(parameters, lr=0.001, momentum=0.9)

num_iter = 10001
for i in range(num_iter):
mix = D.Categorical(weights)
comp = D.Independent(D.Normal(means,stdevs), 1)
gmm = D.MixtureSameFamily(mix, comp)

optimizer1.zero_grad()
x = torch.randn(5000,2)#this can be an arbitrary x samples
loss2 = -gmm.log_prob(x).mean()#-densityflow.log_prob(inputs=x).mean()
loss2.backward()
optimizer1.step()

print(i, loss2)

关于deep-learning - 在 Pytorch 中估计高斯模型的混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65755730/

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