CNN反向传播问题

时间:2017-06-03 13:35:56

标签: java conv-neural-network backpropagation

我正在尝试用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)

我手工完成了计算(我对它们进行了编程,但是看到我的错误,我在纸上做了) enter image description here

所以当我应用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

所以,我想我错过了一些东西,如果有人能帮我解决问题,我会很高兴。

0 个答案:

没有答案