Python 步幅如何影响keras中的输入形状?

Python 步幅如何影响keras中的输入形状?,python,tensorflow,keras,conv-neural-network,stride,Python,Tensorflow,Keras,Conv Neural Network,Stride,我在keras中做了一个简单的图像分类,我使用MaxPoolig2D来减小图像大小。最近我学习了跨步,我想实现它们,但我遇到了错误。下面是一段给出错误的代码: early_stopping = EarlyStopping(monitor = 'val_loss',min_delta = 0.001, patience = 20, restore_best_weights = True) model = tf.keras.Sequential() model.add(tf.keras.layer

我在keras中做了一个简单的图像分类,我使用MaxPoolig2D来减小图像大小。最近我学习了跨步,我想实现它们,但我遇到了错误。下面是一段给出错误的代码:

early_stopping = EarlyStopping(monitor = 'val_loss',min_delta = 0.001, patience = 20, restore_best_weights = True)
model = tf.keras.Sequential()

model.add(tf.keras.layers.Conv2D(512, (2, 2),input_shape=(X[0].shape), strides = 2, data_format='channels_first', activation = 'relu'))

model.add(tf.keras.layers.MaxPooling2D(pool_size=(3, 3)))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Conv2D(512, (3, 3), data_format='channels_first',activation = 'relu'))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(3, 3)))
model.add(tf.keras.layers.Dropout(0.5))

model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Conv2D(128, (3, 3), data_format='channels_first',activation = 'relu'))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(4, 4)))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Flatten())  

model.add(tf.keras.layers.Dense(128))

model.add(tf.keras.layers.Dense(1, activation='sigmoid'))

opt = keras.optimizers.Adam(learning_rate=0.0005)
model.compile(loss='binary_crossentropy',
              optimizer=opt,
              metrics=['accuracy'])

h= model.fit(trainx, trainy, validation_data = (valx, valy), batch_size=64, epochs=80, callbacks = [early_stopping], verbose = 0)
以下是错误:

ValueError: Negative dimension size caused by subtracting 4 from 2 for '{{node max_pooling2d_35/MaxPool}} = MaxPool[T=DT_FLOAT, data_format="NHWC", explicit_paddings=[], ksize=[1, 4, 4, 1], padding="VALID", strides=[1, 4, 4, 1]](Placeholder)' with input shapes: [?,128,2,46].

当我删除“跨步数=2”时,一切正常。为什么跨步选项会导致输入形状错误,我如何防止它?我找不到这方面的任何信息。

步长是每次内核移动的量。大小为2的跨步基本上将输入块的尺寸沿每个轴切成两半。由于你的迂回和步伐,似乎你在某个点上有一个大小为128×2的图像。当然,不能在其上放置4x4过滤器,因为一个轴上的尺寸仅为2


您可以在这里使用padding来填充数据,我相信是0,以将维度提高128乘以4,从而避免错误。

哦,我明白了。当我卸下那个4x4过滤器时,一切正常。顺便说一句,当我应用步幅时,是否有办法确保输入维度与池维度兼容,或者我必须自己计算步幅,并根据该计算应用填充?如果你有一个很好的划分,最好事先计划它们。然而,这是不可能的。特别是当您想要尝试不同的过滤器和步幅(超参数调整)时。填充物可以帮你省去很多麻烦。