神经网络 BP 算法系统开发与验证
一、 实验内容
1. 开发神经网络 BP 算法
2. 实现 y1=x1+x2;y2=sin(x);y3=x^2 或自己确定函数、数据样本
3. 画出训练、回想、泛化曲线
4. 开发语言不限
二、 实验过程
1. 程序设计
因为要实现三种函数的BP模拟,所以要根据输入参数确定神经网络结构,训练数据和测试数据。
choice = int(argv[0]) #用于控制神经网络的输入节点的个数和相关数据准备
用不同的代码准备测试训练数据和测试数据,下面以第二个函数为例,其中,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
BP神经网络的计算主要采用了面向过程的思想,因为在其中有先乘后加,所以用矩阵乘法代替这类操作,比如节点的输入的计算
$$
u_i^k=\sum_{j=0}^{p_{k-1}}{w_{ij}}^ky_j^{k-1}
$$
我将其在算法中的实现为输入i行向量*(i*j)的矩阵,输出为j的行向量。输入层和隐层都可以作为输入,而隐层和输出层都可以作为输出。而神经元的输入和输出,用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函数改变的话,需要在这里更改相应的其导函数的结果。
再使用一个生成(a,b)区间的随机函数
def rand(a,b): return a + random.random() * (b - a)
至此,准备过程结束。
2.BP网络面向对象抽象
BP网络类,需要初始化,前向传播,反向传播和训练四部分。
播,反向传播的计算严格按照PPT92-93页的内容计算。
在训练过程中计算并记录每一次迭代的误差,并画出训练(回想)及泛化误差曲线。
三、实验结果
- 分别三次在文件目录下输入命令(需要配置Python3.7.4环境)
python myBP.py 1
和python myBP.py 2
和python myBP.py 3
分别得到题目所要求的三个函数的训练及泛化曲线。
欢迎在评论区中进行批评指正,转载请注明来源,如涉及侵权,请联系作者删除。