【问题标题】:CNN Convolution backward passCNN卷积后向传播
【发布时间】:2017-09-27 18:50:33
【问题描述】:

我尝试在 Java 中从头开始实现 CNN。我没有使用任何使事情变得更难的外部库。

我的 CNN 结构如下:Input -> [ConvLayer, Pool, ReLU, FullyConnected] -> Output

这些层几乎可以以任何顺序依次添加。 除 ConvLayer 外,每一层都有效。前向传播很好,但我被错误的后向传播和权重更新所困扰。

我知道这是一种带有反向内核的反向卷积或类似的东西,但我无法让它工作,如果有人能简要解释哪些值必须与哪些值相乘,那就太好了: )

我的尝试可以在这里找到:CNN Convolution Layer - Backpropagation problems

我很高兴能得到任何帮助。

你好,芬恩

【问题讨论】:

    标签: java conv-neural-network convolution


    【解决方案1】:

    当我们对特定层进行反向传递时,我们需要

    • 该层的丢失或错误值,
    • 前一个卷积层的输出,
    • 'Delta',这是关于卷积输出的损失部分。

    事实上,卷积层中的权重更新与您在全连接层中所做的事情非常相似。如果你的损失L是在全连接层计算的,那么你可以通过L 相对于 y,其中 y 在您的情况下是卷积层的输出。然后梯度计算将与您对全连接层的计算相同。

    如果你喜欢更数学的描述,请参考Backpropagation

    希望这会对你有所帮助。

    【讨论】:

    • 我不太明白梯度的计算是如何相同的。我的意思是共享权重。在我没有共享权重的多人感知器中,我得到了每个连接的梯度,但是如何使用共享权重计算梯度?
    • 我认为我们应该总结适用于一个特定共享权重的所有表达式。
    • 因此与权重更新如下的 MLP 相比:权重 += -eta * error_signal * previousLayer.output。权重将神经元与输出连接起来,将神经元与给定的 errorSignal 连接起来。那么我应该为每个使用它的连接更新这样的权重吗?
    猜你喜欢
    • 2017-01-12
    • 2017-07-24
    • 2020-05-27
    • 2021-10-20
    • 2016-11-24
    • 1970-01-01
    • 2018-06-21
    • 2020-11-15
    • 1970-01-01
    相关资源
    最近更新 更多