【CV08】1×1卷积如何控制模型复杂度


channel上的卷积

卷积运算是将较小的滤波器线性应用于较大的输入,从而生成输出特征图(feature map)

应用于输入图像或输入特征图的卷积核(filter)的运算结果为单个数值。filter对输入进行从左到右和从上到下的卷积操作,结果为二维特征图,一个filter创建一个对应的特征图。

filter必须具有与输入相同的深度或通道数,但是,无论输入和filter的深度如何,最终的输出都是一个数值,并且一个filter会创建一个具有单个通道的特征图。例如:

  • 如果输入具有一个通道,例如3x3x1的灰度图,则应使用3×3的filter。
  • 如果输入图像具有RGB三个通道,例如3x3x3的RGB图像,则应使用3×3的filter。
  • 如果输入是来自另一个卷积或池化层的特征图,并且深度为64,则应在3x3x64的特征图中,使用3×3的filter,以创建单个值以构成单个输出的特征图。

一个卷积层的输出深度仅由应用于输入的filter的数量决定。


特征图过多导致的问题

卷积层中输入的深度或过滤器的数量通常随网络的深度而增加,从而导致生成的特征图的数量增加。这是一种常见的模型设计模式。此外,某些网络结构(例如inception)也可以连接来自多个卷积层的输出特征图,这也可能会大大增加后续卷积层的输入深度。

卷积神经网络中的大量特征图可能会引起问题,因为必须向下执行整个输入深度的卷积运算。如果要执行的卷积运算相对较大(例如5×5或7×7像素),这将是一个特别的问题,因为它可能导致更多的参数(权重),进而导致执行卷积运算的计算(较大时空复杂度)。

池化层旨在缩小特征图的比例,并系统地将网络中特征图的宽度和高度减半。但是,池化层不会更改模型中filter的数量、深度、通道的数量。 深度卷积神经网络需要相应的池化类型的层,该层可以下采样,减少特征图的深度或数量。


使用1×1的filter下采样特征图

解决方法是使用1×1的filter向下采样特征图的深度或数量。

1×1的filter的输入中,每个通道只有一个参数或权重,与其它filter一样,其结果也是一个单值。这种结构允许1×1的filter像单个神经元一样起作用,并且输入来自每个输入特征图的相同位置。然后,可以单步移动,从左到右,从上到下,系统地应用该单个神经元,而无需进行填充,从而得到宽度和高度与输入相同的特征图。

1×1的filter非常简单,以至于在输入中不包含任何相邻像素。它可能不被认为是卷积运算,相反,它是输入的线性加权或投影。此外,与其它卷积层一样使用非线性,从而允许投影对输入特征图执行有意义的计算。1×1的filter提供了一种有效汇总输入要素图的方法。依次使用多个1×1的filter,可以调整要创建的输入要素图的摘要数量,从而有效地根据需要增加或减少要素图的深度。

在卷积神经网络中,使用1×1的filter的卷积层来控制特征图的数量。它通常被称为投影操作(projection operation)或投影层,或者甚至称为特征图或通道池化层(channel pooling layer)

Keras代码:

from keras.models import Sequential
from keras.layers import Conv2D

model = Sequential()
model.add(Conv2D(512, (1,1), activation='relu'))

减少特征图

1×1的filter可用于减少特征图的数量,这是此类filter最常见的应用,因此该层通常称为特征图池化层(feature map pooling layer)

下例将深度(或通道)从512减少到64。如果要添加到模型中的后续层是另一个具有7×7滤镜的卷积层,则这可能很有用。这些filter只会应用在64个channel上,而不是512。

此外,将具有64个7×7的filter应用深度为512的特征图,将产生大约一百万个参数(权重)。如果使用1×1的filter先将特征图的数量减少到64,则再使用7×7的卷积时,所需的参数数量仅为大约200000。

from keras.models import Sequential
from keras.layers import Conv2D

model = Sequential()
model.add(Conv2D(512, (3,3), padding='same', activation='relu', input_shape=(256, 256, 3)))
model.add(Conv2D(64, (1,1), activation='relu'))

model.summary()

增加特征图

1×1的filter可用于增加特征图的数量,这是在应用另一个卷积层之前在池化层之后的常用操作。

filter的投影效果可以根据需要多次应用于输入,从而允许按比例放大特征图的数量,并且具有捕获原始要素的显着特征的成分。

from keras.models import Sequential
from keras.layers import Conv2D

model = Sequential()
model.add(Conv2D(512, (3,3), padding='same', activation='relu', input_shape=(256, 256, 3)))
model.add(Conv2D(1024, (1,1), activation='relu'))

model.summary()

CNN模型中的应用

2013年的Paper,Network In Network 提出了一种新型的深层网络结构——1×1卷积,称为Network In Network(NIN),这种级联的跨通道参数池化结构允许跨通道信息进行复杂且可学习的交互。每个池化层在输入特征图上执行加权线性重组,然后使用ReLU激活。[…]跨通道参数池化层也等效于具有1×1卷积核的卷积层。

GoogLeNet

2014年的Paper,Going Deeper with Convolutions提出了Inception,其中特征图的输入块由不同的卷积层并行处理,每个卷积层均具有不同大小的filter,其中包括尺寸为1×1的filter。
在这里插入图片描述
然后,将并行层的输出按通道进行堆叠,从而形成非常深的卷积层,以供后续的模块处理。池化层的输出与卷积层的输出的合并将不可避免地导致各个阶段的输出数量的增加。即使此结构可能涵盖了最佳的稀疏结构,它也会非常低效地进行处理,从而导致在几个阶段内出现计算爆炸。解决方法是将Inception模块重新设计为使用1×1的filter,以减少5×5和7×7的filter的并行卷积层之前的特征图数量。

在这里插入图片描述


ResNet

2015年的Paper,Deep Residual Learning for Image Recognition中将1×1的filter用作投影技巧,以将输入filter的数量与残差块的输出相匹配。由于输入已添加到模块的输出中,因此尺寸必须在宽度,高度和深度匹配。可以通过填充来保持宽度和高度,尽管可以使用1×1过滤器根据需要更改输入的深度,以便可以将其与模块的输出相加。这种连接称为投影快捷连接(projection shortcut connection)。此外,残差块使用1×1的filter的bottleneck来减少特征图的数量。

在这里插入图片描述


参考:
https://machinelearningmastery.com/introduction-to-1x1-convolutions-to-reduce-the-complexity-of-convolutional-neural-networks/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章