神经网络 BP算法系统开发与验证

  1. 神经网络 BP 算法系统开发与验证
    1. 一、 实验内容
    2. 二、 实验过程
    3. 三、实验结果

神经网络 BP 算法系统开发与验证

一、 实验内容

1. 开发神经网络 BP 算法
2. 实现 y1=x1+x2;y2=sin(x);y3=x^2 或自己确定函数、数据样本
3. 画出训练、回想、泛化曲线
4. 开发语言不限

二、 实验过程

1. 程序设计

  1. 因为要实现三种函数的BP模拟,所以要根据输入参数确定神经网络结构,训练数据和测试数据。

    choice = int(argv[0])   #用于控制神经网络的输入节点的个数和相关数据准备
    
  2. 用不同的代码准备测试训练数据和测试数据,下面以第二个函数为例,其中,num表示生成多少组数据,并且对数据进行了归一化。

    def get_data_second(num):
         data = list()
         for i in range(num):
             item = list()
             x1 = rand(0,6.28)
             y1 = math.sin(x1)
             x1 = sigmoid(x1)
             y1 = sigmoid(y1)
             item.append([x1])
             item.append([y1])
             data.append(item)
        return d
    
  3. BP神经网络的计算主要采用了面向过程的思想,因为在其中有先乘后加,所以用矩阵乘法代替这类操作,比如节点的输入的计算
    $$
    u_i^k=\sum_{j=0}^{p_{k-1}}{w_{ij}}^ky_j^{k-1}
    $$
    我将其在算法中的实现为输入i行向量*(i*j)的矩阵,输出为j的行向量。输入层和隐层都可以作为输入,而隐层和输出层都可以作为输出。

  4. 而神经元的输入和输出,用sigmoid函数使用的是PPT上面的举例函数
    $$ f^`\left( u_{j}^{k} \right) =f\left( u_j^k \right) \left[ 1-f\left( u_j^k \right) \right] =v_j^k\left( 1-v_j^k \right) $$
    因为并没有存储神经元的sigmoid前的输入,所以在计算时必须带入最后的只与输出有关的式子,也就是

    sigma_wo[k] = real_out*(1-real_out)*(real_out - want_out)
    
    sigma_wh[j] = real_out * (1-real_out)*sum_w_sigma
    

    如果sigmoid函数改变的话,需要在这里更改相应的其导函数的结果。

  5. 再使用一个生成(a,b)区间的随机函数

    def rand(a,b):
    return a + random.random() * (b - a)
    

    至此,准备过程结束。

2.BP网络面向对象抽象

  1. BP网络类,需要初始化,前向传播,反向传播和训练四部分。

  2. 播,反向传播的计算严格按照PPT92-93页的内容计算。

  3. 在训练过程中计算并记录每一次迭代的误差,并画出训练(回想)及泛化误差曲线。

三、实验结果

  1. 分别三次在文件目录下输入命令(需要配置Python3.7.4环境) python myBP.py 1 python myBP.py 2python myBP.py 3分别得到题目所要求的三个函数的训练及泛化曲线。

欢迎在评论区中进行批评指正,转载请注明来源,如涉及侵权,请联系作者删除。

×

喜欢就点赞,疼爱就打赏