Semantic segmentation loss function

Hi Everyone,
I am pretty new to pytorch and I am trying to implement semantic segmentation using
torchvision.models.segmentation. fcn_resnet50 as mentioned on https://pytorch.org/docs/stable/torchvision/models.html#semantic-segmentation

While running my code, I receive the following error:
‘collections.OrderedDict’ object has no attribute ‘log_softmax’

This correspond to the line in the code —> 10 loss = criterion(outputs, labels)
I defined my criterion loss function as criterion = nn.CrossEntropyLoss()

Any help is appreciated!!!
Thanks
Troy

Note that (some) torchvision segmentation models will use a dict as the output.
Could you check that?

Hi, @ptrblck
I used the model deeplabv3_resnet101 and met the same error. I checked that the output is indeed a dict object.
Could you tell me how to use the output in the criterion?
Here is my code in which inputs is a tesor of NxCxHxW and labels is Nx1xHxW

criterion = nn.CrossEntropyLoss(ignore_index=0)
outputs = model(inputs)
loss = criterion(outputs, labels)

I tried to use
loss = criterion(outputs["out"], labels).
But there is a RuntimeError: invalid argument 3: only batches of spatial targets supported (3D tensors) but got targets of dimension: 4 at …\aten\src\THNN/generic/SpatialClassNLLCriterion.c:59

Another question is that my dataset(images) have 5 classes and some ignoer pixels then should I set the num_classes to 5 or 6 in the model ?
Thank you!

outputs['out'] should work and the error points to the additional dimension in your labels tensor.
Squeeze dim1 before passing labels to the loss function and it should work:

labels = labels.squeeze(1)

If you have 5 valid classes and an additional class you want to ignore, you could use 6 classes in total and pass ignore_index=class_index_to_ignore to your loss function.

1 Like

@ptrblck It works now. Many thanks!