我正在尝试用Java从头开始编写CNN库。
反向传播算法适用于除卷积层本身之外的每一层。我应用了用于完全连接层的算法,只是通过导数的总和来更新内核。
我创建了一个测试网络。
ConvolutionLayer:
Input size: 1x4x4
Kernel size: 1x3x3
Kernel stride: 1
Kernel amount: 1
Kernel offset: 0
Output size: 1x2x2
ReLU:
Input size: 1x2x2
Output size: 1x2x2
Activation function: max(0,x)
我手工完成了计算(我对它们进行了编程,但是看到我的错误,我在纸上做了)
所以当我应用backprop (eta = 1)
时。算法我使用这个公式计算了ReLU的误差:
error = (output - expectedOutput) * reluDerivative
然后,我为卷积层的每个输出神经元计算了内核的增量。显示了4个内核增量,因为我们有4个输出神经元。一个内核增量通过以下公式计算:
delta = error * convolvedInput
第五内核delta数组是内核增量的总和。这个用于更新权重(内核)。
现在的问题是每个权重等于或小于0.这将导致负激活图和总输出0(因为ReLU)。这将导致ReLU中的导数为0,这将导致我的ReLU中的错误为0,因为这个公式:
error = (output - expectedOutput) * reluDerivative
所以,我想我错过了一些东西,如果有人能帮我解决问题,我会很高兴。