我研究了卷积神经网络的工作架构。在实施过程中,我遇到了过滤器权重变化的问题。
为简单起见,请考虑以下层结构:
+-----------------------------------+
| Input image volume |
| HxWxD |
+-----------------------------------+
|
+-----------------------------------+
| Convolution layer |
| |
| in: HxWxD, out: H1xW1xD1 |
| |
| K filters with size FxFxD |
| S - stride, P - zero padding |
| H1 = (H - F + 2P) / S + 1 |
| W1 = (W - F + 2P) / S + 1 |
| D1 = K |
+-----------------------------------+
|
+-----------------------------------+
| ReLU layer |
| |
| in: H1xW1xD1, out: H2xW2xD2 |
| |
| H2 = H1, W2 = W1, D2 = D1 |
+-----------------------------------+
|
+-----------------------------------+
| Maxpooling layer |
| |
| in: H2xW2xD2, out: H3xW3xD3 |
| |
| scale [= 2] |
| H3 = H2 / scale |
| W3 = W2 / scale |
| D3 = D2 |
+-----------------------------------+
|
[convert volume to vector]
[W3xH3xD3 -> W3*H3*D3 = N]
|
+-----------------------------------+
| Full connected layer |
| |
| in: N, out: M |
| |
| W: matrix MxN |
| activate: sigmoid |
+-----------------------------------+
|
为进一步简化,请考虑32x32 RGB图像的示例。
输入音量将为32x32x3 在卷积层中,我们将使用K = 4个大小为5x5x3的滤波器,其中S = 1,P = 0,也就是说,通过将输入体积与每个体积进行卷积,来自32x32x3体积的图层将收到28x28x4体积。 K个过滤器。 ReLU层将重置卷中的所有负数并将其返回,因此输出将再次为28x28x4层 具有乘数2的Maxpooling层会将体积28x28x4变成体积14x14x4 一个完全连接的层将在输入处接收一个14 * 14 * 4 = 784个元素的向量,将其乘以矩阵W = [10x784](我们将识别10个类别),将接收一个包含值的10个元素的向量从0到1(由S型激活)。 之后,我们找到误差向量e,然后将转置矩阵W与向量e相乘,然后传播回误差向量e,并通过与将体积转换为向量相同的方式依次输入来将其转换为14x14x4的体积。>
maxpooling的层将返回体积28x28x4,其中非最大值元素以及最大值为体积14x14x4的对应值的元素将为零。
ReLU层将每个元素乘以1或0,具体取决于在输出端获得的是正数还是负数,然后返回相同的层28x28x4。
问题来了。为了获得权重的变化,有必要对输入体积32x32x3与体积28x28x4进行卷积,而以某种方式获得4体积的5x5x3。假设将增量体积分成4个体积28x28x1,但是又如何获得5x5x3(而不是5x5x1)的权重呢?
再次简短地:
转发:[32x32x3] =>带4个滤镜的卷积[5x5x3] => [28x28x4] => ReLu => [28x28x4] => maxpooling => [14x14x4] => vectorize => [784] => W * X => [10]
后退:[10] => W ^ T * e => [784] =>'volumize'=> [14x14x4] =>解池=> [28x28x4] => * relu grad => [28x28x4] => ???