'how to plot input and output shapes on top of each other using polt_model in keras

I want to plot my model using Keras.utils.plot_model function. my problem is that when I plot the model, the input and output shapes do not place on top of each other and instead will be put alongside each other (like figure 1). Here is the code to plot this model:

model = tf.keras.models.Sequential()
model.add(layers.Embedding(100, 128, input_length=45,
                       input_shape=(45,), name='embed'))
model.add(layers.Conv1D(32, 7, activation='relu'))
model.add(layers.MaxPooling1D(5))
model.add(layers.Conv1D(32, 7, activation='relu'))
model.add(layers.GlobalMaxPooling1D())
model.add(layers.Dense(1))
plot_model(model, to_file='model_plot.png', show_shapes=True, show_layer_names=False)

figure 1

but I like to have the model plot such as figure 2 which is the typical figure we can find on internet and I created it many times before. I couldn't find any figsize or fontsize option in plot_model to try changing them. I use google Colaboratory Notebook.

Any help is very appreciated.

enter image description here



Solution 1:[1]

I also have the same issue and I finally found this github link. github

Just because we're using tensorflow ver2.8.0, this problem seems to happen.

As mentioned in the link, one valid solution is to change our tensorflow version such as tf-nightly.

[tensorflow ver2.8.0]

import tensorflow as tf
tf.__version__

2.8.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Dense(1,input_shape=[1], name="input_layer")
],name="model_1")

model.compile(...)

Awww this is the one we don't want to.

[tensorflow nightly]

!pip --quiet install tf-nightly #try not to use tf ver2.8
import tensorflow as tf
tf.__version__

2.10.0-dev20220403

#just do the same thing as above
model = tf.keras.models.Sequential([
  tf.keras.layers.Dense(1,input_shape=[1], name="input_layer")
],name="model_1")

model.compile(...)

our expected output!

I hope you solve this problem.

Solution 2:[2]

It is easy but using model sequence is more easily managed. What are the embedded layers and dataset buffers !? It is batches of input, you manage the combination or number of batches! ( Using MS-word draws the graphs is faster or drawing tools, I use free office when study )

[ Codes ]:

import tensorflow as tf
from tensorflow.keras.utils import plot_model

model = tf.keras.models.Sequential([
    tf.keras.layers.InputLayer(input_shape=(100,), dtype='int32', name='input'),
    tf.keras.layers.Embedding(output_dim=512, input_dim=100, input_length=100),
    tf.keras.layers.LSTM(32),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid', name='output'),
])


dot_img_file = 'F:\\temp\\Python\\img\\001.png'
tf.keras.utils.plot_model(model, to_file=dot_img_file, show_shapes=True)
# <IPython.core.display.Image object>

input('...')

[ Output ]:

F:\temp\Python>python test_tf_plotgraph.py
2022-03-28 14:21:26.043715: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-03-28 14:21:26.645113: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1525] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 4565 MB memory:  -> device: 0, name: NVIDIA GeForce GTX 1060 6GB, pci bus id: 0000:01:00.0, compute capability: 6.1
...

... Sample

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Martijn Pieters