由于我是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
答案 0 :(得分:0)
实际上与kernel_size
有关。首先让我们检查一下
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)
让我们将其更改为您的版本
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和独立keras
对kernel_size
的解释不同。请注意,我使用tf.keras
api获得了两个结果。