Я построил следующую модель распознавания объектов для своего школьного задания, чтобы предсказывать классы на основе набора данных CIFAR-10. Назначение требует, чтобы я использовал заполнение VALID для всех слоев свертки и объединения.
def _build_cifar10_model(num_C1_channels=50, num_C2_channels=60, use_dropout=False):
model = Sequential()
# reshape 1D array of length 3072
# to a matrix of shape 32x32x3
model.add(Input(shape=(3072,)))
model.add(Reshape(target_shape=(32, 32, 3), input_shape=(3072,)))
# 24x24x3
model.add(Conv2D(filters=num_C1_channels, kernel_size=(9, 9), padding='valid', activation='relu'))
# 12x12x3
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))
# 8x8x3
model.add(Conv2D(filters=num_C2_channels, kernel_size=(5, 5), padding='valid', activation='relu'))
# 4x4x3
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))
model.add(Flatten())
model.add(Dense(units=300))
if use_dropout:
model.add(Dropout(rate=0.5))
model.add(Dense(units=10, activation='softmax'))
if use_dropout:
model.add(Dropout(rate=0.5))
return model
Однако при построении этой модели возникает следующая ошибка:
InvalidArgumentError: Negative dimension size caused by subtracting 1 from 0 for '{{node max_pooling2d_15/MaxPool}} = MaxPool[T=DT_FLOAT, data_format="NHWC", ksize=[1, 2, 2, 1], padding="VALID", strides=[1, 2, 2, 1]](conv2d_23/Relu)' with input shapes: [?,24,24,0].
Я подумал, что это потому, что, когда заполнение ДЕЙСТВИТЕЛЬНО, изображение (32, 32, 3) становится размером (24, 24, 0) после применения этого первого слоя Conv2D с kernel_size=9
на нем. Не уверен, почему каналы RGB полностью потеряны.
Есть ли способ обойти эту проблему, сохранив ДЕЙСТВИТЕЛЬНОЕ заполнение?
Заранее извиняюсь, так как я строю такую модель впервые.