我正在学习如何使用卷积神经网络,并继续为此编写自己的框架。 我陷入了必须通过网络反向传播误差(增量)并计算梯度的部分。我知道 CNN 中的滤波器是 3D 的,所以我们有一些滤波器的宽度、高度和深度。 前馈没问题。让我们看一下前馈步骤中某层输出的计算公式:
第l层中滤波器的深度应与前一层l-1的输出z的输出通道数(深度)相同,以便进行卷积。所以在这里,在这个公式中,我们将前一层的输出和当前层的权重进行卷积,这是有效的,因为第三个坐标(深度)在这两者中是相等的。现在,让我们检查一下误差反向传播的公式:
在这个中,我们有 delta 和权重数组 w 的卷积,两者都来自层 l+1。现在这让我感到困惑,因为一般来说它们的第三个坐标(深度)并不总是相等。考虑 VGGNet 架构,让我们看一下过滤器数量变化的三个连续层:
...
CONV3-128:[112x112x128]内存:112*112*128=1.6M 权重:(3*3*128)*128 = 147,456
POOL2:[56x56x128]内存:56*56*128=400K 权重:0
CONV3-256:[56x56x256]内存:56*56*256=800K 权重:(3*3*128)*256 = 294,912
...
滤波器数量从 128 个增加到 256 个(在 CONV3-256 层)后,它具有上述激活维度(和误差增量)和权重。然而,由于滤波器的深度(在本例中为 128)与其增量的第三维(在本例中为 256)不同,我如何执行这两个数组的卷积?非常感谢任何提供帮助的人。我觉得这很令人困惑,而且我在网上没有找到这方面的太多帮助。它大多没有得到很好的解释或被认为是“已知的”。
你是对的,增量和权重的深度不相等。但滤波器的数量等于 Delta 的深度。 我的意思是,您可以有一个大小为 (5x5x2) 的过滤器和大小为 (20x20x4) 的增量,但这里的问题是您实际上将有四个过滤器。 你可以通过构建一个小型 CNN 来检查这一点,你会发现除非这个条件为真,否则前向传递将无效。
我认为我理解你尝试自己实现反向传播的问题,我也在这样做,因为我们反向传播错误,我们所做的是取损失的导数(给出的即交叉熵的导数)损失是预测的 softmax 减去真实标签,这样你就得到了 Dloss 的单个值),并使用与我们对线性层相同的公式进行反向传播(除了发生变化之外,它是相同的)是操作)Dloss/Dw = Dloss/Dz * Dz/Dw,相对于输出 z 的损失是给定的 Dloss,输出 z 相对于 w 的导数是该层的输入(sinze z = w * x,因此 w 的变化将与 x 成正比),因此为了获得所谓的权重(或内核或过滤器相同的东西)的梯度,您可以将给定输入乘以该 conv 层的 Dloss 和繁荣,您就得到了它!在我的实现中,我所做的是创建一个类来保存层并存储它的中间输出,这样我就可以向后传播损失,而为了向后传播,你所做的就是取损失相对于输入的导数(是的)你听到的是对的)所以在公式中它将是给定 Dloss * w 的损失的导数(因此你将损失的导数乘以内核),结果就是你将传播到卷积的下一层的梯度网是下一层的损失(读取结束到开始的顺序)