def train(self, x, L=1, test=False):
batchsize = x.data.shape[0]
z_mean, z_ln_var = self.encoder(x, test=test, apply_f=False)
loss = 0
for l in xrange(L):
# Sample z
z = F.gaussian(z_mean, z_ln_var)
# Compute lower bound
log_px_z = self.log_px_z(x, z, test=test)
log_pz = self.log_pz(z, z_mean, z_ln_var)
log_qz_x = self.log_qz_x(z, z_mean, z_ln_var)
lower_bound = log_px_z + log_pz - log_qz_x
loss += -lower_bound
loss = F.sum(loss) / L / batchsize
self.zero_grads()
loss.backward()
self.update()
if self.gpu:
loss.to_cpu()
return loss.data
评论列表
文章目录