通过NUMPY编写神经网络

神经单元类

In [1]:
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
    
    

训练神经网络

In [3]:
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])))
    

    
随机初始化权重
[[-0.16595599]
 [ 0.44064899]
 [-0.99977125]]
经过训练后的权重
[[ 105754.0196136 ]
 [ -90857.30702198]
 [-181716.49511319]]
输入[1,0,0] -> ?:
0.73105857863

结论

刚开始的权重很小,经过训练后权重都变得很大或者很小,根据《数值计算》可知,大的数值和小的数值在一起计算,有时候会出现问题

In [ ]: