Почему эта реализация VAE иногда добавляет сигмовидную операцию? - PullRequest
0 голосов
/ 08 января 2019

Я строю Variational Autoencoder (VAE) в Python, используя платформу Chainer (ссылка) . Я нашел различные рабочие примеры на github и пытаюсь адаптировать один из них. Я преуспел в том, чтобы заставить его работать, и он работает просто отлично, но я все еще кое-что не понимаю.

В следующем фрагменте, определяющем поведение декодера, есть дополнительная дополнительная функция сигмоида:

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)

Почему эта дополнительная сигмовидная функция? Какую роль он выполняет? Зачем добавлять его после тренировки, а не во время?

1 Ответ

0 голосов
/ 08 января 2019

Прочитайте примечание к этой документации . Входной аргумент F.bernoulli_nll не должен быть sigmoid ed, потому что функция внутри содержит сигмоидную функцию. Поэтому при подаче скрытой переменной в F.bernoulli_nll указывается sigmoid=False. (У меня был точно такой же опыт этой путаницы.)

...