大步如何影响keras中的输入形状?
how strides effect input shapes in keras?
我在 keras 中进行简单的图像分类,我使用 MaxPooling2D 来减小图像尺寸。最近我了解了 strides,我想实现它们,但我 运行 出错了。这是一段给出错误的代码:
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].
当我删除 'strides = 2' 时,一切正常。为什么 strides 选项会导致输入形状错误,我该如何预防?我找不到任何相关信息。
步幅是内核每次移动多少。大小为 2 的步长实质上将输入块的维度沿每个轴减半。由于您的卷积和步幅,您似乎在某个时候有一张尺寸为 128 x 2 的图像。当然你不能在上面放置一个 4 x 4 的过滤器,因为维度在一个轴上只有 2。
您可以在此处使用 padding 来填充数据,我相信用 0 来将维度增加 128 x 4 并避免错误。
我在 keras 中进行简单的图像分类,我使用 MaxPooling2D 来减小图像尺寸。最近我了解了 strides,我想实现它们,但我 运行 出错了。这是一段给出错误的代码:
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].
当我删除 'strides = 2' 时,一切正常。为什么 strides 选项会导致输入形状错误,我该如何预防?我找不到任何相关信息。
步幅是内核每次移动多少。大小为 2 的步长实质上将输入块的维度沿每个轴减半。由于您的卷积和步幅,您似乎在某个时候有一张尺寸为 128 x 2 的图像。当然你不能在上面放置一个 4 x 4 的过滤器,因为维度在一个轴上只有 2。
您可以在此处使用 padding 来填充数据,我相信用 0 来将维度增加 128 x 4 并避免错误。