BP神经网络是一种按误差逆向传播算法训练的多层前馈神经网络,由输入层、隐层和输出层组成,每层的计算公式如下:
[ y = T(WX + B) ]
X:该层的输入
W:该层的权重
B:该层的阈值
T:该层的激活函数
BP神经网络的训练算法流程如下:
1、初始化一个解。
2、迭代计算所有w,b在当前处的梯度dw,db。
3、将w,b往负梯度方向更新:w = w lr * dw,b = b lr * db。
4、判断是否满足退出条件,如果满足,则退出迭代。
BP神经网络的优点包括具有很强的非线性映射能力和柔性的网络结构,中间层数和各层的神经元个数可根据具体情况任意设定,BP神经网络也存在一些缺陷,如学习速度慢、容易陷入局部极小值、网络层数和神经元个数的选择没有相应的理论指导以及网络推广能力有限等。
下面是一个使用Python实现BP神经网络的示例代码,利用pytorch框架来构建和训练一个简单的BP神经网络模型:
import torch import matplotlib.pyplot as plt 设置随机种子以便结果可重复 torch.manual_seed(99) 定义网络的前向传播函数 def forward(w1, b1, w2, b2, x): return w2 @ torch.tanh(w1 @ x + b1) + b2 定义损失函数(均方差) def loss(y, py): return ((y py) ** 2).mean() 生成训练数据 x = torch.linspace(-5, 5, 20).reshape(1, 20) # 在[-5,5]之间生成20个数作为x y = torch.sin(x) # 模型的输出值y为sin函数的值 获取输入和输出的数量 in_num = x.shape[0] out_num = y.shape[0] 初始化参数 hn = 4 # 隐节点个数 w1 = torch.randn([hn, in_num], requires_grad=True) # 输入层到隐层的权重 b1 = torch.randn([hn, 1], requires_grad=True) # 隐层的阈值 w2 = torch.randn([out_num, hn], requires_grad=True) # 隐层到输出层的权重 b2 = torch.randn([out_num, 1], requires_grad=True) # 输出层的阈值 设置学习率 lr = 0.01 训练模型 for i in range(5000): py = forward(w1, b1, w2, b2, x) # 计算网络的输出 L = loss(y, py) # 计算损失函数 print('第', str(i), '轮:', L) # 打印当前损失函数值 L.backward() # 用损失函数更新模型参数的梯度 w1.data = w1.data w1.grad * lr # 更新模型系数w1 b1.data = b1.data b1.grad * lr # 更新模型系数b1 w2.data = w2.data w2.grad * lr # 更新模型系数w2 b2.data = b2.data b2.grad * lr # 更新模型系数b2 w1.grad.zero_() # 清空w1梯度以便下次backward b1.grad.zero_() # 清空b1梯度以便下次backward w2.grad.zero_() 绘制结果 plt.plot(x.detach().numpy(), y.detach().numpy(), label='真实值') plt.plot(x.detach().numpy(), forward(w1, b1, w2, b2, x).detach().numpy(), label='预测值') plt.legend() plt.show()
单元表格:
参数 | 描述 |
forward |
定义了网络的前向传播函数,用于计算网络的输出。 |
loss |
定义了损失函数,用于计算预测值与真实值之间的差异。 |
x |
输入数据,这里使用的是在[-5,5]之间生成的20个数。 |
y |
真实数据,这里使用的是对应于x 的sin函数值。 |
in_num |
输入数据的个数。 |
out_num |
输出数据的个数。 |
hn |
隐节点的个数。 |
w1 |
输入层到隐层的权重。 |
b1 |
隐层的阈值。 |
w2 |
隐层到输出层的权重。 |
b2 |
输出层的阈值。 |
lr |
学习率,用于控制权重更新的速度。 |
py |
预测值,即网络的输出。 |
L |
损失函数的值,用于衡量预测值与真实值之间的差异。 |
plt.plot |
绘制真实值与预测值的对比图。 |
相关问题与解答:
问题1:为什么选择均方差作为损失函数?
答:均方差是回归问题中常用的损失函数,因为它能够量化预测值与真实值之间的平均差异,适用于连续值的预测。
问题2:如何选择合适的学习率?
答:学习率的选择需要根据具体的数据集和模型进行调整,可以从较小的学习率开始尝试,然后逐渐增大或减小,直到找到最优的学习率,还可以使用学习率衰减等策略来动态调整学习率。
小伙伴们,上文介绍了“bp神经网络 lr算法”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/703512.html