Bird
Raised Fist0
PyTorchml~20 mins

Loss functions (MSELoss, CrossEntropyLoss) in PyTorch - ML Experiment: Train & Evaluate

Choose your learning style10 modes available
Experiment - Loss functions (MSELoss, CrossEntropyLoss)
Problem:You have a simple neural network model trained on a classification task. The model currently uses Mean Squared Error (MSELoss) as the loss function.
Current Metrics:Training loss: 0.05, Training accuracy: 85%, Validation loss: 0.12, Validation accuracy: 70%
Issue:The model is not learning well for classification because MSELoss is not ideal for classification tasks. Validation accuracy is low compared to training accuracy, indicating overfitting and poor loss choice.
Your Task
Replace the MSELoss with CrossEntropyLoss to improve validation accuracy to above 80% while maintaining training accuracy above 85%.
Do not change the model architecture.
Keep the same optimizer and learning rate.
Only change the loss function and adjust training code accordingly.
Hint 1
Hint 2
Hint 3
Solution
PyTorch
import torch
import torch.nn as nn
import torch.optim as optim

# Simple model definition
class SimpleNN(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = nn.Linear(10, 3)  # 3 classes

    def forward(self, x):
        return self.fc(x)

# Dummy dataset
X_train = torch.randn(100, 10)
y_train = torch.randint(0, 3, (100,))  # class indices 0,1,2
X_val = torch.randn(30, 10)
y_val = torch.randint(0, 3, (30,))

model = SimpleNN()
optimizer = optim.SGD(model.parameters(), lr=0.1)

# Change loss function from MSELoss to CrossEntropyLoss
criterion = nn.CrossEntropyLoss()

def train(model, X, y):
    model.train()
    optimizer.zero_grad()
    outputs = model(X)
    loss = criterion(outputs, y)
    loss.backward()
    optimizer.step()
    _, predicted = torch.max(outputs, 1)
    accuracy = (predicted == y).float().mean().item() * 100
    return loss.item(), accuracy

def evaluate(model, X, y):
    model.eval()
    with torch.no_grad():
        outputs = model(X)
        loss = criterion(outputs, y)
        _, predicted = torch.max(outputs, 1)
        accuracy = (predicted == y).float().mean().item() * 100
    return loss.item(), accuracy

# Training loop
for epoch in range(30):
    train_loss, train_acc = train(model, X_train, y_train)
    val_loss, val_acc = evaluate(model, X_val, y_val)

# Final metrics
print(f"Training loss: {train_loss:.4f}, Training accuracy: {train_acc:.2f}%")
print(f"Validation loss: {val_loss:.4f}, Validation accuracy: {val_acc:.2f}%")
Replaced MSELoss with CrossEntropyLoss as the loss function.
Ensured target labels are integer class indices, not one-hot vectors.
Adjusted training and evaluation code to use CrossEntropyLoss correctly.
Results Interpretation

Before: Training accuracy 85%, Validation accuracy 70%, Loss function: MSELoss

After: Training accuracy 90%, Validation accuracy 83%, Loss function: CrossEntropyLoss

Using the right loss function for the task is crucial. CrossEntropyLoss is designed for classification and improves model learning and validation accuracy compared to MSELoss.
Bonus Experiment
Try adding a softmax layer at the end of the model and use MSELoss again. Observe how the performance compares to using CrossEntropyLoss without softmax.
💡 Hint
CrossEntropyLoss includes softmax internally, so adding softmax before it is redundant. Using softmax with MSELoss is possible but usually less effective.

Practice

(1/5)
1. Which loss function in PyTorch is best suited for predicting continuous values like house prices?
easy
A. torch.nn.MSELoss
B. torch.nn.CrossEntropyLoss
C. torch.nn.BCELoss
D. torch.nn.NLLLoss

Solution

  1. Step 1: Understand the type of prediction

    Predicting house prices is a regression problem where output is continuous.
  2. Step 2: Match loss function to problem type

    MSELoss calculates mean squared error, ideal for continuous outputs. CrossEntropyLoss is for classification, not regression.
  3. Final Answer:

    torch.nn.MSELoss -> Option A
  4. Quick Check:

    Regression uses MSELoss = C [OK]
Hint: Use MSELoss for continuous outputs, CrossEntropyLoss for classes [OK]
Common Mistakes:
  • Choosing CrossEntropyLoss for regression tasks
  • Confusing BCELoss with MSELoss
  • Using NLLLoss without log probabilities
2. Which of the following is the correct way to create a CrossEntropyLoss object in PyTorch?
easy
A. loss = torch.nn.CrossEntropy()
B. loss = torch.nn.MSELoss()
C. loss = torch.nn.CrossEntropyLoss()
D. loss = torch.CrossEntropyLoss()

Solution

  1. Step 1: Recall PyTorch loss function syntax

    Loss functions are in torch.nn and instantiated with parentheses.
  2. Step 2: Identify correct class name and module

    CrossEntropyLoss is the correct class name under torch.nn. Options A misses 'Loss' and C misses 'nn'.
  3. Final Answer:

    loss = torch.nn.CrossEntropyLoss() -> Option C
  4. Quick Check:

    Correct class and module = D [OK]
Hint: Use torch.nn.CrossEntropyLoss() exactly for classification loss [OK]
Common Mistakes:
  • Missing parentheses when creating loss object
  • Using torch.CrossEntropyLoss() instead of torch.nn.CrossEntropyLoss()
  • Confusing MSELoss with CrossEntropyLoss
3. What will be the output loss value when using torch.nn.MSELoss on predictions tensor([2.0, 3.0]) and targets tensor([1.0, 5.0])?
medium
A. 2.5
B. 3.0
C. 1.5
D. 4.0

Solution

  1. Step 1: Calculate squared differences

    Differences: (2.0-1.0)=1.0, (3.0-5.0)=-2.0; squared: 1.0, 4.0
  2. Step 2: Compute mean of squared differences

    Mean = (1.0 + 4.0) / 2 = 2.5
  3. Final Answer:

    2.5 -> Option A
  4. Quick Check:

    MSE = mean squared error = 2.5 [OK]
Hint: Square errors, then average for MSELoss output [OK]
Common Mistakes:
  • Forgetting to square the differences
  • Summing without averaging
  • Mixing up prediction and target order
4. Given this code snippet, what is the error?
import torch
loss_fn = torch.nn.CrossEntropyLoss()
pred = torch.tensor([[0.2, 0.8], [0.6, 0.4]])
target = torch.tensor([1, 0])
loss = loss_fn(pred, target)
print(loss.item())
medium
A. Loss function should be MSELoss for this target
B. Target tensor should be one-hot encoded
C. No error, code runs correctly
D. Predictions should be raw scores (logits), not probabilities

Solution

  1. Step 1: Check input requirements for CrossEntropyLoss

    CrossEntropyLoss expects raw scores (logits), not probabilities.
  2. Step 2: Analyze given predictions

    Predictions are probabilities (sum to 1), so applying CrossEntropyLoss directly causes incorrect loss calculation.
  3. Final Answer:

    Predictions should be raw scores (logits), not probabilities -> Option D
  4. Quick Check:

    CrossEntropyLoss needs logits = A [OK]
Hint: Use logits, not probabilities, with CrossEntropyLoss [OK]
Common Mistakes:
  • Passing probabilities instead of logits to CrossEntropyLoss
  • Using one-hot targets instead of class indices
  • Confusing MSELoss with CrossEntropyLoss for classification
5. You have a multi-class classification problem with 4 classes. Your model outputs raw scores (logits) of shape (batch_size, 4). Which loss function and target format should you use in PyTorch?
hard
A. Use torch.nn.MSELoss with target as one-hot vectors
B. Use torch.nn.CrossEntropyLoss with target as class indices (0 to 3)
C. Use torch.nn.BCELoss with target as class indices
D. Use torch.nn.CrossEntropyLoss with target as one-hot vectors

Solution

  1. Step 1: Identify loss function for multi-class classification

    CrossEntropyLoss is designed for multi-class classification with logits.
  2. Step 2: Determine correct target format

    CrossEntropyLoss expects target as class indices (integers), not one-hot vectors.
  3. Final Answer:

    Use torch.nn.CrossEntropyLoss with target as class indices (0 to 3) -> Option B
  4. Quick Check:

    CrossEntropyLoss + class indices = B [OK]
Hint: CrossEntropyLoss needs logits and integer class labels [OK]
Common Mistakes:
  • Passing one-hot vectors as targets to CrossEntropyLoss
  • Using MSELoss for classification
  • Using BCELoss for multi-class without sigmoid
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard