简体   繁体   中英

Keras Conv2D without MaxPool2D but the Output Shape is divided by 2

I found two problems in the following Keras model.

Here is the full test code:

import tensorflow as tf

model=tf.keras.Sequential()

model.add(tf.keras.layers.Conv2D(15,(5,5), padding='same', input_shape=(28, 28, 1)))
model.add(tf.keras.layers.Conv2D(16,(5,5)))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))

model.add(tf.keras.layers.Conv2D(32,(5,5),padding='same', input_shape=(28, 28, 3)))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))

model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(10))

model.compile(
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    optimizer=tf.keras.optimizers.Adam(),
    metrics = [
        "accuracy"
    ]
)

model.summary()

Here is the output:

Model: "sequential_6"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d_18 (Conv2D)          (None, 28, 28, 15)        390       
                                                                 
 conv2d_19 (Conv2D)          (None, 24, 24, 16)        6016      
                                                                 
 max_pooling2d_12 (MaxPoolin  (None, 12, 12, 16)       0         
 g2D)                                                            
                                                                 
 conv2d_20 (Conv2D)          (None, 12, 12, 32)        12832     
                                                                 
 max_pooling2d_13 (MaxPoolin  (None, 6, 6, 32)         0         
 g2D)                                                            
                                                                 
 flatten_6 (Flatten)         (None, 1152)              0         
                                                                 
 dense_6 (Dense)             (None, 10)                11530     
                                                                 
=================================================================
Total params: 30,768
Trainable params: 30,768
Non-trainable params: 0

Question 1:

This layer will generate the Output Shape as " (None, 24, 24, 16) ".

model.add(tf.keras.layers.Conv2D(16,(5,5)))

There is no any tf.keras.layers.MaxPool2D between the first layer and the second layer, why does the second layer still change the output shape to (None, 24, 24, 16) ?

It should be (None, 28, 28, 16) because no any MaxPool2D before the second layer.

Question 2:

Why does the input_shape argument in this layer can't change the model to input_shape=(28, 28, 3) :

model.add(tf.keras.layers.Conv2D(32,(5,5),padding='same', input_shape=(28, 28, 1)))

Question 1

Your 2nd Conv2D layer is missing padding=same . It defaults to padding=valid therefore, the output size is 28-5+1=24 .

Question 2

Not sure what you expected here. Sequential models can have only 1 input (which you've already defined the shape of, in the first layer). input_shape in the middle layers has no effect.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM