使用python自己搭建一个简单的BP神经网络

from numpy import exp,array,random,dot
#import random

class NeuralNetwork(object):
    def __init__(self):
        #指定随机数发生器种子,保证每次获得相同结果的随机数
        random.seed(1)
        #对含有3输入1输出的单个神经元建模
        #即3*1矩阵赋予随机权重值,范围(-1,1)
        #即(a,b)范围的c*d矩阵随机数为(b-a)*random.random((c,d))+a
        self.dendritic_weights=2*random.random((3,1))-1

    #sigmoid函数,s型曲线,用于对输入的加权总和x做(0,1)正规化
    #它可以将一个实数映射到(0,1)空间
    def __sigmoid(self,x):
        return 1/(1+exp(-x))

    #sigmoid函数的导数
    #这里的x是指__sigmoid函数的输出
    def __sigmoid_derivative(self,x):
        return x*(1-x)

        #训练该神经网络,并调整树突的权重
    def train(self,training_inputs,training_output,number_of_training_iteration):
        '''
        training_inputs:训练集的样本输入
        training_outputs:训练集样本的输出
        number_of_training_iteration:训练次数
        1.我们使用sigmoid曲线计算(输入的加权和映射到0至1之间)作为输出神经元
        2.如果输出是一个大的正(或负)数,这意味着神经元采用这种(或另一种)方式
        3.从sigmoid曲线可以看出,在较大值处,sigmoid曲线的斜率小,即认为当前权重是正确
        4.所以,乘以sigmoid函数曲线斜率可以进行调整
        '''
        for _iteration in range(number_of_training_iteration):
            #训练集导入神经网络
            output=self.think(training_inputs)

            #计算误差
            error=training_output-output

            #将误差乘以输入,再乘以s型曲线的梯度
            adjustment=dot(training_inputs.T,error*self.__sigmoid_derivative(output))

            self.dendritic_weights+=adjustment

    #神经网络
    def think(self,inputs):
        #输入与权重相乘并正交化
        return self.__sigmoid(dot(inputs,self.dendritic_weights))

if __name__=='__main__':
    #初始化神经网络
    nn=NeuralNetwork()
    #初始化权重
    print("初始树突权重:\n{}".format(nn.dendritic_weights))

    #训练集,四个样本,每个样本有3个输入,1个输出
    #训练样本输入
    training_inputs_sample=array([[0,0,1],[1,1,1],[1,0,1],[0,1,1]])

    #训练样本的输出
    training_outputs_sample=array([[0,1,1,0]]).T

    #用训练集训练nn,重复十万次,每次做微小的调整
    nn.train(training_inputs_sample,training_outputs_sample,100000)

    #训练后的树突权重
    print("训练后树突权重:\n{}".format(nn.dendritic_weights))

    #用新数据进行测试
    test_result=nn.think(array([1,0,0]))
    print("测试结果:\n{}".format(test_result))
    

程序运行结果:

初始树突权重:
[[-0.16595599]
 [ 0.44064899]
 [-0.99977125]]
训练后树突权重:
[[12.00870061]
 [-0.2044116 ]
 [-5.8002822 ]]
测试结果:
[0.99999391]

参考资料:python尝试自己写一个简单的神经网络

猜你喜欢

转载自blog.csdn.net/wzx_numberone/article/details/110795815