Java CNN卷积反传

Java CNN卷积反传,java,conv-neural-network,convolution,Java,Conv Neural Network,Convolution,我尝试用Java从头开始实现CNN。我没有使用任何使事情变得更困难的外部库 我的CNN具有以下结构:Input->[ConvLayer、Pool、ReLU、FullyConnected]->Output 这些层几乎可以按任何顺序添加到彼此后面。 除ConvLayer外,每一层都可以工作。向前传球很好,但我被错误的向后传球和权重的更新所困扰 我知道这是一种反向卷积,有反向的内核或类似的东西,但我就是不能让它工作,如果有人能简单地解释什么值必须乘以什么值,那就太好了:) 我的尝试可以在这里找到: 我

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

我的CNN具有以下结构:
Input->[ConvLayer、Pool、ReLU、FullyConnected]->Output

这些层几乎可以按任何顺序添加到彼此后面。 除ConvLayer外,每一层都可以工作。向前传球很好,但我被错误的向后传球和权重的更新所困扰

我知道这是一种反向卷积,有反向的内核或类似的东西,但我就是不能让它工作,如果有人能简单地解释什么值必须乘以什么值,那就太好了:)

我的尝试可以在这里找到:

我很高兴能得到任何帮助


您好,芬恩当我们为一个特定的层做反向传球时,我们需要

  • 该层的损失或错误值
  • 前一卷积层的输出
  • “Delta”,这是相对于卷积输出的部分损失
事实上,卷积层中的权重更新与完全连接层中的操作非常相似。如果在完全连接层中计算损耗L,则可以通过L中与y相关的部分来计算卷积层的损耗,其中y是本例中卷积层的输出。然后梯度计算将与完全连接层的计算相同

如果您喜欢更数学的描述,请参阅


希望这能对你有所帮助。

我真的不明白梯度的计算是如何相同的。我的意思是分享重量。在我的没有共享权重的多人感知器中,我得到了每个连接的梯度,但是如何使用共享权重计算梯度?我认为我们应该对所有表达式求和,其中一个特定的共享权重适用。因此,与权重更新为这样的MLP相比:权重+=-eta*错误信号*previousLayer.output。权重将神经元与输出和给定错误信号连接起来。所以我应该像这样更新每个使用它的连接的权重吗?