如何更新权重和偏见

时间:2019-08-24 17:42:46

标签: python-3.x numpy neural-network deep-learning

我正在尝试从头开始用numpy编写一个神经网络来识别hand_writing_digits。但是我在更新权重和偏差时有些困惑

这是我的代码

class NeuralNetwork():

    learning_rate = 0.0001
    ephochs = 10000
    nodes_in_input_layer = 784  # features
    nodes_in_hidden_layer = 100
    nodes_in_output_layer = 10  # classes
    np.random.seed(3)


    def __init__(self):
        self.hidden_layer = {'weights': np.random.rand(self.nodes_in_input_layer, self.nodes_in_hidden_layer)*0.1,
                             'biases': np.random.rand(self.nodes_in_hidden_layer)*0.1 }

        self.output_layer = {'weights': np.random.rand(self.nodes_in_hidden_layer, self.nodes_in_output_layer)*0.1,
                             'biases': np.random.rand(self.nodes_in_output_layer)*0.1 }

        print('self.hidden_layer: ',self.hidden_layer['weights'].shape)
        print('self.output_layer: ',self.output_layer['weights'].shape)

    def fit(self, x, y, ephochs= ephochs):
        for i in range(ephochs):
            # feed forword
            z_hidden_layer = np.dot(x[i], self.hidden_layer['weights']) + self.hidden_layer['biases']
            o_hidden_layer = sigmoid(z_hidden_layer)

            z_output_layer = np.dot(o_hidden_layer, self.output_layer['weights']) + self.output_layer['biases']
            o_output_layer = sigmoid(z_output_layer)

            # back propagation
            error = o_output_layer - y[i]

            '''
            ## at output layer 

            derror_dweights = derror/do * do/dz * dz/dw

            derror/do = error
            do/dz = derivative of sigmoid(x[i]) 
            dz/dw = o_hidden_layer
            ''' 
            derror_do = error 
            do_dz =  sigmoid(z_output_layer, derivative=True)
            dz_dw =  o_hidden_layer

            nw_output_layer = derror_do * do_dz
            nw_output_layer = np.dot(nw_output_layer, dz_dw.T) 

            nb_output_layer = error

            # updating new weights and biases
            self.output_layer['weights'] = self.output_layer['weights'] - (self.learning_rate * nw_output_layer)
            self.output_layer['biases'] = self.output_layer['biases'] - (self.learning_rate * nb_output_layer)

            ## update remain weights and biases

我在跑步时遇到此错误

nw_output_layer = np.dot(nw_output_layer, dz_dw.T) ValueError: shapes (10,) and (100,) not aligned: 10 (dim 0) != 100 (dim 0)

谁能逐步解释更新此神经网络的权重和偏差的过程?

1 个答案:

答案 0 :(得分:1)

在神经网络中,您必须将数据预处理为相同的形状。您可以尝试对函数内部的数据进行预处理。因此,您只需要简单地调用相同的函数来预处理测试数据。这样可以防止不同数据的形状不同。

权重被更新以测量用于分离数据的超平面。例如,

在二元分类中,用斜率填充查找线,以用线方程Y = MX + B分隔两个类。以相同的方式,需要通过梯度下降算法用超平面分离多维数据。

W = W-学习率*增量

此处,增量是损失的偏导数。通过更新权重,您可以减少损失。在某个时候,损失将达到一些局部最小值。此时(局部极小值)停止了历元(迭代次数以找到最佳精度)。

要更新权重,您可以使用具有一定批次大小的for loop。在神经网络中,您必须找到适合您的数据的学习率和时期。如果您使用的学习率非常低,则会减慢您的训练速度。