我正在学习
Convolutional Neural Network
,现在我对如何实现它感到困惑。
我了解常规神经网络以及
Gradient Descent
和Back Propagation
等概念,并且我可以直观地理解CNN的工作原理。
我的问题是关于 CNN 中的反向传播。这是怎么发生的?最后一个完全连接的层是常规的神经网络,这没有问题。但是我如何更新卷积层中的过滤器?如何将误差从完全连接的层反向传播到这些过滤器?我的问题是更新过滤器!
滤波器只是简单的矩阵?或者它们具有类似于常规神经网络的结构,并且层之间的连接可以模拟该功能?我读到了有关
Sparse Connectivity
和 Shared Weights
的内容,但我无法将它们与 CNN 联系起来。我对实现 CNN 感到非常困惑,而且我找不到任何谈论这些概念的教程。我无法阅读论文,因为我对这些东西还很陌生,而且我的数学也不好。
我不想使用
TensorFlow
或这样的工具,我正在学习主要概念并使用纯粹的Python
。
首先,我可以推荐 this CNN 简介。也许你可以通过这个更好地理解它的想法。
简短回答您的一些问题:
假设您想使用 CNN 进行图像分类。图片由 NxM 像素组成,有 3 个通道(RBG)。要在其上应用卷积层,请使用过滤器。滤波器是(通常但不一定)二次形状(例如 PxP)的矩阵,其通道数等于其所应用的表示的通道数。因此,第一个Conv层过滤器也有3个通道。可以说,通道是滤波器的层数。
将过滤器应用于图片时,您会执行称为离散卷积的操作。您拿起过滤器(通常比图像小)并将其逐步滑动到图片上,然后计算卷积。这基本上是一个矩阵乘法。然后在其上应用激活函数,甚至可能是池化层。需要注意的是,该层上所有执行的卷积的过滤器保持不变,因此每层只有 P*P 参数。您以某种方式调整过滤器,使其尽可能适合训练数据。这就是为什么它的参数被称为共享权重。应用 GD 时,您只需将其应用于所述过滤器权重即可。
此外,您还可以在这里找到一个不错的卷积演示。
实现这些东西当然是可能的,但一开始你可以尝试使用张量流进行实验。至少这是我学习新概念的方式:)
CNN 中的反向传播与全连接层中的反向传播非常相似,但操作不同,正如我们所知,我们通过计算损失相对于权重(滤波器或线性网络的权重)的导数来开始反向传播。层),Dloss/Dweights = Dloss/Dz * Dz/Dweights(其中 Z 是该层生成的输出),因此我们说得更简单,让我们将层视为一个函数,它接受f(x) 并输出 z,将该函数分解为我们得到 y = x * w 的部分(其中 * 表示互相关运算,为了简单起见,让我们避免偏差),之后 y 输出我们得到预测,然后是导数损失的(通过对原始预测进行 softmax 并从真实标签中减去),因此在链式规则表达式中,我们首先获得 Dloss/Dz ,其中 是相对于输出(或激活)的损失,它是梯度我们是向后传播,我们将其乘以 dz/Dweights,它是 z 对于损失的导数,记住 z = x * w,所以 w 的变化与 x 成正比(根据链式法则),所以 dz/Dweights 是该卷积层的输入,第一层反向传播的最后一步(因为我们实际上可以以编程方式实现它)是计算损失相对于输入的导数,我们稍后计算了损失相对于权重,我们得到输入 z = x * w,因此输入 x 的变化与 w 成正比,因此我们乘以 Dloss/Dz * Dz/Dx,其中 Dloss/Dz 是损失的实际导数,给定,Dz/Dx 是权重,我们这样做是因为我们将梯度向后传播到其他层(我们无法更新输入的大小)。希望我的回答有用