【问题标题】:convolution layer as an output layer for classification problem卷积层作为分类问题的输出层
【发布时间】:2026-01-29 13:55:02
【问题描述】:

我正在尝试构建一个深度学习模型,用于对 10 个类别的 cifar10 数据集进行分类。现在,我想要一个卷积层作为我的输出层,这个层(filters=10)应该从 flatten 中获取输入并预测我的类。

我的型号代码

num_class = 10

model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
                 input_shape=x_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))


model.add(Flatten())
model.add(Dense(num_classes))
model.add(Conv2D(10, (3,3)))
model.add(Activation('softmax'))

但它给了我错误

Input 0 of layer conv2d_34 is incompatible with the layer: expected ndim=4, found ndim=2. Full shape received: [None, 6272]

我如何做到这一点?

【问题讨论】:

    标签: machine-learning keras deep-learning


    【解决方案1】:

    您在卷积层之前使用Flatten 层。 Flatten 使张量输出 2-d,但 Conv2D 需要 4-d 数据。只需评论Flatten 图层行,一切都会正常工作。

    您的模型中没有分类模块,您需要有一个 Dense 层,其中最后一层中的类数。

    #model.add(Flatten()) # comment this line
    model.add(Dropout(0.5))
    model.add(Conv2D(10,(3,3)))
    model.add(Flatten())
    model.add(Dense(num_class)) # num_class is how many classes do you have in your dataset
    model.add(Activation('softmax'))
    

    您可以通过某种全局池化将卷积层用作最终输出。例如,以下模型使用 GlobalAveragePooling。

    model = Sequential()
    model.add(Conv2D(32, (3, 3), padding='same',
                     input_shape=x_train.shape[1:]))
    model.add(Activation('relu'))
    model.add(Conv2D(32, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    
    model.add(Conv2D(64, (3, 3), padding='same'))
    model.add(Activation('relu'))
    model.add(Conv2D(64, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    
    
    model.add(Conv2D(10, (3,3)))
    model.add(GlobalAveragePooling2D())
    model.add(Activation('softmax'))
    model.summary()
    

    【讨论】: