Feature map visualization helps us see what a neural network learns inside. It shows which parts of the input the model focuses on.
Feature map visualization in PyTorch
Start learning this pattern below
Jump into concepts and practice - no test required
feature_maps = model.layer(input_tensor) # feature_maps shape: (batch_size, channels, height, width) # To visualize, convert feature_maps to numpy and plot each channel as an image
Feature maps are the outputs of convolutional layers.
They have 4 dimensions: batch size, channels, height, and width.
feature_maps = model.conv1(input_image)
print(feature_maps.shape)import matplotlib.pyplot as plt for i in range(feature_maps.shape[1]): plt.subplot(1, feature_maps.shape[1], i+1) plt.imshow(feature_maps[0, i].detach().cpu(), cmap='gray') plt.axis('off') plt.show()
This code creates a simple CNN with one convolutional layer. It passes a random image through the model, gets the feature maps, prints their shape, and shows each channel as a small image.
import torch import torch.nn as nn import matplotlib.pyplot as plt # Simple CNN model class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() self.conv1 = nn.Conv2d(1, 4, kernel_size=3, padding=1) def forward(self, x): x = self.conv1(x) return x # Create model and dummy input model = SimpleCNN() input_tensor = torch.randn(1, 1, 28, 28) # batch=1, channel=1, 28x28 image # Get feature maps from conv1 feature_maps = model(input_tensor) # Print shape print(f"Feature maps shape: {feature_maps.shape}") # Plot feature maps fig, axs = plt.subplots(1, feature_maps.shape[1], figsize=(12,3)) for i in range(feature_maps.shape[1]): axs[i].imshow(feature_maps[0, i].detach().cpu(), cmap='gray') axs[i].axis('off') axs[i].set_title(f'Channel {i+1}') plt.show()
Detach the feature maps from the computation graph before plotting to avoid memory issues.
Use cpu() if your tensors are on GPU before converting to numpy or plotting.
Feature maps show patterns detected by filters, like edges or textures.
Feature maps are outputs of convolution layers showing learned patterns.
Visualizing them helps understand and debug CNNs.
Plot each channel as an image to see what the model focuses on.
Practice
Solution
Step 1: Understand CNN layer outputs
Convolutional layers process input images and produce outputs called feature maps that highlight detected features.Step 2: Identify feature map role
Feature maps represent learned patterns like edges or textures, not inputs or final outputs.Final Answer:
The output of a convolutional layer showing detected patterns -> Option DQuick Check:
Feature map = convolution output [OK]
- Confusing feature maps with input images
- Thinking feature maps are final model outputs
- Mixing feature maps with loss values
conv1 given an input tensor x?Solution
Step 1: Understand PyTorch layer call
In PyTorch, calling a layer like a function with input tensor returns its output (feature maps).Step 2: Check syntax correctness
Usingconv1(x)is correct;x.conv1()orconv1.output(x)are invalid syntax.Final Answer:
feature_maps = conv1(x) -> Option BQuick Check:
Call layer as function = correct [OK]
- Trying to call layer as method on input tensor
- Using non-existent methods like .output()
- Calling forward() directly instead of layer call
feature_maps?
import torch import torch.nn as nn conv = nn.Conv2d(in_channels=3, out_channels=5, kernel_size=3, padding=1) x = torch.randn(1, 3, 32, 32) feature_maps = conv(x)
Solution
Step 1: Analyze conv layer parameters
Input has shape [1, 3, 32, 32]. Conv2d has 5 output channels, kernel size 3, padding 1.Step 2: Calculate output spatial size
Padding 1 keeps spatial size same: 32x32. Output channels = 5, batch size = 1.Final Answer:
[1, 5, 32, 32] -> Option CQuick Check:
Output shape = [batch, out_channels, height, width] [OK]
- Ignoring padding effect on output size
- Confusing input channels with output channels
- Mixing batch size with channel dimension
import matplotlib.pyplot as plt feature_maps = conv(x) plt.imshow(feature_maps[0]) plt.show()What is the likely cause of the error?
Solution
Step 1: Understand feature_maps shape
feature_maps[0] is shape [channels, height, width], multiple channels not a single image.Step 2: plt.imshow expects 2D or 3D image
plt.imshow needs 2D grayscale or 3D RGB image, but feature_maps[0] has multiple channels causing error.Final Answer:
feature_maps[0] has multiple channels, plt.imshow expects 2D or 3D image -> Option AQuick Check:
Multi-channel tensor ≠ single image [OK]
- Trying to plot all channels at once with plt.imshow
- Assuming conv output is scalar
- Not checking input tensor existence
conv for a single input image x. Which code correctly plots each channel as a separate grayscale image using matplotlib?Solution
Step 1: Extract feature maps and iterate channels
feature_maps shape is [batch, channels, height, width]. We select batch 0 and loop over channels.Step 2: Plot each channel as grayscale image
Use plt.subplot to arrange images, plt.imshow with cmap='gray' to show each channel properly.Final Answer:
feature_maps = conv(x) for i in range(feature_maps.shape[1]): plt.subplot(1, feature_maps.shape[1], i+1) plt.imshow(feature_maps[0, i].detach().cpu(), cmap='gray') plt.show() -> Option AQuick Check:
Loop channels, plot each with cmap='gray' [OK]
- Plotting entire tensor at once
- Not detaching or moving tensor to CPU
- Ignoring batch dimension
