关于CNN中的认知补充

作者: AyyB | 来源:发表于2021-12-13 16:58 被阅读0次

    卷积

    在听沈华伟老师讲授GCN中,他回顾了卷积操作,也让我对卷积更深的认识。例如他有讲到,卷积操作,实质上输入数组与卷积核作“卷积操作”,这里的卷积操作并不是我最初认识的。即,卷积窗口从输入数组的最左上方开始,按从左往右,从上往下的顺序一次在输入数组上滑动,窗口中的输入子数组与核数组按元素相乘并求和,得到输出数组中相应位置的元素。

    经过查阅资料呢,上述操作叫做互相关运算,即按序相乘并求和。而卷积操作又或者是沈华伟老师在讲授中所提到的卷积,是由卷积公式得出,我们所利用的卷积核是与我们所定义(初始化)的卷积核不同,即上下翻转,左右翻转,(翻转180度)做卷积操作时,输入数组是与这样的卷积核按序相乘并求和,应为卷积要求对应相乘元素,下标和为1(将卷积核中心元素定位(0,0)),这样就造成了老师所说的“输入子数组中的左上角元素与卷积核右下角元素相乘”。

    在《动手学深度学习》中,提到在卷积网络中,我们通常使用互相关操作来代替卷积操作,是因为核数组是通过训练学习出来的,卷积层无论使用互相关运算还是卷积元素那都不会影响模型预测时的输出。为了详细证明这点呢,我们可以使用经过互相关运算学习得到的核数组,翻转180度都,再与源输入作卷积运算,同样可以得到原来互相关运算得到的输出数组。因为卷积核是一个方块,并且通常是关于中心对称的,那么卷积核互相关运算得到的结果就是一样的。

    小结:1. 卷积层的核心计算是指互相关运算,在简单的形式下,它对输入数据核卷积核作互相关运算然后加上偏差。
    2. 可以通过设计卷积核来检测图像中的边缘。
    3. 可以通过数据来学习卷积核。

    填充和步幅

    填充

    在这之前要提到,经过卷积核输出数组形状为(nh-kh+1)*(nw - kw + 1)

    填充是指在输入 高和宽的两侧填充元素(通常式0元素)。这里我们用ph表示在高的两侧一共填充行数,在宽的两侧一共填充pw列。那么输出形状就是(nh + ph - kh + 1)*(nw + pw - kw + 1)。

    很多情况下,我们会设置ph = kh - 1,pw = kw - 1来使输入和输出具有相同的宽和高。这样方便在构造网络时推测每个层的输出形状。假设这里kh为技术,我们会在高的两侧分别填充ph/2行,如果kh为偶数,一种可能是在输入的顶端一侧填充ph/2(取上界)行,在底端一侧填充[ph/2](取下界)行。在宽的两侧同理。

    #输入形状为(8*8)

    conv2d = nn.Conv2D(1, kernel_size=(5, 3), padding=(2, 1))

    conv2d.shape #(8, 8)

    步幅

    卷积窗口从输入数组的最左上方开始,按左右,上下顺序,依次滑动,我们将每次滑动的行数和列数成为步幅。默认为1。

    这里用sh表示高上步幅,用sw表示宽上步幅。那么输出形状为[(nh + ph - kh + sh)/ sh]取下界 * [(nw + pw - kw + sw)/ sw]取下界。如果设置ph = kh - 1和pw = kw - 1,那么输出形状简化为[(nh -1 + sh) / sh]取下界 * [(nw - 1 + sw) / sw]取下界。此外如果输入宽和高能分别别高和宽上的步幅整除,那么输出形状为(nh / sh) * (nw /sw)。

    conv2d = nn.Conv2D(1, kernel_size=(3, 5), padding=(0, 1), strides=(3, 4))

    conv2d.shape #(2, 2)

    小结:1. 填充可以增加输出的高和宽。这常用来使输出与输入具有相同的高和宽。
    2. 步幅可以减少输出的高和宽,例如输出的高和宽仅为输入的高和宽的1/n(n > 1)。

    1*1卷积层

    输入和输出具有相同的高、宽,输出中的每个元素来自输入中在宽和高上相同位置的元素在不同通道之间的按权重累加。假设我们通道维当作特征维,将高和宽维度上的元素当作数据样本,那么1*1卷积层的作用和全连接层等价。

    1*1卷积层被当作保持高和宽度维度形状不变的全连接层使用。于是,我们可以通过调整网络层之间的通道数来控制模型复杂度。

    相关文章

      网友评论

        本文标题:关于CNN中的认知补充

        本文链接:https://www.haomeiwen.com/subject/ciylxrtx.html