Pytorch GAN的Parzen窗对数似然估计
我试图重新实现Ian Goodfello等人的原始GAN论文,我需要证明我的实现与作者实现的结果相同或相似。但我不确定如何评估这一指标。我看了一下它们的实现,但得到了一些有趣的结果。在论文中,他们在MNIST上报告了这个指标的225+-2,而我得到的结果是-400000000。我认为这个模型可能不好,但它生成了非常好的MNIST数字图像 有人能告诉我我做错了什么吗 下面是我使用的代码。我从官员那里复制了代码的一部分 注意:有效变量是从MNIST数据集中获取的图像Pytorch GAN的Parzen窗对数似然估计,pytorch,mnist,generative-adversarial-network,log-likelihood,Pytorch,Mnist,Generative Adversarial Network,Log Likelihood,我试图重新实现Ian Goodfello等人的原始GAN论文,我需要证明我的实现与作者实现的结果相同或相似。但我不确定如何评估这一指标。我看了一下它们的实现,但得到了一些有趣的结果。在论文中,他们在MNIST上报告了这个指标的225+-2,而我得到的结果是-400000000。我认为这个模型可能不好,但它生成了非常好的MNIST数字图像 有人能告诉我我做错了什么吗 下面是我使用的代码。我从官员那里复制了代码的一部分 注意:有效变量是从MNIST数据集中获取的图像 def get_nll(x,
def get_nll(x, parzen, batch_size=10):
"""
Credit: Yann N. Dauphin
"""
inds = range(x.shape[0])
n_batches = int(numpy.ceil(float(len(inds)) / batch_size))
print("N batches:", n_batches)
times = []
nlls = []
for i in range(n_batches):
begin = time.time()
nll = parzen(x[inds[i::n_batches]])
end = time.time()
times.append(end-begin)
nlls.extend(nll)
if i % 10 == 0:
print(i, numpy.mean(times), numpy.mean(nlls))
return numpy.array(nlls)
def log_mean_exp(a):
"""
Credit: Yann N. Dauphin
"""
max_ = a.max(1)
return max_ + T.log(T.exp(a - max_.dimshuffle(0, 'x')).mean(1))
def cross_validate_sigma(samples, data, sigmas, batch_size):
lls = []
for sigma in sigmas:
print("Sigma:", sigma)
parzen = theano_parzen(samples, sigma)
tmp = get_nll(data, parzen, batch_size = batch_size)
lls.append(numpy.asarray(tmp).mean())
del parzen
gc.collect()
ind = numpy.argmax(lls)
print(max(lls))
return sigmas[ind]
noise = torch.randn((10000, 100), device=device)
gen_model.eval()
gan_out = gen_model(noise)
sigma_range = numpy.logspace(-1., 0., num=10)
sigma = cross_validate_sigma(gan_out.reshape(10000,-1), valid[0:10000], sigma_range, 100)