Inception网络模块(Inception Network Module)

来源:Coursera吴恩达深度学习课程

一般而言,在构建网络的卷积层时,需要决定过滤器的大小。而Inception网络的作用就是帮助你做决定,代替人工来确定卷积层中的过滤器(filter)大小,或者确定是否需要创建卷积层(conv)或池化层(pooling),虽然网络架构因此变得更加复杂,但网络表现却非常好,下面来了解一下其中的原理。

上图是28×28×192维度的输入层,如果使用1×1卷积,输出结果会是28×28×#(某个值),假设输出为28×28×64(绿色),并且这里只有一个层。

如果使用3×3的过滤器,那么输出是28×28×128(蓝色)。然后我们把第二个值堆积到第一个值上,为了匹配维度(应用same卷积),输出维度和输入维度相同,为28×28,即高度和宽度相同。

如果希望提升网络的表现,也可以试一下5×5过滤器,输出变成28×28×32(紫色),我们再次使用same卷积,保持维度不变。

当然如果你不想要卷积层,那就用池化层,进行最大池化操作,得到一些不同的输出结果,我们把它也堆积起来,这里的池化输出是28×28×32(橘色)。为了匹配所有维度,对最大池化使用padding,它是一种特殊的池化形式,因为如果输入的高度和宽度为28×28,则输出的相应维度也是28×28。然后再进行池化,padding不变,步幅为1。

有了这样的Inception模块,你就可以输入某个量,这里的最终输出为32+32+128+64=256(因为它累加了所有数字)。Inception模块的输入为28×28×192,输出为28×28×256。这就是Inception网络的核心内容(heart),提出者包括Christian Szegedy、刘伟、贾扬清、Pierre Sermanet、Scott Reed、Dragomir Anguelov、Dumitru Erhan、Vincent Vanhoucke和Andrew Rabinovich。基本思想是Inception网络不需要人为决定使用哪个过滤器或者是否需要池化,而是由网络自行确定这些参数,你可以给网络添加这些参数的所有可能值,然后把这些输出连接起来,让网络自己学习它需要什么样的参数,采用哪些过滤器组合。

下面,计算这个5×5过滤器在该模块中的计算成本(computational cost)

(一)这是一个28×28×192的输入块,这里用一个看起来更普通的蓝色块表示。执行一个5×5卷积,它有32个过滤器,每个过滤器大小为5×5×192,输出为28×28×32。对于输出中的每个数字来说,你都需要执行5×5×192次乘法运算,所以乘法运算的总次数为每个输出值所需要执行的乘法运算次数(5×5×192)乘以输出值个数(28×28×32),把这些数相乘结果等于1.2亿(120422400)。即使在现在,用计算机执行1.2亿次乘法运算,成本也是相当高的。为了降低计算成本,用计算成本除以因子10,结果它从1.2亿减小到原来的十分之一。请记住120这个数字。

(二)上图是另一种结构:1*1卷积降低参数和计算量。对于输入层,使用1×1卷积把输入值从192个通道减少到16个通道,然后对这个较小层运行5×5卷积,得到最终输出。请注意,输入和输出的维度依然相同,输入是28×28×192,输出是28×28×32,和上一页的相同。但我们要做的就是把左边这个大的输入层压缩成这个较小的的中间层,它只有16个通道,而不是192个。有时候这被称为瓶颈层(bottleneck layer),瓶颈通常是某个对象最小的部分。因此我们先缩小网络表示,然后再扩大它。应用1×1卷积,过滤器个数为16,每个过滤器大小为1×1×192,这两个维度相匹配(输入通道数与过滤器通道数),28×28×16这个层的计算成本是,输出28×28×192中每个元素都做192次乘法,用1×1×192来表示,相乘结果约等于240万。第二层卷积层的输出是28×28×32,对每个输出值应用一个5×5×16维度的过滤器,计算结果为1000万。

因此所需要乘法运算的总次数是这两层的计算成本之和,即1204万(12.4 million multiplications),与上一张PPT中的值做比较,计算成本从1.2亿下降到了原来的十分之一,即1204万。所需要的加法运算(additions)与乘法运算(multiplications)的次数近似相等,所以这里只统计了乘法运算的次数。

总结一下,当你在构建神经网络层的时候,不想决定池化层是使用1×1,3×3还是5×5的过滤器,那么Inception模块就是最好的选择。可以应用各种类型的过滤器,只需要把输出连接起来。对于计算成本问题,通过使用1×1卷积来构建瓶颈层,从而大大降低计算成本。当然你也可能会问,仅仅大幅缩小表示层规模会不会影响神经网络的性能?事实证明,只要合理构建瓶颈层,你既可以显著缩小表示层规模(shrink down the representation size significantly),又不会降低网络性能(and it doesn’t seem to hurt the performance),从而节省了计算(that saves you a lot of computation)

这就是Inception模块的主要思想(key ideas)。

说明:记录学习笔记,如果错误欢迎指正!转载请联系我。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 MATLAB 中使用 ResNet50 骨干网络提取图像特征,可以使用 `activations` 函数。这个函数可以把输入图像通过 ResNet50 模型进行前向传递,然后返回指定层的激活值,这些激活值可以作为特征向量来使用。 下面是一个示例代码: ```matlab % Load the pre-trained ResNet50 network net = resnet50; % Load an example image img = imread('example.jpg'); % Resize the image to fit the network input size inputSize = net.Layers(1).InputSize; img = imresize(img, [inputSize(1), inputSize(2)]); % Extract features using the ResNet50 network layer = 'fc1000'; features = activations(net, img, layer, 'OutputAs', 'rows'); ``` 这个代码会加载一个预训练的 ResNet50 网络,并读取一个示例图像 `example.jpg`。然后它将图像大小调整为网络的输入大小,最后通过网络的全连接层 `fc1000` 提取特征向量。 如果你想要在 ResNet50 的基础上添加 Inception 多尺度模块,可以参考 TensorFlow 中的实现方式。具体来说,你可以在 ResNet50 的最后一个卷积层后面添加 Inception 模块,然后再接一个全局池化层和一个全连接层,以输出特征向量。 在 MATLAB 中,你可以使用 `addLayers` 和 `connectLayers` 函数来添加新的层。下面是一个示例代码: ```matlab % Define the Inception module inceptionLayers = [ averagePooling2dLayer([5 5], 'Stride', 3, 'Name', 'inception_pool') convolution2dLayer(1, 64, 'Name', 'inception_conv1x1') reluLayer('Name', 'inception_relu1') convolution2dLayer(3, 96, 'Padding', 'same', 'Name', 'inception_conv3x3_reduce') reluLayer('Name', 'inception_relu2') convolution2dLayer(3, 128, 'Padding', 'same', 'Name', 'inception_conv3x3') reluLayer('Name', 'inception_relu3') convolution2dLayer(1, 32, 'Name', 'inception_conv5x5_reduce') reluLayer('Name', 'inception_relu4') convolution2dLayer(5, 64, 'Padding', 'same', 'Name', 'inception_conv5x5') reluLayer('Name', 'inception_relu5') concatenationLayer(4, 3, 'Name', 'inception_concat') ]; % Load the pre-trained ResNet50 network net = resnet50; % Remove the last two layers (average pooling and fc1000) layersToRemove = {'avg_pool', 'fc1000'}; net = removeLayers(net, layersToRemove); % Add the Inception module after the last conv layer lastConvLayer = findLastConvLayer(net); net = addLayers(net, inceptionLayers); net = connectLayers(net, lastConvLayer, 'inception_pool'); % Add a global pooling layer and a fully connected layer net = globalAveragePooling2dLayer('Name', 'global_pool')(net); net = fullyConnectedLayer(1024, 'Name', 'fc1024')(net); net = reluLayer('Name', 'relu')(net); % Extract features using the modified network img = imread('example.jpg'); inputSize = net.Layers(1).InputSize; img = imresize(img, [inputSize(1), inputSize(2)]); layer = 'fc1024'; features = activations(net, img, layer, 'OutputAs', 'rows'); ``` 这个代码首先定义了一个 Inception 模块 `inceptionLayers`。然后它加载一个预训练的 ResNet50 网络,并移除最后两层。接着它找到最后一个卷积层,并在其后面添加 Inception 模块。最后它再添加一个全局池化层和一个全连接层,以输出特征向量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值