gpt4 book ai didi

python-3.x - 为什么这个 VAE 实现有时会添加 sigmoid 运算?

转载 作者:行者123 更新时间:2023-11-30 08:35:59 24 4
gpt4 key购买 nike

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

在下面的代码片段中,定义解码器的行为,有一个可选的额外 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 函数?它发挥什么作用?为什么在训练后添加它,而不是在训练期间添加?

最佳答案

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

关于python-3.x - 为什么这个 VAE 实现有时会添加 sigmoid 运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54083075/

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