我设计了具有2个卷积层和2个完全连接层的CNN。
我的CNN的体系结构如下:
Input -> [Conv1->ReLU->Pool] -> [Conv2->ReLU->Pool] -> FC1 -> FC2 -> output
28x28 28x28 14x14 14x14 7x7 49x1 49x1 10x1
在训练CNN时,我进行了反向传播,直到完全连接层为止。如果不更新过滤器,我的准确率将达到94%左右,但是我需要更新过滤器才能发挥全部功能。
我无法弄清楚如何将错误从FC层传播到conv层的过滤器中。
我提到过各种消息来源,但没有一个能真正帮助我。如何将错误从49x49 FC层传播到转换层中的3x3过滤器?
有人可以帮我吗?
谢谢。
答案 0 :(得分:0)
与完全连接的层相同,但是使用卷积而不是矩阵乘法。假设您位于第5层(L5)。在反向传播期间,您有一个在L6处计算出的增量矩阵,我们称其为D6。在L5中,您有2个任务...您需要计算将用于更新过滤器的dF,并且需要计算将在L4中用作增量的D5。
您是如何在密集层中执行这些操作的?好吧,对于dW,您将层输入与增量相乘,而对于下一个增量,您会将增量与权重和激活函数的导数相乘。
现在魔术来了...如果您拥有转换层,请大胆地猜测您的操作。我来帮忙要计算dF,需要将D6与L5的原始输入进行卷积。我希望看起来很熟悉。为了获得下一个增量,您需要使用D6对原始滤波器进行完全卷积,然后将其传递给L4。池化层上有大量的资源,它们非常简单,所以我宁愿跳过它们。
如果您使用的是python,这是一个好习惯,但是不要期望它可用。这是一个非常缓慢的过程,因此,除了玩弄之外,还需要使用诸如tensorflow / keras / etc之类的框架。