How can I define BCEloss for intermediary layers of an autoencoder ? I can’t use the already existing function, since that one expects that one of the inputs be labels, not variables. Any ideas?
just write it out with autograd ops, i.e. torch.* operations.
def example_loss(x, t):
loss = ((x - t)^^2).sum()
return loss
Thanks but that’s MSE loss. That one is easy to implement. I was asking about cross entropy.
Would
CE_Loss = - (y*torch.log(a) + (1-y)*torch.log(1-a)).sum().mean()
give the same thing?
Hi @Bixqu,
in principle yes. Generally, it is recommended that you apply a small regularization for the logarithm.
If you try:
lossfunc = torch.nn.BCELoss()
for eps in [1e-11,1e-12,1e-13]:
pred=Variable(torch.FloatTensor([1.0,0.0]))
label=Variable(torch.FloatTensor([0.0,1.0]))
ownloss=-(label*pred.clamp(min=eps).log()+(1-label)*(1-pred).clamp(min=eps).log()).mean()
print("Reg: {} BCELoss: {:.4f} own BCELoss {:.4f}".format(eps, lossfunc(pred, label).data[0], ownloss.data[0]))
gives
Reg: 1e-11 BCELoss: 27.6310 own BCELoss 25.3284
Reg: 1e-12 BCELoss: 27.6310 own BCELoss 27.6310
Reg: 1e-13 BCELoss: 27.6310 own BCELoss 29.9336
(If you are a friend of multilabel, you might sum over the labels and only take the mean over the batch or somesuch.)
Disclaimer: I don’t have any actual knowledge of the implementation of BCELoss.
Best regards
Thomas
Thanks for the reply. I want to apply this as the loss function of an autoencoder so I think it should work.
Hello everybody,
do you know where I can find the exact implementation of the nn.BCELoss() of PyTorch?
I’m trying to implement a binary classificator with a slightly modified loss.
Thanks a lot and best regards,
filippo portera
Thanks but does it refer to F.binary_cross_entropy()?
I couldn’t find the detailed implementation.
The lowest level I reached is:
torch._C._nn.binary_cross_entropy()
The forward
of nn.BCELoss
directs to F.binary_cross_entropy()
which further takes you to torch._C._nn.binary_cross_entropy()
(the lowest you’ve reached).
You can find the CPU implementation of the forward method of binary_cross_entropy
here (and the backward right below it).