Проблемы с VALID padding для слоя Conv2D

Я построил следующую модель распознавания объектов для своего школьного задания, чтобы предсказывать классы на основе набора данных 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 полностью потеряны.

Есть ли способ обойти эту проблему, сохранив ДЕЙСТВИТЕЛЬНОЕ заполнение?

Заранее извиняюсь, так как я строю такую ​​модель впервые.


person cal    schedule 02.11.2020    source источник


Ответы (1)


Используйте InputLayer вместо Input в начале вашей модели. Это даст вам первый слой модели вместо символьного тензора.

Замените строку на это:

model.add(InputLayer(input_shape=(3072,)))

Остальная часть кода, кажется, выполняется для меня и дает мне слой 4x4 после свертки, которую вы вводите в свои выпадающие / плотные слои.

person Animesh Sinha    schedule 02.11.2020
comment
Оцените ответ. Я изменил model.add(Input(shape=(3072,))) на строку model.add(InputLayer(input_shape=(3072,))), и ошибка, похоже, все еще повторяется. - person cal; 02.11.2020
comment
colab.research.google.com/drive/ См. это, у меня это работает. - person Animesh Sinha; 02.11.2020
comment
Перезагрузите среду и запустите ее один раз, возможно, это решит проблему, потому что как в моей локальной системе, так и в colab она работает плавно. Я использую керасы тензорного потока, а не чистые керасы, потому что они больше не поддерживаются. Пожалуйста, проверьте еще раз, что вы делаете то же самое. - person Animesh Sinha; 02.11.2020