【问题标题】:Why does this VAE implementation sometimes add a sigmoid operation?为什么这个 VAE 实现有时会添加一个 sigmoid 操作?
【发布时间】:2019-06-02 15:08:10
【问题描述】:

我正在使用 Chainer 框架 (link) 在 Python 中构建变分自动编码器 (VAE)。我在 github 上找到了各种工作示例,并正在尝试调整其中一个。我已经成功地让它运行起来了,它工作得很好,但还有一些我不明白的地方。

在下面定义解码器行为的 sn-p 中,有一个可选的额外 sigmoid 函数:

def decode(self, z, sigmoid=True):
    h = F.leaky_relu(self.ld1(z))
    h = F.leaky_relu(self.ld2(h))
    h = self.ld3(h)
    if sigmoid:
        return F.sigmoid(h)
    else:
        return h

此函数在损失函数中使用 Sigmoid=False 进行训练时使用:

def lf(x):
    mu, ln_var = self.encode(x)
    batchsize = len(mu)

    # reconstruction loss
    rec_loss = 0
    for l in six.moves.range(k):
        z = F.gaussian(mu, ln_var)
                                                       # ↓here↓
        rec_loss += F.bernoulli_nll(x, self.decode(z, sigmoid=False)) / (k * batchsize)
    self.rec_loss = rec_loss

    # adding latent loss
    self.latent_loss = beta * gaussian_kl_divergence(mu, ln_var) / batchsize
    self.loss = self.rec_loss + self.latent_loss
    chainer.report({'rec_loss': self.rec_loss, 'latent_loss': self.latent_loss, 'loss': self.loss}, observer=self)
    return self.loss

训练之后生成示例时,与 Sigmoid=True 一起使用(隐式):

z = C.Variable(np.random.normal(0, 1, (self._batchsize, args.dimz)).astype(np.float32))
    with C.using_config('train', False), C.no_backprop_mode():
        xrand = self._model.decode(z)  # ←here
    xrand = np.asarray(xrand.array).reshape(self._batchsize, 3, 18, 11)

为什么要有这个额外的 sigmoid 函数?它发挥什么作用?为什么要在训练后添加,而不是在训练中添加?

【问题讨论】:

  • 我在官方chainer vae 示例github.com/chainer/chainer/tree/master/examples/vae 中找不到这种sigmoid 操作。您指的是哪个存储库?我猜作者想在推理过程中将输出从-1“剪辑”到+1??
  • @corochann 我相信 Chainer 存储库重写了他们的官方示例。这是我能找到的第一个使用我所指结构的存储库:vqvae

标签: python-3.x machine-learning neural-network autoencoder chainer


【解决方案1】:

阅读this documentation的注释。 F.bernoulli_nll 的输入参数不应该是 sigmoided,因为函数内部包含 sigmoid 函数。因此,在将隐藏变量提供给F.bernoulli_nll 时,指定了sigmoid=False。 (这种困惑我也有同样的经历。)

【讨论】:

    猜你喜欢
    • 2013-12-30
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多