encA = EncoderA(args.wseed, zPrivate_dim=args.n_private) decA = DecoderA(args.wseed, zPrivate_dim=args.n_private) encB = EncoderB(args.wseed) decB = DecoderB(args.wseed) if CUDA: encA.cuda() decA.cuda() encB.cuda() decB.cuda() cuda_tensors(encA) cuda_tensors(decA) cuda_tensors(encB) cuda_tensors(decB) optimizer = torch.optim.Adam(list(encB.parameters()) + list(decB.parameters()) + list(encA.parameters()) + list(decA.parameters()), lr=args.lr) def elbo(q, pA, pB, lamb=1.0, beta1=(1.0, 1.0, 1.0), beta2=(1.0, 1.0, 1.0), bias=1.0): # from each of modality reconst_loss_A, kl_A = probtorch.objectives.mws_tcvae.elbo( q, pA,
encA = EncoderA(args.wseed, zShared_dim=args.n_shared) decA = DecoderA(args.wseed, zShared_dim=args.n_shared) encB = EncoderB(args.wseed, zShared_dim=args.n_shared) decB = DecoderB(args.wseed, zShared_dim=args.n_shared) if CUDA: encA.cuda() decA.cuda() encB.cuda() decB.cuda() cuda_tensors(encA) cuda_tensors(decA) cuda_tensors(encB) cuda_tensors(decB) optimizer = torch.optim.Adam( list(encB.parameters()) + list(decB.parameters()) + list(encA.parameters()) + list(decA.parameters()), lr=args.lr) # # def elbo(q, pA, pB, lamb=1.0, annealing_factor=1.0): # muA_own = q['sharedA'].dist.loc.squeeze(0) # stdA_own = q['sharedA'].dist.scale.squeeze(0) # muB_own = q['sharedB'].dist.loc.squeeze(0) # stdB_own = q['sharedB'].dist.scale.squeeze(0) # # # from each of modality # reconst_loss_A = pA['images_own'].loss.mean() # kl_A = 0.5 * torch.sum(1 + torch.log(stdA_own ** 2 + EPS) - muA_own ** 2 - stdA_own ** 2, # dim=1).mean() #
encA = EncoderA(num_pixels=4096, num_hidden=512, zPrivate_dim=args.n_private, zShared_dim=args.n_shared) decA = DecoderA(num_pixels=4096, num_hidden=512, zPrivate_dim=args.n_private, zShared_dim=args.n_shared) encB = EncoderB(num_pixels=4096, num_hidden=512, zPrivate_dim=args.n_private, zShared_dim=args.n_shared) decB = DecoderB(num_pixels=4096, num_hidden=512, zPrivate_dim=args.n_private, zShared_dim=args.n_shared) if CUDA: encA.cuda() decA.cuda() encB.cuda() decB.cuda() cuda_tensors(encA) cuda_tensors(decA) cuda_tensors(encB) cuda_tensors(decB) optimizer = torch.optim.Adam(list(encB.parameters())+list(decB.parameters())+list(encA.parameters())+list(decA.parameters()), lr=args.lr) def elbo(iter, q, pA, pB, lamb=1.0, beta1=(1.0, 1.0, 1.0), beta2=(1.0, 1.0, 1.0), bias=1.0): # from each of modality reconst_loss_A, kl_A = probtorch.objectives.mws_tcvae.elbo(q, pA, pA['imagesA_sharedA'], latents=['privateA', 'sharedA'], sample_dim=0, batch_dim=1, beta=beta1, bias=bias) reconst_loss_B, kl_B = probtorch.objectives.mws_tcvae.elbo(q, pB, pB['imagesB_sharedB'], latents=['privateB', 'sharedB'], sample_dim=0, batch_dim=1, beta=beta2, bias=bias) if q['poe'] is not None: # by POE # 기대하는바:sharedA가 sharedB를 따르길. 즉 sharedA에만 digit정보가 있으며, 그 permutataion이 GT에서처럼 identity이기를 reconst_loss_poeA, kl_poeA = probtorch.objectives.mws_tcvae.elbo(q, pA, pA['imagesA_poe'], latents=['privateA', 'poe'], sample_dim=0, batch_dim=1, beta=beta1, bias=bias) # 의미 없음. rec 은 항상 0. 인풋이 항상 GT고 poe결과도 GT를 따라갈 확률이 크기 때문(학습 초반엔 A가 unif이라서, 학습 될수록 A가 B label을 잘 따를테니)