filter - 更新 CNN 中的过滤器权重
问题描述
我设计了一个具有 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 层传播到 conv 层中的 3x3 过滤器?
谁能帮我这个 ?
谢谢你。
解决方案
与您对全连接层所做的方式相同,但使用卷积而不是矩阵乘法。假设您位于第 5 层 (L5)。在反向传播期间,您有一个在 L6 计算的增量矩阵,我们称之为 D6。在 L5 中,您有 2 个任务...您需要计算将用于更新过滤器的 dF,并且您需要计算将用作 L4 中的增量的 D5。
您是如何在密集层中执行这些操作的?对于 dW,您将层输入乘以 delta,而对于下一个 delta,您将 delta 乘以权重和激活函数的导数。
现在魔法来了……如果你有一个 conv 层,请大胆猜测你在做什么。让我帮一点忙。要计算 dF,您需要将 D6 与 L5 的原始输入进行卷积。我希望看起来很熟悉。为了获得下一个增量,您使用 D6 对原始过滤器执行完全卷积,并将其传递给 L4。池化层上有大量资源,它们非常简单,所以我宁愿跳过它们。
如果您使用的是 python,这是一个很好的做法,但不要指望它可以使用。这是一个非常缓慢的过程,所以除了玩游戏之外,还可以使用一些框架,比如 tensorflow/keras/etc。
推荐阅读
- lotus-notes - 如何在 LotusScript 代理中使用 NSFNoteCipherDecrypt
- dataweave - 在 Mulesoft 中获取消息异常
- javascript - HTML:动态修复用户正在阅读的标题和子标题
- c# - 验证用户对网页的身份,同时阻止他们通过直接链接访问它
- php - Apache 无法使用 curl 发出传出 HTTP 请求
- hadoop - 插入 HIVE 表时转换值
- c++ - yaml-cpp 编码/解码指针?
- ffmpeg - 如何在 ffmpeg (-f) 中为输入和输出指定文件类型?
- sql - 子查询上的多个 id 来计算计数
- group-by - SQL中固定间隔和分组依据后的平均值