Last Updated on 08/10/2025 by Eran Feit
CNN Feature Visualization with Activation Maximization
This post shows how to visualize what a convolutional neural network “imagines” for a target class using Activation Maximization.
We will generate a synthetic image that maximally activates the “Persian cat” neuron of a pre-trained VGG16 model.
The method helps you interpret CNNs, validate model behavior, and create compelling teaching visuals.
We will use TensorFlow Keras, tf-keras-vis, and OpenCV in a clean, reproducible pipeline.
Our primary SEO focus is CNN feature visualization, which balances demand and competition while matching readers’ intent.
You can find the link for the video tutorial here : https://www.youtube.com/watch?v=5J_b_GxnUBU
You can find the full code here : https://ko-fi.com/s/d62d70033b
You can find more similar tutorials in my blog posts page here : https://eranfeit.net/blog/
Here is the Code :
Environment and Model Setup
In this part you install or upgrade dependencies, import libraries, load the VGG16 model with ImageNet weights, print the architecture, and prepare a model_modifier that switches the final activation to linear for optimization.
Keeping include_top=True preserves the classifier so we can directly maximize a class score.
### Ensure the visualization toolkit and TensorFlow are available and up to date.
# pip install --upgrade tf-keras-vis tensorflow
### Import NumPy for array handling.
import numpy as np
### Import TensorFlow for deep learning operations.
import tensorflow as tf
### Import the pre-trained VGG16 model and alias for readability.
from tensorflow.keras.applications.vgg16 import VGG16 as Vgg16Model
### Load VGG16 with ImageNet weights and keep the classification head for class scoring.
model = Vgg16Model(weights='imagenet', include_top=True)
### Print the model summary to confirm architecture and parameter counts.
print (model.summary())
### Prepare a function that modifies the model before visualization.
### We change the final softmax to linear to expose raw logits for maximization.
# define a function to modify the model
# we will change the softmax to a linear function
def model_modifier(modl):
### Set the last layer activation to linear to make optimization well behaved.
modl.layers[-1].activation = tf.keras.activations.linear # All the layers except the last one will have activation=linear
You can find the full code here : https://ko-fi.com/s/d62d70033b
You verified the environment, loaded a pre-trained classifier, and ensured the output activation is suitable for activation maximization.
This prepares the model for stable optimization toward a specific class.
Build the Activation Maximization Pipeline
Here you create the ActivationMaximization object, define a loss that targets the “Persian cat” class index, run the optimizer, and convert the resulting image to uint8 for display and saving.
Progress printing helps monitor the iterations.
### Import the activation maximization utility that performs gradient-based optimization on the input.
# create an object instance of Acticvation maximization class
from tf_keras_vis.activation_maximization import ActivationMaximization
### Instantiate the visualizer with our model and the modifier.
### clone=True duplicates the model so the original instance remains unchanged.
activation_maximization = ActivationMaximization(model,
model_modifier,
clone=True) # clone means , duplicate the model and not update the current one
### Define a loss that returns the logit for the target ImageNet class.
### We will maximize the score for the Persian cat class.
# Now , We will define a loss function that maximize a specific class.
# leats maximize the class of "Persian cat" , class no. 283
# https://deeplearning.cms.waikato.ac.nz/user-guide/class-maps/IMAGENET/
def loss(output):
### Return the score for class index 283 which corresponds to Persian cat.
return output[:, 283]
### Import a callback to print progress at intervals.
from tf_keras_vis.utils.callbacks import Print
### Run activation maximization to synthesize an image that maximizes the target class score.
### The callback prints status every 50 iterations for transparency.
# visual the class
activation = activation_maximization(loss,
callbacks=[Print(interval=50)] )
### Retrieve the synthesized image from the result list and convert to 8-bit for rendering.
#lets grab the image after running the process
image = activation[0].astype(np.uint8)
You can find the full code here : https://ko-fi.com/s/d62d70033b
You targeted a specific class with a simple loss and let tf-keras-vis optimize a canvas image toward high activation.
The output is a synthetic image reflecting what the network associates with the Persian cat concept.
Post-processing and Display with OpenCV
Finally, you convert color space from RGB to BGR for OpenCV, upscale the visualization for clarity, and display it in a window.
This makes the result presentation-ready for notebooks, slides, or blog images.
### Import OpenCV for color conversion, resizing, and display.
# show the image using OpenCv
import cv2
### Convert the image from RGB to BGR because OpenCV expects BGR by default.
# change the image from RGB to BGR
imageCV = cv2.cvtColor(image , cv2.COLOR_RGB2BGR)
### Define the upscaling percentage to view more detail comfortably.
# enlarge the image
scale_percent = 200
### Compute the new width using the chosen scale.
w = int(imageCV.shape[1]* scale_percent / 100)
### Compute the new height using the chosen scale.
h = int(imageCV.shape[0]* scale_percent / 100)
### Package the target dimensions for the resize function.
dim = (w, h)
### Resize the image using an area-based interpolator for smooth scaling.
resized = cv2.resize(imageCV, dim , interpolation=cv2.INTER_AREA)
### Display the synthesized class visualization in a window titled "Persian Cat".
cv2.imshow("Persian Cat",resized )
### Keep the window open until a key is pressed.
cv2.waitKey(0)
You can find the full code here : https://ko-fi.com/s/d62d70033b
You prepared the synthesized image for display and scaled it to highlight fine textures.
Your activation maximization pipeline is complete and ready to reuse for any ImageNet class.


Connect :
☕ Buy me a coffee — https://ko-fi.com/eranfeit
🖥️ Email : feitgemel@gmail.com
🤝 Fiverr : https://www.fiverr.com/s/mB3Pbb
Planning a trip and want ideas you can copy fast?
Here are three detailed guides from our travels:
• 5-Day Ireland Itinerary: Cliffs, Castles, Pubs & Wild Atlantic Views
https://eranfeit.net/unforgettable-trip-to-ireland-full-itinerary/
• My Kraków Travel Guide: Best Places to Eat, Stay & Explore
https://eranfeit.net/my-krakow-travel-guide-best-places-to-eat-stay-explore/
• Northern Greece: Athens, Meteora, Tzoumerka, Ioannina & Nafpaktos (7 Days)
https://eranfeit.net/my-amazing-trip-to-greece/
Each guide includes maps, practical tips, and family-friendly stops—so you can plan in minutes, not hours.
Enjoy,
Eran