Keras: How to get layer shapes in a Sequential model

65,336

Solution 1

According to official doc for Keras Layer, one can access layer output/input shape via layer.output_shape or layer.input_shape.

from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D


model = Sequential(layers=[
    Conv2D(32, (3, 3), input_shape=(64, 64, 3)),
    MaxPool2D(pool_size=(3, 3), strides=(2, 2))
])

for layer in model.layers:
    print(layer.output_shape)

# Output
# (None, 62, 62, 32)
# (None, 30, 30, 32)

Solution 2

If you want the output printed in a fancy way:

model.summary()

If you want the sizes in an accessible form

for layer in model.layers:
    print(layer.get_output_at(0).get_shape().as_list())

There are probably better ways to access the shapes than this. Thanks to Daniel for the inspiration.

Solution 3

Just use model.summary(), and it will print all layers with their output shapes.


If you need them as arrays, tuples or etc, you can try:

for l in model.layers:
    print (l.output_shape)

For layers that are used more than once, they contain "multiple inbound nodes", and you should get each output shape separately:

if isinstance(layer.outputs, list):
    for out in layer.outputs:
        print(K.int_shape(out))

        for out in layer.outputs:

It will come as a (None, 62, 62, 32) for the first layer. The None is related to the batch_size, and will be defined during training or predicting.

Share:
65,336
Toke Faurby
Author by

Toke Faurby

Updated on March 06, 2020

Comments

  • Toke Faurby
    Toke Faurby about 4 years

    I would like to access the layer size of all the layers in a Sequential Keras model. My code:

    model = Sequential()
    model.add(Conv2D(filters=32, 
                   kernel_size=(3,3), 
                   input_shape=(64,64,3)
            ))
    model.add(MaxPooling2D(pool_size=(3,3), strides=(2,2)))
    

    Then I would like some code like the following to work

    for layer in model.layers:
        print(layer.get_shape())
    

    .. but it doesn't. I get the error: AttributeError: 'Conv2D' object has no attribute 'get_shape'

  • Toke Faurby
    Toke Faurby about 7 years
    model.summary() is a good bet in many cases, but ideally I would like to have the shape as an array or tensor
  • Toke Faurby
    Toke Faurby about 7 years
    I get the following error (with the update): AttributeError: The layer "max_pooling2d_1 has multiple inbound nodes, with different output shapes. Hence the notion of "output shape" is ill-defined for the layer. Use 'get_output_shape_at(node_index)' instead. I think you have to do the full thing, as in my answer
  • Daniel Möller
    Daniel Möller about 5 years
    You can K.int_shape(layer.get_output_at(node_index)), but you will need to get outputs at many indices
  • Adrian
    Adrian over 3 years
    "AttributeError: The layer has never been called and thus has no defined output shape"
  • Thomas Wagenaar
    Thomas Wagenaar over 3 years
    @Adrian make sure to define the inpute_shape of the first layer correctly. You can check this by calling model.build() first.