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

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

1.全连接层可以视作一种特殊的卷积

考虑下面两种情况:

  1. 特征图和全连接层相连,AlexNet经过五次池化后得到7*7*512的特征图,下一层全连接连向4096个神经元,这个过程可以看做有4096个7*7*512的卷积核和7*7*512的特征图进行卷积操作,最终得到1*1*4096的特征图,等价与全连接得到4096个神经元。
  2. 全连接层和全连接层相连,AlexNet的再下一层依然是4096个神经元,即4096个神经元和4096个神经元全连接,由(1)我们得到了1*1*4096的特征图,本次全连接过程可以看做存在4096个1*1*4096个卷积核,依次和1*1*4096的特征图进行卷积操作,等价与全连接。

2.网络改成全卷积形式后在某些场景可以提升效率

CS231课程中有如下陈述: 实际操作中,每次这样的变换都需要把全连接层的权重W重塑成卷积层的滤波器。那么这样的转化有什么作用呢?它在下面的情况下可以更高效:让卷积网络在一张更大的输入图片上滑动(译者注:即把一张更大的图片的不同区域都分别带入到卷积网络,得到每个区域的得分),得到多个输出,这样的转化可以让我们在单个向前传播的过程中完成上述的操作。

举个例子,如果我们想让224x224尺寸的浮窗,以步长为32在384x384的图片上滑动,把每个经停的位置都带入卷积网络,最后得到6x6个位置的类别得分。上述的把全连接层转换成卷积层的做法会更简便。如果224x224的输入图片经过卷积层和汇聚层之后得到了[7x7x512]的数组,那么,384x384的大图片直接经过同样的卷积层和汇聚层之后会得到[12x12x512]的数组(因为途径5个汇聚层,尺寸变为384/2/2/2/2/2 = 12)。然后再经过上面由3个全连接层转化得到的3个卷积层,最终得到[6x6x1000]的输出(因为(12 - 7)/1 + 1 = 6)。这个结果正是浮窗在原图经停的6x6个位置的得分!

面对384x384的图像,让(含全连接层)的初始卷积神经网络以32像素的步长独立对图像中的224x224块进行多次评价,其效果和使用把全连接层变换为卷积层后的卷积神经网络进行一次前向传播是一样的。自然,相较于使用被转化前的原始卷积神经网络对所有36个位置进行迭代计算,使用转化后的卷积神经网络进行一次前向传播计算要高效得多,因为36次计算都在共享计算资源。这一技巧在实践中经常使用,一次来获得更好的结果。比如,通常将一张图像尺寸变得更大,然后使用变换后的卷积神经网络来对空间上很多不同位置进行评价得到分类评分,然后在求这些分值的平均值。

上面给出了转化为全卷积的两个理由,一是不用限制死输入图像的大小,提供方便。二是前向传播时效率更高。

我的理解与推理

首先解释方便,对于384*384的图片,不修改AlexNet的结构使之适应384*384(依然使用原来224x224输入的结构),直到经过汇聚层得到[12x12x512]的数组时,网络运行没有任何问题,按照原来的架构,接下来要将特征图平铺和4096个神经元全连接,这时候就出问题了,因为原架构平铺后是7x7,现在是12x12,无法使用之前的参数矩阵了,但是将全连接层转化为卷积层后可继续进行,并最终得到6x6的正确输出,仅仅将网络的全连接层等价转化为卷积层,就能接收更大的图片,这显然方便了很多。

然后解释高效,第一层卷积,对于224x224的一张图片,假设卷积耗时为t,那么前向传播时,36张图片的时间为36t,对于384x384的图片,耗时同样为6*6*t = 36t,假设下一层为池化层,每次2x2池化的时间为ti,对于36张224x224的图片,总耗时36*112*112*ti = 451584ti,对于384x384的图片,耗时为192*192*ti = 36864ti << 451584ti,类似进行计算下去,发现全卷积每一层的耗时都少的多。因此全卷积效率更高,直观上如何得到这个结论呢?将384x384的图片按照32的步长切成224x224后得到36张图片,这36张图片有很多区域重叠了,本来一次池化就可以得到结果的,但是输入36张图片后,相同区域进行了多次重复池化操作,因此耗费了更多的时间。

原文地址:https://www.cnblogs.com/liuzhan709/p/9356960.html

时间: 2024-11-04 10:41:20

理解为什么要将全连接层转化为卷积层的相关文章

resnet18全连接层改成卷积层

想要尝试一下将resnet18最后一层的全连接层改成卷积层看会不会对网络效果和网络大小有什么影响 1.首先先对train.py中的更改是: train.py代码可见:pytorch实现性别检测 # model_conv.fc = nn.Linear(fc_features, 2)这是之前的写法 model_conv.fc = nn.Conv2d(fc_features, 2, 1) print(model_conv.fc) 但是运行的时候出错: 1) RuntimeError: Expected

全连接理解2

(名称:全连接.意思就是输出层的神经元和输入层的每个神经元都连接) 在卷积神经网络的最后,往往会出现一两层全连接层,全连接一般会把卷积输出的二维特征图转化成一维的一个向量,这是怎么来的呢?目的何在呢? 举个例子: 最后的两列小圆球就是两个全连接层,在最后一层卷积结束后,进行了最后一次池化,输出了20个12*12的图像,然后通过了一个全连接层变成了1*100的向量. 这是怎么做到的呢,其实就是有20*100个12*12的卷积核卷积出来的,对于输入的每一张图,用了一个和图像一样大小的核卷积,这样整幅

Fully Connected Layer:全连接层

1. 全连接层:主要用于分类,把分布式特征映射到样本标记空间.全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来.全连接层中的权值矩阵Wi的每一行相当于一个分类模版,xi与Wi矩阵乘法,即可得到xi与每一个模板的匹配度,从中选取得分最高的匹配模板. 在 CNN 结构中,经多个卷积层和池化层后,连接着1个或1个以上的全连接层.全连接层中的每个神经元与其前一层的所有神经元进行全连接,全连接层可以整合卷积层或者池化层中具有类别区分性的局部信息.为了提升 CNN 网络性能,全连

【TensorFlow/简单网络】MNIST数据集-softmax、全连接神经网络,卷积神经网络模型

初学tensorflow,参考了以下几篇博客: soft模型 tensorflow构建全连接神经网络 tensorflow构建卷积神经网络 tensorflow构建卷积神经网络 tensorflow构建CNN[待学习] 全连接+各种优化[待学习] BN层[待学习] 先解释以下MNIST数据集,训练数据集有55,000 条,即X为55,000 * 784的矩阵,那么Y为55,000 * 10的矩阵,每个图片是28像素*28像素,带有标签,Y为该图片的真实数字,即标签,每个图片10个数字,1所在位置

前馈全连接神经网络和函数逼近、时间序列预测、手写数字识别

https://www.cnblogs.com/conmajia/p/annt-feed-forward-fully-connected-neural-networks.html Andrew Kirillov 著Conmajia 译2019 年 1 月 12 日 原文发表于 CodeProject(2018 年 9 月 28 日). 中文版有小幅修改,已获作者本人授权. 本文介绍了如何使用 ANNT 神经网络库生成前馈全连接神经网络并应用到问题求解. 全文约 12,000 字,建议阅读时间 3

FCN用卷积层代替FC层原因(转)

分类任务 CNN对于常见的分类任务,基本是一个鲁棒且有效的方法.例如,做物体分类的话,入门级别的做法就是利用caffe提供的alexnet的模型,然后把输出的全连接层稍稍修改称为自己想要的类别数,然后再根据实际需要修改网络模型(通常是瘦身).下面记录几个point. 关于crop 一般在训练的时候会利用两个手段做data augmentation,分别是mirror和crop.其中,mirror没什么特别,但是crop有一些东西我们需要了解. 在训练的时候,crop操作会在大图上随机切小图,然后

【python实现卷积神经网络】卷积层Conv2D实现(带stride、padding)

关于卷积操作是如何进行的就不必多说了,结合代码一步一步来看卷积层是怎么实现的. 代码来源:https://github.com/eriklindernoren/ML-From-Scratch 先看一下其基本的组件函数,首先是determine_padding(filter_shape, output_shape="same"): def determine_padding(filter_shape, output_shape="same"): # No paddin

全连接层 和 卷积层

卷积不过是一个稀疏的全连接:全连接也不过是一个画面那么大的卷积.本质上都可以理解为矩阵乘法(卷积可以参考托普利兹矩阵和块循环矩阵),相比起来卷积这种形式可以很好捕捉图像这种有空间相关性输入的特征. 本身conv和fc两者在设计好conv大小的情况下就是等价的, 没有什么取代不取代的. 基本上可以理解全conv就是拿一个小点的fc不停的在图片不同位置上跑, 当然, 有层数的情况下不严格一样, 但是差不了多少. fc不愿意用是因为锁死分辨率, 而且容易造成模型参数太多, 性能上受限制. 但是fc可以

[转]深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接

深入理解SQL的四种连接-左外连接.右外连接.内连接.全连接 1.内连接(典型的连接运算,使用像 =  或 <> 之类的比较运算符).包括相等连接和自然连接.     内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行.       2.外连接.外连接可以是左向外连接.右向外连接或完整外部连接.     在 FROM子句中指定外连接时,可以由下列几组关键字中的一组指定:     1)LEFT  JOIN或LEFT