分类算法的使用很普遍,除了更换backbone,常常会涉及到是否将fc层替换为1*1的卷积?此时就会想到怎样实施更换?更换后会有哪些收益,下面我就从自身的使用经验来进行分析。
第一个问题:怎样使用1*1 conv更换fc层?
主要涉及到以下几个问题:
-
卷积(conv)输出尺寸的计算?
O=输出图像的尺寸。
I=输入图像的尺寸。
K=卷积层的核尺寸
N=核数量
S=移动步长
P =填充数
输出图像尺寸的计算公式如下:
如:输入图像的尺寸为227*227*3.卷积层有16个尺寸为3*3的核。步长为4,填充为0.
-
全连接层(fc)输出尺寸的计算?
全连接层输出向量长度等于神经元的数量。
如:
self.fc_card = nn.Linear(512, 9)
输入为512,输出大小为9;
-
1*1卷积和全连接的参数量计算?
参考链接:CNN中的几个概念(全连接,卷积,线性,全卷积)理解 - 知乎
总结:卷积层的参数量会比fc层所使用的参数量少;
第二个问题:1*1conv和fc层在分类中的作用,各有什么优缺点?
-
fc层在分类中的作用?
将前一层的输出通过加权隐射到label上去,可以查看如下图:
上图中,4096为全连接层前一层的输出,通过fc层的作用(w),将4096个特征隐射到分类结果上(10个类别);
-
1*1conv常规功能有哪些?
参考链接:fc全连接层的作用、卷积层的作用、pooling层、激活函数的作用 - 有梦就要去实现他 - 博客园
总结:1*1的卷积可以用于降维(减少通道数),升维(增加通道数),代替fc成为一个分类器
-
1*1conv在替换掉fc层后对模型有什么影响?
优点:权值共享,参数量较同等功能的fc层相比少,使用了位置信息;fc层对于训练样本要求统一尺寸,但是1*1的卷积不会受该规定的限制;
参考链接: