visualkeras: custom vgg16 example#
An example showing the visualkeras function
used by a tf.keras.Model model.
# Authors: The scikit-plots developers
# SPDX-License-Identifier: BSD-3-Clause
# visualkeras Need aggdraw tensorflow
# !pip install scikitplot[core, cpu]
# or
# !pip install aggdraw
# !pip install tensorflow
# pip install protobuf==5.29.4
import tensorflow as tf
# Clear any session to reset the state of TensorFlow/Keras
tf.keras.backend.clear_session()
from scikitplot import visualkeras
/home/circleci/.pyenv/versions/3.11.14/lib/python3.11/site-packages/keras/src/export/tf2onnx_lib.py:8: FutureWarning:
In the future `np.object` will be defined as the corresponding NumPy scalar.
create VGG16
image_size = 224
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.InputLayer(shape=(image_size, image_size, 3)))
model.add(tf.keras.layers.ZeroPadding2D((1, 1)))
model.add(tf.keras.layers.Conv2D(64, activation="relu", kernel_size=(3, 3)))
model.add(tf.keras.layers.ZeroPadding2D((1, 1)))
model.add(tf.keras.layers.Conv2D(64, activation="relu", kernel_size=(3, 3)))
model.add(visualkeras.SpacingDummyLayer())
model.add(tf.keras.layers.MaxPooling2D((2, 2), strides=(2, 2)))
model.add(tf.keras.layers.ZeroPadding2D((1, 1)))
model.add(tf.keras.layers.Conv2D(128, activation="relu", kernel_size=(3, 3)))
model.add(tf.keras.layers.ZeroPadding2D((1, 1)))
model.add(tf.keras.layers.Conv2D(128, activation="relu", kernel_size=(3, 3)))
model.add(visualkeras.SpacingDummyLayer())
model.add(tf.keras.layers.MaxPooling2D((2, 2), strides=(2, 2)))
model.add(tf.keras.layers.ZeroPadding2D((1, 1)))
model.add(tf.keras.layers.Conv2D(256, activation="relu", kernel_size=(3, 3)))
model.add(tf.keras.layers.ZeroPadding2D((1, 1)))
model.add(tf.keras.layers.Conv2D(256, activation="relu", kernel_size=(3, 3)))
model.add(tf.keras.layers.ZeroPadding2D((1, 1)))
model.add(tf.keras.layers.Conv2D(256, activation="relu", kernel_size=(3, 3)))
model.add(visualkeras.SpacingDummyLayer())
model.add(tf.keras.layers.MaxPooling2D((2, 2), strides=(2, 2)))
model.add(tf.keras.layers.ZeroPadding2D((1, 1)))
model.add(tf.keras.layers.Conv2D(512, activation="relu", kernel_size=(3, 3)))
model.add(tf.keras.layers.ZeroPadding2D((1, 1)))
model.add(tf.keras.layers.Conv2D(512, activation="relu", kernel_size=(3, 3)))
model.add(tf.keras.layers.ZeroPadding2D((1, 1)))
model.add(tf.keras.layers.Conv2D(512, activation="relu", kernel_size=(3, 3)))
model.add(visualkeras.SpacingDummyLayer())
model.add(tf.keras.layers.MaxPooling2D((2, 2), strides=(2, 2)))
model.add(tf.keras.layers.ZeroPadding2D((1, 1)))
model.add(tf.keras.layers.Conv2D(512, activation="relu", kernel_size=(3, 3)))
model.add(tf.keras.layers.ZeroPadding2D((1, 1)))
model.add(tf.keras.layers.Conv2D(512, activation="relu", kernel_size=(3, 3)))
model.add(tf.keras.layers.ZeroPadding2D((1, 1)))
model.add(tf.keras.layers.Conv2D(512, activation="relu", kernel_size=(3, 3)))
model.add(tf.keras.layers.MaxPooling2D())
model.add(visualkeras.SpacingDummyLayer())
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(4096, activation="relu"))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(4096, activation="relu"))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(1000, activation="softmax"))
# model.summary()
Now visualize the model!
from collections import defaultdict
color_map = defaultdict(dict)
color_map[tf.keras.layers.Conv2D]["fill"] = "orange"
color_map[tf.keras.layers.ZeroPadding2D]["fill"] = "gray"
color_map[tf.keras.layers.Dropout]["fill"] = "pink"
color_map[tf.keras.layers.MaxPooling2D]["fill"] = "red"
color_map[tf.keras.layers.Dense]["fill"] = "green"
color_map[tf.keras.layers.Flatten]["fill"] = "teal"
from PIL import ImageFont
ImageFont.load_default()
<PIL.ImageFont.FreeTypeFont object at 0x7f6ea8680050>
img_vgg16 = visualkeras.layered_view(
model,
type_ignore=[visualkeras.SpacingDummyLayer],
# to_file="result_images/vgg16.png",
save_fig=True,
save_fig_filename="vgg16.png",
)

2026-01-06 16:56:18.314857: W scikitplot 140115099773824 utils_pil.py:204:load_font] Error loading system font: cannot open resource
2026-01-06 16:56:18.314956: W scikitplot 140115099773824 utils_pil.py:206:load_font] Falling back to PIL default font.
2026-01-06 16:56:18.315075: W scikitplot 140115099773824 _layered.py:216:layered_view] The legend_text_spacing_offset parameter is deprecated andwill be removed in a future release.
img_vgg16_legend = visualkeras.layered_view(
model,
type_ignore=[visualkeras.SpacingDummyLayer],
legend=True,
font={
"font_size": 61,
# 'use_default_font': False,
# 'font_path': '/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf'
},
# to_file="result_images/vgg16_legend.png",
save_fig=True,
save_fig_filename="vgg16_legend.png",
)
img_vgg16_legend

2026-01-06 16:56:19.808680: W scikitplot 140115099773824 utils_pil.py:204:load_font] Error loading system font: cannot open resource
2026-01-06 16:56:19.808781: W scikitplot 140115099773824 utils_pil.py:206:load_font] Falling back to PIL default font.
2026-01-06 16:56:19.808901: W scikitplot 140115099773824 _layered.py:216:layered_view] The legend_text_spacing_offset parameter is deprecated andwill be removed in a future release.
<matplotlib.image.AxesImage object at 0x7f6ea829a790>
img_vgg16_spacing_layers = visualkeras.layered_view(
model,
type_ignore=[],
spacing=0,
# to_file="result_images/vgg16_spacing_layers.png",
save_fig=True,
save_fig_filename="vgg16_spacing_layers.png",
)
img_vgg16_spacing_layers

2026-01-06 16:56:20.864397: W scikitplot 140115099773824 utils_pil.py:204:load_font] Error loading system font: cannot open resource
2026-01-06 16:56:20.864498: W scikitplot 140115099773824 utils_pil.py:206:load_font] Falling back to PIL default font.
2026-01-06 16:56:20.864609: W scikitplot 140115099773824 _layered.py:216:layered_view] The legend_text_spacing_offset parameter is deprecated andwill be removed in a future release.
<matplotlib.image.AxesImage object at 0x7f6ea832d390>
img_vgg16_type_ignore = visualkeras.layered_view(
model,
type_ignore=[
tf.keras.layers.ZeroPadding2D,
tf.keras.layers.Dropout,
tf.keras.layers.Flatten,
visualkeras.SpacingDummyLayer,
],
# to_file="result_images/vgg16_type_ignore.png",
save_fig=True,
save_fig_filename="vgg16_type_ignore.png",
)
img_vgg16_type_ignore

2026-01-06 16:56:21.745346: W scikitplot 140115099773824 utils_pil.py:204:load_font] Error loading system font: cannot open resource
2026-01-06 16:56:21.745439: W scikitplot 140115099773824 utils_pil.py:206:load_font] Falling back to PIL default font.
2026-01-06 16:56:21.745551: W scikitplot 140115099773824 _layered.py:216:layered_view] The legend_text_spacing_offset parameter is deprecated andwill be removed in a future release.
<matplotlib.image.AxesImage object at 0x7f6ea8338a90>
img_vgg16_color_map = visualkeras.layered_view(
model,
type_ignore=[visualkeras.SpacingDummyLayer],
color_map=color_map,
# to_file="result_images/vgg16_color_map.png",
save_fig=True,
save_fig_filename="vgg16_color_map.png",
)
img_vgg16_color_map

2026-01-06 16:56:22.361181: W scikitplot 140115099773824 utils_pil.py:204:load_font] Error loading system font: cannot open resource
2026-01-06 16:56:22.361263: W scikitplot 140115099773824 utils_pil.py:206:load_font] Falling back to PIL default font.
2026-01-06 16:56:22.361363: W scikitplot 140115099773824 _layered.py:216:layered_view] The legend_text_spacing_offset parameter is deprecated andwill be removed in a future release.
<matplotlib.image.AxesImage object at 0x7f6ea82074d0>
img_vgg16_flat = visualkeras.layered_view(
model,
type_ignore=[visualkeras.SpacingDummyLayer],
draw_volume=False,
# to_file="result_images/vgg16_flat.png",
save_fig=True,
save_fig_filename="vgg16_flat.png",
)
img_vgg16_flat

2026-01-06 16:56:23.297665: W scikitplot 140115099773824 utils_pil.py:204:load_font] Error loading system font: cannot open resource
2026-01-06 16:56:23.297774: W scikitplot 140115099773824 utils_pil.py:206:load_font] Falling back to PIL default font.
2026-01-06 16:56:23.297888: W scikitplot 140115099773824 _layered.py:216:layered_view] The legend_text_spacing_offset parameter is deprecated andwill be removed in a future release.
<matplotlib.image.AxesImage object at 0x7f6ea8233390>
img_vgg16_scaling = visualkeras.layered_view(
model,
type_ignore=[visualkeras.SpacingDummyLayer],
# legend=True,
min_z=1,
min_xy=1,
max_z=4096,
max_xy=4096,
scale_z=0.5,
scale_xy=11,
# font={'font_size': 99},
# to_file="result_images/vgg16_scaling.png",
save_fig=True,
save_fig_filename="vgg16_scaling.png",
)
img_vgg16_scaling

2026-01-06 16:56:23.972068: W scikitplot 140115099773824 utils_pil.py:204:load_font] Error loading system font: cannot open resource
2026-01-06 16:56:23.972166: W scikitplot 140115099773824 utils_pil.py:206:load_font] Falling back to PIL default font.
2026-01-06 16:56:23.972283: W scikitplot 140115099773824 _layered.py:216:layered_view] The legend_text_spacing_offset parameter is deprecated andwill be removed in a future release.
<matplotlib.image.AxesImage object at 0x7f6ea80d5790>
Total running time of the script: (0 minutes 19.903 seconds)
Related examples
Visualkeras: Spam Classification Conv1D Dense Example
Visualkeras: Spam Classification Conv1D Dense Example