How to transpose a tensor and apply it to cross entropy loss?

Hi guys. If the dimension of the tensor is [x, y], then the dimension of the labels for the loss would be [x]. I want to create a loss - crossEntropyLoss([x, y], [x]) + crossEntropyLoss([y, x], [y]). For the second part, I transpose the original [x, y] tensor, but it keeps giving errors. I also tried clone and transpose but nothing works, it keeps throwing the same error.

loss_fn = nn.CrossEntropyLoss()
loss = loss_fn(input, labels) + loss_fn(input.T, labels2)

So the problem is how can I transpose a input and use it in the loss function?
Thanks a lot

Hi Charles!

I am skeptical of your proposed use case. However:

In its most common usage, CrossEntropyLoss takes integer class
labels for its target. These should be integers that run from zero
to the number of classes you have, that is to say, the size of the
nClass dimension of the input. Note that transposing your input
can change which values are valid for your class labels.

Here is an example of transposing the input where the corresponding
class labels are constructed to be valid:

>>> import torch
>>> torch.__version__
'1.9.0'
>>> _ = torch.manual_seed (2021)
>>> x = 3
>>> y = 5
>>> input = torch.randn (x, y)
>>> labels = torch.randint (y, (x,))
>>> labels2 = torch.randint (x, (y,))
>>> loss_fn = torch.nn.CrossEntropyLoss()
>>> loss_fn (input, labels)
tensor(2.5805)
>>> loss_fn (input.T, labels2)
tensor(2.9129)

Best.

K. Frank

1 Like

I supposed it is the right way to implement this. But it turns out that I’ve tried the same implementation as yours and CUDA gives me an error.