精华内容
下载资源
问答
  • 多层前向卷积神经网络Python代码。Theano的CNN代码
  • 本文来自于网络,本文大致分成两大部分,第一部分尝试将本文涉及的分类器统一到神经元类模型中,第二部分阐述卷积神经网络(CNN)的发展简述和目前的相关工作。 本文涉及的分类器(分类方法)有:线性回归 逻辑回归...
  • 卷积神经网络(ConstitutionalNeuralNetworks,CNN)是在多层神经网络的基础上发展起来的针对图像分类和识别而特别设计的一种深度学习方法。先回顾一下多层神经网络:多层神经网络包括一个输入层和一个输出层,中间有...
  • 基于多层区域卷积神经网络的图像情感分类
  • 卷积神经网络 文章目录卷积神经网络一、卷积神经网络基础1.基础知识2.卷积层的简洁实现3.池化二、LeNet三、常见的一些卷积神经网络1.AlexNet2.VGG3.NiN4.GoogLeNet   一、卷积神经网络基础 1.基础知识 二维互相关...
  • 基于多层连接卷积神经网络的单帧图像超分辨重建.pdf
  • import numpy as np ... # 循环遍历图像以应用卷积运算 for r in np.uint16(np.arange(filter_size/2.0, img.shape[0]-filter_size/2.0+1)): for c in np.uint16(np.arange(filter_size/2.0, img.shape[1]-filter_s
  • 联合像元谱段信息与空间结构特征,提出一种适用于多光谱遥感影像像素级分类的多层感知卷积神经网络(MPCNet),并基于吉林1号光谱卫星(Jilin-1GP)影像,在印度纳西克研究区对地表覆盖分类算法进行性能测试。为保证实验的...
  • 卷积神经网络概述

    2021-01-06 19:57:01
    卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深 度结构的前馈神经网络,是多层感知机(MLP)的变种,本质是一个多层感知机,但由于 其采用了局部连接和权值共享的方式,一方面减少...
  • 基于多层上下文卷积神经网络的目标检测算法.pdf
  • 多层局部感知卷积神经网络的高光谱图像分类.pdf
  • 你已经知道如何对二维图像做卷积了,现在看看如何执行卷积不仅仅在二维图像上,而是三维立体上。 我们从一个例子开始,假如说你不仅想检测灰度图像的特征,也想检测RGB彩色图像的特征。彩色图像如果是6×6×3,这里...

     

    你已经知道如何对二维图像做卷积了,现在看看如何执行卷积不仅仅在二维图像上,而是三维立体上。

    我们从一个例子开始,假如说你不仅想检测灰度图像的特征,也想检测RGB彩色图像的特征。彩色图像如果是6×6×3,这里的3指的是三个颜色通道,你可以把它想象成三个6×6图像的堆叠。为了检测图像的边缘或者其他的特征,不是把它跟原来的3×3的过滤器做卷积,而是跟一个三维的过滤器,它的维度是3×3×3,这样这个过滤器也有三层,对应红绿、蓝三个通道。

    给这些起个名字(原图像),这里的第一个6代表图像高度,第二个6代表宽度,这个3代表通道的数目。同样你的过滤器也有一个高,宽和通道数,并且图像的通道数必须和过滤器的通道数匹配,所以这两个数(紫色方框标记的两个数)必须相等。下个幻灯片里,我们就会知道这个卷积操作是如何进行的了,这个的输出会是一个4×4的图像,注意是4×4×1,最后一个数不是3了。

    我们研究下这背后的细节,首先先换一张好看的图片。这个是6×6×3的图像,这个是3×3×3的过滤器,最后一个数字通道数必须和过滤器中的通道数相匹配。为了简化这个3×3×3过滤器的图像,我们不把它画成3个矩阵的堆叠,而画成这样,一个三维的立方体。

    为了计算这个卷积操作的输出,你要做的就是把这个3×3×3的过滤器先放到最左上角的位置,这个3×3×3的过滤器有27个数,27个参数就是3的立方。依次取这27个数,然后乘以相应的红绿蓝通道中的数字。先取红色通道的前9个数字,然后是绿色通道,然后再是蓝色通道,乘以左边黄色立方体覆盖的对应的27个数,然后把这些数都加起来,就得到了输出的第一个数字。

    如果要计算下一个输出,你把这个立方体滑动一个单位,再与这27个数相乘,把它们都加起来,就得到了下一个输出,以此类推。

    那么,这个能干什么呢?举个例子,这个过滤器是3×3×3的,如果你想检测图像红色通道的边缘,那么你可以将第一个过滤器设为,和之前一样,而绿色通道全为0,,蓝色也全为0,。如果你把这三个堆叠在一起形成一个3×3×3的过滤器,那么这就是一个检测垂直边界的过滤器,但只对红色通道有用。

    或者如果你不关心垂直边界在哪个颜色通道里,那么你可以用一个这样的过滤器,,所有三个通道都是这样。所以通过设置第二个过滤器参数,你就有了一个边界检测器,3×3×3的边界检测器,用来检测任意颜色通道里的边界。参数的选择不同,你就可以得到不同的特征检测器,所有的都是3×3×3的过滤器。

    按照计算机视觉的惯例,当你的输入有特定的高宽和通道数时,你的过滤器可以有不同的高,不同的宽,但是必须一样的通道数。理论上,我们的过滤器只关注红色通道,或者只关注绿色或者蓝色通道也是可行的。

    再注意一下这个卷积立方体,一个6×6×6的输入图像卷积上一个3×3×3的过滤器,得到一个4×4的二维输出。

    现在你已经了解了如何对立方体卷积,还有最后一个概念,对建立卷积神经网络至关重要。就是,如果我们不仅仅想要检测垂直边缘怎么办?如果我们同时检测垂直边缘和水平边缘,还有45°倾斜的边缘,还有70°倾斜的边缘怎么做?换句话说,如果你想同时用多个过滤器怎么办?

    这是我们上一张幻灯片的图片,我们让这个6×6×3的图像和这个3×3×3的过滤器卷积,得到4×4的输出。(第一个)这可能是一个垂直边界检测器或者是学习检测其他的特征。第二个过滤器可以用橘色来表示,它可以是一个水平边缘检测器。

    所以和第一个过滤器卷积,可以得到第一个4×4的输出,然后卷积第二个过滤器,得到一个不同的4×4的输出。我们做完卷积,然后把这两个4×4的输出,取第一个把它放到前面,然后取第二个过滤器输出,我把它画在这,放到后面。所以把这两个输出堆叠在一起,这样你就都得到了一个4×4×2的输出立方体,你可以把这个立方体当成,重新画在这,就是一个这样的盒子,所以这就是一个4×4×2的输出立方体。它用6×6×3的图像,然后卷积上这两个不同的3×3的过滤器,得到两个4×4的输出,它们堆叠在一起,形成一个4×4×2的立方体,这里的2的来源于我们用了两个不同的过滤器。

    我们总结一下维度,如果你有一个(通道数)的输入图像,在这个例子中就是6×6×3,这里的就是通道数目,然后卷积上一个,这个例子中是3×3×3,按照惯例,这个(前一个nc)和这个(后一个nc)必须数值相同。然后你就得到了(n-f + 1)*(n-f+1)*nc,这里其实就是下一层的通道数,它就是你用的过滤器的个数,在我们的例子中,那就是4×4×2。我写下这个假设时,用的步幅为1,并且没有padding。如果你用了不同的步幅或者padding,那么这个数值会变化,正如前面的视频演示的那样。

    这个对立方体卷积的概念真的很有用,你现在可以用它的一小部分直接在三个通道的RGB图像上进行操作。更重要的是,你可以检测两个特征,比如垂直和水平边缘或者10个或者128个或者几百个不同的特征,并且输出的通道数会等于你要检测的特征数。

    对于这里的符号,我一直用通道数(nc)来表示最后一个维度,在文献里大家也把它叫做3维立方体的深度。这两个术语,即通道或者深度,经常被用在文献中。但我觉得深度容易让人混淆,因为你通常也会说神经网络的深度。所以,在这些视频里我会用通道这个术语来表示过滤器的第三个维度的大小。

    所以你已经知道怎么对立方体做卷积了,你已经准备好了实现卷积神经其中一层了,在下个视频里让我们看看是怎么做的。

     

    展开全文
  • 卷积神经网络(CNN)在计算机视觉领域已经取得了前所未有的巨大成功,但我们目前对其效果显著的原因还没有全面的理解。约克大学电气工程与计算机科学系的 Isma Hadji 和 Richard P. Wildes 发表了论文《What Do We ...
  • 该文首先概述了卷积神经网络的发展历史,然后分别描述了神经元模型、多层感知器的结构.接着,详细分析了卷积神经网络的结构,包括卷积层、池化层、全连接层,它们发挥着不同的作用.然后,讨论了网中网模型、空间变换网络...
  • 车辆识别方法计算量大,提取的特征复杂,且传统神经网络利用端层特征进行分类导致特征不全面,为此提出了一种结合卷积神经网络(CNN)多层特征和支持向量机(SVM)的车辆识别方法。该方法在传统AlexNet模型基础上构建卷积...
  • 一般情况下,图像数据比较大,意味着网络的输入层维度也比较大。当然可以对其进行处理,即使这样,假设处理完后图像变为2562563的彩色图,即输入的维度的值为196608。那么后面的隐藏层的神经元个数自然也能太少,...

    DNN可以用到计算机视觉上么?为什么需要CNN?

    答案是必然的,但是DNN有不少缺点,为此引入CNN。
    一般情况下,图像数据比较大,意味着网络的输入层维度也比较大。当然可以对其进行处理,即使这样,假设处理完后图像变为2562563的彩色图,即输入的维度的值为196608。那么后面的隐藏层的神经元个数自然也能太少,假设为1024。仅仅一层的链接就有高达196608 * 1024的参数量。巨大的计算量给计算能力带来不小的挑战。
    同时,模型的神经元数量大,可能会带来过拟合。

    引入的CNN保持了层级网络结构,从输入到输出经过不同层次,不同层次有不同形式的运算或者功能。主要有以下层次:

    1. 数据输入层/ Input layer - 数据预处理
    2. 卷积计算层/ CONV layer
    3. 激励层/ Activation layer - 非线性变换
    4. 池化层/ Pooling layer - 下采样
    5. 全连接层/ FC layer
    6. 批归一化层/ Batch Normalization layer(可能有)

    转载于:https://www.cnblogs.com/shayue/p/10369422.html

    展开全文
  • 本文综合整理常用的神经网络,包括生物神经网络、人工神经网络卷积神经网络、循环神经网络、生成对抗网络;参考了许多高校的课程、论文、博客和视频等。文章的结构是先进行概念了解,然后结合图片、结构图、一步...

    前言

    本文综合整理常用的神经网络,包括生物神经网络、人工神经网络、卷积神经网络、循环神经网络、生成对抗网络;参考了许多高校的课程、论文、博客和视频等。文章的结构是先进行概念了解,然后结合图片、结构图、一步一步详细讲解;大家要不看看? ( •̀ ω •́ )y

    一、人工神经网络

    简介:人工神经网络 (Artificial Neural Network, ANN),由人工神经元构成的网络,模拟人类的大脑;它模拟生物过程以反映人脑某些特征的计算结构。

    联系人工神经元模拟生物神经元人工神经网络模拟人类的大脑,模拟生物神经网络

    特点:人工神经网络是一个并行、分布处理结构,具有学习能力、泛化能力。

    功能:联想记忆功能、非线性映射功能、分类与识别功能、知识处理功能。

    详细介绍一篇文章“简单”认识《人工神经网络》(更新版)

    目录大纲

      展开全文
    • 本项目的所有代码均已在Python3.6及Pycharm平台调试通过,除了代码外,还提供《卷积神经网络(CNN)详解与代码实现》文档和《Notes on Convolutional Neural Networks》文档,其中:《卷积神经网络(CNN)详解与代码实现...
    • 卷积神经网络

      2018-05-26 21:16:39
       第二章阐述了几种多层神经网络 ,并介绍当前计算机视觉领域应用中最成功的卷积结 构;  第三章具体介绍了标准卷积神经网络中的各构成组件 ,并从生物学和理论两个角度分 析不同组件的设计方案 ;  第四章讨论...
    • CNN :Convolutional Neural Networks (卷积神经网络 ) 环境准备 Python版本:Python 3.6.8 PyTorch版本:PyTorch1.1.0 RDKit版本:RDKit 2020.03.1 基于卷积神经网络(CNN)预测分子特性 导入库 from rdkit ...
    • 神经网络卷积操作总结简介Convolution1x1/Pointwise ConvolutionsSpatial and Cross-Channel ConvolutionsGrouped ConvolutionsSeparable ConvolutionsSpatially Separable ConvolutionsDepthwise Separable ...

      简介

      • 在《信号与系统》里面,卷积的含义是:系统在t时刻的输出,不仅与系统在t时刻的输入有关,还与它在t时刻之前的输入有关,并且不同时刻的输入,有不同的权重。所以,卷积本质上做的事情是:不同时刻的输入的加权求和。权重是一个关于时间t的连续函数。
      • 把以上概念映射到2D图片卷积上:对于2D图片来说,某个位置的输出,不仅与该位置的输入有关,还与此位置周边位置的输入有关,不同位置的输入,具有不同的权重。卷积所做的事情,同样是一个加权求和。由于位置坐标是固定的有限个值,所以,权重是一个关于位置的离散函数。
      • 针对神经网络中2D图片卷积的卷积,研究人员提出了各种新的卷积或者卷积组合来进行改进,其中有的改进是针对速度、有的是为了加深模型、有的是为了对速度和准确率的trade-off

      Convolution

      • 在深度学习中,卷积的目的是从输入中提取有用的特征。在图像处理中,卷积滤波器的选择范围非常广,每种类型的滤波器(比如Sobel算子、Canny算子等)都有助于从输入图像中提取不同的方面或者特征,比如水平、垂直、边缘或对角线等特征。
      • 而在CNN中,不同的特征是通过卷积在训练过程中自动学习得到的filter的权重得到的。卷积具有权重共享和平移不变性的优点。
      • 多个filter效果就如下图所示:
        在这里插入图片描述

      1x1/Pointwise Convolutions

      最初1x1卷积是在Network in Network中提出的,之后1x1convolution最初在GoogLeNet中大量使用,1x1卷积有以下几个特点:

      • 用于降维或者升维,可以灵活控制特征图filter个数
      • 减少参数量,特征图filter少了,参数量也会减少
      • 实现跨通道的交互和信息整合
      • 在卷积之后增加了非线性特征(添加激活函数)
        在这里插入图片描述

      Spatial and Cross-Channel Convolutions

      最初被使用在Inception模块中,主要是将跨通道相关性和空间相关性的操作拆分为一系列独立的操作。
      在这里插入图片描述先使用1x1 Convolution来约束通道个数,降低计算量,然后每个分支都是用3x3卷积,最终使用concat的方式融合特征。pytorch代码实现如下:

      class InceptionA(nn.Module):
          def __init__(self, in_channels, pool_features, conv_block=None):
              super(InceptionA, self).__init__()
              if conv_block is None:
                  conv_block = BasicConv2d
              self.branch1x1 = conv_block(in_channels, 64, kernel_size=1)
      
              self.branch5x5_1 = conv_block(in_channels, 48, kernel_size=1)
              self.branch5x5_2 = conv_block(48, 64, kernel_size=5, padding=2)
      
              self.branch3x3dbl_1 = conv_block(in_channels, 64, kernel_size=1)
              self.branch3x3dbl_2 = conv_block(64, 96, kernel_size=3, padding=1)
              self.branch3x3dbl_3 = conv_block(96, 96, kernel_size=3, padding=1)
      
              self.branch_pool = conv_block(in_channels, pool_features, kernel_size=1)
      
          def _forward(self, x):
              branch1x1 = self.branch1x1(x)
      
              branch5x5 = self.branch5x5_1(x)
              branch5x5 = self.branch5x5_2(branch5x5)
      
              branch3x3dbl = self.branch3x3dbl_1(x)
              branch3x3dbl = self.branch3x3dbl_2(branch3x3dbl)
              branch3x3dbl = self.branch3x3dbl_3(branch3x3dbl)
      
              branch_pool = F.avg_pool2d(x, kernel_size=3, stride=1, padding=1)
              branch_pool = self.branch_pool(branch_pool)
      
              outputs = [branch1x1, branch5x5, branch3x3dbl, branch_pool]
              return outputs
      
          def forward(self, x):
              outputs = self._forward(x)
              return torch.cat(outputs, 1)
      

      Grouped Convolutions

      组卷积最初是在AlexNet中提出的,之后被大量应用在ResNeXt网络结构中,提出的动机就是通过将feature 划分为不同的组来降低模型计算复杂度。下图则是一个组卷积的CNN结构。filters被分成了两个group。每一个group都只有原来一半的feature map。
      在这里插入图片描述所谓分组就是将输入feature map的通道进行分组,然后每个组内部进行卷积操作,最终将得到的组卷积的结果Concate到一起,得到输出的feature map。ResNeXt是ResNet和Inception的结合,其每个分支都采用的相同的拓扑结构。ResNeXt本质是使用组卷积(Grouped Convolutions),通过基数( cardinality )来控制组的数量。
      在这里插入图片描述使用组卷积的优点:

      • 训练效率高。由于卷积被分为几个不同的组,每个组的计算就可以分配给不同的GPU核心来进行计算。这种结构的设计更符合GPU并行计算的要求,这也能解释为何ResNeXt在GPU上效率要高于Inception模块。
      • 模型效率高。模型参数随着组数或者基数的增加而减少。
      • 效果好。分组卷积可能能够比普通卷积组成的模型效果更优,这是因为滤波器之间的关系是稀疏的,而划分组以后对模型可以起到一定正则化的作用。从COCO数据集榜单就可以看出来,有很多是ResNeXt101作为backbone的模型在排行榜非常靠前的位置。

      Separable Convolutions

      可分离卷积可以分为空间可分离卷积(Spatially Separable Convolutions)和深度可分离卷积(depthwise separable convolution)。假设feature的size为[channel, height , width]

      • 空间也就是指:[height, width]这两维度组成的。
      • 深度也就是指:channel这一维度。

      Spatially Separable Convolutions

      简单来讲,空间可分离卷积就是将原nxn的卷积,分开计算变为1xn和nx1两步。普通的3x3卷积在一个5x5的feature map上,每个位置需要9次乘法,一共有9个位置,所以整个操作下来就是9x9=81次乘法操作。如果用空间可分离卷积的话,如下图所示:
      在这里插入图片描述第一步先使用3x1的filter,所需计算量为:15x3=45
      第二步使用1x3的filter,所需计算量为:9x3=27
      总共需要72次乘法就可以得到最终结果,要小于普通卷积的81次乘法。推广一下,假设对nxn的feature map使用kernel size为mxm的卷积,普通卷积需要计算的乘法次数为:
      在这里插入图片描述
      空间可分离卷积需要计算的乘法次数为:
      在这里插入图片描述
      那么代价比为:
      在这里插入图片描述
      在n>>m的情况下,这个比值将变为2/m,所以可以极大降低计算量。
      虽然空间可分离卷积节省了计算成本,但是一般情况很少用到。原因是并非所有的kernel 都可以分为两个较小的kernel;空间可分离卷积可能会带来一定的信息损失;如果将全部的传统卷积替换为空间可分离卷积,将影响模型的容量, 这样得到的训练结果可能是次优的。

      Depthwise Separable Convolutions

      深度可分离卷积在Xception或者MobileNet中大量使用,主要有两个部分组成:

      • Depthwise Convolution: 独立地施加在每个通道的空间卷积
      • Pointwise Convolution: 1x1 convolution,通过深度卷积将通道输出投影到一个新的通道空间。
        深度可分离卷积的pytorch实现:
      class DWConv(nn.Module):
          def __init__(self, in_plane, out_plane):
              super(DWConv, self).__init__()
              self.depth_conv = nn.Conv2d(in_channels=in_plane,
                                          out_channels=in_plane,
                                          kernel_size=3,
                                          stride=1,
                                          padding=1,
                                          groups=in_plane)
              self.point_conv = nn.Conv2d(in_channels=in_plane,
                                          out_channels=out_plane,
                                          kernel_size=1,
                                          stride=1,
                                          padding=0,
                                          groups=1)
          def forward(self, x):
              x = self.depth_conv(x)
              x = self.point_conv(x)
              return x
      

      通过比对代码,很容易理解下图的操作过程:
      在这里插入图片描述
      Inception模块和可分离卷积的区别:

      • 可分离卷积是先用Depthwise Convolution, 然后再使用1x1卷积;Inception中是先使用1x1 Convolution,然后再使用Depthwise Convolution。
      • 深度可分离卷积实现的时候没有增加非线性特征(也就是使用激活函数)。

      下面再来比较一下所需计算量:
      在这里插入图片描述以上图为例,普通卷积需要的计算量为:
      128 × ( 3 × 3 × 3 ) × ( 5 × 5 ) = 86400 128\times(3\times3\times3)\times(5\times5)=86400 128×(3×3×3)×(5×5)=86400
      对应128个3x3x3的卷积核移动5x5次的结果
      深度可分离卷积计算量应该分为两个部分:

      • 第一步:depthwise convolution 有3个3x3x1的kernel移动5x5次。
        3 × 3 × 3 × 1 × 5 × 5 = 675 3\times3\times3\times1\times5\times5=675 3×3×3×1×5×5=675
      • 第二步:1x1 convolution 有128个1x1x3的kernel移动5x5次。
        128 × 1 × 1 × 3 × 5 × 5 = 9600 128\times1\times1\times3\times5\times5=9600 128×1×1×3×5×5=9600

      两步总计10275次乘法,只有普通卷积计算量的12%左右。推广一下,对于一个输入尺寸为[C,H,W]的feature map, 如果用stride=1、padding=0、kernel size=h(h为奇数),那么输出的尺寸为 [ N c , H − h + 1 , W − h + 1 ] [N_c, H-h+1,W-h+1] [Nc,Hh+1,Wh+1]。普通卷积需要的乘法次数为: N c × h × h × C × ( H − h + 1 ) × ( W − h + 1 ) N_c{\times}h{\times}h{\times}C{\times}(H-h+1){\times}(W-h+1) Nc×h×h×C×(Hh+1)×(Wh+1)
      深度可分离卷积所需要乘法次数为:
      在这里插入图片描述
      代价比为:
      在这里插入图片描述
      在Nc>>h的情况下,代价比可约等于h的平方分之一。
      同样,深度可分离卷积也有缺点,通过使用深度可分离卷积替代普通的卷积,可以显著降低模型的计算量,但是与此同时会导致模型的容量也显著降低。这将导致训练得到的结果可能也不是最优的。因此,在使用深度可分离卷积的时候要考虑模型容量和计算效率的平衡。

      Flattened Convolutions

      最初在Flattened Convolutional Neural Networks for Feedforward Acceleration中提出,是2015年ICLR的workshop。了解了空间可分离卷积以后,再来看Flattened Convolutions就比较简单了,Flattened Convolution将标准的卷积核拆分成3个1D卷积核(空间可分离卷积只拆分HxW维度),可以极大地降低了计算成本。
      在这里插入图片描述
      论文在结论中提到,使用Flattened Convolutions能够将计算量减少为原来的10倍,并可以达到类似或更高的准确率在CIFAR-10、CIFAR-100和MNIST数据集中。
      深度学习中的学习型滤波器具有分布特征值,直接将分离应用在滤波器中会导致严重的信息损失,过多使用的话会对模型准确率产生一定影响。

      Shuffled Grouped Convolutions

      最初是在ShuffleNet中提出的,使用了pointwise group convolution和channel shuffle两种操作,能够在保持精度的同时极大地降低计算量。Channel Shuffle操作主要是为了消除原来Grouped Convolution中存在的副作用,也就是输出feature map的通道仅仅来自输入通道的一小部分,因此每个滤波器组仅限于学习一些特定的特性,如下图(a)所示。Grouped Convolution的这个属性会阻碍信息在通道组之间的信息流动并削弱了模型的表达。通过使用Channel Shuffle可以促进通道间信息的融合从而解决以上问题。
      在这里插入图片描述从上图中,(a)代表的是组卷积,所有输出只和一部分输入有关(b)代表的是Channel Shuffle组合的方式,不同的组内部进行了重排,都是用到了输入的一部分(c)代表的是一种与(b)等价的实现方式。ShuffleNet还用到了pointwise grouped convolution, 作者认为1x1卷积成本也非常高,所以也对1x1卷积使用组卷积,具体模块化的设计如下图(b)和©所示。
      在这里插入图片描述
      所以实际上用到了三种类型的卷积:

      • shuffled grouped convolution = grouped convolution + Channel Shuffle
      • pointwise grouped convolution = 1x1 convolution + grouped convolution
      • depthwise separable convolution

      Dilated Convolution(Atrous Convolution)

      空洞卷积是在DeepLabv1和《Multi-scale context aggregation by dilated convolutions》中提出的。空洞卷积是在kernel之间插入空洞,并引入了空洞率,具体操作如下:
      在这里插入图片描述
      空洞卷积能够在不增加计算量的情况下,增加模型的感受野。并且如果使用多个空洞卷积组成多层结构来构建网络,有效感受野将呈指数级增长,而所需要的参数数量仅仅呈线性增长。空洞卷积用于多尺度的上下文信息,并且不会丢失分辨率,在其应用到语义分割模型后,达到了当时的STOA。
      不过也存在几个问题:

      • Gridding Effect:
        kernel并不连续,并不是所有的点都被计算了,这会导致损失信息的连续性,对细粒度信息处理(pixel-level dense prediction)来说并不友好。
      • 上下文信息多少
        dilated convolution可以获取长距离信息,使用dilated convolution对大物体的效果会有一定效果,但是对小物体来说并不友好,小物体所需要的感受野并不需要太大。所以如何同时处理好不同大小物体之间的关系是使用空洞卷积的关键。

      Deformable Convolution

      可变形卷积(DCN) 是一个特别新颖的想法,最初是为了提升目标检测模型,提出以后也成为刷榜利器。DCN提出的动机是为何特征提取形状一定要是正方形或者矩形,为何不能更加自适应的分布到目标上,进而提出了一种形状可学习的卷积。
      在这里插入图片描述实现过程如下图所示,在普通卷积之外又添加了一个分支,专门用于学习每个点的偏移量,将原始的卷积和offset结合就形成了可变形卷积。
      在这里插入图片描述

      Attention

      Squeeze and Excitation

      在这里插入图片描述SENet的核心想法是,每个通道的重要性不是一样的。基于这个想法,SENet添加了一个模块,如上图靠上的分支,这个模块作用是给每个通道打分,最终将打分的结果与卷积得到的feature map相乘,完成特征通道的权重重分配。SENet是通道注意力机制的最经典的实现。pytorch实现:

      class SELayer(nn.Module):
          def __init__(self, channel, reduction=16):
              super(SELayer, self).__init__()
              self.avg_pool = nn.AdaptiveAvgPool2d(1)
              self.fc = nn.Sequential(
                  nn.Linear(channel, channel // reduction, bias=False),
                  nn.ReLU(inplace=True),
                  nn.Linear(channel // reduction, channel, bias=False),
                  nn.Sigmoid()
              )
      
          def forward(self, x):
              b, c, _, _ = x.size()
              y = self.avg_pool(x).view(b, c)
              y = self.fc(y).view(b, c, 1, 1)
              return x * y.expand_as(x)
      

      缺点:不利于并行处理,添加SELayer以后导致在GPU上运行速度有一定的减慢。

      Convolutional Block Attention Module

      CBAM模块算是比较早的一批将通道注意力机制和空间注意力机制结合起来的模型,通过添加该模块,能在一定程度上优化feature。
      CBAM分为Channel Attention Module 和 Spatial Attention Module:

      • pytorch实现通道注意力机制:
      class ChannelAttention(nn.Module):
          def __init__(self, in_planes, rotio=16):
              super(ChannelAttention, self).__init__()
              self.avg_pool = nn.AdaptiveAvgPool2d(1)
              self.max_pool = nn.AdaptiveMaxPool2d(1)
      
              self.sharedMLP = nn.Sequential(
                  nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False), nn.ReLU(),
                  nn.Conv2d(in_planes // rotio, in_planes, 1, bias=False))
              self.sigmoid = nn.Sigmoid()
      
          def forward(self, x):
              avgout = self.sharedMLP(self.avg_pool(x))
              maxout = self.sharedMLP(self.max_pool(x))
              return self.sigmoid(avgout + maxout)
      
      • pytorch实现空间注意力机制:
      class SpatialAttention(nn.Module):
          def __init__(self, kernel_size=7):
              super(SpatialAttention, self).__init__()
              assert kernel_size in (3,7), "kernel size must be 3 or 7"
              padding = 3 if kernel_size == 7 else 1
      
              self.conv = nn.Conv2d(2,1,kernel_size, padding=padding, bias=False)
              self.sigmoid = nn.Sigmoid()
      
          def forward(self, x):
              avgout = torch.mean(x, dim=1, keepdim=True)
              maxout, _ = torch.max(x, dim=1, keepdim=True)
              x = torch.cat([avgout, maxout], dim=1)
              x = self.conv(x)
              return self.sigmoid(x)
      

      最终CBAM模块选择将两个部分进行串联:
      在这里插入图片描述

      总结

      以上卷积核可以这样分类:

      • 通道和空间
        • Convolution
        • 1x1 Convolution
        • Spatial and Cross-Channel Convolutions
      • 通道相关性(channel)
        • Depthwise Separable Convolutions
        • Shuffled Grouped Convolutions
        • Squeeze and Excitation Network
        • Channel Attention Module in CBAM
      • 空间相关性(HxW)
        • Spatially Separable Convolutions
        • Flattened Convolutions
        • Dilated Convolutions
        • Deformable Convolution
        • Spatial Attention Module in CBAM

      现在很多CNN模型准确率越来越高,很多研究人员的研究方向也转向如何在尽可能保证准确率的情况下,尽可能减少模型参数,做好准确率和速度的平衡。
      总结一下效果优异的人工设计的backbone可能会用到以下策略:

      • 单一尺寸卷积核用多个尺寸卷积核代替(参考Inception系列)
      • 使用可变形卷积替代固定尺寸卷积(参考DCN)
      • 大量加入1x1卷积或者pointwise grouped convolution来降低计算量(参考NIN、ShuffleNet)
      • 通道加权处理(参考SENet)
      • 用深度可分离卷积替换普通卷积(参考MobileNet)
      • 使用分组卷积(参考ResNeXt)
      • 分组卷积+channel shuffle(参考shuffleNet)
      • 使用Residual连接(参考ResNet)
      展开全文
    • 右边是为了简洁将左边的公式略作变形 时间反向传播算法 多种不同的RNN神经网络 语言模型 通过概率来判断当前识别到的语句可能的意思,先建立词典,再将输入的单词转换为one-hot标签,不在字典中的可以设为标签。...
    • 如果堆叠了多层卷积层,则随着层次加深,提取的信息也愈加复杂、抽象,这是深度学习中很有意思的一个地方。最开始的层对简单的边缘有响应,接下来的层对纹理有响应,再后面的层对更加复杂的物体部件有响应。也就是说...
    • mnist的卷积神经网络例子和上一篇博文中的神经网络例子大部分是相同的。但是CNN层数要多一些,网络模型需要自己来构建。 程序比较复杂,我就分成几个部分来叙述。 首先,下载并加载数据: import tensorflow as tf ...
    • 该文首先概述了卷积神经网络的 发展历史,然后分别描述了神经元模型、多层感知器的结构.接着,详细分析了卷积神经网络的结构,包括卷积层、 池化层、全连接层,它们发挥着不同的作用.然后,讨论了网中网模型、空间...
    • 卷积神经网络

      万次阅读 多人点赞 2014-11-29 16:20:41
      自今年七月份以来,一直在实验室负责卷积神经网络(Convolutional Neural Network,CNN),期间配置和使用过theano和cuda-convnet、cuda-convnet2。为了增进CNN的理解和使用,特写此博文,以其与人交流,互有增益。...
    • 多层卷积神经网络深度学习算法可移植性分析.pdf
    • 基于多层卷积神经网络的SAR图像分类方法.pdf
    • 基于卷积神经网络多层特征融合和稀疏表示的表情识别,孙悦,杨勇,卷积神经网络浅层特征含有很多图像细节信息,深层特征含有更多抽象特征,为了充分利用不同层次特征的细节信息和抽象信息,将浅层

    空空如也

    空空如也

    1 2 3 4 5 ... 20
    收藏数 25,928
    精华内容 10,371
    关键字:

    多层神经网络卷积不同