Python 简单神经网络调试
我正试图创建一个基于的python神经网络实现,但我一直在调试,无法找出我把什么搞砸了。目前,在计算隐藏层的增量时出现了一个问题,我假设矩阵操作存在一些问题,这些问题会影响后续步骤。有人能帮忙调试吗Python 简单神经网络调试,python,neural-network,Python,Neural Network,我正试图创建一个基于的python神经网络实现,但我一直在调试,无法找出我把什么搞砸了。目前,在计算隐藏层的增量时出现了一个问题,我假设矩阵操作存在一些问题,这些问题会影响后续步骤。有人能帮忙调试吗 import numpy as np class NeuralNetwork: def sigmoid(self, x): return 1 / (1 + np.exp(-x)) def sigmoid_d(self, x): return x
import numpy as np
class NeuralNetwork:
def sigmoid(self, x):
return 1 / (1 + np.exp(-x))
def sigmoid_d(self, x):
return x * (1 - x)
def __init__(self, input_nodes, hidden_nodes, output_nodes):
# Save size properties
self.input_nodes_count = input_nodes
self.hidden_nodes_count = hidden_nodes
self.output_nodes_count = output_nodes
# Generate random weights
self.weights_ih = np.random.random((self.hidden_nodes_count, self.input_nodes_count))
self.weights_ho = np.random.random((self.output_nodes_count, self.hidden_nodes_count))
# Generate weights for biases
self.bias_h = np.random.randn()
self.bias_o = np.random.randn()
# Set learning rate
self.learningRate = 0.1
def calc_hidden(self, inputs):
# Prepare hidden values
hidden_without_bias = np.dot(self.weights_ih, inputs)
# Add bias for hidden values
hidden_not_activated = np.add(hidden_without_bias, self.bias_h)
# Execute hidden activation
hidden = list(map(lambda x: self.sigmoid(x), hidden_not_activated))
return hidden
def calc_output(self, inputs):
# Prepare output values
output_without_bias = np.dot(self.weights_ho, inputs)
# Add bias for output values
output_not_activated = np.add(output_without_bias, self.bias_o)
# Execute output activation
outputs = list(map(lambda x: self.sigmoid(x), output_not_activated))
return outputs
def predict(self, inputs):
# Calc hidden values
hidden = self.calc_hidden(inputs)
# Calc output values
outputs = self.calc_output(hidden)
return outputs
def train(self, inputs, targets):
# Calc hidden values
hidden = self.calc_hidden(inputs)
# Calc output values
outputs = self.calc_output(hidden)
# Calc output errors
output_errors = np.subtract(outputs, targets)
# Calc the output gradient
gradients = list(map(lambda x: self.sigmoid_d(x), outputs))
gradients = np.multiply(gradients, output_errors)
gradients = np.multiply(gradients, self.learningRate)
# Calc deltas
hidden_t = np.transpose(hidden)
weights_ho_deltas = np.dot(gradients, hidden_t)
# Adjust output weights by deltas
for i in range(len(self.weights_ho)):
for j in range(len(self.weights_ho[i])):
self.weights_ho[i][j] += weights_ho_deltas[i][j]
self.bias_o += gradients
# Calc the hidden layer errors
weights_ho_t = np.transpose(self.weights_ho)
hidden_errors = np.dot(weights_ho_t, output_errors)
# Calc the hidden gradient
hidden_gradients = list(map(lambda x: self.sigmoid_d(x), hidden))
hidden_gradients = np.multiply(hidden_gradients, hidden_errors)
hidden_gradients = np.multiply(hidden_gradients, self.learningRate)
# Calc hidden deltas
inputs_t = np.transpose(inputs)
weights_ih_deltas = np.dot(hidden_gradients, inputs_t)
# Adjust hidden weights by deltas
for i in range(len(self.weights_ih)):
for j in range(len(self.weights_ih)):
self.weights_ih[i][j] += weights_ih_deltas[i][j]
self.bias_h += hidden_gradients
if __name__ == '__main__':
neuralNetwork = NeuralNetwork(2, 2, 1)
training_data = [[0, 0], [0, 1], [1, 0], [1, 1]]
training_output = [[0], [1], [1], [0]]
for i in range(1):
index = np.random.randint(0, len(training_output))
neuralNetwork.train(training_data[index], training_output[index])
print(neuralNetwork.predict([1, 1]))
但是你被困在哪一部分呢?错误是什么,预期输出是什么,等等?实际上很难确定哪部分无效。我认为这是一个计算三角洲和调整权重的问题。关于预期输出,运行更多次后的训练数据集应该学习XOR函数,因此我希望[1,1]的预测值尽可能接近0。我知道我没有像我应该的那样解决这个问题,但是现在我有点迷失在这个主题中,因为我花了很多时间试图调试它。你应该发布你得到的完整错误跟踪,还有你自己尝试和调试的步骤。目前在生成隐藏层和梯度的点积时有一个错误(这个错误很明显),但我认为主要的问题是算法,我相信对于熟悉这个主题的人来说,这个错误可能很严重。我试图找出我的实现和实际算法之间的差异,但失败了。对不起,我说得不够精确,但你到底在做什么?错误是什么,预期输出是什么,等等?实际上很难确定哪部分无效。我认为这是一个计算三角洲和调整权重的问题。关于预期输出,运行更多次后的训练数据集应该学习XOR函数,因此我希望[1,1]的预测值尽可能接近0。我知道我没有像我应该的那样解决这个问题,但是现在我有点迷失在这个主题中,因为我花了很多时间试图调试它。你应该发布你得到的完整错误跟踪,还有你自己尝试和调试的步骤。目前在生成隐藏层和梯度的点积时有一个错误(这个错误很明显),但我认为主要的问题是算法,我相信对于熟悉这个主题的人来说,这个错误可能很严重。我试图找出我的实现和实际算法之间的差异,但失败了。对不起,不够精确