Trabalhem juntos para criar e crescer juntos! Este é o 14º dia da minha participação no "Nuggets Daily New Plan·August Update Challenge", clique para ver os detalhes do evento
Rede Neural Convolucional
convolução
O processo de convolução pode ser visto como uma multiplicação especial entre duas matrizes, como mostra a figura a seguir:
Um é o tensor de entrada e o outro é o kernel de convolução. O kernel de convolução geralmente é uma matriz de tamanho menor, como 3X3, 5X5, etc. O kernel de convolução começará no canto superior esquerdo do tensor de entrada, da esquerda para a direita, a partir do topo Deslizando para baixo, a matriz da parte do tensor de entrada e o kernel de convolução são multiplicados por elemento e adicionados para obter um valor.
De acordo com a figura acima, o processo de cálculo de cada elemento do tensor de saída é o seguinte:
A animação a seguir mostra todo o processo:
Recomende um site: pwwang.github.io/cnn-convolu…
O processo de cálculo de convolução na figura acima é na verdade uma operação de correlação cruzada.
Em matemática, a convolução de duas funções é definida como:
可以解释成函数 f 与 g 经过翻转和平移时,计算两个函数之间的重叠面积。当是离散对象时,积分就变成求和运算,公式如下:
该公式应用到二维张量中,对应的就是:
根据这个公式,计算过程如下:
和之前讲的不太一样,好像不是一一对应的元素相乘,再相加。因为减号的存在,所以计算过程相当于将核矩阵旋转了180度,再与输入矩阵相乘求和了。
其实在卷积神经网络的应用场景下,更多的是对待图像,图像是否旋转,旋转多少,对于计算机是无区别的,计算机计算的是图像的像素点,不旋转的互相关运算计算起来更方便。因此,很多深度学习框架直接使用互相关运算来表示卷积的过程。
卷积中的卷,指的是函数翻转与滑动,你可以理解成卷毛巾过程,从 g(z) 变成 g(i-z) 的这个过程。
卷积中的积,指的是积分或者求和。
到这里希望你理解了卷积的含义以及在神经网络的含义。
推荐理解文章:
Padding与Stride
假设输入形状为 ,卷积核形状为 ,那么输出形状将是 。因此,卷积的输出形状取决于输入形状和卷积核的形状。
填充
在上述图片的计算过程,其实我们丢失了边缘信息,如果希望在输出张量中存在边缘信息,就可以在输入张量进行填充元素,默认是 0 ,这就是 Padding
。如下图所示:
假设对输入张量进行 行填充, 列填充,那么输出的形状将为
在很多情况下,我们希望输入张量与输出张量形状是一致的,那么就需要设置 和 。
- 假设 是奇数,我们将在高度的两侧填充 行。
- 是偶数,则一种可能性是在输入顶部填充 行,在底部填充 行。
在代码中都是 p/2
。
卷积神经网络中卷积核的高度和宽度通常为奇数,例如1、3、5或7。
步幅
卷积核会从输入张量的左上方开始,按从左往右、从上往下的顺序,依次在输入矩阵上滑动,那么滑动的行数和列数称为步幅(Stride)。
在之前的例子中都是默认步幅是 1 。如下图所示,使用了纵向步幅为3、横向步幅为2 的计算过程。
通常,当垂直步幅为 、水平步幅为 时,输出形状为
通道
一张彩色的图像,是一个 的高维数组, 和 是图像的高度与宽度,单位是像素,3则是图像的通道,因为RGB(红、绿、蓝)3个颜色通道。
当你的输入张量具有多个通道时,构造的卷积核的通道数需要与输入张量的通道数相同,不同的通道的卷积核与不同通道的输入张量进行计算。
举个例子:
假设输入张量的通道数为 ,那么卷积核的输入通道数也需要为 。我们卷积核的形状为 的张量。将这些 个张量连结在一起可以得到形状为 的卷积核。由于输入和卷积核都有 个通道,我们可以对每个通道输入的二维张量和卷积核的二维张量进行互相关运算,再对通道求和(将 的结果相加)得到二维张量。
多输入通道与卷积核进行运算会得到单通道的二维张量。
当输出通道为多个,卷积核需要再增加一维,多个通道的卷积核进行相加得到输出张量。
举个例子:
假设输入和输出通道的数目分别表示 和 ,卷积核的高度和宽度为 和 ,当 大于 1 时,每个输出通道都会有一个形状为 的卷积核张量,那么整个卷积核形状是 。每个输出通道的输出张量是每个通道的卷积核相加得到结果。
建议多理解一下这里!
当多输入通道,卷积核也会有着同样的通道,通道对应的进行互相关计算,最后结果相加得到一个二维张量,当多输出通道,在多输入通道的基础上,增加卷积核的维度,就可以得到多个输出通道结果。
池化层
与卷积层类似,由一个固定窗口构成,叫做pooling
。该窗口会根据步幅在输入张量上进行滑动,根据特殊计算得到一个输出,值得注意的是该窗口是没有参数构成,就是设置一个固定形状的窗口。通常计算窗口中所有元素的最大值或平均值,分别称为最大池化层(maximum pooling)和平均池化层(average pooling)。
假设设置一个最大池化层,它的形状为 2X2。窗口就会从输入张量的左上角开始,从左往右、从上往下的在输入张量内滑动,计算覆盖输入张量的子张量的最大值,得出输出结果。
计算过程如下:
池化层也有步幅与填充,该过程与卷积层是一样的,就不多介绍了。
当涉及的多个通道输入数据时候,池化层会在每个通道进行单独运算,不会对结果进行汇总,相当于处理每一个通道的数据, 所以池化层的输出通道数与输入通道数相同。池化层是没有多个输出通道问题。
为什么会需要池化层?
No processo de aprendizado real, quando queremos identificar um objeto na imagem, ele não aparecerá em uma posição fixa no conjunto de dados, e as posições dos pixels de diferentes objetos da imagem também são diferentes. O que precisamos prestar mais atenção é se o contorno do objeto atende às nossas expectativas.O objeto a ser reconhecido não quer que o modelo tenha certos requisitos sobre a posição do pixel do objeto. O agrupamento de camadas pode aliviar a sensibilidade excessiva das camadas convolucionais para posicionar enquanto reduz a sensibilidade a representações com redução de amostragem espacial.
referir-se:
- lulaoshi.info/machine-lea…
- www.cnblogs.com/shine-lee/p…
- zhuanlan.zhihu.com/p/268179286
- Aprendizado Profundo Prático - Li Mu