Bird
Raised Fist0
PyTorchml~20 mins

Reshaping (view, reshape, squeeze, unsqueeze) in PyTorch - ML Experiment: Train & Evaluate

Choose your learning style10 modes available
Experiment - Reshaping (view, reshape, squeeze, unsqueeze)
Problem:You have a tensor representing a batch of images with shape (32, 3, 28, 28). You want to prepare this tensor for a fully connected neural network by flattening each image into a vector. Currently, the tensor shape is not compatible with the network input.
Current Metrics:Tensor shape before reshaping: torch.Size([32, 3, 28, 28])
Issue:The tensor shape is 4D, but the fully connected layer expects 2D input (batch_size, features). Without reshaping, the model will raise an error.
Your Task
Reshape the input tensor from shape (32, 3, 28, 28) to (32, 3*28*28) so it can be fed into a fully connected layer. Then, after the layer, reshape the output back to (32, 10, 1, 1) to simulate a feature map. Use PyTorch functions view, reshape, squeeze, and unsqueeze appropriately.
Do not change the batch size (32).
Use PyTorch tensor operations only.
Avoid using loops.
Hint 1
Hint 2
Hint 3
Solution
PyTorch
import torch

# Original tensor simulating a batch of images
x = torch.randn(32, 3, 28, 28)
print(f"Original shape: {x.shape}")

# Flatten each image to a vector of size 3*28*28
x_flat = x.view(32, -1)  # or x.reshape(32, -1)
print(f"After flattening: {x_flat.shape}")

# Simulate a fully connected layer output with 10 features
fc_output = torch.randn(32, 10)
print(f"Fully connected output shape: {fc_output.shape}")

# Reshape fc_output to (32, 10, 1, 1) to simulate feature maps
fc_reshaped = fc_output.unsqueeze(-1).unsqueeze(-1)
print(f"After unsqueeze: {fc_reshaped.shape}")

# Remove the last two dimensions if needed
fc_squeezed = fc_reshaped.squeeze(-1).squeeze(-1)
print(f"After squeeze: {fc_squeezed.shape}")
Used view to flatten the 4D tensor to 2D for fully connected layer input.
Used unsqueeze twice to add two singleton dimensions to the fully connected output.
Used squeeze twice to remove singleton dimensions from the tensor.
Results Interpretation

Before: Input tensor shape was (32, 3, 28, 28), which is 4D and incompatible with fully connected layers.

After: Flattened tensor shape is (32, 2352), suitable for fully connected layers. Then reshaped output to (32, 10, 1, 1) using unsqueeze, and back to (32, 10) using squeeze.

Reshaping tensors is essential to prepare data for different layers in neural networks. Using view or reshape changes tensor shape without copying data. Squeeze removes dimensions of size 1, and unsqueeze adds such dimensions. These operations help adapt tensor shapes flexibly.
Bonus Experiment
Try reshaping the tensor using only reshape instead of view, and verify if the output shapes remain the same.
💡 Hint
Both view and reshape can change tensor shapes, but reshape can handle non-contiguous tensors better. Check if the tensor is contiguous before using view.

Practice

(1/5)
1. What does the torch.squeeze() function do to a tensor?
easy
A. Adds a new dimension of size 1 at a specified position
B. Removes all dimensions of size 1 from the tensor
C. Changes the tensor's data without changing its shape
D. Flattens the tensor into a 1D vector

Solution

  1. Step 1: Understand the purpose of squeeze

    torch.squeeze() removes dimensions that have size 1, effectively reducing unnecessary dimensions.
  2. Step 2: Differentiate from other reshape functions

    Unlike unsqueeze which adds size 1 dims, squeeze removes them without changing data.
  3. Final Answer:

    Removes all dimensions of size 1 from the tensor -> Option B
  4. Quick Check:

    squeeze removes size 1 dims = B [OK]
Hint: Squeeze removes dims with size 1, like cleaning empty boxes [OK]
Common Mistakes:
  • Confusing squeeze with unsqueeze
  • Thinking squeeze changes data values
  • Assuming squeeze flattens the tensor
2. Which of the following is the correct syntax to add a new dimension at position 0 using PyTorch?
easy
A. tensor.unsqueeze(0)
B. tensor.unsqueeze(1)
C. tensor.squeeze(0)
D. tensor.reshape(0)

Solution

  1. Step 1: Recall unsqueeze syntax

    unsqueeze(dim) adds a dimension of size 1 at the specified dim index.
  2. Step 2: Identify correct dimension index

    To add at position 0 (the front), use unsqueeze(0). tensor.unsqueeze(1) adds at position 1, C squeezes, D is invalid.
  3. Final Answer:

    tensor.unsqueeze(0) -> Option A
  4. Quick Check:

    unsqueeze(0) adds dim at front = A [OK]
Hint: unsqueeze(dim) adds size 1 dim at dim index [OK]
Common Mistakes:
  • Using squeeze instead of unsqueeze
  • Passing wrong dimension index
  • Using reshape with a single integer argument
3. Given the tensor t = torch.randn(2, 1, 3), what is the shape after t.view(2, 3)?
medium
A. (2, 3)
B. (2, 1, 3)
C. (1, 6)
D. RuntimeError due to incompatible shape

Solution

  1. Step 1: Understand original tensor shape

    Tensor t has shape (2, 1, 3), total elements = 2*1*3 = 6.
  2. Step 2: Check if view(2, 3) is compatible

    New shape (2, 3) also has 6 elements, so view can reshape without error.
  3. Final Answer:

    (2, 3) -> Option A
  4. Quick Check:

    view reshapes without changing total elements = A [OK]
Hint: view reshapes if total elements match exactly [OK]
Common Mistakes:
  • Confusing view with squeeze or unsqueeze
  • Assuming view changes data order
  • Trying incompatible shapes causing runtime error
4. What is wrong with this code snippet?
import torch
t = torch.randn(3, 1, 4)
t = t.view(3, 3, 1, 1)
medium
A. The new shape has more elements than original tensor
B. view cannot add new dimensions, only reshape existing ones
C. view requires contiguous tensor, but t is not contiguous
D. The new shape is incompatible with the total number of elements

Solution

  1. Step 1: Calculate original tensor elements

    Original shape (3,1,4) has 3*1*4 = 12 elements.
  2. Step 2: Calculate new shape elements

    New shape (3,3,1,1) has 3*3*1*1 = 9 elements, which does not match.
  3. Final Answer:

    The new shape is incompatible with the total number of elements -> Option D
  4. Quick Check:

    view fails if total elements don't match = C [OK]
Hint: Check total elements before view; must match exactly [OK]
Common Mistakes:
  • Assuming view cannot add dimensions
  • Confusing contiguous memory errors
  • Miscounting total elements
5. You have a tensor x of shape (4, 1, 28, 28). You want to prepare it for a fully connected layer that expects input shape (4, 784). Which sequence of PyTorch operations correctly reshapes x without changing data order?
hard
A. x = x.view(4, 28, 28)
B. x = x.unsqueeze(1).view(4, 1, 784)
C. x = x.squeeze(1).view(4, 784)
D. x = x.reshape(4, 1, 784)

Solution

  1. Step 1: Understand original tensor shape

    x has shape (4, 1, 28, 28). The middle dimension is size 1, which is unnecessary for flattening.
  2. Step 2: Remove the size 1 dimension

    Use squeeze(1) to remove the dimension of size 1 at index 1, resulting in shape (4, 28, 28).
  3. Step 3: Flatten the last two dimensions

    Use view(4, 784) to reshape (4, 28, 28) into (4, 784) without changing data order.
  4. Final Answer:

    x = x.squeeze(1).view(4, 784) -> Option C
  5. Quick Check:

    Remove size 1 dim then flatten = D [OK]
Hint: Squeeze first to remove size 1 dims, then view to flatten [OK]
Common Mistakes:
  • Trying to view directly without squeezing
  • Using unsqueeze unnecessarily
  • Confusing reshape and view effects
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