将全连接层转换为 conv2d 并预测输出?

Posted

技术标签:

【中文标题】将全连接层转换为 conv2d 并预测输出?【英文标题】:convert fully connected layer to conv2d and predict output? 【发布时间】:2020-06-06 17:30:57 【问题描述】:

我正在尝试将扁平层作为 convd2d 的输入,并使用 cifar-10 数据集预测 Densenet 上 10 类分类问题的输出。 以下代码 sn-p 出现错误。

global compression
    BatchNorm = layers.BatchNormalization()(input)
    relu = layers.Activation('relu')(BatchNorm)
    AvgPooling = layers.AveragePooling2D(pool_size=(2,2))(relu)
    flat = layers.Flatten()(AvgPooling)
    # output = layers.Dense(num_classes, activation='softmax')(flat)
    output = layers.Conv2D(filters=10,kernel_size=3,strides=1,activation='softmax',padding='valid')(flat)

我收到以下错误

ValueError: Input 0 is incompatible with layer conv2d_513: expected ndim=4, found ndim=2

谁能告诉我如何解决它。 提前致谢。

【问题讨论】:

为什么要在2D卷积之前将数据展平?通常情况正好相反。对于 Conv2D,您需要一个 2D 输入,并且展平层将 2D 转换为 1D。 【参考方案1】:
output = layers.Conv2D(filters=10, kernel_size=(1,1),strides =(2,2))

此代码会将您的密集层更改为相应的 Conv2D 层。但为避免任何错误,您需要将softmax 添加为不同的层。应该是这样的:

not_final = layers.Activation('softmax')(output)

result = layers.Flatten()(not_final)

【讨论】:

以上是关于将全连接层转换为 conv2d 并预测输出?的主要内容,如果未能解决你的问题,请参考以下文章

resnet 有全连接层吗?

resnet18全连接层改成卷积层

神经网络之全连接层(线性层)

如何使用 PyTorch 中的单个全连接层直接将输入连接到输出?

caffe源码 全连接层

理解为什么要将全连接层转化为卷积层