首页 > 解决方案 > 2 个隐藏层神经网络上的反向传播

问题描述

我正在尝试制作我的第一个神经网络,并且我尝试制作一个具有 2 个隐藏层的神经网络,但它没有学习。

我很确定前馈部分工作正常,但无论我训练多少(使用 XOR 表),误差都不会减少,它只是在 0.5 左右振荡。我猜反向传播部分有问题,但我已经修改了很多次,甚至计算了它应该是什么都无济于事。

这是代码:

class NeuralNetwork:

    def __init__(self, input_size, output_size):

        # Sets the input and output sizes
        self.inputs  = input_size
        self.outputs = output_size

        # Sets size of hidden layers
        self.L1 = 2
        self.L2 = 2

        # Initializes weights
        self.W1 = np.random.rand(self.inputs.shape[1], self.L1)
        self.W2 = np.random.rand(self.L1, self.L2)
        self.W3 = np.random.rand(self.L2, self.outputs.shape[1])


    # The network evaluates the inputs
    def feedforward(self, inp):

        self.inputs = inp

        # Evaluates layer 1
        Z1 = sig(np.dot(self.inputs, self.W1))

        # Evaluates layer 2
        Z2 = sig(np.dot(Z1, self.W2))

        # Evaluates end result
        Z3 = sig(np.dot(Z2, self.W3))

        self.outputs = Z3

    # Backpropagation
    def train(self, inp, outp):

        # Evaluate the input
        self.inputs = inp

        # Evaluates layer 1
        Z1 = sig(np.dot(self.inputs, self.W1))

        # Evaluates layer 2
        Z2 = sig(np.dot(Z1, self.W2))

        # Evaluates end result
        Z3 = sig(np.dot(Z2, self.W3))

        # Evaluate the error
        error = Z3 - outp

        print("Error: " +  str(abs(error.sum())))

        # Backpropagates
        dcost_dpred = error
        dpred_dz = dsig(np.dot(Z2, self.W3))

        z_delta = dcost_dpred * dpred_dz
        self.W3 -= lr * np.dot(Z2.T, z_delta)

        z_delta = np.dot(z_delta, self.W3.T)
        self.W2 -= lr * (np.dot(Z1.T, z_delta) * dsig(np.dot(Z1, self.W2)))

        z_delta = np.dot(z_delta, self.W2.T)
        self.W1 -= lr * (np.dot(self.inputs.T, z_delta) * dsig(np.dot(self.inputs, self.W1)))

真的错了吗?如果是,我应该如何修复它?

标签: pythonneural-networkbackpropagation

解决方案


推荐阅读