I am following the following official Pytorch tutorial to prepare a face pose point map dataset, but it doesn’t include the code to implement the predictive model.
https://pytorch.org/tutorials/beginner/data_loading_tutorial.html 74
I build a CNN with Adam optimizer and MultiLabelSoftMarginLoss because it needs to predict an array of points representing the face point map for each input image. It is not working.
The code for the dataset preparation is the following:
https://pytorch.org/tutorials/beginner/data_loading_tutorial.html 74
My detailed code and comments are the following:

  
      github.com
  
  
    rubencg195/Pytorch-Tutorials/blob/master/Machine Learning - Face Recognition CNN Pytorch.ipynb 41
{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "DATA LOADING AND PROCESSING TUTORIAL",
      "version": "0.3.2",
      "provenance": [],
      "collapsed_sections": [],
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {


  This file has been truncated. show original

  
  
    
    
  
  


The code for the model and training is the following:
MODEL
class ConvNet(nn.Module):
    def __init__(self, num_classes=10):
        super(ConvNet, self).__init__()
        self.layer1 = nn.Sequential(
            nn.Conv2d(3, 18, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(18),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2, padding=0))
       self.layer2 = nn.Sequential(
            nn.Conv2d(18, 32, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(32),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2, padding=0))
       self.fc = nn.Linear(32 * 56 * 56, num_classes)
    
   def forward(self, x):
       out = self.layer1(x)
       out = self.layer2(out)
       out = out.reshape(out.size(0), -1)
       out = self.fc(out)
       return out

TRAIN THE MODEL
model = ConvNet(num_classes).to(device)

# Loss and optimizer
criterion = nn.MultiLabelSoftMarginLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

# Train the model
total_step = len(train_loader)
for epoch in range(num_epochs):
    for i, sample_batched in enumerate(train_loader):
        images_batch, landmarks_batch = \
            sample_batched['image'], sample_batched['landmarks']

        images = images_batch
        labels = landmarks_batch.reshape(-1, 68 * 2)

        images = Variable(images.float())
        labels = Variable(labels)

        images = images.to(device)
        labels = labels.to(device)

        # Forward pass
        outputs = model(images)

        loss = criterion(outputs, labels.float())

        # Backward and optimize
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if (i+1) % 5 == 0:
            print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' 
                   .format(epoch+1, num_epochs, i+1, total_step, loss.item()))

Expected results:

Prediction of the face point map

Result

The model does not find an optimal local minimum during training.

for detailed code and comments, see the following Jupiter notebook.

  
      github.com
  
  
    rubencg195/Pytorch-Tutorials/blob/master/Machine Learning - Face Recognition CNN Pytorch.ipynb 41
{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "DATA LOADING AND PROCESSING TUTORIAL",
      "version": "0.3.2",
      "provenance": [],
      "collapsed_sections": [],
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {


  This file has been truncated. show original