Conv2D层的VALID填充问题

时间:2020-11-02 10:41:16

标签: tensorflow machine-learning keras keras-layer

我为我的学校作业建立了以下对象识别模型,以便根据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].

我认为这是因为,当填充为有效时,在将第一个Conv2D图层上应用了kernel_size=9之后,(32,32,3)图像的大小变为(24,24,0)。不确定为什么RGB通道会完全丢失。

在保持VALID填充的同时,有没有办法解决此问题?

对不起,因为这是我第一次构建这样的模型。

1 个答案:

答案 0 :(得分:0)

在模型开始时使用InputLayer代替Input。它将为您提供模型的第一层而不是符号张量。

用以下内容替换行:

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

其余的代码似乎对我来说执行了,并在卷积之后为我提供了一个4x4的层,将其输入到辍学/密集层中。