我在尝试提高用Python编写的前馈神经网络的准确性时遇到了问题。我不确定这是一个真正的错误还是我的数学函数的问题,但我得到了一些模糊的输出(例如0.5)。无论我如何增加迭代次数,我的代码如下:
from numpy import exp, array, random, dotclass NeuralNetwork(): def __init__(self): random.seed(1) self.synaptic_weights = 2 * random.random((3, 1)) - 1 # MM reuslt = 3 (3 * 1) def Sigmoid(self, x): return 1 / (1 + exp(-x)) def Sigmoid_Derivative(self, x): return x * (1 - x) def train(self, Training_inputs, Training_outputs, iterations): output = self.think(Training_inputs) print ("THe outputs are: -", output) erorr = Training_outputs - output adjustment = dot(Training_inputs.T, erorr * self.Sigmoid_Derivative(output)) print ("The adjustments are:-", adjustment) self.synaptic_weights += output def think(self, inputs): Training_inputs = array(inputs) return self.Sigmoid(dot(inputs, self.synaptic_weights))# phew! the class ends..if __name__ == "__main__": neural_network = NeuralNetwork() print("Random startin weights", neural_network.synaptic_weights) Training_inputs = array([[1, 1, 1], [0, 0, 0], [1, 0, 1],]) # 3 rows * 3 columns??? Training_outputs = array([[1, 1, 0]]).T neural_network.train(Training_inputs, Training_outputs, 0) print ("New synaptic weights after training: ") print (neural_network.synaptic_weights) # Test the neural network with a new situation. print ("Considering new situation [1, 0, 0] -> ?: ") print (neural_network.think(array([1, 0, 0])))
以下是我的输出结果:
[Running] python -u "/home/neel/Documents/VS-Code_Projects/Machine_Lrn(PY)/test.py"Random startin weights [[-0.16595599] [ 0.44064899] [-0.99977125]]THe outputs are: - [[0.3262757 ] [0.5 ] [0.23762817]]The adjustments are:- [[0.10504902] [0.14809799] [0.10504902]]New synaptic weights after training: [[ 0.16031971] [ 0.94064899] [-0.76214308]]Considering new situation [1, 0, 0] -> ?: [0.5399943][Done] exited with code=0 in 0.348 seconds[Running] python -u "/home/neel/Documents/VS-Code_Projects/Machine_Lrn(PY)/tempCodeRunnerFile.py"Random startin weights [[-0.16595599] [ 0.44064899] [-0.99977125]]THe outputs are: - [[0.3262757 ] [0.5 ] [0.23762817]]The adjustments are:- [[0.10504902] [0.14809799] [0.10504902]]New synaptic weights after training: [[ 0.16031971] [ 0.94064899] [-0.76214308]]Considering new situation [1, 0, 0] -> ?: [0.5399943][Done] exited with code=0 in 3.985 seconds
我尝试过更改迭代次数,但差异非常小。我认为问题可能出在我其中一个数学(Sigmoid)函数上。除此之外,我认为第20行的点乘运算可能也是问题所在,因为调整看起来不太对劲……
另外,0.5是否表明我的网络没有在学习,而只是在进行随机猜测?
附注: 我认为我的问题并不是重复的,因为它涉及到所述模型的‘准确性’,而链接的问题涉及到‘非预期输出’
回答:
你的 Sigmoid_Derivative
函数是错误的,这一点在你之前的问题中已经指出了;它应该是这样的:
def Sigmoid_Derivative(self, x): return self.Sigmoid(x) * (1-self.Sigmoid(x))
请参阅Math.SE上的Sigmoid函数的导数讨论串,以及这里的讨论。
如果纠正这一点后仍然没有得到预期的结果,请不要更改上面的问题 – 而是开启一个新问题…