我正在尝试从头开始用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)
谁能逐步解释更新此神经网络的权重和偏差的过程?
答案 0 :(得分:1)
在神经网络中,您必须将数据预处理为相同的形状。您可以尝试对函数内部的数据进行预处理。因此,您只需要简单地调用相同的函数来预处理测试数据。这样可以防止不同数据的形状不同。
权重被更新以测量用于分离数据的超平面。例如,
在二元分类中,用斜率填充查找线,以用线方程Y = MX + B分隔两个类。以相同的方式,需要通过梯度下降算法用超平面分离多维数据。
W = W-学习率*增量
此处,增量是损失的偏导数。通过更新权重,您可以减少损失。在某个时候,损失将达到一些局部最小值。此时(局部极小值)停止了历元(迭代次数以找到最佳精度)。
要更新权重,您可以使用具有一定批次大小的for loop。在神经网络中,您必须找到适合您的数据的学习率和时期。如果您使用的学习率非常低,则会减慢您的训练速度。