算法介绍及实现——BP神经网络(基于Python-torch)
BP算法是我接触到的第一个算法,可谓是梦开始的地方,算法专栏用它作为开篇再合适不过了。目录1、什么是BP神经网络?2、BP神经网络的原理?3、BP神经网络如何实现?4、总结1、什么是BP神经网络?BPNN是一种当下的应用比较广泛的智能算法,是MLP的一种,是用于寻找数据集中非线性的、复杂的数据关系。它是基于生物神经网络的原型,对其进行抽象和模拟,模仿人脑思考问题的方式和方法,能很好的去发掘数据之间
BP算法是我接触到的第一个算法,可谓是梦开始的地方,算法专栏用它作为开篇再合适不过了。
目录
1、什么是BP神经网络?
BPNN是一种当下的应用比较广泛的智能算法,是MLP的一种,是用于寻找数据集中非线性的、复杂的数据关系。它是基于生物神经网络的原型,对其进行抽象和模拟,模仿人脑思考问题的方式和方法,能很好的去发掘数据之间的相关性。其主要用去数据的建模和预测。其结果如下图所示:
举个不严谨的例子,我在输入层输入今天的温度、降雨、是否周末等就可以通过网络“计算”获得商场的人数,因为商场的人数是受温度、降雨、是否周末所影响的,所以如果掌握了它们其中的影响过程,当我们有新的影响因子数据(温度、降雨、是否周末)时就可对商场人数进行预测。
2、BP神经网络的原理?
个人论文节选:
3、BP神经网络如何实现?
使用Python的torch模块来实现BP神经网络,如下。对于BP网络的实现,有些人会选择自己从头到尾实现,我认为这确实是一种对理论掌握和代码能力的很好的体现,但是我个人建议如果对其原理已经完全掌握还是直接使用一些库提供的API会更为方便,如sklearn库、torch、tensorflow等等。
import torch
class ini_BP_net(torch.nn.Module):
def __init__(self, n_feature, n_hidden, n_output):
super(ini_BP_net, self).__init__()
# 构造隐含层和输出层
self.hidden = torch.nn.Linear(n_feature, n_hidden)
self.output = torch.nn.Linear(n_hidden, n_output)
def forward(self, x):
# 前向计算
hid = torch.tanh(self.hidden(x))
out = torch.tanh(self.output(hid))
return out
def train(model, epochs, learning_rate, x_train, y_train):
"""
:param model: 模型
:param epochs: 最大迭代次数
:param learning_rate:学习率
:param x_train:训练数据(输入)
:param y_train:训练数据(输出)
:return: 最终的loss值(MSE)
"""
loss_fc = torch.nn.MSELoss(reduction="sum")
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
loss_list = []
for i in range(epochs):
model.train()
# 前向计算
data = model(x_train)
# 计算误差
loss = loss_fc(data, y_train)
loss_list.append(loss)
# 更新梯度
optimizer.zero_grad()
# 反向传播
loss.backward()
# 更新参数
optimizer.step()
# print("This is {} th iteration,MSE is {}。".format(i+1,loss))
# 返回误差是为了观测网络训练过程的误差下降情况
loss_ls = [loss_list[i].detach().numpy() for i in range(len(loss_list))]
return loss_ls
if __name__ == "__main__":
n_feature = 2
n_hidden = 5
n_output = 1
# 构建模型
model = ini_BP_net(n_feature, n_hidden, n_output)
# 测试
# 数据准备
# ======================== #
# 此处数据准备的比较随意,在实际应用中,x_train为对于影响因子,y_label为对应真值数据。
x_train = torch.rand(5,n_feature)
y_label = torch.rand(5,n_output)
# ============================== #
learn_data = 1e-2
loss_ls = train(model, 1000, learn_data, x_train, y_label)
import matplotlib.pyplot as plt
plt.plot(loss_ls)
plt.show()
4、总结
BP神经网络有很强的数据拟合能力,能很好的发现数据之间的相互关系。值得注意的是,如果实验数据之间没有很强的相关性,会导致无法收敛。所以在利用BP神经网络进行建模前,可以对相关数据进行相关性分析,根据相关程度选择模型使用数据。
作者水平有限,欢迎留言指正讨论!
共勉!
更多推荐
所有评论(0)