Noções básicas sobre model.summary Keras

Estou tentando entender o model.summary() em Keras. Eu tenho a seguinte neural network convolucional. Os valores da primeira Convolução são:

 conv2d_4 (Conv2D) (None, 148, 148, 16) 448 

De onde vem o 148 e o 448?

Código

 image_input = layers.Input(shape=(150, 150, 3)) x = layers.Conv2D(16, 3, activation='relu')(image_input) x = layers.MaxPooling2D(2)(x) x = layers.Conv2D(32, 3, activation='relu')(x) x = layers.MaxPooling2D(2)(x) x = layers.Conv2D(64, 3, activation='relu')(x) x = layers.MaxPooling2D(2)(x) x = layers.Flatten()(x) x = layers.Dense(512, activation='relu')(x) output = layers.Dense(1, activation='sigmoid')(x) # Keras Model definition # input = input feature map # output = input feature map + stacked convolution/maxpooling layers + fully connected layer + sigmoid output layer model = Model(image_input, output) model.summary() 

Saída

 Layer (type) Output Shape Param # ================================================================= input_2 (InputLayer) (None, 150, 150, 3) 0 _________________________________________________________________ conv2d_4 (Conv2D) (None, 148, 148, 16) 448 _________________________________________________________________ max_pooling2d_4 (MaxPooling2 (None, 74, 74, 16) 0 _________________________________________________________________ conv2d_5 (Conv2D) (None, 72, 72, 32) 4640 _________________________________________________________________ max_pooling2d_5 (MaxPooling2 (None, 36, 36, 32) 0 _________________________________________________________________ conv2d_6 (Conv2D) (None, 34, 34, 64) 18496 _________________________________________________________________ max_pooling2d_6 (MaxPooling2 (None, 17, 17, 64) 0 _________________________________________________________________ flatten_1 (Flatten) (None, 18496) 0 _________________________________________________________________ dense_1 (Dense) (None, 512) 9470464 _________________________________________________________________ dense_2 (Dense) (None, 1) 513 

A partir da documentação do Keras , você pode ver que o padding é por default=valid para que não haja preenchimento e que o tamanho dos strides seja 1. Então, o formato de saída é obviamente 148 x 148.

Para calcular isso, você poderia usar esta fórmula:

 O = (W - K + 2P)/S + 1 

onde O é a altura / largura de saída, W é a altura / largura de input, K é o tamanho do filtro, P é o preenchimento e S é o tamanho da passada.

Quanto ao segundo parâmetro, você tem um mapa de características de 16 e seu tamanho de kernel é 3 x 3 para que você tenha 16 x (3 x 3) que é 144. Então você tem três canais de cor para que 144 x 3 = 432 e depois você precisa adicionar 16 vieses que faz 448;) Espero que isso ajude!