YoniChechik
YoniChechik

Reputation: 1537

How to show all layers in a Tensorflow model with nested model?

How to show all layers in a model with the model base?

base_model = keras.applications.MobileNetV3Small(
    input_shape=model_input_shape,
    include_top=False,
    weights="imagenet",
)

# =================== build model
model = keras.Sequential(
    [
        keras.Input(shape=image_shape),
        preprocessing.Resizing(*model_input_shape[:2]),
        preprocessing.Rescaling(1.0 / 255),
        base_model,
        layers.GlobalAveragePooling2D(),
        # missing dropout
        layers.Dense(1, activation="sigmoid"),
    ]
)

model.summary()

The output is this:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
resizing (Resizing)          (None, 224, 224, 3)       0         
_________________________________________________________________
rescaling_1 (Rescaling)      (None, 224, 224, 3)       0         
_________________________________________________________________
MobilenetV3small (Functional (None, 7, 7, 1024)        1529968    <---------- why can't I see all layers here?
_________________________________________________________________
global_average_pooling2d (Gl (None, 1024)              0         
_________________________________________________________________
dense (Dense)                (None, 1)                 1025      

How do I show all layers?

for layer in model.layers:
    print(layer)

The above has the same problem. What am I doing wrong?

Upvotes: 0

Views: 1318

Answers (1)

Innat
Innat

Reputation: 17239

In such a setup, the base_model acts as a single layer, ie. become nested. To inspect it, you can try either

model.layers[2].summary()


for i, layer in enumerate(model.layers):
    if i == 2:
        for nested_layer in layer.layers:
            print(nested_layer)

or, more intuitively, you can use this solution.

def summary_plus(layer, i=0):
    if hasattr(layer, 'layers'):
        if i != 0: 
            layer.summary()
        for l in layer.layers:
            i += 1
            summary_plus(l, i=i)
summary_plus(model)

or, you can also use the plot_model function as well

keras.utils.plot_model(
    model,
    expand_nested=True # < make it true 
)

Update 1: Raised on the issue regarding this. Keras #15239. Hopefully, it will be solved soon.

Update 2: model.summary now has expand_nested parameter. #15251

Upvotes: 1

Related Questions