精华内容
下载资源
问答
  •   前面两篇笔记写了卷积神经网络的两个部件,即卷积层与反卷积层,这篇笔记写池化层与反池化层。池化是一种很重要的下采样方法,它像水池一样汇集一个小区域加粗样式内的值,并总结浓缩成一个值输出,常用的有最大...

    前言


      前面两篇笔记写了卷积神经网络的两个部件,即卷积层与反卷积层,这篇笔记写池化层与反池化层。池化是一种很重要的下采样方法,它像水池一样汇集一个小区域内的值,并总结浓缩成一个值输出,常用的有最大池化Maxpooling——选择最大值输出,和平均池化Avepooling——取平均值作为输出。反池化,是一种和转置卷积类似的上采样方法,在分割任务中会用到。分组卷积是一种使模型轻量化的方法,本笔记也将浅浅的记录。本笔记的知识框架主要来源于深度之眼,并依此作了内容的丰富拓展,拓展内容主要源自对torch文档的翻译,对孙玉林等著的PyTorch深度学习入门与实战的参考和自己的粗浅理解,所用数据来源于网络。发现有人在其他平台照搬笔者笔记,不仅不注明出处,有甚者更将其作为收费文章,因此笔者将在文中任意位置插入识别标志。

       笔记是笔者根据自己理解一字一字打上去的,还要到处找合适的图片,有时为了便于理解还要修图,原创不易,转载请注明出处,文中笔者哪怕是引图也注明了出处的

      结果可视化见:深度之眼Pytorch打卡(十):Pytorch数据预处理——数据统一与数据增强(上)

      卷积操作见:深度之眼Pytorch打卡(十四):Pytorch卷积神经网络部件——卷积操作与卷积层、转置卷积操作与转置卷积层(反卷积)(对卷积转置卷积细致动图分析)

      转置卷积操作见:深度之眼Pytorch打卡(十五):Pytorch卷积神经网络部件——转置卷积操作与转置卷积层(对转置卷积操作全网最细致分析,转置卷积的stride与padding,转置与反卷积名称论证)


    池化与池化层


    • 池化操作

       池化(pooling)是一种下采样方法,其能在保持数据空间特征的同时减少数据大小1,进而减少冗余信息,降低训练时的运算量。最常用的主要包括最大池化和平均池化,即对区域内的值进行总结的方法是取最大值和取平均值。池化没有参数,故一般不算入卷积神经网络层数,它常常放在连续的卷积操作中间,卷积-池化-卷积-池化是较为典型的结构。

       最大池化:

      用区域内的最大值(响应)来代表该区域的所有值(响应),移位过程有点像卷积,但它是非线性运算,并且相邻两次移动到的区域一般不重叠,即stride=kernel_size,操作过程如图1所示,其摘自国外的文章:Convolution Neural Networkkernel_size=2,stride=2是最常用的池化超参数

    最大池化Maxpooling

    图1.Maxpooling过程

       平均池化:

      用区域内的平均值(响应)来代表该区域的所有值(响应),操作过程如图2所示,其摘自国外的文章:Convolution Neural Network。平均池化是线性运算

    平均池化Avgpooling

    图2.Avgpooling过程
    • Pytorch池化层

      最大池化层:

      Pytorch的最大池化层有三个,即nn.MaxPool1d()、nn.MaxPool2d()、nn.MaxPool2d()。这里只单独学习最最常用的nn.MaxPool2d(),其他的都类似或者相同。

      MaxPool2d()

    CLASS torch.nn.MaxPool2d(kernel_size: Union[int, Tuple[int, ...]], 
                             stride: Union[int, Tuple[int, ...], None] = None, 
                             padding: Union[int, Tuple[int, ...]] = 0, 
                             dilation: Union[int, Tuple[int, ...]] = 1, 
                             return_indices: bool = False, 
                             ceil_mode: bool = False)
                           
    # (CSDN意疏原创笔记:https://blog.csdn.net/sinat_35907936/article/details/107833112)
    

      return_indices: 如果为True,该函数类除了返回池化结果外,还会返回输入中每个最大值所在位置的索引(indices。 在用MaxUnpool2d做上采样(反池化)时需要该参数。

      ceil_mode: 输出尺寸取整方式,默认向下取整(floor),当ceil_modeTrue时向上取整。如输入尺寸5x5,取stride=2,kernel_size=2,则默认情况下输出尺寸为2x2ceil_modeTrue时输出尺寸为3x3

      平均池化层:

      Pytorch的平均池化层也有三个,即nn.AvgPool1d()、nn.AvgPool2d()、nn.AvgPool2d()。这里也只单独学习最最常用的nn.AvgPool2d(),其他的都类似或者相同。

      AvgPool2d()

    CLASS torch.nn.AvgPool2d(kernel_size: Union[int, Tuple[int, int]], 
                             stride: Union[int, Tuple[int, int], None] = None, 
                             padding: Union[int, Tuple[int, int]] = 0, 
                             ceil_mode: bool = False, 
                             count_include_pad: bool = True, 
                             divisor_override: bool = None)
                           
     #(CSDN意疏原创笔记:https://blog.csdn.net/sinat_35907936/article/details/107833112)
    

      count_include_pad: 计算均值时是否把padding的像素值算在内。
      divisor_override: 除法因子更改,如果设置了该值,则在求均值时不再除以kernel覆盖的像素个数,而是除以该值。

      池化层使用

      代码:transform_inverse()函数定义见此文,池化过程不改变通道数。

    import torch
    from PIL import Image
    import torch.nn as nn
    import matplotlib.pyplot as plt
    import torchvision.transforms as transforms
    from tools.transform_inverse import transform_inverse
    
    MaxPool_layer = nn.MaxPool2d((2, 2), 2)
    AvgPool_layer = nn.AvgPool2d((2, 2), 2)
    
    # 4个元素,除法因子应该为4,此处改为8,输出会黯淡一倍
    AvgPool_layer1 = nn.AvgPool2d((2, 2), 2, divisor_override=8)
    
    pil_img = Image.open('data/lenna.jpg').convert('RGB')
    img = transforms.ToTensor()(pil_img)
    print(img.size())
    c = img.size()[0]
    h = img.size()[1]
    w = img.size()[2]
    img = torch.reshape(img, [1, c, h, w])
    
    MaxPool_out = MaxPool_layer(img)
    AvgPool_out = AvgPool_layer(img)
    AvgPool_out1 = AvgPool_layer1(img)
    
    MaxPool_out = torch.squeeze(MaxPool_out)
    AvgPool_out = torch.squeeze(AvgPool_out)
    AvgPool_out1 = torch.squeeze(AvgPool_out1)
    
    print(MaxPool_out.size())
    MaxPool_pil = transform_inverse(MaxPool_out, None)
    AvgPool_pil = transform_inverse(AvgPool_out, None)
    AvgPool_pil1 = transform_inverse(AvgPool_out1, None)
    
    plt.figure(0)
    ax = plt.subplot(2, 2, 1)
    ax.set_title('input img')
    ax.imshow(pil_img)
    ax = plt.subplot(2, 2, 2)
    ax.set_title('MaxPool_out img')
    ax.imshow(MaxPool_pil)
    ax = plt.subplot(2, 2, 3)
    ax.set_title('Avgpool_out img')
    ax.imshow(AvgPool_pil)
    ax = plt.subplot(2, 2, 4)
    ax.set_title('AvgPool_out with divisor_override=8')
    ax.imshow(AvgPool_pil1)
    plt.show()
    
    
     #(CSDN意疏原创笔记:https://blog.csdn.net/sinat_35907936/article/details/107833112)
    

      结果:用kernel_size = 2,stride = 2的池化层,可以将输入尺寸缩减一半,但是大部分的信息都没有丢失,如图3所示。所以池化操作可以减少冗余,进而减小后续的计算量。平均池化,可以通过修改除法因子来修改池化结果,除法因子是根据实际情况的需要的修改的,一般保持默认值。

    torch.Size([3, 440, 440])
    torch.Size([3, 220, 220])
    

    最大池化与平均池化作用结果

    图3.最大池化与平均池化作用结果

    反池化与反池化层


    • 反池化操作

      反池化是一种上采样技术,常用在图像分割任务中。如图4,就是反池化在经典的编码-解码图像分割网络中,与转置卷积共同作用,进行上采样的图示,图源

    反池化在图像分割任务中的应用

    图4.反池化在图像分割任务中的应用
      

      最大池化的反池化。在进行最大池化时,记录下输入的最大值所在位置的索引。在进行反池化时,将输入值根据其所在位置分别放到索引指示的地方,其他位置补零,流程如图5所示,图源。可以看出,两者是一个对称的过程,即池化输入尺寸等于反池化输出尺寸,池化输出尺寸等于反池化输入尺寸,正是应为这样,索引才能对应上。

    最大池化与最大反池化过程

    图5.最大池化与最大反池化过程
    • 反池化层

      MaxUnpool2d()

    CLASS torch.nn.MaxUnpool2d(kernel_size: Union[int, Tuple[int, int]], 
                               stride: Union[int, Tuple[int, int], None] = None, 
                               padding: Union[int, Tuple[int, int]] = 0)
    

      stride: 笔者觉得官方文档的解释有问题,以下是笔者理解:输入的一个元素在输出中对应区域的宽高,如stride=2,则表示MaxUnpool2d输入的一个元素,在输出中对应2*2的一个区域。一般取stride=kernel_size
      padding: 笔者觉得官方文档的解释有问题,以下是笔者理解:输入计算尺寸被缩减的值。如输入尺寸是3*3,若padding=1,则表示输入计算尺寸被缩减到(3-1)*(3-1),即2*2,若此时stride=2,则可得输出尺寸是4*4。因为并且索引必须与输入同尺寸,即3*3,所以最后输出就是4*4的张量中有9个点有值,其他均为零。如下代码所示。

      代码:

    import torch
    import torch.nn as nn
    
    MaxUnpool_layer = nn.MaxUnpool2d((2, 2), 2, padding=0)
    MaxUnpool_layer1 = nn.MaxUnpool2d((2, 2), 2, padding=1)
    
    In = torch.randn(1, 1, 3, 3)
    print(In)
    idx = torch.tensor([[0, 5, 3],
                       [8, 6, 11],
                        [12, 13, 14]])   # 4*4的张量被拉成一维张量后的序号
    print(idx)
    idx = torch.reshape(idx, [1, 1, 3, 3])
    MaxunPool_out = MaxUnpool_layer(In, indices=idx)
    MaxunPool_out1 = MaxUnpool_layer1(In, indices=idx)
    print(MaxunPool_out)
    print(MaxunPool_out1)
    

      结果:

    
    # input
    tensor([[[[ 2.0394, -0.0362,  0.0612],
              [-0.3057, -0.3779,  0.2984],
              [-0.4500,  1.2419,  0.1124]]]])
    
    # indices
    tensor([[ 0,  5,  3],
            [ 8,  6, 11],
            [12, 13, 14]])
    
    # padding=0,输出6*6的张量
    
    tensor([[[[ 2.0394,  0.0000,  0.0000,  0.0612,  0.0000, -0.0362],
              [-0.3779,  0.0000, -0.3057,  0.0000,  0.0000,  0.2984],
              [-0.4500,  1.2419,  0.1124,  0.0000,  0.0000,  0.0000],
              [ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000],
              [ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000],
              [ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000]]]])
              
    # padding=1,输出4*4的张量          
    tensor([[[[ 2.0394,  0.0000,  0.0000,  0.0612],
              [ 0.0000, -0.0362, -0.3779,  0.0000],
              [-0.3057,  0.0000,  0.0000,  0.2984],
              [-0.4500,  1.2419,  0.1124,  0.0000]]]])
    

      MaxPoolMaxUnPool配合使用,此时MaxUnPool不要用Padding,否则会报如下错误:RuntimeError: Found an invalid max index。

    MaxPool_out, idx1 = MaxPool_layer(In)
    MaxunPool_out = MaxUnpool_layer(MaxPool_out, indices=idx1)
    

    其他层


    • 非线性激活函数层

      很多非线性激活函数在这篇笔记中已经梳理,此处不赘述。


    参考


    1. https://yjjo.tistory.com/8 ↩︎

    展开全文
  • 池化层最大池化、平均池化pytorch实现池化(下采样)最大池化平均池化pytorch实现反池化(上采样)最大值反池化线性层激活函数层sigmoidtanhrelu 池化层 最大池化、平均池化 pytorch实现池化(下采样) 最大池化 ...

    池化层

    最大池化、平均池化

    在这里插入图片描述

    pytorch实现池化(下采样)

    最大池化

    在这里插入图片描述
    冗余信息剔除、减小运算量

    平均池化

    在这里插入图片描述
    相对于最大池池化的图像亮度较小

    pytorch实现反池化(上采样)

    最大值反池化

    在这里插入图片描述

    img_reconstruct = torch.randn_like(img_pool, dtype=torch.float)
    maxunpool_layer = nn.MaxUnpool2d((2, 2), stride=(2, 2))
    img_unpool = maxunpool_layer(img_reconstruct, indices)
    

    线性层

    在这里插入图片描述
    在这里插入图片描述

    激活函数层

    非线性变换

    sigmoid

    在这里插入图片描述

    tanh

    在这里插入图片描述

    relu

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 演示反池化的操作

    千次阅读 2018-05-13 16:46:50
    对于最大池化层,也不支持输出最大激活值得位置,但是同样有个池化的反向传播函数tf.nn.max_pool_with_argmax()。该函数可以找出位置,需要开发者利用这个函数做一些改动,自己封装一个最大池化操作,然后再根据mask...
    TensorFlow中目前还没有反池化操作的函数。对于最大池化层,也不支持输出最大激活值得位置,但是同样有个池化的反向传播函数tf.nn.max_pool_with_argmax()。该函数可以找出位置,需要开发者利用这个函数做一些改动,自己封装一个最大池化操作,然后再根据mask写出反池化函数。
    def max_pool_with_argmax(net,stride):
    '''
    重定义一个最大池化函数,返回最大池化结果以及每个最大值的位置(是个索引,形状和池化结果一致)
    args:
    net:输入数据 形状为[batch,in_height,in_width,in_channels]
    stride:步长,是一个int32类型,注意在最大池化操作中我们设置窗口大小和步长大小是一样的
    '''
    #使用mask保存每个最大值的位置 这个函数只支持GPU操作
    _, mask = tf.nn.max_pool_with_argmax( net,ksize=[1, stride, stride, 1], strides=[1, stride, stride, 1],padding='SAME')
    #将反向传播的mask梯度计算停止
    mask = tf.stop_gradient(mask)
    #计算最大池化操作
    net = tf.nn.max_pool(net, ksize=[1, stride, stride, 1],strides=[1, stride, stride, 1], padding='SAME')
    #将池化结果和mask返回
    return net,mask
    
    
    
    def un_max_pool(net,mask,stride):
    '''
    定义一个反最大池化的函数,找到mask最大的索引,将max的值填到指定位置
    args:
    net:最大池化后的输出,形状为[batch, height, width, in_channels]
    mask:位置索引组数组,形状和net一样
    stride:步长,是一个int32类型,这里就是max_pool_with_argmax传入的stride参数
    '''
    ksize = [1, stride, stride, 1]
    input_shape = net.get_shape().as_list()
    # calculation new shape
    output_shape = (input_shape[0], input_shape[1] * ksize[1], input_shape[2] * ksize[2], input_shape[3])
    # calculation indices for batch, height, width and feature maps
    one_like_mask = tf.ones_like(mask)
    batch_range = tf.reshape(tf.range(output_shape[0], dtype=tf.int64), shape=[input_shape[0], 1, 1, 1])
    b = one_like_mask * batch_range
    y = mask // (output_shape[2] * output_shape[3])
    x = mask % (output_shape[2] * output_shape[3]) // output_shape[3]
    feature_range = tf.range(output_shape[3], dtype=tf.int64)
    f = one_like_mask * feature_range
    # transpose indices & reshape update values to one dimension
    updates_size = tf.size(net)
    indices = tf.transpose(tf.reshape(tf.stack([b, y, x, f]), [4, updates_size]))
    values = tf.reshape(net, [updates_size])
    ret = tf.scatter_nd(indices, values, output_shape)
    return ret
    
    #定义一个形状为4x4x2的张量
    img = tf.constant([
    [[0.0,4.0],[0.0,4.0],[0.0,4.0],[0.0,4.0]],
    [[1.0,5.0],[1.0,5.0],[1.0,5.0],[1.0,5.0]],
    [[2.0,6.0],[2.0,6.0],[2.0,6.0],[2.0,6.0]],
    [[3.0,7.0],[3.0,7.0],[3.0,7.0],[3.0,7.0]],
    ])
    img = tf.reshape(img,[1,4,4,2])
    #最大池化操作
    pooling1 = tf.nn.max_pool(img,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
    #带有最大值位置的最大池化操作
    pooling2,mask = max_pool_with_argmax(img,2)
    #反最大池化
    img2 = un_max_pool(pooling2,mask,2)
    with tf.Session() as sess:
    print('image:')
    image = sess.run(img)
    print(image)
    #默认的最大池化输出
    result = sess.run(pooling1)
    print('max_pool:\n',result)
    #带有最大值位置的最大池化输出
    result,mask2 = sess.run([pooling2,mask])
    print('max_pool_with_argmax:\n',result,mask2)
    #反最大池化输出
    result = sess.run(img2)
    print('un_max_pool',result)
    这里我们自己定义了两个函数,一个是带有最大值位置的最大池化函数,一个反最大池化函数,程序运行后,我们应该可以看到自己定义的最大池化与原来的版本输出是一样的,由于tf.nn.max_pool_with_argmax()函数只支持GPU操作,不能在CPU机器上运行,所以我没法运行这段程序。mask的值是将整个数组flat后的索引,并保持与池化结果一致的shape。
    参考
    展开全文
  • 文章目录卷积层定义特点池化层特点上采样卷积/转置卷积 卷积层 定义 首先需要了解图像是个什么东西? 通道 常用于表示图像的某种组成。一个标准数字相机拍摄的图像会有三通道 - 红、绿和蓝;你可以把它们看作是...

    卷积层

    定义

    首先需要了解图像是个什么东西?
    通道 常用于表示图像的某种组成。一个标准数字相机拍摄的图像会有三通道 - 红、绿和蓝;你可以把它们看作是互相堆叠在一起的二维矩阵(每一个通道代表一个颜色),每个通道的像素值在 0 到 255 的范围内。
    灰度图像,仅仅只有一个通道。在本篇文章中,我们仅考虑灰度图像,这样我们就只有一个二维的矩阵来表示图像。矩阵中各个像素的值在 0 到 255 的范围内——零表示黑色,255 表示白色

    卷积的主要目的是为了从输入图像中提取特征。卷积可以通过从输入的一小块数据中学到图像的特征,并可以保留像素间的空间关系。我在这里并不会详细讲解卷积的数学细节,因为我也不会,但我会试着理解卷积是如何处理图像的。

    每张图像都可以看作是像素值的矩阵。考虑一下一个 5 x 5 的图像,它的像素值仅为 0 或者 1(注意对于灰度图像而言,像素值的范围是 0 到 255,下面像素值为 0 和 1 的绿色矩阵仅为特例):
    在这里插入图片描述
    那还有一个 3 x 3 的矩阵,如下所示:
    在这里插入图片描述
    他们结合在了一起,得到了如下的结果,操作的方式可以理解成每个黄色的值都和绿色的值相乘,结果相加:
    在这里插入图片描述
    在 CNN 的术语中,3x3 的矩阵叫做“滤波器(filter)”或者“核(kernel)”或者“特征检测器(feature detector)”,通过在图像上滑动滤波器并计算点乘得到矩阵叫做“卷积特征(Convolved Feature)”或者“激活图(Activation Map)”或者“特征图(Feature Map)”。记住滤波器在原始输入图像上的作用是特征检测器。
    在这里插入图片描述

    特点

    • 局部感知:人的大脑识别图片的过程中,并不是一下子整张图同时识别,而是对于图片中的每一个特征首先局部感知,然后更高层次对局部进行综合操作,从而得到全局信息。第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。
    • 参数共享
      五个小朋友对应五个神经元,也叫filter,每个小盆友视野有限,每次只看一小块,慢慢滑动直到看完,那么左图中的小块叫感受野(receptive field)。
      每个小朋友看完一张图得到一张图,五个人得出五张,即depth是5,即神经元个数。
      小盆友1视野很小,每个感受野对应一些参数,假设为w1w2w3w4,每滑动一次,另一个感受野又对应四个w,因为每个小朋友都有自己处事原则(不管看什么,参数不变),所以一个小盆友只要学习四个参数。一幅图只要4*5=20个参数。

    池化层

    池化(Pooling)是卷积神经网络中另一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效地原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。
    在这里插入图片描述

    特点

    1. 特征不变形:池化操作是模型更加关注是否存在某些特征而不是特征具体的位置。
    2. 特征降维:池化相当于在空间范围内做了维度约减,从而使模型可以抽取更加广范围的特征。同时减小了下一层的输入大小,进而减少计算量和参数个数。
    3. 在一定程度上防止过拟合,更方便优化。

    上采样

    在应用在计算机视觉的深度学习领域,由于输入图像通过卷积神经网络(CNN)提取特征后,输出的尺寸往往会变小,而有时我们需要将图像恢复到原来的尺寸以便进行进一步的计算(e.g.:图像的语义分割),这个采用扩大图像尺寸,实现图像由小分辨率到大分辨率的映射的操作,叫做上采样(Upsample)。
    上采样有3种常见的方法:双线性插值(bilinear),反卷积(Transposed Convolution),反池化(Unpooling)。

    反卷积/转置卷积

    反卷积也被称为转置卷积,反卷积其实就是卷积的逆过程。大家可能对于反卷积的认识有一个误区,以为通过反卷积就可以获取到经过卷积之前的图片,实际上通过反卷积操作并不能还原出卷积之前的图片,只能还原出卷积之前图片的尺寸。
    http://www.360doc.com/content/19/0507/12/57110788_834069126.shtml

    上采样

    池化也叫下采样(down-sampling), 操作与普通卷积基本相同, 不过根据取最大值或平均值可分为最大池化和平均池化, 同时无反向传播过程(无需学习参数).

    上池化保留位置信息补0, 上采样不保留位置信息直接复制. 但二者均无反向传播过程(无需学习参数), 也就是对中间地带不采取过渡值只是简单处理.
    在这里插入图片描述

    • 图(a)表示上池化UnPooling的过程,特点是在池化Maxpooling的时候保留最大值的位置信息,之后在上池化UnPooling阶段使用该信息扩充Feature Map,除最大值位置以外,其余补0。
    • 与之相对的是图(b),两者的区别在于上采样UnSampling阶段没有使用MaxPooling时的位置信息,而是直接将内容复制来扩充Feature Map。从图中即可看到两者结果的不同。
    • 图(c)为反卷积的过程,反卷积是卷积的逆过程,又称作转置卷积(Transposed Convolution)。最大的区别在于反卷积过程是有参数要进行学习的(类似卷积过程),而上池化和上采样是无反向传播过程的. 理论上反卷积可以实现UnPooling和unSampling,只要卷积核的参数设置的合理。

    扩展卷积 dilated convolution

    区别

    扩张卷积和普通卷积的区别在于,卷积核的大小是一样的,在神经网络中即参数数量不变,区别在于扩张卷积具有更大的感受野。感受野是卷积核在图像上看到的大小。
    相比原来的标准卷积,扩张卷积(dilated convolution) 多了一个hyper-parameter(超参数)称之为dilation rate(扩张率),指的是kernel各点之前的间隔数量,正常的convolution 的 dilatation rate为 1。
    在这里插入图片描述

    (a)图对应3x3的1-dilated conv,和普通的卷积操作一样。(b)图对应3x3的2-dilated conv,实际的卷积kernel size还是3x3,但是空洞为1,需要注意的是空洞的位置全填进去0,填入0之后再卷积即可。
    比如上图中(a),dilated=1,F(dilated) = 3×3;图(b)中,dilated=2,F(dilated)=7×7;图(c)中,dilated=4, F(dilated)=15×15。
    dilated=2时具体的操作,即按照下图在空洞位置填入0之后,然后直接卷积就可以了。
    在这里插入图片描述

    空洞卷积的动态过程

    在这里插入图片描述

    上图是一个扩张率为2的3×3卷积核,感受野与5×5的卷积核相同,而且仅需要9个参数。你可以把它想象成一个5×5的卷积核,每隔一行或一列删除一行或一列。
    在相同的计算条件下,空洞卷积提供了更大的感受野。空洞卷积经常用在实时图像分割中。当网络层需要较大的感受野,但计算资源有限而无法提高卷积核数量或大小时,可以考虑空洞卷积。

    Dilated Convolution感受野指数级增长

    对于标准卷积核情况,比如用3×3卷积核连续卷积2次,在第3层中得到1个Feature点,那么第3层这个Feature点换算回第1层覆盖了多少个Feature点呢?
    第一层的一个5×5大小的区域经过2次3×3的标准卷积之后,变成了一个点。也就是说从size上来讲,2层33卷积转换相当于1层55卷积。即,一个5×5的卷积核是可以由2次连续的3×3的卷积代替。
    但对于dilated=2,3*3的扩张卷积核呢?
    可以看到第一层13×13的区域,经过2次3×3的扩张卷积之后,变成了一个点。即从size上来讲,连续2层的3×3空洞卷积转换相当于1层13×13卷积

    Gated Convolution

    Why

    • vanilla convolution(普通卷积)认为所有通道的输入像素都是有效的,但gated convolution可以通过对每个channel应用参数可学的特征选择机制,将所有层响应空间位置的像素融合到一起,达到对partial convolution(部分卷积)进行泛化的目的。
    • 针对规则的矩形mask设计出来的GANs无法处理free-form masks,已经有文章论证了vanilla convolution无法解决free-form image inpainting任务。

    How

    partial conv可以被认为是hard-gating single-channel un-learnable layer再跟input feature map逐像素点乘。
    gated conv抛弃通过固定规则进行更新的hard mask,而是从数据中自动学习soft mask,公式如下:
    在这里插入图片描述
    其中,σsigmaσ表示对0~1的output gating values使用sigmoid激活函数,ϕ可以是任意激活函数(ReLU or LeakyReLU)

    展开全文
  • 原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9579108.html ... 一.... 大家学过神经网络的都知道,在神经网络中有一层是pooling层也就是池化层,通过池化对特征进行提取并且...
  • 返回主目录 返回 CNN 卷积神经网络目录 上一章:深度篇—— CNN 卷积神经网络(一)细说 cnn 卷积神经...本小节,细说 池化 与 反池化,下一小节细说 关于 ROI 与 插值 二. 池化层 (pooling layer) 1. 池化...
  • PyTorch框架学习十——基础网络层(卷积、转置卷积、池化、线性、激活函数)一、卷积层二、转置卷积层三、池化层 上次笔记介绍了PyTorch中如何进行网络搭建,是从宏观上来学习,这次笔记介绍一个网络内部的具体网络...
  • [深度学习] 池化层

    千次阅读 2018-07-15 22:17:50
    池化层的输入一般来源于上一个卷积层,主要的作用是提供了很强的鲁棒性。(例如max-pooling是取一小块区域中的最大值,此时若此区域中的其他值略有变化,或者图像稍有平移,pooling后...池化层一般没有参数,所以...
  • 任务名称:学习网络层中的卷积层,池化层,全连接层和激活函数层 ...本节第二部分学习池化层,全连接层和激活函数层,在池化层中有正常的最大值池化,均值池化,还有图像分割任务中常用的反池化——M
  • 任务名称:学习网络层中的卷积层,池化层,全连接层和激活函数层 ...本节第二部分学习池化层,全连接层和激活函数层,在池化层中有正常的最大值池化,均值池化,还有图像分割任务中常用的反池化——MaxUn

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 155
精华内容 62
关键字:

反池化层