tf.keras和keras之间Conv2D的输出形状不同吗?

时间:2019-10-28 03:46:21

标签: tensorflow keras

由于我是Keras和Tensorflow的新手,这可能是一个愚蠢的问题。

我有一个简单的模型:

classifier=Sequential()

classifier.add(Convolution2D(32, 3, 3, input_shape=(64, 64, 3), activation='relu'))

classifier.add(MaxPooling2D(pool_size=(2, 2)))

classifier.add(Flatten())

classifier.add(Dense(units=128, activation='relu'))
classifier.add(Dense(units=128, activation='relu'))
classifier.add(Dense(units=2, activation='softmax'))

classifier.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

classifier.summary()

使用tf.keras.*类(例如from tensorflow.keras.models import Sequential)运行时,summary将第一层显示为:

Layer (type)                 Output Shape              Param #
=================================================================
conv2d (Conv2D)              (None, 21, 21, 32)        896

,但与keras.*(如from keras.models import Sequential)类一起运行时。 summary将第一层显示为:

Layer (type)                 Output Shape              Param #
=================================================================
conv2d_1 (Conv2D)            (None, 62, 62, 32)        896

为什么它们给出不同的输出形状?

我正在使用tensorflow 2.0.0和keras 2.3.1

1 个答案:

答案 0 :(得分:0)

实际上与kernel_size有关。首先让我们检查一下

示例1:

classifier=Sequential()

classifier.add(Conv2D(32, (3, 3), input_shape=(64, 64, 3), activation='relu'))
classifier.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

classifier.summary()

请注意,在您的代码中,Conv2D中的微小变化是classifier.add(Conv2D(32, 3, 3, input_shape=(64, 64, 3), activation='relu')),而另一个则有kernel_size = (3, 3)。 示例1的输出形状为

  

(无,62、62、32)

示例2:

让我们将其更改为您的版本

classifier=Sequential()

classifier.add(Conv2D(32, 3, 3, input_shape=(64, 64, 3), activation='relu'))
classifier.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

classifier.summary()

导致

  

(无人,21、21、32)896

结论是,tf.keras api和独立keraskernel_size的解释不同。请注意,我使用tf.keras api获得了两个结果。