from numpy import exp,array,random,dot
class NeuralNetwork():
def __init__(self):
#设置随机种子,可以每次程序运行产生相同的结果
random.seed(1)
self.synaptic_weights=2*random.random((3,1))-1
#sigmoid激活函数
def __sigmoid(self,x):
return 1/(1+exp(-1))
#sigmoid激活函数的导数,x是经过sigmoid函数求值的结果
def __sigmoid_derivative(self,x):
return x*(1-x)
#定义输出函数,没有加上偏置
def think(self,inputs):
return self.__sigmoid(dot(inputs,self.synaptic_weights))
#训练神经网络
def train(self,train_set_inputs,traning_set_oupts,number_of_training_iterations):
#对于Py2用下面的语句,xrange属于生成器,每次生成一个值
#for iteration in xrange(number_of_training_iterations):
#对于Py3用下面的语句代替
for iteration in range(number_of_training_iterations):
output=self.think(train_set_inputs)
error=traning_set_oupts-output
#首先对输出进行求偏导数,得到梯度下降的方向
adjustment=dot(train_set_inputs.T,error* self.__sigmoid_derivative(output))
#修改相应的权重
self.synaptic_weights += adjustment
if __name__ == "__main__":
neural=NeuralNetwork()
print("随机初始化权重")
print(neural.synaptic_weights)
training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
training_set_outputs = array([[0, 1, 1, 0]]).T
neural.train(training_set_inputs,training_set_outputs,1000000)
print("经过训练后的权重")
print(neural.synaptic_weights)
#测试网络
print("输入[1,0,0] -> ?:")
print(neural.think(array([1,0,0])))
刚开始的权重很小,经过训练后权重都变得很大或者很小,根据《数值计算》可知,大的数值和小的数值在一起计算,有时候会出现问题