Closed Auth0rM0rgan closed 5 years ago
Hi @arminXerror,
I'm assuming fake_A is a sample from B transformed into A and fake_B is a sample from A transformed into B. You train D_A based on real_A and fake_A and D_B based on real_B and fake_B.
So the losses are:
loss_GAN_A = (torch.mean((D_A(real_A) - torch.mean(D_A(fake_A)) - 1) 2) + torch.mean((torch.mean(D_A(real_A)) - D_A(fake_A) - 1) 2))/2 loss_GAN_B = (torch.mean((D_B(real_B) - torch.mean(D_B(fake_B)) - 1) 2) + torch.mean((torch.mean(D_B(real_B)) - D_B(fake_B) - 1) 2))/2 loss_GAN = (loss_GAN_A + loss_GAN_B) / 2
loss_GAN_A = (torch.mean((D_A(fake_A) - torch.mean(D_A(real_A)) - 1) 2) + torch.mean((torch.mean(D_A(fake_A)) - D_A(real_A) - 1) 2))/2 loss_GAN_B = (torch.mean((D_B(fake_B) - torch.mean(D_B(real_B)) - 1) 2) + torch.mean((torch.mean(D_B(fake_B)) - D_B(real_B) - 1) 2))/2 loss_GAN = (loss_GAN_A + loss_GAN_B) / 2
Make sure to detach, add G and all these things, This is just to show you the loss functions.
The loss is more clearly written in : https://arxiv.org/pdf/1901.02474. You can also see in there how to easily change it to hinge loss if you want to try later.
Hi @AlexiaJM ,
Thank you for quick answer.Since there is tanh() layer as the last layer in generators, I need to use Relativistic average LSGAN or Relativistic average HingeGAN.
Is my modification correct for Relativistic average LSGAN ?
G:
loss_GAN_AB = (torch.mean((D_A(real_A) - torch.mean(D_A(fake_A)) + valid) ** 2) +
torch.mean((D_A(fake_A) - torch.mean(D_A(real_B)) - valid) ** 2)) / 2
loss_GAN_BA = (torch.mean((D_B(real_B) - torch.mean(D_B(fake_B)) + valid) ** 2) +
torch.mean((D_B(fake_B) - torch.mean(D_B(real_B)) - valid) ** 2)) / 2
loss_GAN = (loss_GAN_AB + loss_GAN_BA) / 2
valid is a matrix with full of ones:
valid = torch.ones((real_A.size(0), *patch), requires_grad=False).to(device)
Thanks in advance!
You can use other loss functions, the generator has no influence on this. I have tanh in my G and I used all sorts of loss functions.
I'm not sure why you want to switch between "+" and "-", but anyhow both options work. You are correct except for a small typo:
loss_GAN_AB = (torch.mean((D_A(real_A) - torch.mean(D_A(fake_A)) + valid) 2) + torch.mean((D_A(fake_A) - torch.mean(DA(realA)) - valid) 2)) / 2
loss_GAN_BA = (torch.mean((D_B(real_B) - torch.mean(D_B(fake_B)) + valid) 2) + torch.mean((D_B(fake_B) - torch.mean(D_B(real_B)) - valid) 2)) / 2
loss_GAN = (loss_GAN_AB + loss_GAN_BA) / 2
Thanks. In the Readme.md, you are switching between "+" and "-" and I follow the order you wrote the loss function in Readme :)
# Generator loss (You may want to resample again from real and fake data)
errG = (torch.mean((y_pred - torch.mean(y_pred_fake) + y) ** 2) + torch.mean((y_pred_fake - torch.mean(y_pred) - y) ** 2))/2
errG.backward()
Hey @AlexiaJM ,
Good job to your work. I am trying to add Relativism to cycleGAN but I'm little confused about the way to add Relativism to this GAN, since cycleGAN has 2 Generator and 2 Discriminator.
Generators loss in cyclegan calculated as follow:
Discriminator loss:
and criterion_GAN is
MSELoss().
I modified the code and add relativisim but I am not sure I did it correctly. Generators loss:
Discriminators loss:
I would be appreciated if you can help me to figure out how can I add Relativism to cycleGAN.
Thanks in advance!