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

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

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 0x7fa0b1185090>
img_vgg16 = visualkeras.layered_view(
    model,
    type_ignore=[visualkeras.SpacingDummyLayer],
    # to_file="result_images/vgg16.png",
    save_fig=True,
    save_fig_filename="vgg16.png",
)
plot custom vgg16
2025-11-30 16:06:21.657821: W scikitplot 140329820801920 utils_pil.py:204:load_font] Error loading system font: cannot open resource
2025-11-30 16:06:21.657991: W scikitplot 140329820801920 utils_pil.py:206:load_font] Falling back to PIL default font.
2025-11-30 16:06:21.658178: W scikitplot 140329820801920 layered.py:203: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
plot custom vgg16
2025-11-30 16:06:23.148971: W scikitplot 140329820801920 utils_pil.py:204:load_font] Error loading system font: cannot open resource
2025-11-30 16:06:23.149062: W scikitplot 140329820801920 utils_pil.py:206:load_font] Falling back to PIL default font.
2025-11-30 16:06:23.149169: W scikitplot 140329820801920 layered.py:203:layered_view] The legend_text_spacing_offset parameter is deprecated andwill be removed in a future release.

<matplotlib.image.AxesImage object at 0x7fa0987a2bd0>
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
plot custom vgg16
2025-11-30 16:06:24.125013: W scikitplot 140329820801920 utils_pil.py:204:load_font] Error loading system font: cannot open resource
2025-11-30 16:06:24.125106: W scikitplot 140329820801920 utils_pil.py:206:load_font] Falling back to PIL default font.
2025-11-30 16:06:24.125210: W scikitplot 140329820801920 layered.py:203:layered_view] The legend_text_spacing_offset parameter is deprecated andwill be removed in a future release.

<matplotlib.image.AxesImage object at 0x7fa098357050>
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
plot custom vgg16
2025-11-30 16:06:24.921297: W scikitplot 140329820801920 utils_pil.py:204:load_font] Error loading system font: cannot open resource
2025-11-30 16:06:24.921368: W scikitplot 140329820801920 utils_pil.py:206:load_font] Falling back to PIL default font.
2025-11-30 16:06:24.921465: W scikitplot 140329820801920 layered.py:203:layered_view] The legend_text_spacing_offset parameter is deprecated andwill be removed in a future release.

<matplotlib.image.AxesImage object at 0x7fa0983efa10>
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
plot custom vgg16
2025-11-30 16:06:25.477748: W scikitplot 140329820801920 utils_pil.py:204:load_font] Error loading system font: cannot open resource
2025-11-30 16:06:25.477821: W scikitplot 140329820801920 utils_pil.py:206:load_font] Falling back to PIL default font.
2025-11-30 16:06:25.477914: W scikitplot 140329820801920 layered.py:203:layered_view] The legend_text_spacing_offset parameter is deprecated andwill be removed in a future release.

<matplotlib.image.AxesImage object at 0x7fa0982224d0>
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
plot custom vgg16
2025-11-30 16:06:26.327780: W scikitplot 140329820801920 utils_pil.py:204:load_font] Error loading system font: cannot open resource
2025-11-30 16:06:26.327852: W scikitplot 140329820801920 utils_pil.py:206:load_font] Falling back to PIL default font.
2025-11-30 16:06:26.327963: W scikitplot 140329820801920 layered.py:203:layered_view] The legend_text_spacing_offset parameter is deprecated andwill be removed in a future release.

<matplotlib.image.AxesImage object at 0x7fa0982d05d0>
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
plot custom vgg16
2025-11-30 16:06:26.963621: W scikitplot 140329820801920 utils_pil.py:204:load_font] Error loading system font: cannot open resource
2025-11-30 16:06:26.963733: W scikitplot 140329820801920 utils_pil.py:206:load_font] Falling back to PIL default font.
2025-11-30 16:06:26.963860: W scikitplot 140329820801920 layered.py:203:layered_view] The legend_text_spacing_offset parameter is deprecated andwill be removed in a future release.

<matplotlib.image.AxesImage object at 0x7fa09812e510>

Tags: model-type: classification model-workflow: model building plot-type: visualkeras domain: neural network level: intermediate purpose: showcase

Total running time of the script: (0 minutes 15.569 seconds)

Related examples

visualkeras: custom vgg16 show dimension example

visualkeras: custom vgg16 show dimension example

Visualkeras: Spam Classification Conv1D Dense Example

Visualkeras: Spam Classification Conv1D Dense Example

visualkeras: Spam Dense example

visualkeras: Spam Dense example

visualkeras: custom VGG example

visualkeras: custom VGG example

Gallery generated by Sphinx-Gallery