Pytorch GAN的Parzen窗对数似然估计

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,

我试图重新实现Ian Goodfello等人的原始GAN论文,我需要证明我的实现与作者实现的结果相同或相似。但我不确定如何评估这一指标。我看了一下它们的实现,但得到了一些有趣的结果。在论文中,他们在MNIST上报告了这个指标的225+-2,而我得到的结果是-400000000。我认为这个模型可能不好,但它生成了非常好的MNIST数字图像

有人能告诉我我做错了什么吗

下面是我使用的代码。我从官员那里复制了代码的一部分

注意:有效变量是从MNIST数据集中获取的图像

 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)